diff --git a/.dockerignore b/.dockerignore index ffd7c45ec38f19a047a0c727f5bf2460a0911052..834924b9f79d8075aca055984a1203b00d788280 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,5 @@ doc -target +**target* .idea/ Dockerfile .dockerignore diff --git a/.gitattributes b/.gitattributes index 9a0309f9e5ba5ecc5de180cffece11f609a65384..9bd26362b0e878091caf184509be782b6b6b6c9c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -Cargo.lock linguist-generated=true -diff +Cargo.lock linguist-generated=true diff --git a/.gitignore b/.gitignore index d9ba8ac2b411f21befe040b38e08732c5ead9d28..28885a4830d9b9c6d35ca9885b283d52799b8e6d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ nohup.out rls*.log *.orig *.rej +**/wip/*.stderr diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 91855c567c8f2f1b0d8d517a22e49345be861dc6..99b354a60b08b76e5397ae86c754ec444c7c34de 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,15 +10,16 @@ stages: - test - build - publish - - deploy + - kubernetes + - flaming-fir -image: parity/rust-substrate-build:stretch +image: parity/rust-builder:latest variables: GIT_STRATEGY: fetch + CARGO_HOME: "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_JOB_NAME}" + SCCACHE_DIR: "/ci-cache/${CI_PROJECT_NAME}/sccache" CI_SERVER_NAME: "GitLab CI" - CARGO_HOME: "/ci-cache/substrate/cargo/${CI_JOB_NAME}" - SCCACHE_CACHE_SIZE: 50G DOCKER_OS: "debian:stretch" ARCH: "x86_64" @@ -37,6 +38,12 @@ variables: environment: name: parity-build +.compiler_info: &compiler_info + before_script: + - rustup show + - cargo --version + - sccache -s + #### stage: test @@ -52,7 +59,44 @@ check-runtime: script: - ./scripts/gitlab/check_runtime.sh + +check-line-width: + stage: test + image: parity/tools:latest + <<: *kubernetes-build + only: + - /^[0-9]+$/ + script: + - ./scripts/gitlab/check_line_width.sh + allow_failure: false + + test-linux-stable: &test + stage: test + <<: *compiler_info + variables: + RUST_TOOLCHAIN: stable + # Enable debug assertions since we are running optimized builds for testing + # but still want to have debug assertions. + RUSTFLAGS: -Cdebug-assertions=y + TARGET: native + tags: + - linux-docker + only: + - tags + - master + - schedules + - web + - /^[0-9]+$/ + except: + variables: + - $DEPLOY_TAG + script: + - ./scripts/build.sh --locked + - time cargo test --all --release --verbose --locked + - sccache -s + +test-linux-stable-int: &test stage: test variables: RUST_TOOLCHAIN: stable @@ -73,12 +117,44 @@ test-linux-stable: &test - $DEPLOY_TAG before_script: - sccache -s - - ./scripts/build.sh + - ./scripts/build.sh --locked script: - - time cargo test --all --release --verbose --locked + - time RUST_LOG=sync=trace,consensus=trace,client=trace,state-db=trace,db=trace,forks=trace,state_db=trace,storage_cache=trace cargo test -p node-cli --release --verbose --locked -- --ignored --test-threads=1 + - sccache -s + allow_failure: true + + +check-web-wasm: + stage: test + <<: *compiler_info + allow_failure: true + only: + - master + - /^[0-9]+$/ + script: + # WASM support is in progress. As more and more crates support WASM, we + # should add entries here. See https://github.com/paritytech/substrate/issues/2416 + - time cargo web build -p sr-io + - time cargo web build -p sr-primitives + - time cargo web build -p sr-std + - time cargo web build -p substrate-consensus-common + - time cargo web build -p substrate-keyring + - time cargo web build -p substrate-keystore + - time cargo web build -p substrate-executor + - time cargo web build -p substrate-network-libp2p + - time cargo web build -p substrate-panic-handler + - time cargo web build -p substrate-peerset + - time cargo web build -p substrate-primitives + - time cargo web build -p substrate-serializer + - time cargo web build -p substrate-state-db + - time cargo web build -p substrate-state-machine + - time cargo web build -p substrate-telemetry + - time cargo web build -p substrate-trie - sccache -s + tags: + - linux-docker -.build-only: &build-only +.build-only: &build-only only: - master - tags @@ -86,19 +162,18 @@ test-linux-stable: &test #### stage: build -build-linux-release: &build +build-linux-release: stage: build <<: *collect-artifacts <<: *build-only + <<: *compiler_info except: variables: - $DEPLOY_TAG tags: - linux-docker - before_script: - - sccache -s - - ./scripts/build.sh script: + - ./scripts/build.sh --locked - time cargo build --release --verbose - mkdir -p ./artifacts - mv ./target/release/substrate ./artifacts/. @@ -116,8 +191,9 @@ build-linux-release: &build - cp -r scripts/docker/* ./artifacts - sccache -s -build-rust-doc-release: &build +build-rust-doc-release: stage: build + <<: *compiler_info allow_failure: true artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}-doc" @@ -128,12 +204,10 @@ build-rust-doc-release: &build <<: *build-only tags: - linux-docker - before_script: - - sccache -s - - ./scripts/build.sh script: + - ./scripts/build.sh --locked - rm -f ./crate-docs/index.html # use it as an indicator if the job succeeds - - time cargo +nightly doc --release --verbose + - time cargo +nightly doc --release --all --verbose - cp -R ./target/doc ./crate-docs - echo "" > ./crate-docs/index.html - sccache -s @@ -170,7 +244,11 @@ publish-docker-release: - echo "Substrate version = ${VERSION}" - test -z "${VERSION}" && exit 1 - cd ./artifacts - - docker build --tag $CONTAINER_IMAGE:$VERSION --tag $CONTAINER_IMAGE:latest . + - docker build + --build-arg VCS_REF="${CI_COMMIT_SHA}" + --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" + --tag $CONTAINER_IMAGE:$VERSION + --tag $CONTAINER_IMAGE:latest . - docker push $CONTAINER_IMAGE:$VERSION - docker push $CONTAINER_IMAGE:latest after_script: @@ -200,6 +278,7 @@ publish-s3-release: publish-s3-doc: stage: publish + image: parity/awscli:latest allow_failure: true dependencies: - build-rust-doc-release @@ -222,10 +301,10 @@ publish-s3-doc: --human-readable --summarize .deploy-template: &deploy - stage: deploy + stage: kubernetes when: manual retry: 1 - image: parity/kubectl-helm:$HELM_VERSION + image: parity/kubetools:latest <<: *build-only tags: # this is the runner that is used to deploy it @@ -272,20 +351,46 @@ publish-s3-doc: deploy-ew3: <<: *deploy-cibuild environment: - name: parity-prod-ew3 + name: parity-prod-ew3 deploy-ue1: <<: *deploy-cibuild environment: - name: parity-prod-ue1 + name: parity-prod-ue1 deploy-ew3-tag: <<: *deploy-tag environment: - name: parity-prod-ew3 + name: parity-prod-ew3 deploy-ue1-tag: <<: *deploy-tag environment: - name: parity-prod-ue1 + name: parity-prod-ue1 +.validator-deploy: &validator-deploy + stage: flaming-fir + dependencies: + - build-linux-release + image: parity/azure-ansible:v1 + allow_failure: true + when: manual + tags: + - linux-docker + +validator 1 4: + <<: *validator-deploy + script: + - ./scripts/flamingfir-deploy.sh flamingfir-validator1 +validator 2 4: + <<: *validator-deploy + script: + - ./scripts/flamingfir-deploy.sh flamingfir-validator2 +validator 3 4: + <<: *validator-deploy + script: + - ./scripts/flamingfir-deploy.sh flamingfir-validator3 +validator 4 4: + <<: *validator-deploy + script: + - ./scripts/flamingfir-deploy.sh flamingfir-validator4 diff --git a/Cargo.lock b/Cargo.lock index c68e923d43d9e26b93d8040ca10256036c194a3b..4ba0c9005ae9da568929fe77ba2025b8eba1b21f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,12 +1,9 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "MacTypes-sys" -version = "2.1.0" +name = "adler32" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "aes-ctr" @@ -15,7 +12,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -41,10 +38,10 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.9" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -52,12 +49,12 @@ name = "aio-limited" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -65,7 +62,7 @@ name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -106,7 +103,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -119,27 +116,26 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.13" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -147,15 +143,10 @@ name = "backtrace-sys" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "base-x" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "base58" version = "0.1.0" @@ -189,22 +180,23 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.43.2" +version = "0.47.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cexpr 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "which 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -248,10 +240,10 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -267,7 +259,7 @@ dependencies = [ [[package]] name = "block-padding" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -278,9 +270,22 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bstr" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -309,6 +314,7 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -324,7 +330,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.26" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -332,24 +338,34 @@ dependencies = [ [[package]] name = "cexpr" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "chain-spec-builder" +version = "2.0.0" +dependencies = [ + "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", + "node-cli 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", +] + [[package]] name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -359,8 +375,8 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "libloading 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -383,7 +399,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -396,10 +412,10 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.35" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -409,48 +425,63 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "core-foundation" -version = "0.5.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "core-foundation-sys" -version = "0.5.1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "criterion" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion-plot 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "csv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "csv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "tinytemplate 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "criterion-plot" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -463,13 +494,13 @@ name = "crossbeam" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -479,7 +510,7 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -515,7 +546,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -529,7 +560,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -549,7 +580,7 @@ name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -557,7 +588,7 @@ name = "crossbeam-utils" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -568,7 +599,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -591,11 +622,13 @@ dependencies = [ [[package]] name = "csv" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -603,7 +636,7 @@ name = "csv-core" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -612,12 +645,12 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ctr" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -626,11 +659,11 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.1.1" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -644,14 +677,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.0.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -661,13 +694,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -691,11 +724,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" @@ -711,7 +739,7 @@ version = "1.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -719,7 +747,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -738,8 +766,8 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -752,24 +780,25 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "error-chain" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "exit-future" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -777,7 +806,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -786,10 +815,10 @@ name = "failure_derive" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -802,7 +831,7 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -810,10 +839,10 @@ name = "finality-grandpa" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -821,17 +850,30 @@ dependencies = [ [[package]] name = "fixed-hash" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "flate2" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fnv" version = "1.0.6" @@ -852,7 +894,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fork-tree" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -863,9 +905,9 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "libloading 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -889,7 +931,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -897,8 +939,8 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -930,7 +972,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -940,7 +982,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -948,33 +990,38 @@ name = "glob" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "globset" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "h2" -version = "0.1.16" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -984,10 +1031,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1009,7 +1056,7 @@ name = "heapsize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1017,7 +1064,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1027,21 +1074,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hex-literal" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hex-literal-impl 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hex-literal-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hex-literal-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hmac" version = "0.4.2" @@ -1073,12 +1137,23 @@ dependencies = [ [[package]] name = "http" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "http-body" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1096,7 +1171,7 @@ dependencies = [ [[package]] name = "hyper" -version = "0.10.15" +version = "0.10.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1104,7 +1179,7 @@ dependencies = [ "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1114,27 +1189,30 @@ dependencies = [ [[package]] name = "hyper" -version = "0.12.23" +version = "0.12.29" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1162,7 +1240,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1185,105 +1271,135 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itertools" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "jsonrpc-client-transports" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-core" -version = "10.0.1" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "jsonrpc-core-client" +version = "12.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "jsonrpc-client-transports 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-derive" -version = "10.0.2" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-http-server" -version = "10.0.1" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hyper 0.12.23 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-server-utils 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-pubsub" -version = "10.0.1" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-server-utils" -version = "10.0.1" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "globset 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-ws-server" -version = "10.0.1" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-server-utils 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ws 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1293,11 +1409,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "keccak-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1338,9 +1454,9 @@ dependencies = [ "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1361,56 +1477,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.48" +version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libloading" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-websocket 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1419,95 +1537,105 @@ dependencies = [ "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-identify" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1516,214 +1644,232 @@ dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-noise" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "snow 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-secio" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-uds" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-websocket" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "websocket 0.22.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-yamux" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "librocksdb-sys" -version = "5.14.3" +version = "5.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bindgen 0.43.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "make-cmd 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1761,6 +1907,14 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.3.9" @@ -1774,7 +1928,7 @@ name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1785,11 +1939,6 @@ dependencies = [ "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "make-cmd" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "matches" version = "0.1.8" @@ -1797,11 +1946,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memchr" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1826,13 +1974,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1844,17 +1991,44 @@ dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1869,7 +2043,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1879,8 +2053,8 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1900,11 +2074,11 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1918,19 +2092,19 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", - "schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", + "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1938,189 +2112,207 @@ name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "nix" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "node-cli" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "node-executor 1.0.0", - "node-primitives 1.0.0", - "node-runtime 1.0.0", + "node-executor 2.0.0", + "node-primitives 2.0.0", + "node-runtime 2.0.0", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-basic-authorship 1.0.0", - "substrate-cli 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura 1.0.1", - "substrate-finality-grandpa 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keystore 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-service-test 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-transaction-pool 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "srml-finality-tracker 2.0.0", + "srml-indices 2.0.0", + "srml-timestamp 2.0.0", + "structopt 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-basic-authorship 2.0.0", + "substrate-cli 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-finality-grandpa 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-keystore 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-service-test 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-transaction-pool 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "transaction-factory 0.0.1", ] [[package]] name = "node-executor" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "node-primitives 1.0.0", - "node-runtime 1.0.0", + "node-primitives 2.0.0", + "node-runtime 2.0.0", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-contract 1.0.0", - "srml-grandpa 1.0.0", - "srml-indices 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "srml-treasury 1.0.0", - "substrate-executor 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-contract 2.0.0", + "srml-grandpa 2.0.0", + "srml-indices 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "srml-treasury 2.0.0", + "substrate-executor 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "node-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "substrate-serializer 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-serializer 2.0.0", ] [[package]] -name = "node-runtime" -version = "1.0.0" +name = "node-rpc-client" +version = "2.0.0" +dependencies = [ + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core-client 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "node-primitives 2.0.0", + "substrate-rpc 2.0.0", +] + +[[package]] +name = "node-runtime" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "node-primitives 1.0.0", + "node-primitives 2.0.0", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-aura 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-contract 1.0.0", - "srml-council 1.0.0", - "srml-democracy 1.0.0", - "srml-executive 1.0.0", - "srml-finality-tracker 1.0.0", - "srml-grandpa 1.0.0", - "srml-indices 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-sudo 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "srml-treasury 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-keyring 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-aura 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-contract 2.0.0", + "srml-council 2.0.0", + "srml-democracy 2.0.0", + "srml-executive 2.0.0", + "srml-finality-tracker 2.0.0", + "srml-grandpa 2.0.0", + "srml-indices 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-sudo 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "srml-treasury 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-keyring 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "node-template" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "node-template-runtime 1.0.0", + "node-template-runtime 2.0.0", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "substrate-basic-authorship 1.0.0", - "substrate-cli 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura 1.0.1", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-transaction-pool 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "substrate-basic-authorship 2.0.0", + "substrate-cli 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-transaction-pool 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "node-template-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-aura 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-executive 1.0.0", - "srml-indices 1.0.0", - "srml-sudo 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-aura 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-executive 2.0.0", + "srml-indices 2.0.0", + "srml-sudo 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -2135,34 +2327,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "nom" -version = "4.2.0" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "numtoa" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "ole32-sys" version = "0.2.0" @@ -2187,15 +2388,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.16" +version = "0.10.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2205,11 +2406,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-sys" -version = "0.9.40" +version = "0.9.47" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2219,7 +2421,7 @@ name = "output_vt100" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2250,7 +2452,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2258,26 +2460,15 @@ name = "parity-codec-derive" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parity-crypto" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2285,47 +2476,37 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multihash" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "parity-wasm" -version = "0.31.3" +name = "parity-send-wrapper" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] -name = "parity-ws" -version = "0.8.0" +name = "parity-wasm" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2355,15 +2536,25 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2371,11 +2562,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2383,31 +2574,46 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste-impl" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2457,21 +2663,21 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2484,12 +2690,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2499,15 +2705,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "proc-macro2" -version = "0.4.27" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2515,7 +2713,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.3.0" +version = "2.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2538,20 +2736,12 @@ name = "quick-error" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "quote" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "quote" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2559,7 +2749,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2569,10 +2759,10 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2582,9 +2772,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2592,17 +2782,17 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2610,7 +2800,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2645,34 +2835,34 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_os" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_pcg" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2698,7 +2888,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2709,8 +2899,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2723,7 +2913,7 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2731,7 +2921,7 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2741,19 +2931,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "regex" -version = "1.1.0" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2764,7 +2954,7 @@ name = "remove_dir_all" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2772,8 +2962,8 @@ name = "rhododendron" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2784,12 +2974,12 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2797,25 +2987,23 @@ name = "rocksdb" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "librocksdb-sys 5.14.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "rust-crypto" -version = "0.2.36" +name = "rpassword" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2823,11 +3011,6 @@ name = "rustc-hex" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "rustc-serialize" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "rustc_version" version = "0.2.3" @@ -2836,19 +3019,32 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2874,80 +3070,66 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "schnorrkel" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "schnorrkel" -version = "0.1.1" -source = "git+https://github.com/paritytech/schnorrkel#1762df02ac48ba5c3fa8c162e19a393247079f88" -dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] +name = "scopeguard" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "scopeguard" -version = "0.3.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "secp256k1" -version = "0.12.2" +name = "sct" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "security-framework" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "security-framework-sys" -version = "0.2.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2970,30 +3152,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.87" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.87" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" -version = "1.0.38" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha-1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3018,7 +3211,7 @@ name = "sha2" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3026,10 +3219,10 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3058,16 +3251,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -3075,8 +3258,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3095,22 +3278,19 @@ name = "slog_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "smallvec" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "snow" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3120,8 +3300,27 @@ dependencies = [ "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3136,475 +3335,491 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-api-macros" -version = "1.0.0" +version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-test-client 1.0.0", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-version 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-test-client 2.0.0", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-io" -version = "1.0.0" +version = "2.0.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-std 2.0.0", + "substrate-offchain 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-sandbox" -version = "1.0.0" +version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-std" -version = "1.0.0" +version = "2.0.0" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-version" -version = "1.0.0" +version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "srml-assets" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-aura" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", +] + +[[package]] +name = "srml-babe" +version = "2.0.0" +dependencies = [ + "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-balances" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-consensus" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-contract" -version = "1.0.0" +version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-sandbox 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-sandbox 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-primitives 2.0.0", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-council" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-democracy 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-democracy 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-democracy" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-example" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "srml-balances 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "srml-balances 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-executive" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-indices 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-indices 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-finality-tracker" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-grandpa" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-finality-tracker 1.0.0", - "srml-session 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-finality-grandpa-primitives 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-finality-tracker 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-finality-grandpa-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-indices" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-metadata" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-session" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-staking" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-session 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-sudo" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-support-procedural 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-support-procedural 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-support" -version = "1.0.0" +version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-metadata 1.0.0", - "srml-support-procedural 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-metadata 2.0.0", + "srml-support-procedural 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-support-procedural" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "srml-support-procedural-tools 1.0.0", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "srml-support-procedural-tools 2.0.0", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "srml-support-procedural-tools-derive 1.0.0", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "srml-support-procedural-tools-derive 2.0.0", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-test" -version = "0.1.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "srml-support 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "srml-support 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "trybuild 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-system" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-timestamp" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-treasury" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -3622,50 +3837,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -3676,8 +3847,11 @@ dependencies = [ [[package]] name = "string" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "strsim" @@ -3686,22 +3860,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "structopt" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt-derive 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "structopt-derive" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3715,131 +3889,135 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "subkey" -version = "1.0.0" +version = "2.0.0" dependencies = [ "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "node-primitives 2.0.0", + "node-runtime 2.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "substrate-primitives 1.0.0", - "tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", + "substrate-primitives 2.0.0", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "node-cli 1.0.0", + "ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "node-cli 2.0.0", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-basic-authorship" -version = "1.0.0" +version = "2.0.0" dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "substrate-transaction-pool 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "substrate-transaction-pool 2.0.0", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#080da45923885cfec2379cef3dee4e7f43e6c260" +version = "0.2.1" +source = "git+https://github.com/paritytech/substrate-bip39#44307fda4ea17fe97aeb93af317fbc8f6ed34193" dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-cli" -version = "1.0.0" +version = "2.0.0" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-client 1.0.0", - "substrate-keyring 1.0.0", - "substrate-network 0.1.0", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-telemetry 1.0.0", - "sysinfo 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "structopt 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-client 2.0.0", + "substrate-keyring 2.0.0", + "substrate-network 2.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-telemetry 2.0.0", + "sysinfo 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-client" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "substrate-trie 2.0.0", ] [[package]] name = "substrate-client-db" -version = "1.0.0" +version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3849,658 +4027,668 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-db 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-test-client 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-db 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-test-client 2.0.0", + "substrate-trie 2.0.0", ] [[package]] name = "substrate-consensus-aura" -version = "1.0.1" +version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "srml-aura 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-consensus-slots 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-version 2.0.0", + "srml-aura 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-consensus-slots 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-aura-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-consensus-authorities" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-consensus-babe" -version = "1.0.0" +version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.1 (git+https://github.com/paritytech/schnorrkel)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-consensus-babe-primitives 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-consensus-slots 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-version 2.0.0", + "srml-babe 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-consensus-slots 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-babe-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-slots 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-slots 2.0.0", ] [[package]] name = "substrate-consensus-common" -version = "1.0.0" +version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "substrate-test-client 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-rhd" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rhododendron 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-transaction-pool 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-version 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-transaction-pool 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-slots" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-executor" -version = "1.0.0" +version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-version 1.0.0", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-serializer 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-version 2.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-serializer 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-finality-grandpa" -version = "1.0.0" +version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "finality-grandpa 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "fork-tree 1.0.0", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "fork-tree 2.0.0", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "srml-finality-tracker 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-finality-grandpa-primitives 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "srml-finality-tracker 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-finality-grandpa-primitives 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-finality-grandpa-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-inherents" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "substrate-keyring" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", + "sr-primitives 2.0.0", "strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-keystore" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-primitives 2.0.0", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-network" -version = "0.1.0" +version = "2.0.0" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "fork-tree 1.0.0", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "fork-tree 2.0.0", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-keyring 1.0.0", - "substrate-network-libp2p 1.0.0", - "substrate-peerset 1.0.0", - "substrate-primitives 1.0.0", - "substrate-test-client 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-keyring 2.0.0", + "substrate-network-libp2p 2.0.0", + "substrate-peerset 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-network-libp2p" -version = "1.0.0" +version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-peerset 1.0.0", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-peerset 2.0.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-offchain" -version = "0.1.0" +version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-inherents 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", - "substrate-test-client 1.0.0", - "substrate-transaction-pool 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "substrate-transaction-pool 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-offchain-primitives" -version = "0.1.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-panic-handler" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-peerset" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "substrate-serializer 1.0.0", - "tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", + "substrate-serializer 2.0.0", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-rpc" -version = "1.0.0" +version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-derive 10.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-pubsub 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core-client 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-derive 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-test-client 1.0.0", - "substrate-test-runtime 1.0.0", - "substrate-transaction-pool 1.0.0", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-version 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-test-client 2.0.0", + "substrate-test-runtime 2.0.0", + "substrate-transaction-pool 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-rpc-servers" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "jsonrpc-http-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-pubsub 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-ws-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-http-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-ws-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-rpc 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-rpc 2.0.0", ] [[package]] name = "substrate-serializer" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-service" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "node-executor 2.0.0", + "node-primitives 2.0.0", + "node-runtime 2.0.0", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-client-db 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keystore 1.0.0", - "substrate-network 0.1.0", - "substrate-offchain 0.1.0", - "substrate-primitives 1.0.0", - "substrate-rpc-servers 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "substrate-transaction-pool 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-client-db 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-finality-grandpa 2.0.0", + "substrate-keystore 2.0.0", + "substrate-network 2.0.0", + "substrate-offchain 2.0.0", + "substrate-primitives 2.0.0", + "substrate-rpc-servers 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "substrate-transaction-pool 2.0.0", "target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-service-test" -version = "1.0.0" +version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-state-db" -version = "1.0.0" +version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-state-machine" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-telemetry" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-test-client" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-client-db 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-test-runtime 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-client-db 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-test-runtime 2.0.0", ] [[package]] name = "substrate-test-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-executive 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", - "substrate-test-client 1.0.0", - "substrate-trie 1.0.0", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-executive 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-transaction-graph" -version = "1.0.0" +version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-primitives 1.0.0", - "substrate-test-runtime 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-runtime 2.0.0", ] [[package]] name = "substrate-transaction-pool" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-test-client 1.0.0", - "substrate-transaction-graph 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "substrate-transaction-graph 2.0.0", ] [[package]] name = "substrate-trie" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "trie-bench 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "trie-bench 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4510,46 +4698,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "subtle" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.31" +version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sysinfo" -version = "0.8.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "target_info" version = "0.1.0" @@ -4566,20 +4749,20 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.0.6" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "termcolor" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4587,11 +4770,12 @@ dependencies = [ [[package]] name = "termion" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4616,14 +4800,14 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tiny-bip39" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4645,11 +4829,11 @@ dependencies = [ [[package]] name = "tinytemplate" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4657,44 +4841,54 @@ name = "tk-listen" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.1.18" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-buf" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-codec" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4702,7 +4896,7 @@ name = "tokio-current-thread" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4711,10 +4905,10 @@ name = "tokio-dns-unofficial" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4723,7 +4917,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4731,45 +4925,59 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-io" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-reactor" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-sync" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4778,24 +4986,24 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4803,11 +5011,11 @@ dependencies = [ [[package]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4817,14 +5025,14 @@ name = "tokio-tls" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-trace-core" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4836,12 +5044,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4850,23 +5058,23 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4874,19 +5082,33 @@ name = "traitobject" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "transaction-factory" +version = "0.0.1" +dependencies = [ + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-cli 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", +] + [[package]] name = "trie-bench" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4911,12 +5133,11 @@ dependencies = [ [[package]] name = "trie-standardmap" -version = "0.12.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4924,6 +5145,19 @@ name = "try-lock" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "trybuild" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "twofish" version = "0.2.0" @@ -4936,7 +5170,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4959,11 +5193,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4978,7 +5212,7 @@ dependencies = [ [[package]] name = "unicase" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4997,12 +5231,12 @@ name = "unicode-normalization" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -5015,14 +5249,6 @@ name = "unicode-xid" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "unsigned-varint" version = "0.2.2" @@ -5087,9 +5313,9 @@ name = "wabt" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "wabt-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5098,8 +5324,8 @@ name = "wabt-sys" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cmake 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5109,7 +5335,7 @@ version = "2.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5118,92 +5344,104 @@ name = "want" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasmi" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5217,32 +5455,53 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "websocket" -version = "0.22.2" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5250,18 +5509,19 @@ dependencies = [ [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "which" -version = "1.0.5" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5271,7 +5531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5293,7 +5553,7 @@ name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5306,24 +5566,23 @@ name = "wincolor" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ws" -version = "0.7.9" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5339,11 +5598,11 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5359,18 +5618,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5378,12 +5637,49 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] -"checksum MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaf9f0d0b1cc33a4d2aee14fb4b2eac03462ef4db29c8ac4057327d8a71ad86f" +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" -"checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" +"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" "checksum aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f10b352bc3fc08ae24dc5d2d3ddcac153678533986122dc283d747b12071000" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" @@ -5393,25 +5689,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "checksum assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" -"checksum backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b493b66e03090ebc4343eb02f94ff944e0cbc9ac6571491d170ba026741eb5" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)" = "ada4c783bb7e7443c14e0480f429ae2cc99da95065aeab7ee1b81ada0419404f" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" -"checksum bindgen 0.43.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d52d263eacd15d26cbcf215d254b410bd58212aaa2d3c453a04b2d3b3adcf41" +"checksum bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df683a55b54b41d5ea8ebfaebb5aa7e6b84e3f3006a78f010dadc9ca88469260" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" -"checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d" +"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" +"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" -"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "59604ece62a407dc9164732e5adea02467898954c3a5811fd2dc140af14ef15b" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" @@ -5419,20 +5716,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" -"checksum cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "389803e36973d242e7fecb092b2de44a3d35ac62524b3b9339e51d577d668e02" -"checksum cexpr 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "644d693ecfa91955ed32dcc7eda4914e1be97a641fb6f0645a37348e20b230da" -"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" +"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7fa24eb00d5ffab90eaeaf1092ac85c04c64aaf358ea6f84505b8116d24c6af" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ef0c1bcf2e99c649104bd7a7012d8f8802684400e03db0ec0af48583c6fa0e4" "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "6ec65ee4f9c9d16f335091d23693457ed4928657ba4982289d7fafee03bc614a" +"checksum cmake 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "2ca4386c8954b76a8415b63959337d940d724b336cabd3afe189c2b51a7e1ff0" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" -"checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980" -"checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" -"checksum criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "1c6e5ee5b9652d4f851418c448af105642e1f99e9a2741a8ff45c0d2c911b1e0" -"checksum criterion-plot 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4107e4a5abb94267e0149922b8ff49dc70a87cc202820fdbfc0d3e1edbdc4b16" +"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" +"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +"checksum criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394" +"checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" "checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" "checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" @@ -5444,37 +5743,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" +"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" -"checksum csv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd1c44c58078cfbeaf11fbb3eac9ae5534c23004ed770cc4bfb48e658ae4f04" +"checksum csv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9044e25afb0924b5a5fc5511689b0918629e85d68ea591e5e87fbf1e85ea1b3b" "checksum csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5cdef62f37e6ffe7d1f07a381bc0db32b7a3ff1cac0de56cb0d81e71f53d65" "checksum ctor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3b4c17619643c1252b5f690084b82639dd7fac141c57c8e77a00e0148132092c" -"checksum ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "044f882973b245404e90c90e7e42e8ee8d7a64edfd7adf83d684fb97e8e2c1b6" -"checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" +"checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" +"checksum ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5531b7f0698d9220b4729f8811931dbe0e91a05be2f7b3245fdc50dd856bae26" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -"checksum curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "dae47cc3529cdab597dbc8b606e565707209b506e55848f3c15679214a56c956" +"checksum curve25519-dalek 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4440b7acc6264fde2eee18bae135625129c88ff244f3ded035e3caa585a6bf0a" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" -"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" +"checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" -"checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" +"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" "checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" "checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" -"checksum exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "87559b08e99a81a92bbb867d237543e43495857749f688e0773390a20d56c61c" +"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9" +"checksum exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d8013f441e38e31c670e7f34ec8f1d5d3a2bd9d303c1ff83976ca886005e8f48" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" "checksum finality-grandpa 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5cdd9ef7c48777665dacc9657c272778121d4d09848100bcc2bd9c773c6cf837" -"checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" @@ -5482,7 +5781,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "62941eff9507c8177d448bd83a44d9b9760856e184081d8cd79ba9f03dd24981" +"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" @@ -5490,43 +5789,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" "checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" -"checksum globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4743617a7464bbda3c8aec8558ff2f9429047e025771037df561d383337ff865" -"checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" +"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +"checksum globset 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef4feaabe24a0a658fd9cf4a9acf6ed284f045c77df0f49020ba3245cfb7b454" +"checksum h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "1e42e3daed5a7e17b12a0c23b5b2fbff23a925a570938ebee4baca1a9a1a2240" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" -"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8e04cb7a5051270ef3fa79f8c7604d581ecfa73d520e74f554e45541c4b5881a" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" -"checksum hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae0e5c30fb65e661a0e39860e37100dfbe4d39aff865e9357a6a4ed0b5bbf303" -"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc2928beef125e519d69ae1baa8c37ea2e0d3848545217f6db0179c5eb1d639" +"checksum hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c3da68162fdd2147e66682e78e729bd77f93b4c99656db058c5782d8c6b6225a" +"checksum hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" +"checksum hex-literal-impl 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06095d08c7c05760f11a071b3e1d4c5b723761c01bd8d7201c30a9536668a612" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" -"checksum http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "1a10e5b573b9a0146545010f50772b9e8b1dd0a256564cc4307694c68832a2f5" +"checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" +"checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" -"checksum hyper 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "df0caae6b71d266b91b4a83111a61d2b94ed2e2bea024c532b933dcff867e58c" -"checksum hyper 0.12.23 (registry+https://github.com/rust-lang/crates.io-index)" = "860faf61a9957c9cb0e23e69f1c8290e92f6eb660fcdd1f2d6777043a2ae1a46" +"checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" +"checksum hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)" = "e2cd6adf83b3347d36e271f030621a8cf95fd1fd0760546b9fc5a24a0f1447c7" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" +"checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +"checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" -"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" -"checksum jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a5152c3fda235dfd68341b3edf4121bc4428642c93acbd6de88c26bf95fc5d7" -"checksum jsonrpc-derive 10.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c14be84e86c75935be83a34c6765bf31f97ed6c9163bb0b83007190e9703940a" -"checksum jsonrpc-http-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "99e1ce36c7cc9dcab398024d76849ab2cb917ee812653bce6f74fc9eb7c82d16" -"checksum jsonrpc-pubsub 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "56608ed54b1b2a69f4357cb8bdfbcbd99fe1179383c03a09bb428931bd35f592" -"checksum jsonrpc-server-utils 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5521613b31ea22d36d9f95ad642058dccec846a94ed8690957652d479f620707" -"checksum jsonrpc-ws-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20b8333a5a6e6ccbcf5c90f90919de557cba4929efa164e9bd0e8e497eb20e46" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" +"checksum jsonrpc-client-transports 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0245e08f98d627a579cdee6a2138d05ab64f6093efbcdeec50805d121ee13c0c" +"checksum jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "288dca7f9713710a29e485076b9340156cb701edb46a881f5d0c31aa4f5b9143" +"checksum jsonrpc-core-client 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05e499e393aaa97cf5ff3a7444549c94a6d27e70be1c300b865187d722f1b426" +"checksum jsonrpc-derive 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b65eafb36286a4251c9a1d4cdf4e9a7cf8fa4f7bf991383e42f0cf26908767" +"checksum jsonrpc-http-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea8b3996f19dc6dd90d928c81d30b3ce9535840487734290da9fae3b3185db5d" +"checksum jsonrpc-pubsub 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fcdd238ecccde73faea93760b068f3fe3ca84caeb6b5414c2aabd4f008dad418" +"checksum jsonrpc-server-utils 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "036a53ffa47533dcccf1e1bb16abb0f45ef9a2dc9a63654d2d2cd199b80ad33e" +"checksum jsonrpc-ws-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "977ea40f077c027553e4112d750114b9e5cc7bcf5642512838abc2a9b322bd23" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" -"checksum keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a02fb74dc1b613522069b5f2023c014756ce121c6c6fb39364c139b0efc39a2d" +"checksum keccak-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "af672553b2abac1c86c29fd62c79880638b6abc91d96db4aa42a5baab2bc1ca9" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" @@ -5534,100 +5841,105 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "e962c7641008ac010fa60a7dfdc1712449f29c44ef2d4702394aea943ee75047" -"checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" -"checksum libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0231edab431064b30b7749484a39735eb36492cef4658c372c9059e58c3003aa" -"checksum libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a3bad2ed26297112847678683dd221473a0d44297250b61f004e1b35e72493" -"checksum libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f765f103b680cbed910b02bfdbdcfce5b1142899c93e51acb960bf59b6f81b1" -"checksum libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b129d20cc8cbb6ce5da8361045649c024659173e246c5dfbf20ae06071c046a" -"checksum libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70d68816b8435d6788399416eb2f0a6974fb1d15c4be5c30141f87c8e81746df" -"checksum libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "718ca645a065fd70855ca6042a7df686c24cd21add750c37a82c811fbd1e5c43" -"checksum libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbe27c623a6a720efd5d704347838972062f89149a9c3cd149748da60bdcd3e0" -"checksum libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9bc1a5d85f4812cae6367b49a432763fe28997bac7c530dc55b70ec18a78aa7" -"checksum libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe5a858342a1cc89464474f7edc4bae1da649b9c823a3e04d9fb494493601746" -"checksum libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc6b5185c50a52a12e7bbe2ee7799059e24de4e52ab25edbfd26c8ab8515d317" -"checksum libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7905c1431ad115bee83405770629a27d6f17153ad02ec9670a7347998ef20e22" -"checksum libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc17626763ded57da8fed73187c2d9f6ebb89d30838673c430315bf560c7e4db" -"checksum libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2409d08b809ab1a74269597f7da2829d117cc11b9ed3343af33fc20831619726" -"checksum libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258cdc6742945c8f6402997bbbf36733588e2db18e5a0014da6d46e3ccfb92cf" -"checksum libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b5691e2ba2720d42bd1e93d6b90239fa9235c1956ef6a5f1dd499a7ae2767be" -"checksum libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ab0b9ca050105fd94229c48911c0c84aef4d6b86a53d1b6df81d938354e47e" -"checksum libp2p-websocket 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81692c3141a9aefd84f4faffdc93985af3858ef82ed7fe8185e6b27437b36183" -"checksum libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" -"checksum librocksdb-sys 5.14.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b9024327233e7fac7982440f73301c00046d438c5b1011e8f4e394226ce19007" +"checksum libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "6281b86796ba5e4366000be6e9e18bf35580adf9e63fbe2294aadb587613a319" +"checksum libloading 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a5692f82b51823e27c4118b3e5c0d98aee9be90633ebc71ad12afef380b50219" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" +"checksum librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19778314deaa7048f2ea7d07b8aa12e1c227acebe975a37eeab6d2f8c74e41b" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" "checksum linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7c91c4c7bbeb4f2f7c4e5be11e6a05bd6830bc37249c47ce1ad86ad453ff9c" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -"checksum make-cmd 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8ca8afbe8af1785e09636acb5a41e08a765f5f0340568716c18a8700ba3c0d3" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" -"checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8" +"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum merlin 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a9e97b439f6d38cbe2a4a4aa93f6770c5305f62761b78b1851406c09c87ee2a" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" -"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" +"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" -"checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" +"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17" +"checksum nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46f0f3210768d796e8fa79ec70ee6af172dacbe7147f5e69be5240a47778302b" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" -"checksum nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b30adc557058ce00c9d0d7cb3c6e0b5bc6f36e2e2eabe74b0ba726d194abd588" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" -"checksum num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a69d464bdc213aaaff628444e99578ede64e9c854025aa43b9796530afa9238" +"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" +"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" +"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" +"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ec7bd7ca4cce6dbdc77e7c1230682740d307d1218a87fb0349a571272be749f9" +"checksum openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)" = "1bb974e77de925ef426b6bc82fce15fd45bdcbeb5728bffcfc7cdeeb7ce1c2d6" +"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" "checksum output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b9db194dfbcfe3b398d63d765437a5c7232d59906e203055f0e993f6458ff1" -"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" -"checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" +"checksum parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eb83358a0c05e52c44d658981fec2d146d3516d1adffd9e553684f8c8e9e8fa5" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" -"checksum parity-ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2fec5048fba72a2e01baeb0d08089db79aead4b57e2443df172fb1840075a233" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" +"checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f50392d1265092fbee9273414cc40eb6d47d307bd66222c477bb8450c8504f9d" -"checksum paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a3cd512fe3a55e8933b2dcad913e365639db86d512e4004c3084b86864d9467a" +"checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" +"checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" +"checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" "checksum pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a029430f0d744bc3d15dd474d591bed2402b645d024583082b9f63bb936dac6" "checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66" +"checksum proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0c1dd4172a1e1f96f709341418f49b11ea6c2d95d53dca08c0f74cbd332d9cf3" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "77997c53ae6edd6d187fec07ec41b207063b5ee6f33680e9fa86d405cdd313d4" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d82d117bc7565ce6be0150159251c9b1eeec7b129f5a2aa86e10acb5970de1cb" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e9076cae823584ab4d8fab3a111658d1232faf106611dc8378161b7d062b628" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" -"checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" "checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" @@ -5638,131 +5950,129 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" -"checksum rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b7c690732391ae0abafced5015ffb53656abfaec61b342290e5eb56b286a679d" -"checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03b418169fb9c46533f326efd6eed2576699c44ca92d3052a066214a8d828929" "checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d813022b2e00774a48eaf43caaa3c20b45f040ba8cbf398e2e8911a06668dbe6" -"checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" -"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "checksum rhododendron 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9381ed76c1ec4e8994f1f7d2c6d7e33eed3ff7176e16fece09c2e993fc4a5a" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" "checksum rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1651697fefd273bfb4fd69466cc2a9d20de557a0213b97233b22b5e95924b5e" -"checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"checksum rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c34fa7bcae7fca3c8471e8417088bbc3ad9af8066b0ecf4f3c0d98a0d772716e" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" -"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" -"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" +"checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" "checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" -"checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56" -"checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" -"checksum schnorrkel 0.1.1 (git+https://github.com/paritytech/schnorrkel)" = "" +"checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfaccd3a23619349e0878d9a241f34b1982343cdf67367058cd7d078d326b63e" -"checksum security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfab8dda0e7a327c696d893df9ffa19cadc4bd195797997f5223cf5831beaf05" -"checksum security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6696852716b589dff9e886ff83778bb635150168e83afa8ac6b8a78cb82abc" +"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" +"checksum security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eee63d0f4a9ec776eeb30e220f0bc1e092c3ad744b2a379e3993070364d3adc2" +"checksum security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9636f8989cbf61385ae4824b98c1aaa54c994d7d8b41f11c601ed799f0549a56" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" -"checksum serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)" = "2e20fde37801e83c891a2dc4ebd3b81f0da4d1fb67a9e0a2a3b921e2536a58ee" -"checksum serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)" = "633e97856567e518b59ffb2ad7c7a4fd4c5d91d9c7f32dd38a27b2bf7e8114ea" -"checksum serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "27dce848e7467aa0e2fcaf0a413641499c0b745452aaca1194d24dedde9e13c9" +"checksum serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "32746bf0f26eab52f06af0d0aa1984f641341d06d8d673c693871da2d188c9be" +"checksum serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "46a3223d0c9ba936b61c0d2e3e559e3217dbfb8d65d06d26e8b3c25de38bae3e" +"checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" -"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eff3b513cf2e0d1a60e1aba152dc72bedc5b05585722bb3cebd7bcb1e31b98f" -"checksum smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "88aea073965ab29f6edb5493faf96ad662fb18aa9eeb186a3b7057951605ed15" -"checksum snow 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7251f8920e9043106cfe466c04ed3eb257b8315a7699259c4fd0af6dffb6aef6" +"checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" +"checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "461e7f2e33670b1c33f1ea22bb2f86de6136fabd0c4d27d167ed425c231143ca" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "432465093692af7379dcd196ce4be398c906958d91b412fff9102a66238d6f26" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" -"checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" +"checksum string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0bbfb8937e38e34c3444ff00afb28b0811d9554f15c5ad64d12b0308d1d1995" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" -"checksum structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "670ad348dc73012fcf78c71f06f9d942232cdd4c859d4b6975e27836c3efc0c3" -"checksum structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ef98172b1a00b0bec738508d3726540edcbd186d50dfd326f2b1febbb3559f04" +"checksum structopt 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c767a8971f53d7324583085deee2e230903be09e52fb27df9af94c5cb2b43c31" +"checksum structopt-derive 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c57a30c87454ced2186f62f940e981746e8cbbe026d52090c8c4352b636f8235" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" +"checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b4cfac95805274c6afdb12d8f770fa2d27c045953e7b630a81801953699a9a" -"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum sysinfo 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4da1ccc493b46042d6f5352910a7f18ed8fe81307dd7db3f2e2d8a7db6f6284" -"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" +"checksum sysinfo 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65f0e28a49b7bf142cee89befd7077b40627d7cc70aa8a8acfe03afc26016c33" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -"checksum tempfile 3.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "37daa55a7240c4931c84559f03b3cad7d19535840d1c4a0cc4e9b2fb0dcf70ff" -"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" -"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" +"checksum tempfile 3.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dc4738f2e68ed2855de5ac9cdbe05c9216773ecde4739b2f095002ab03a13ef" +"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" +"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5388a470627f97a01a6e13389ced797a42b1611f9de7e0f6ca705675ac55297" +"checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" -"checksum tinytemplate 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7655088894274afb52b807bd3c87072daa1fedd155068b8705cabfd628956115" +"checksum tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4574b75faccaacddb9b284faecdf0b544b80b6b294f3d062d325c5726a209c20" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" -"checksum tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "65641e515a437b308ab131a82ce3042ff9795bef5d6c5a9be4eb24195c417fd9" +"checksum tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "ec2ffcf4bcfc641413fa0f1427bf8f91dfc78f56a6559cbf50e04837ae442a87" +"checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" "checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" "checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" -"checksum tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b53aeb9d3f5ccf2ebb29e19788f96987fa1355f8fe45ea193928eaaaf3ae820f" -"checksum tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afbcdb0f0d2a1e4c440af82d7bbf0bf91a8a8c0575bcd20c05d15be7e9d3a02f" -"checksum tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fda385df506bf7546e70872767f71e81640f1f251bdf2fd8eb81a0eaec5fe022" +"checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" +"checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" +"checksum tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" +"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "ec5759cf26cf9659555f36c431b515e3d05f66831741c85b4b5d5dfb9cf1323c" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" "checksum tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c" -"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" +"checksum tokio-trace-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9c8a256d6956f7cb5e2bdfe8b1e8022f1a09206c6c2b1ba00f3b746b260c613" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" -"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +"checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-bench 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eafa32a8662c06f5bf135984bc1a12821fd38770b5c2f2f9e8750327fcbe3955" +"checksum trie-bench 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba20f7d9865497ea46511860b43e05a44f4ac9a76ee089d34cd80a839a690264" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" -"checksum trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006314f54f2ea7944a878e66fd93ad7978095bc355f30a2f26ec40f664d86c86" +"checksum trie-standardmap 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ebaa4b340046196efad8872b2dffe585b5ea330230dc44ee14e399f77da29f51" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" +"checksum trybuild 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0b0df728de48978b759da185ed7ef76676ef0c878ae4800c9e90024c998dc75b" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -"checksum unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3218ea14b4edcaccfa0df0a64a3792a2c32cc706f1b336e48867f9d3147f90" +"checksum unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84e5511b2a947f3ae965dcb29b13b7b1691b6e7332cf5dbc1744138d5acb7f6" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" -"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" +"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" "checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" @@ -5776,30 +6086,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum wabt-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a6265b25719e82598d104b3717375e37661d41753e2c84cde3f51050c7ed7e3c" "checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" -"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" -"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" -"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" -"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" -"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" -"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" -"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" -"checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" +"checksum wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" +"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" "checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" -"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" -"checksum websocket 0.22.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d2c67346c042adbd4f5b2a49700e340befc5b772094fec8d36df6b825523d933" -"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" -"checksum which 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e84a603e7e0b1ce1aa1ee2b109c7be00155ce52df5081590d1ffb93f4f515cb2" +"checksum web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" +"checksum websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0adcd2a64c5746c9702b354a1b992802b0c363df1dfa324a74cb7aebe10e0cbf" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" +"checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" +"checksum ws 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ec91ea61b83ce033c43c06c52ddc7532f465c0153281610d44c58b74083aee1a" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" "checksum xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" "checksum yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992" -"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" +"checksum zeroize 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e68403b858b6af538b11614e62dfe9ab2facba9f13a0cafb974855cfb495ec95" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3f07490820219949839d0027b965ffdd659d75be9220c00798762e36c6cd281" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/Cargo.toml b/Cargo.toml index 6f7474293483e12c0386bc2836026612c60d648f..5710d08aff8789fdedd8210477251b9eaefeb7fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,12 @@ path = "node/src/main.rs" [package] name = "substrate" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] build = "build.rs" edition = "2018" [dependencies] -error-chain = "0.12" cli = { package = "node-cli", path = "node/cli" } futures = "0.1" ctrlc = { version = "3.0", features = ["termination"] } @@ -83,14 +82,15 @@ members = [ "node/executor", "node/primitives", "node/runtime", + "node/rpc-client", "node-template", "subkey", + "test-utils/chain-spec-builder", ] exclude = [ "node/runtime/wasm", "core/executor/wasm", "core/test-runtime/wasm", - "test-utils/chain-spec-builder" ] [badges] diff --git a/Dockerfile b/Dockerfile index 5c78740d5ea847f055021e3afbd332fda2647796..c5944dbab6de9231c9fa61af735fcf48d2b5be6b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,38 +1,55 @@ -FROM alpine:edge AS builder +# Note: We don't use Alpine and its packaged Rust/Cargo because they're too often out of date, +# preventing them from being used to build Substrate/Polkadot. + +FROM phusion/baseimage:0.10.2 as builder LABEL maintainer="chevdor@gmail.com" LABEL description="This is the build stage for Substrate. Here we create the binary." -RUN apk add build-base \ - cmake \ - linux-headers \ - openssl-dev \ - clang-dev \ - cargo - ARG PROFILE=release WORKDIR /substrate COPY . /substrate -RUN cargo build --$PROFILE +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y cmake pkg-config libssl-dev git clang + +RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ + export PATH="$PATH:$HOME/.cargo/bin" && \ + rustup toolchain install nightly && \ + rustup target add wasm32-unknown-unknown --toolchain nightly && \ + cargo install --git https://github.com/alexcrichton/wasm-gc && \ + rustup default nightly && \ + ./scripts/build.sh && \ + rustup default stable && \ + cargo build --$PROFILE # ===== SECOND STAGE ====== -FROM alpine:edge +FROM phusion/baseimage:0.10.2 LABEL maintainer="chevdor@gmail.com" LABEL description="This is the 2nd stage: a very small image where we copy the Substrate binary." ARG PROFILE=release + +RUN mv /usr/share/ca* /tmp && \ + rm -rf /usr/share/* && \ + mv /tmp/ca-certificates /usr/share/ && \ + mkdir -p /root/.local/share/Polkadot && \ + ln -s /root/.local/share/Polkadot /data && \ + useradd -m -u 1000 -U -s /bin/sh -d /substrate substrate + COPY --from=builder /substrate/target/$PROFILE/substrate /usr/local/bin -RUN apk add --no-cache ca-certificates \ - libstdc++ \ - openssl +# checks +RUN ldd /usr/local/bin/substrate && \ + /usr/local/bin/substrate --version +# Shrinking RUN rm -rf /usr/lib/python* && \ - mkdir -p /root/.local/share/Substrate && \ - ln -s /root/.local/share/Substrate /data + rm -rf /usr/bin /usr/sbin /usr/share/man +USER substrate EXPOSE 30333 9933 9944 VOLUME ["/data"] -ENTRYPOINT ["/usr/local/bin/substrate"] +CMD ["/usr/local/bin/substrate"] diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000000000000000000000000000000000..9b368f3f04d4c60d5f7bdfcf83eaa323340ab181 --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ +Thank you for your Pull Request! + +Before you submitting, please check that: + +- [ ] You added a brief description of the PR, e.g.: + - What does it do? + - What important points reviewers should know? + - Is there something left for follow-up PRs? +- [ ] You labeled the PR with appropriate labels if you have permissions to do so. +- [ ] You mentioned a related issue if this PR related to it, e.g. `Fixes #228` or `Related #1337`. +- [ ] You asked any particular reviewers to review. If you aren't sure, start with GH suggestions. +- [ ] Your PR adheres [the style guide](https://github.com/paritytech/polkadot/wiki/Style-Guide) + - In particular, mind the maximal line length. + - There is no commented code checked in unless necessary. + - Any panickers have a proof or removed. +- [ ] You bumped the runtime version if there are breaking changes in the **runtime**. +- [ ] You updated any rustdocs which may have changed + +After you've read this notice feel free to remove it. +Thank you! + +✄ ----------------------------------------------------------------------------- diff --git a/README.adoc b/README.adoc index 71c512b820427fd78209ddd2bb54803528132051..2a76525914b0753c7e6b0ffae9e6c951731bc819 100644 --- a/README.adoc +++ b/README.adoc @@ -12,7 +12,7 @@ Substrate is a next-generation framework for blockchain innovation. At its heart, Substrate is a combination of three technologies: https://webassembly.org/[WebAssembly], https://libp2p.io/[Libp2p] and GRANDPA Consensus. About GRANDPA, see this https://hackmd.io/Jd0byWX0RiqFiXUVC78Bdw?view#GRANDPA[definition], https://medium.com/polkadot-network/grandpa-block-finality-in-polkadot-an-introduction-part-1-d08a24a021b5[introduction] and https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf[formal specification]. It is both a library for building new blockchains and a "skeleton key" of a blockchain client, able to synchronize to any Substrate-based chain. -Substrate chains have three distinct features that make them "next-generation": a dynamic, self-defining state-transition function; light-client functionality from day one; and a progressive consensus algorithm with fast block production and adaptive, definite finality. The STF, encoded in WebAssembly, is known as the "runtime". This defines the `execute_block` function, and can specify everything from the staking algorithm, transaction semantics, logging mechanisms and procedures for replacing any aspect of itself or of the blockchain's state ("governance"). Because the runtime is entirely dynamic all of these can be switched out or upgraded at any time. A Substrate chain is very much a "living organizm". +Substrate chains have three distinct features that make them "next-generation": a dynamic, self-defining state-transition function; light-client functionality from day one; and a progressive consensus algorithm with fast block production and adaptive, definite finality. The STF, encoded in WebAssembly, is known as the "runtime". This defines the `execute_block` function, and can specify everything from the staking algorithm, transaction semantics, logging mechanisms and procedures for replacing any aspect of itself or of the blockchain's state ("governance"). Because the runtime is entirely dynamic all of these can be switched out or upgraded at any time. A Substrate chain is very much a "living organism". See also https://www.parity.io/what-is-substrate/. @@ -30,7 +30,7 @@ Substrate is designed to be used in one of three ways: === The Basics of Substrate -Substrate is a blockchain platform with a completely generic state transition function. That said, it does come with both standards and conventions (particularly regarding the Runtime Module Library) regarding underlying datastructures. Roughly speaking, these core datatypes correspond to +trait+s in terms of the actual non-negotiable standard and generic +struct+s in terms of the convention. +Substrate is a blockchain platform with a completely generic state transition function. That said, it does come with both standards and conventions (particularly regarding the Runtime Module Library) regarding underlying data structures. Roughly speaking, these core datatypes correspond to +trait+s in terms of the actual non-negotiable standard and generic +struct+s in terms of the convention. ``` Header := Parent + ExtrinsicsRoot + StorageRoot + Digest @@ -39,7 +39,7 @@ Block := Header + Extrinsics + Justifications === Extrinsics -Extrinsics in Substrate are pieces of information from "the outside world" that are contained in the blocks of the chain. You might think "ahh, that means *transactions*": in fact, no. Extrinsics fall into two broad categories of which only one is *transactions*. The other is known as *inherents*. The difference between these two is that transactions are signed and gossipped on the network and can be deemed useful *per se*. This fits the mold of what you would call transactions in Bitcoin or Ethereum. +Extrinsics in Substrate are pieces of information from "the outside world" that are contained in the blocks of the chain. You might think "ahh, that means *transactions*": in fact, no. Extrinsics fall into two broad categories of which only one is *transactions*. The other is known as *inherents*. The difference between these two is that transactions are signed and gossiped on the network and can be deemed useful *per se*. This fits the mold of what you would call transactions in Bitcoin or Ethereum. Inherents, meanwhile, are not passed on the network and are not signed. They represent data which describes the environment but which cannot call upon anything to prove it such as a signature. Rather they are assumed to be "true" simply because a sufficiently large number of validators have agreed on them being reasonable. @@ -111,7 +111,7 @@ Inherent extrinsic knowledge is again somewhat generic, and the actual construct == Trying out Substrate Node -Substate Node is Substrate's pre-baked blockchain client. You can run a development node locally or configure a new chain and launch your own global testnet. +Substrate Node is Substrate's pre-baked blockchain client. You can run a development node locally or configure a new chain and launch your own global testnet. === On Mac and Ubuntu @@ -173,11 +173,13 @@ You can distribute `mychain.json` so that everyone can synchronize and (dependin If you'd actually like to hack on Substrate, you can just grab the source code and build it. Ensure you have Rust and the support software installed: +==== Linux and Mac + +For Unix-based operating systems, you should run the following commands: + [source, shell] ---- curl https://sh.rustup.rs -sSf | sh -# on Windows download and run rustup-init.exe -# from https://rustup.rs instead rustup update nightly rustup target add wasm32-unknown-unknown --toolchain nightly @@ -195,27 +197,60 @@ sudo apt install cmake pkg-config libssl-dev git clang libclang-dev [source, shell] brew install cmake pkg-config openssl git llvm - - Windows (PowerShell): -+ -[source, shell] ----- -# Install LLVM -# Download and install the Pre Build Windows binaries -# of LLVM from http://releases.llvm.org/download.html - -# Install OpenSSL (through vcpkg) -mkdir \Tools -cd \Tools -git clone https://github.com/Microsoft/vcpkg.git -cd vcpkg -.\bootstrap-vcpkg.bat -.\vcpkg.exe install openssl:x64-windows-static - -$env:OPENSSL_DIR = 'C:\Tools\vcpkg\installed\x64-windows-static' -$env:OPENSSL_STATIC = 'Yes' -[System.Environment]::SetEnvironmentVariable('OPENSSL_DIR', $env:OPENSSL_DIR, [System.EnvironmentVariableTarget]::User) -[System.Environment]::SetEnvironmentVariable('OPENSSL_STATIC', $env:OPENSSL_STATIC, [System.EnvironmentVariableTarget]::User) ----- +To finish installation of Substrate, jump down to <>. + +==== Windows + +If you are trying to set up Substrate on Windows, you should do the following: + +1. First, you will need to download and install "Build Tools for Visual Studio:" + + * You can get it at this link: https://aka.ms/buildtools + * Run the installation file: `vs_buildtools.exe` + * Please ensure the Windows 10 SDK component is included when installing the Visual C++ Build Tools. + * image:https://i.imgur.com/zayVLmu.png[image] + * Restart your computer. + +2. Next, you need to install Rust: + + * Detailed instructions are provided by the https://doc.rust-lang.org/book/ch01-01-installation.html#installing-rustup-on-windows[Rust Book]. + * Download from: https://www.rust-lang.org/tools/install + * Run the installation file: `rustup-init.exe` + > Note that it should not prompt you to install vs_buildtools since you did it in step 1. + * Choose "Default Installation." + * To get started, you need Cargo's bin directory (%USERPROFILE%\.cargo\bin) in your PATH environment variable. Future applications will automatically have the correct environment, but you may need to restart your current shell. + +3. Then, you will need to run some commands in CMD to set up your Wasm Build Environment: + + rustup update nightly + rustup update stable + rustup target add wasm32-unknown-unknown --toolchain nightly + +4. Next, you install wasm-gc, which is used to slim down Wasm files: + + cargo install --git https://github.com/alexcrichton/wasm-gc --force + +5. Then, you need to install LLVM: https://releases.llvm.org/download.html + +6. Next, you need to install OpenSSL, which we will do with `vcpkg`: + + mkdir \Tools + cd \Tools + git clone https://github.com/Microsoft/vcpkg.git + cd vcpkg + .\bootstrap-vcpkg.bat + .\vcpkg.exe install openssl:x64-windows-static + +7. After, you need to add OpenSSL to your System Variables: + + $env:OPENSSL_DIR = 'C:\Tools\vcpkg\installed\x64-windows-static' + $env:OPENSSL_STATIC = 'Yes' + [System.Environment]::SetEnvironmentVariable('OPENSSL_DIR', $env:OPENSSL_DIR, [System.EnvironmentVariableTarget]::User) + [System.Environment]::SetEnvironmentVariable('OPENSSL_STATIC', $env:OPENSSL_STATIC, [System.EnvironmentVariableTarget]::User) + +8. Finally, you need to install `cmake`: https://cmake.org/download/ + +==== Shared Steps Then, grab the Substrate source code: @@ -229,8 +264,8 @@ Then build the code: [source, shell] ---- -./scripts/build.sh # Builds the WebAssembly binaries -cargo build # Builds all native code +./scripts/build.sh # Builds the WebAssembly binaries +cargo build # Builds all native code ---- You can run all the tests if you like: @@ -249,7 +284,7 @@ Detailed logs may be shown by running the node with the following environment va If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two validator nodes for Alice and Bob, who are the initial authorities of the genesis chain specification that have been endowed with a testnet DOTs. We'll give each node a name and expose them so they are listed on link:https://telemetry.polkadot.io/#/Local%20Testnet[Telemetry] . You'll need two terminals windows open. -We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The Bootnode ID of her node is `QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN`, which is generated from the `--node-key` value that we specify below: +We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The Bootnode ID of her node is `QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR`, which is generated from the `--node-key` value that we specify below: [source, shell] cargo run --release \-- \ @@ -265,18 +300,20 @@ In the second terminal, we'll run the following to start Bob's substrate node on [source, shell] cargo run --release \-- \ --base-path /tmp/bob \ - --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN \ + --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR \ --chain=local \ --bob \ --port 30334 \ --telemetry-url ws://telemetry.polkadot.io:1024 \ --validator -Additional Substate CLI usage options are available and may be shown by running `cargo run \-- --help`. +Additional Substrate CLI usage options are available and may be shown by running `cargo run \-- --help`. -=== Joining the Emberic Elm Testnet +[[flaming-fir]] +=== Joining the Flaming Fir Testnet -Emberic Elm is the new testnet for Substrate 1.0. Please note that 1.0 is not compatible with the BBQ-Birch, Charred-Cherry, or Dried-Danta testnets. Ensure you have the dependencies listed above before compiling. +Flaming Fir is the new testnet for Substrate master (2.0). Please note that master is not compatible with the BBQ-Birch, Charred-Cherry, Dried-Danta or Emberic-Elm testnets. Ensure you have the dependencies listed above before compiling. +The master branch might have breaking changes as development progresses, therefore you should make sure you have a reasonably updated client when trying to sync Flaming Fir. [source, shell] ---- @@ -304,8 +341,21 @@ For example, you can choose a custom node name: [source, shell] cargo run --release \-- --name my_custom_name -If you are successful, you will see your node syncing at https://telemetry.polkadot.io/#/Emberic%20Elm +If you are successful, you will see your node syncing at https://telemetry.polkadot.io/#/Flaming%20Fir + +=== Joining the Emberic Elm Testnet + +Emberic Elm is the testnet for Substrate 1.0. Please note that 1.0 is not compatible with the BBQ-Birch, Charred-Cherry, Dried-Danta or Flaming-Fir testnets. +In order to join the Emberic Elm testnet you should build from the `v1.0` branch. Ensure you have the dependencies listed above before compiling. + +[source, shell] +---- +git clone https://github.com/paritytech/substrate.git +cd substrate +git checkout -b v1.0 origin/v1.0 +---- +You can then follow the same steps for building and running as described above in <>. == Documentation diff --git a/core/basic-authorship/Cargo.toml b/core/basic-authorship/Cargo.toml index fdd1be81777260304dd156e9f5df31cb2178c6b0..63408b4329a2f7b60cf7985bbac26d5d3378f437 100644 --- a/core/basic-authorship/Cargo.toml +++ b/core/basic-authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-basic-authorship" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 6dee9be4a21f6c6a511d507b0a0623a6b3388ae4..166a89447e0c424d041d7e45007904bf9886bdad 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -20,7 +20,7 @@ // use std::{self, time, sync::Arc}; -use log::{info, debug, warn, trace}; +use log::{info, debug, trace}; use client::{ self, error, Client as SubstrateClient, CallExecutor, @@ -30,12 +30,13 @@ use codec::Decode; use consensus_common::{self, evaluation}; use primitives::{H256, Blake2Hasher, ExecutionContext}; use runtime_primitives::traits::{ - Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, AuthorityIdFor + Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, + AuthorityIdFor, DigestFor, }; use runtime_primitives::generic::BlockId; use runtime_primitives::ApplyError; use transaction_pool::txpool::{self, Pool as TransactionPool}; -use inherents::{InherentData, pool::InherentsPool}; +use inherents::InherentData; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; /// Build new blocks. @@ -53,11 +54,13 @@ pub trait AuthoringApi: Send + Sync + ProvideRuntimeApi where /// The error used by this API type. type Error: std::error::Error; - /// Build a block on top of the given, with inherent extrinsics pre-pushed. - fn build_block) -> ()>( + /// Build a block on top of the given block, with inherent extrinsics and + /// inherent digests pre-pushed. + fn build_block) -> ()>( &self, at: &BlockId, inherent_data: InherentData, + inherent_digests: DigestFor, build_ctx: F, ) -> Result; } @@ -88,13 +91,15 @@ impl AuthoringApi for SubstrateClient where type Block = Block; type Error = client::error::Error; - fn build_block) -> ()>( + fn build_block) -> ()>( &self, at: &BlockId, inherent_data: InherentData, + inherent_digests: DigestFor, mut build_ctx: F, ) -> Result { - let mut block_builder = self.new_block_at(at)?; + + let mut block_builder = self.new_block_at(at, inherent_digests)?; let runtime_api = self.runtime_api(); // We don't check the API versions any further here since the dispatch compatibility @@ -114,8 +119,6 @@ pub struct ProposerFactory where A: txpool::ChainApi { pub client: Arc, /// The transaction pool. pub transaction_pool: Arc>, - /// The inherents pool - pub inherents_pool: Arc::Extrinsic>>, } impl consensus_common::Environment<::Block> for ProposerFactory where @@ -145,7 +148,6 @@ impl consensus_common::Environment<::Block> for Propose parent_id: id, parent_number: *parent_header.number(), transaction_pool: self.transaction_pool.clone(), - inherents_pool: self.inherents_pool.clone(), now: Box::new(time::Instant::now), }; @@ -160,8 +162,7 @@ pub struct Proposer { parent_id: BlockId, parent_number: <::Header as HeaderT>::Number, transaction_pool: Arc>, - inherents_pool: Arc::Extrinsic>>, - now: Box time::Instant>, + now: Box time::Instant>, } impl consensus_common::Proposer<::Block> for Proposer where @@ -174,12 +175,16 @@ impl consensus_common::Proposer<::Block> for Pro type Create = Result<::Block, error::Error>; type Error = error::Error; - fn propose(&self, inherent_data: InherentData, max_duration: time::Duration) - -> Result<::Block, error::Error> + fn propose( + &self, + inherent_data: InherentData, + inherent_digests: DigestFor, + max_duration: time::Duration, + ) -> Result<::Block, error::Error> { // leave some time for evaluation and block finalization (33%) let deadline = (self.now)() + max_duration - max_duration / 3; - self.propose_with(inherent_data, deadline) + self.propose_with(inherent_data, inherent_digests, deadline) } } @@ -190,8 +195,12 @@ impl Proposer where A: txpool::ChainApi, client::error::Error: From<::Error>, { - fn propose_with(&self, inherent_data: InherentData, deadline: time::Instant) - -> Result<::Block, error::Error> + fn propose_with( + &self, + inherent_data: InherentData, + inherent_digests: DigestFor, + deadline: time::Instant, + ) -> Result<::Block, error::Error> { use runtime_primitives::traits::BlakeTwo256; @@ -203,17 +212,8 @@ impl Proposer where let block = self.client.build_block( &self.parent_id, inherent_data, + inherent_digests.clone(), |block_builder| { - // Add inherents from the internal pool - - let inherents = self.inherents_pool.drain(); - debug!("Pushing {} queued inherents.", inherents.len()); - for i in inherents { - if let Err(e) = block_builder.push_extrinsic(i) { - warn!("Error while pushing inherent extrinsic from the pool: {:?}", e); - } - } - // proceed with transactions let mut is_first = true; let mut skipped = 0; @@ -296,13 +296,12 @@ mod tests { use test_client::{self, runtime::{Extrinsic, Transfer}, AccountKeyring}; fn extrinsic(nonce: u64) -> Extrinsic { - let tx = Transfer { + Transfer { amount: Default::default(), nonce, from: AccountKeyring::Alice.into(), to: Default::default(), - }; - tx.into_signed_tx() + }.into_signed_tx() } #[test] @@ -317,7 +316,6 @@ mod tests { let proposer_factory = ProposerFactory { client: client.clone(), transaction_pool: txpool.clone(), - inherents_pool: Default::default(), }; let mut proposer = proposer_factory.init( @@ -332,40 +330,11 @@ mod tests { cell.replace(new) }); let deadline = time::Duration::from_secs(3); - let block = proposer.propose(Default::default(), deadline).unwrap(); + let block = proposer.propose(Default::default(), Default::default(), deadline).unwrap(); // then // block should have some extrinsics although we have some more in the pool. assert_eq!(block.extrinsics().len(), 1); assert_eq!(txpool.ready().count(), 2); } - - #[test] - fn should_include_inherents_from_the_pool() { - // given - let client = Arc::new(test_client::new()); - let chain_api = transaction_pool::ChainApi::new(client.clone()); - let txpool = Arc::new(TransactionPool::new(Default::default(), chain_api)); - let inpool = Arc::new(InherentsPool::default()); - - let proposer_factory = ProposerFactory { - client: client.clone(), - transaction_pool: txpool.clone(), - inherents_pool: inpool.clone(), - }; - - inpool.add(extrinsic(0)); - - let proposer = proposer_factory.init( - &client.header(&BlockId::number(0)).unwrap().unwrap(), - &[] - ).unwrap(); - - // when - let deadline = time::Duration::from_secs(3); - let block = proposer.propose(Default::default(), deadline).unwrap(); - - // then - assert_eq!(block.extrinsics().len(), 1); - } } diff --git a/core/cli/Cargo.toml b/core/cli/Cargo.toml index 1309e788de77c3639f0676575901a2f449b3d252..54cde50d1a0c80bc601680c34dcb20fc26d3f99e 100644 --- a/core/cli/Cargo.toml +++ b/core/cli/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "substrate-cli" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate CLI interface." edition = "2018" [dependencies] clap = "~2.32" +derive_more = "0.14.0" env_logger = "0.6" -error-chain = "0.12" log = "0.4" atty = "0.2" regex = "1" @@ -33,6 +33,7 @@ substrate-telemetry = { path = "../../core/telemetry" } keyring = { package = "substrate-keyring", path = "../keyring" } names = "0.11.0" structopt = "0.2" +rpassword = "3.0" [dev-dependencies] tempdir = "0.3" diff --git a/core/cli/src/error.rs b/core/cli/src/error.rs index 07d14eb479873f3b26a41eeb67ff804cb3d15c0f..b052a29710d7fce5f737b3f64b377f7b015d3bbc 100644 --- a/core/cli/src/error.rs +++ b/core/cli/src/error.rs @@ -16,26 +16,38 @@ //! Initialization errors. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - use client; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; - -error_chain! { - foreign_links { - Io(::std::io::Error) #[doc="IO error"]; - Cli(::clap::Error) #[doc="CLI error"]; - Service(::service::Error) #[doc="Substrate service error"]; - Client(client::error::Error) #[doc="Client error"]; - } - errors { - /// Input error. - Input(m: String) { - description("Invalid input"), - display("{}", m), + +/// Result type alias for the CLI. +pub type Result = std::result::Result; + +/// Error type for the CLI. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Io error + Io(std::io::Error), + /// Cli error + Cli(clap::Error), + /// Service error + Service(service::Error), + /// Client error + Client(client::error::Error), + /// Input error + Input(String), + /// Invalid listen multiaddress + #[display(fmt="Invalid listen multiaddress")] + InvalidListenMultiaddress +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(ref err) => Some(err), + Error::Cli(ref err) => Some(err), + Error::Service(ref err) => Some(err), + Error::Client(ref err) => Some(err), + Error::Input(_) => None, + Error::InvalidListenMultiaddress => None, } } } diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index b78e9b064696395b46acb8dc5e2b13fe6d49255f..607ab9ae8591f430ecf9f3a3bead5c28d8e0dbcd 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -29,12 +29,19 @@ use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; use log::{info, warn}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Header, As}; +use runtime_primitives::traits::{Header, SaturatedConversion}; /// Spawn informant on the event loop +#[deprecated(note = "Please use informant::build instead, and then create the task manually")] pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExecutor) where C: Components, { + handle.spawn(exit.until(build(service)).map(|_| ())); +} + +/// Creates an informant in the form of a `Future` that must be polled regularly. +pub fn build(service: &Service) -> impl Future +where C: Components { let network = service.network(); let client = service.client(); let txpool = service.transaction_pool(); @@ -46,78 +53,76 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe let display_notifications = network.status().for_each(move |sync_status| { - if let Ok(info) = client.info() { - let best_number: u64 = info.chain.best_number.as_(); - let best_hash = info.chain.best_hash; - let num_peers = sync_status.num_peers; - let speed = move || speed(best_number, last_number, last_update); - last_update = time::Instant::now(); - let (status, target) = match (sync_status.sync.state, sync_status.sync.best_seen_block) { - (SyncState::Idle, _) => ("Idle".into(), "".into()), - (SyncState::Downloading, None) => (format!("Syncing{}", speed()), "".into()), - (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed()), format!(", target=#{}", n)), - }; - last_number = Some(best_number); - let txpool_status = txpool.status(); - let finalized_number: u64 = info.chain.finalized_number.as_(); - let bandwidth_download = network.average_download_per_sec(); - let bandwidth_upload = network.average_upload_per_sec(); - info!( - target: "substrate", - "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", - Colour::White.bold().paint(&status), - target, - Colour::White.bold().paint(format!("{}", sync_status.num_peers)), - Colour::White.paint(format!("{}", best_number)), - best_hash, - Colour::White.paint(format!("{}", finalized_number)), - info.chain.finalized_hash, - TransferRateFormat(bandwidth_download), - TransferRateFormat(bandwidth_upload), - ); - - let backend = (*client).backend(); - let used_state_cache_size = match backend.used_state_cache_size(){ - Some(size) => size, - None => 0, - }; - - // get cpu usage and memory usage of this process - let (cpu_usage, memory) = if sys.refresh_process(self_pid) { - let proc = sys.get_process(self_pid).expect("Above refresh_process succeeds, this should be Some(), qed"); - (proc.cpu_usage(), proc.memory()) - } else { (0.0, 0) }; - - let network_state = network.network_state(); - - telemetry!( - SUBSTRATE_INFO; - "system.interval"; - "network_state" => network_state, - "status" => format!("{}{}", status, target), - "peers" => num_peers, - "height" => best_number, - "best" => ?best_hash, - "txcount" => txpool_status.ready, - "cpu" => cpu_usage, - "memory" => memory, - "finalized_height" => finalized_number, - "finalized_hash" => ?info.chain.finalized_hash, - "bandwidth_download" => bandwidth_download, - "bandwidth_upload" => bandwidth_upload, - "used_state_cache_size" => used_state_cache_size, - ); - } else { - warn!("Error getting best block information"); - } + let info = client.info(); + let best_number = info.chain.best_number.saturated_into::(); + let best_hash = info.chain.best_hash; + let num_peers = sync_status.num_peers; + let speed = move || speed(best_number, last_number, last_update); + last_update = time::Instant::now(); + let (status, target) = match (sync_status.sync.state, sync_status.sync.best_seen_block) { + (SyncState::Idle, _) => ("Idle".into(), "".into()), + (SyncState::Downloading, None) => (format!("Syncing{}", speed()), "".into()), + (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed()), format!(", target=#{}", n)), + }; + last_number = Some(best_number); + let txpool_status = txpool.status(); + let finalized_number: u64 = info.chain.finalized_number.saturated_into::(); + let bandwidth_download = network.average_download_per_sec(); + let bandwidth_upload = network.average_upload_per_sec(); + info!( + target: "substrate", + "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", + Colour::White.bold().paint(&status), + target, + Colour::White.bold().paint(format!("{}", sync_status.num_peers)), + Colour::White.paint(format!("{}", best_number)), + best_hash, + Colour::White.paint(format!("{}", finalized_number)), + info.chain.finalized_hash, + TransferRateFormat(bandwidth_download), + TransferRateFormat(bandwidth_upload), + ); + + #[allow(deprecated)] + let backend = (*client).backend(); + let used_state_cache_size = match backend.used_state_cache_size(){ + Some(size) => size, + None => 0, + }; + + // get cpu usage and memory usage of this process + let (cpu_usage, memory) = if sys.refresh_process(self_pid) { + let proc = sys.get_process(self_pid).expect("Above refresh_process succeeds, this should be Some(), qed"); + (proc.cpu_usage(), proc.memory()) + } else { (0.0, 0) }; + + let network_state = network.network_state(); + + telemetry!( + SUBSTRATE_INFO; + "system.interval"; + "network_state" => network_state, + "status" => format!("{}{}", status, target), + "peers" => num_peers, + "height" => best_number, + "best" => ?best_hash, + "txcount" => txpool_status.ready, + "cpu" => cpu_usage, + "memory" => memory, + "finalized_height" => finalized_number, + "finalized_hash" => ?info.chain.finalized_hash, + "bandwidth_download" => bandwidth_download, + "bandwidth_upload" => bandwidth_upload, + "used_state_cache_size" => used_state_cache_size, + ); Ok(()) }); let client = service.client(); - let mut last = match client.info() { - Ok(info) => Some((info.chain.best_number, info.chain.best_hash)), - Err(e) => { warn!("Error getting best block information: {:?}", e); None } + let mut last = { + let info = client.info(); + Some((info.chain.best_number, info.chain.best_hash)) }; let display_block_import = client.import_notification_stream().for_each(move |n| { @@ -125,6 +130,7 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe if let Some((ref last_num, ref last_hash)) = last { if n.header.parent_hash() != last_hash { let tree_route = ::client::blockchain::tree_route( + #[allow(deprecated)] client.backend().blockchain(), BlockId::Hash(last_hash.clone()), BlockId::Hash(n.hash), @@ -156,17 +162,17 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe Ok(()) }); - let informant_work = display_notifications.join3(display_block_import, display_txpool_import); - handle.spawn(exit.until(informant_work).map(|_| ())); + display_notifications.join3(display_block_import, display_txpool_import) + .map(|((), (), ())| ()) } fn speed(best_number: u64, last_number: Option, last_update: time::Instant) -> String { let since_last_millis = last_update.elapsed().as_secs() * 1000; let since_last_subsec_millis = last_update.elapsed().subsec_millis() as u64; - let speed = match last_number { - Some(num) => (best_number.saturating_sub(num) * 10_000 / (since_last_millis + since_last_subsec_millis)) as f64, - None => 0.0 - }; + let speed = last_number + .and_then(|num| + (best_number.saturating_sub(num) * 10_000).checked_div(since_last_millis + since_last_subsec_millis)) + .map_or(0.0, |s| s as f64); if speed < 1.0 { "".into() diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 296e8e3c3f7c20f1b8af48df65c32f8b5ac68486..c14c9625917e51d9a6b487668b634151d38429c8 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -26,7 +26,6 @@ pub mod error; pub mod informant; use client::ExecutionStrategies; -use runtime_primitives::traits::As; use service::{ ServiceFactory, FactoryFullConfiguration, RuntimeGenesis, FactoryGenesis, PruningMode, ChainSpec, @@ -50,13 +49,12 @@ use structopt::{StructOpt, clap::AppSettings}; pub use structopt::clap::App; use params::{ RunCmd, PurgeChainCmd, RevertCmd, ImportBlocksCmd, ExportBlocksCmd, BuildSpecCmd, - NetworkConfigurationParams, SharedParams, MergeParameters, TransactionPoolParams, - NodeKeyParams, NodeKeyType + NetworkConfigurationParams, MergeParameters, TransactionPoolParams, + NodeKeyParams, NodeKeyType, Cors, }; -pub use params::{NoCustom, CoreParams}; +pub use params::{NoCustom, CoreParams, SharedParams}; pub use traits::{GetLogFilter, AugmentClap}; use app_dirs::{AppInfo, AppDataType}; -use error_chain::bail; use log::info; use lazy_static::lazy_static; @@ -146,10 +144,6 @@ fn base_path(cli: &SharedParams, version: &VersionInfo) -> PathBuf { ) } -fn input_err>(msg: T) -> error::Error { - error::ErrorKind::Input(msg.into()).into() -} - /// Check whether a node name is considered as valid fn is_node_name_valid(_name: &str) -> Result<(), &str> { let name = _name.to_string(); @@ -184,7 +178,7 @@ fn is_node_name_valid(_name: &str) -> Result<(), &str> { /// /// `CC` is a custom subcommand. This needs to be an `enum`! If no custom subcommand is required, /// `NoCustom` can be used as type here. -/// `RP` is are custom parameters for the run command. This needs to be a `struct`! The custom +/// `RP` are custom parameters for the run command. This needs to be a `struct`! The custom /// parameters are visible to the user as if they were normal run command parameters. If no custom /// parameters are required, `NoCustom` can be used as type here. pub fn parse_and_execute<'a, F, CC, RP, S, RS, E, I, T>( @@ -201,7 +195,7 @@ where CC: StructOpt + Clone + GetLogFilter, RP: StructOpt + Clone + AugmentClap, E: IntoExit, - RS: FnOnce(E, RP, FactoryFullConfiguration) -> Result<(), String>, + RS: FnOnce(E, RunCmd, RP, FactoryFullConfiguration) -> Result<(), String>, I: IntoIterator, T: Into + Clone, { @@ -279,7 +273,7 @@ where /// Create an error caused by an invalid node key argument. fn invalid_node_key(e: impl std::fmt::Display) -> error::Error { - input_err(format!("Invalid node key: {}", e)) + error::Error::Input(format!("Invalid node key: {}", e)) } /// Parse a Secp256k1 secret key from a hex string into a `network::Secret`. @@ -322,6 +316,7 @@ fn fill_network_configuration( chain_spec_id: &str, config: &mut NetworkConfiguration, client_id: String, + is_dev: bool, ) -> error::Result<()> { config.boot_nodes.extend(cli.bootnodes.into_iter()); config.config_path = Some( @@ -334,7 +329,7 @@ fn fill_network_configuration( } for addr in cli.listen_addr.iter() { - let addr = addr.parse().map_err(|_| "Invalid listen multiaddress")?; + let addr = addr.parse().ok().ok_or(error::Error::InvalidListenMultiaddress)?; config.listen_addresses.push(addr); } @@ -359,11 +354,16 @@ fn fill_network_configuration( config.in_peers = cli.in_peers; config.out_peers = cli.out_peers; - config.enable_mdns = !cli.no_mdns; + config.enable_mdns = !is_dev && !cli.no_mdns; Ok(()) } +fn input_keystore_password() -> Result { + rpassword::read_password_from_tty(Some("Keystore password: ")) + .map_err(|e| format!("{:?}", e)) +} + fn create_run_node_config( cli: RunCmd, spec_factory: S, impl_name: &'static str, version: &VersionInfo ) -> error::Result> @@ -373,6 +373,9 @@ where { let spec = load_spec(&cli.shared_params, spec_factory)?; let mut config = service::Configuration::default_with_spec(spec.clone()); + if cli.interactive_password { + config.password = input_keystore_password()? + } config.impl_name = impl_name; config.impl_commit = version.commit; @@ -384,14 +387,14 @@ where }; match is_node_name_valid(&config.name) { Ok(_) => (), - Err(msg) => bail!( - input_err( + Err(msg) => Err( + error::Error::Input( format!("Invalid node name '{}'. Reason: {}. If unsure, use none.", config.name, msg ) ) - ) + )? } let base_path = base_path(&cli.shared_params, version); @@ -409,7 +412,7 @@ where Some(ref s) if s == "archive" => PruningMode::ArchiveAll, None => PruningMode::default(), Some(s) => PruningMode::keep_blocks( - s.parse().map_err(|_| input_err("Invalid pruning mode specified"))? + s.parse().map_err(|_| error::Error::Input("Invalid pruning mode specified".to_string()))? ), }; @@ -441,6 +444,8 @@ where config.roles = role; config.disable_grandpa = cli.no_grandpa; + let is_dev = cli.shared_params.dev; + let client_id = config.client_id(); fill_network_configuration( cli.network_config, @@ -448,6 +453,7 @@ where spec.id(), &mut config.network, client_id, + is_dev, )?; fill_transaction_pool_configuration::( @@ -459,7 +465,7 @@ where config.keys.push(key); } - if cli.shared_params.dev { + if cli.shared_params.dev && cli.keyring.account.is_none() { config.keys.push("//Alice".into()); } @@ -476,18 +482,20 @@ where config.rpc_ws = Some( parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)? ); - let is_dev = cli.shared_params.dev; + config.rpc_ws_max_connections = cli.ws_max_connections; config.rpc_cors = cli.rpc_cors.unwrap_or_else(|| if is_dev { log::warn!("Running in --dev mode, RPC CORS has been disabled."); - None + Cors::All } else { - Some(vec![ + Cors::List(vec![ "http://localhost:*".into(), + "http://127.0.0.1:*".into(), "https://localhost:*".into(), + "https://127.0.0.1:*".into(), "https://polkadot.js.org".into(), "https://substrate-ui.parity.io".into(), ]) - }); + }).into(); // Override telemetry if cli.no_telemetry { @@ -496,7 +504,8 @@ where config.telemetry_endpoints = Some(TelemetryEndpoints::new(cli.telemetry_endpoints)); } - config.force_authoring = cli.force_authoring; + // Imply forced authoring on --dev + config.force_authoring = cli.shared_params.dev || cli.force_authoring; Ok(config) } @@ -514,11 +523,11 @@ where F: ServiceFactory, E: IntoExit, S: FnOnce(&str) -> Result>>, String>, - RS: FnOnce(E, RP, FactoryFullConfiguration) -> Result<(), String>, + RS: FnOnce(E, RunCmd, RP, FactoryFullConfiguration) -> Result<(), String>, { - let config = create_run_node_config::(cli.left, spec_factory, impl_name, version)?; + let config = create_run_node_config::(cli.left.clone(), spec_factory, impl_name, version)?; - run_service(exit, cli.right, config).map_err(Into::into) + run_service(exit, cli.left, cli.right, config).map_err(Into::into) } // @@ -573,7 +582,8 @@ where Ok(()) } -fn create_config_with_db_path( +/// Creates a configuration including the database path. +pub fn create_config_with_db_path( spec_factory: S, cli: &SharedParams, version: &VersionInfo, ) -> error::Result> where @@ -607,13 +617,13 @@ where let to = cli.to; let json = cli.json; - let file: Box = match cli.output { + let file: Box = match cli.output { Some(filename) => Box::new(File::create(filename)?), None => Box::new(stdout()), }; service::chain_ops::export_blocks::( - config, exit.into_exit(), file, As::sa(from), to.map(As::sa), json + config, exit.into_exit(), file, from.into(), to.map(Into::into), json ).map_err(Into::into) } @@ -630,7 +640,7 @@ where { let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; - let file: Box = match cli.input { + let file: Box = match cli.input { Some(filename) => Box::new(File::open(filename)?), None => Box::new(stdin()), }; @@ -649,7 +659,7 @@ where { let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; let blocks = cli.num; - Ok(service::chain_ops::revert_chain::(config, As::sa(blocks))?) + Ok(service::chain_ops::revert_chain::(config, blocks.into())?) } fn purge_chain( @@ -743,10 +753,10 @@ fn init_logger(pattern: &str) { builder.filter(None, log::LevelFilter::Info); if let Ok(lvl) = std::env::var("RUST_LOG") { - builder.parse(&lvl); + builder.parse_filters(&lvl); } - builder.parse(pattern); + builder.parse_filters(pattern); let isatty = atty::is(atty::Stream::Stderr); let enable_color = isatty; @@ -822,7 +832,7 @@ mod tests { NodeKeyType::variants().into_iter().try_for_each(|t| { let node_key_type = NodeKeyType::from_str(t).unwrap(); let sk = match node_key_type { - NodeKeyType::Secp256k1 => secp256k1::SecretKey::generate().as_ref().to_vec(), + NodeKeyType::Secp256k1 => secp256k1::SecretKey::generate().to_bytes().to_vec(), NodeKeyType::Ed25519 => ed25519::SecretKey::generate().as_ref().to_vec() }; let params = NodeKeyParams { @@ -833,11 +843,11 @@ mod tests { node_key_config(params, &net_config_dir).and_then(|c| match c { NodeKeyConfig::Secp256k1(network::Secret::Input(ref ski)) if node_key_type == NodeKeyType::Secp256k1 && - &sk[..] == ski.as_ref() => Ok(()), + &sk[..] == ski.to_bytes() => Ok(()), NodeKeyConfig::Ed25519(network::Secret::Input(ref ski)) if node_key_type == NodeKeyType::Ed25519 && &sk[..] == ski.as_ref() => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } @@ -863,7 +873,7 @@ mod tests { if node_key_type == NodeKeyType::Secp256k1 && f == &file => Ok(()), NodeKeyConfig::Ed25519(network::Secret::File(ref f)) if node_key_type == NodeKeyType::Ed25519 && f == &file => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } @@ -897,7 +907,7 @@ mod tests { if typ == NodeKeyType::Secp256k1 => Ok(()), NodeKeyConfig::Ed25519(network::Secret::New) if typ == NodeKeyType::Ed25519 => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } @@ -914,7 +924,7 @@ mod tests { NodeKeyConfig::Ed25519(network::Secret::File(ref f)) if typ == NodeKeyType::Ed25519 && f == &dir.join(NODE_KEY_ED25519_FILE) => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 42d98bf7ed1e93d4468e68789b3d601353cd9e87..0cdc633188d7dc3ef8ee80b6bece823e1730b74f 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -20,7 +20,7 @@ use std::path::PathBuf; use structopt::{StructOpt, clap::{arg_enum, _clap_count_exprs, App, AppSettings, SubCommand, Arg}}; use client; -/// Auxialary macro to implement `GetLogFilter` for all types that have the `shared_params` field. +/// Auxiliary macro to implement `GetLogFilter` for all types that have the `shared_params` field. macro_rules! impl_get_log_filter { ( $type:ident ) => { impl $crate::GetLogFilter for $type { @@ -119,7 +119,7 @@ pub struct NetworkConfigurationParams { pub in_peers: u32, /// By default, the network will use mDNS to discover other nodes on the local network. This - /// disables it. + /// disables it. Automatically implied when using --dev. #[structopt(long = "no-mdns")] pub no_mdns: bool, @@ -333,13 +333,17 @@ pub struct RunCmd { #[structopt(long = "ws-port", value_name = "PORT")] pub ws_port: Option, + /// Maximum number of WS RPC server connections. + #[structopt(long = "ws-max-connections", value_name = "COUNT")] + pub ws_max_connections: Option, + /// Specify browser Origins allowed to access the HTTP & WS RPC servers. /// It's a comma-separated list of origins (protocol://domain or special `null` value). /// Value of `all` will disable origin validation. /// Default is to allow localhost, https://polkadot.js.org and https://substrate-ui.parity.io origins. /// When running in --dev mode the default is to allow all origins. #[structopt(long = "rpc-cors", value_name = "ORIGINS", parse(try_from_str = "parse_cors"))] - pub rpc_cors: Option>>, + pub rpc_cors: Option, /// Specify the pruning mode, a number of blocks to keep or 'archive'. Default is 256. #[structopt(long = "pruning", value_name = "PRUNING_MODE")] @@ -395,6 +399,10 @@ pub struct RunCmd { /// Enable authoring even when offline. #[structopt(long = "force-authoring")] pub force_authoring: bool, + + /// Interactive password for validator key. + #[structopt(short = "i")] + pub interactive_password: bool, } /// Stores all required Cli values for a keyring test account. @@ -468,7 +476,7 @@ impl Keyring { } /// Default to verbosity level 0, if none is provided. -fn parse_telemetry_endpoints(s: &str) -> Result<(String, u8), Box> { +fn parse_telemetry_endpoints(s: &str) -> Result<(String, u8), Box> { let pos = s.find(' '); match pos { None => { @@ -482,8 +490,29 @@ fn parse_telemetry_endpoints(s: &str) -> Result<(String, u8), Box>` +/// handling of `structopt`. +#[derive(Clone, Debug)] +pub enum Cors { + /// All hosts allowed + All, + /// Only hosts on the list are allowed. + List(Vec), +} + +impl From for Option> { + fn from(cors: Cors) -> Self { + match cors { + Cors::All => None, + Cors::List(list) => Some(list), + } + } +} + /// Parse cors origins -fn parse_cors(s: &str) -> Result>, Box> { +fn parse_cors(s: &str) -> Result> { let mut is_all = false; let mut origins = Vec::new(); for part in s.split(',') { @@ -496,7 +525,7 @@ fn parse_cors(s: &str) -> Result>, Box> { } } - Ok(if is_all { None } else { Some(origins) }) + Ok(if is_all { Cors::All } else { Cors::List(origins) }) } impl_augment_clap!(RunCmd); @@ -529,11 +558,11 @@ pub struct ExportBlocksCmd { /// Specify starting block number. 1 by default. #[structopt(long = "from", value_name = "BLOCK")] - pub from: Option, + pub from: Option, /// Specify last block number. Best block by default. #[structopt(long = "to", value_name = "BLOCK")] - pub to: Option, + pub to: Option, /// Use JSON output rather than binary. #[structopt(long = "json")] @@ -564,12 +593,12 @@ pub struct ImportBlocksCmd { impl_get_log_filter!(ImportBlocksCmd); -/// The `revert` command used revert the chain to a previos state. +/// The `revert` command used revert the chain to a previous state. #[derive(Debug, StructOpt, Clone)] pub struct RevertCmd { /// Number of blocks to revert. #[structopt(default_value = "256")] - pub num: u64, + pub num: u32, #[allow(missing_docs)] #[structopt(flatten)] diff --git a/core/cli/src/traits.rs b/core/cli/src/traits.rs index ddb389e454ece4aafacc64e7a40e02a171255e68..0f8d247e49ab144f0f916c54fd1f5998e3701734 100644 --- a/core/cli/src/traits.rs +++ b/core/cli/src/traits.rs @@ -16,7 +16,7 @@ use structopt::{StructOpt, clap::App}; -/// Something that can augment a clapp app with further parameters. +/// Something that can augment a clap app with further parameters. /// `derive(StructOpt)` is implementing this function by default, so a macro `impl_augment_clap!` /// is provided to simplify the implementation of this trait. pub trait AugmentClap: StructOpt { diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index f1b7a903ffc0bad036cca42cdd90012cdcdbf1dd..0978b897ec0eb132061da8f900a948f5cb713947 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-client" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -8,10 +8,9 @@ edition = "2018" derive_more = { version = "0.14.0", optional = true } fnv = { version = "1.0", optional = true } log = { version = "0.4", optional = true } -parking_lot = { version = "0.7.1", optional = true } +parking_lot = { version = "0.8.0", optional = true } hex = { package = "hex-literal", version = "0.1", optional = true } futures = { version = "0.1.17", optional = true } -heapsize = { version = "0.4", optional = true } consensus = { package = "substrate-consensus-common", path = "../consensus/common", optional = true } executor = { package = "substrate-executor", path = "../executor", optional = true } state-machine = { package = "substrate-state-machine", path = "../state-machine", optional = true } @@ -49,7 +48,6 @@ std = [ "log", "hex", "futures", - "heapsize", "executor", "state-machine", "keyring", diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 355ed78b9b7a66629182331b60797e7f8b8a3430..64051164b85428b56774408bf2cc883922160af7 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "substrate-client-db" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.7.1" +parking_lot = "0.8" log = "0.4" kvdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } # FIXME replace with release as soon as our rocksdb changes are released upstream https://github.com/paritytech/parity-common/issues/88 -kvdb-rocksdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } -kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d", optional = true } +kvdb-rocksdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d", optional = true } +kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } lru-cache = "0.1.1" hash-db = { version = "0.12" } primitives = { package = "substrate-primitives", path = "../../primitives" } @@ -24,11 +24,10 @@ trie = { package = "substrate-trie", path = "../../trie" } consensus_common = { package = "substrate-consensus-common", path = "../../consensus/common" } [dev-dependencies] -kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } substrate-keyring = { path = "../../keyring" } test-client = { package = "substrate-test-client", path = "../../test-client" } env_logger = { version = "0.6" } [features] default = [] -test-helpers = ["kvdb-memorydb"] +test-helpers = [] diff --git a/core/client/db/src/cache/list_cache.rs b/core/client/db/src/cache/list_cache.rs index 67e09b580d3c4cb2347c547b946ebb25aca569b9..4f343e93fdc93f5dbadf066879b4393be623f076 100644 --- a/core/client/db/src/cache/list_cache.rs +++ b/core/client/db/src/cache/list_cache.rs @@ -44,9 +44,11 @@ use std::collections::BTreeSet; use log::warn; use client::error::{Error as ClientError, Result as ClientResult}; -use runtime_primitives::traits::{Block as BlockT, NumberFor, As, Zero}; +use runtime_primitives::traits::{ + Block as BlockT, NumberFor, Zero, Bounded, CheckedSub +}; -use crate::cache::{CacheItemT, ComplexBlockId}; +use crate::cache::{CacheItemT, ComplexBlockId, EntryType}; use crate::cache::list_entry::{Entry, StorageEntry}; use crate::cache::list_storage::{Storage, StorageTransaction, Metadata}; @@ -135,7 +137,7 @@ impl> ListCache // BUT since we're not guaranteeing to provide correct values for forks // behind the finalized block, check if the block is finalized first - if !chain::is_finalized_block(&self.storage, at, As::sa(::std::u64::MAX))? { + if !chain::is_finalized_block(&self.storage, at, Bounded::max_value())? { return Ok(None); } @@ -174,10 +176,10 @@ impl> ListCache parent: ComplexBlockId, block: ComplexBlockId, value: Option, - is_final: bool, + entry_type: EntryType, ) -> ClientResult>> { // this guarantee is currently provided by LightStorage && we're relying on it here - debug_assert!(!is_final || self.best_finalized_block.hash == parent.hash); + debug_assert!(entry_type != EntryType::Final || self.best_finalized_block.hash == parent.hash); // we do not store any values behind finalized if block.number != Zero::zero() && self.best_finalized_block.number >= block.number { @@ -185,6 +187,7 @@ impl> ListCache } // if the block is not final, it is possibly appended to/forking from existing unfinalized fork + let is_final = entry_type == EntryType::Final || entry_type == EntryType::Genesis; if !is_final { let mut fork_and_action = None; @@ -348,9 +351,9 @@ impl> ListCache ) { let mut do_pruning = || -> ClientResult<()> { // calculate last ancient block number - let ancient_block = match block.number.as_().checked_sub(self.prune_depth.as_()) { - Some(number) => match self.storage.read_id(As::sa(number))? { - Some(hash) => ComplexBlockId::new(hash, As::sa(number)), + let ancient_block = match block.number.checked_sub(&self.prune_depth) { + Some(number) => match self.storage.read_id(number)? { + Some(hash) => ComplexBlockId::new(hash, number), None => return Ok(()), }, None => return Ok(()), @@ -436,7 +439,7 @@ impl Fork { } } - /// Try to append NEW block to the fork. This method willonly 'work' (return true) when block + /// Try to append NEW block to the fork. This method will only 'work' (return true) when block /// is actually appended to the fork AND the best known block of the fork is known (i.e. some /// block has been already appended to this fork after last restart). pub fn try_append(&self, parent: &ComplexBlockId) -> bool { @@ -831,12 +834,27 @@ pub mod tests { #[test] fn list_on_block_insert_works() { + let nfin = EntryType::NonFinal; + let fin = EntryType::Final; + // when trying to insert block < finalized number assert!(ListCache::new(DummyStorage::new(), 1024, test_id(100)) - .on_block_insert(&mut DummyTransaction::new(), test_id(49), test_id(50), Some(50), false).unwrap().is_none()); + .on_block_insert( + &mut DummyTransaction::new(), + test_id(49), + test_id(50), + Some(50), + nfin, + ).unwrap().is_none()); // when trying to insert block @ finalized number assert!(ListCache::new(DummyStorage::new(), 1024, test_id(100)) - .on_block_insert(&mut DummyTransaction::new(), test_id(99), test_id(100), Some(100), false).unwrap().is_none()); + .on_block_insert( + &mut DummyTransaction::new(), + test_id(99), + test_id(100), + Some(100), + nfin, + ).unwrap().is_none()); // when trying to insert non-final block AND it appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block @@ -848,7 +866,7 @@ pub mod tests { ); cache.unfinalized[0].best_block = Some(test_id(4)); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(4), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(4), nfin).unwrap(), Some(CommitOperation::AppendNewBlock(0, test_id(5)))); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); @@ -856,7 +874,7 @@ pub mod tests { // when trying to insert non-final block AND it appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(5), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(5), nfin).unwrap(), Some(CommitOperation::AppendNewEntry(0, Entry { valid_from: test_id(5), value: Some(5) }))); assert_eq!(*tx.inserted_entries(), vec![test_id(5).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -872,7 +890,7 @@ pub mod tests { 1024, test_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(4), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(4), nfin).unwrap(), Some(CommitOperation::AppendNewBlock(0, correct_id(5)))); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); @@ -880,7 +898,7 @@ pub mod tests { // when trying to insert non-final block AND it is the first block that appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(5), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(5), nfin).unwrap(), Some(CommitOperation::AppendNewEntry(0, Entry { valid_from: correct_id(5), value: Some(5) }))); assert_eq!(*tx.inserted_entries(), vec![correct_id(5).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -898,7 +916,7 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(3), fork_id(0, 3, 4), Some(14), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(3), fork_id(0, 3, 4), Some(14), nfin).unwrap(), Some(CommitOperation::AddNewFork(Entry { valid_from: fork_id(0, 3, 4), value: Some(14) }))); assert_eq!(*tx.inserted_entries(), vec![fork_id(0, 3, 4).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -913,7 +931,7 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), false).unwrap(), None); + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), nfin).unwrap(), None); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); assert!(tx.updated_meta().is_none()); @@ -926,16 +944,16 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), nfin).unwrap(), Some(CommitOperation::AddNewFork(Entry { valid_from: correct_id(3), value: Some(3) }))); assert_eq!(*tx.inserted_entries(), vec![correct_id(3).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); assert_eq!(*tx.updated_meta(), Some(Metadata { finalized: Some(correct_id(2)), unfinalized: vec![correct_id(3)] })); - // when inserting finalized entry AND there are no previous finalzed entries + // when inserting finalized entry AND there are no previous finalized entries let cache = ListCache::new(DummyStorage::new(), 1024, correct_id(2)); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), Some(Entry { valid_from: correct_id(3), value: Some(3) }), Default::default()))); assert_eq!(*tx.inserted_entries(), vec![correct_id(3).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -948,14 +966,14 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), None, Default::default()))); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); assert!(tx.updated_meta().is_none()); // when inserting finalized entry AND value differs from previous finalized let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), Some(Entry { valid_from: correct_id(3), value: Some(3) }), Default::default()))); assert_eq!(*tx.inserted_entries(), vec![correct_id(3).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -970,7 +988,7 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), None, vec![0].into_iter().collect()))); } @@ -1031,7 +1049,7 @@ pub mod tests { // when new block is appended to unfinalized fork cache.on_transaction_commit(CommitOperation::AppendNewBlock(0, correct_id(6))); assert_eq!(cache.unfinalized[0].best_block, Some(correct_id(6))); - // when new entry is appnded to unfinalized fork + // when new entry is appended to unfinalized fork cache.on_transaction_commit(CommitOperation::AppendNewEntry(0, Entry { valid_from: correct_id(7), value: Some(7) })); assert_eq!(cache.unfinalized[0].best_block, Some(correct_id(7))); assert_eq!(cache.unfinalized[0].head, Entry { valid_from: correct_id(7), value: Some(7) }); diff --git a/core/client/db/src/cache/list_storage.rs b/core/client/db/src/cache/list_storage.rs index 6271f892bc859059cdc01b44a5d0acd4f3ca67f3..af0b74066c213dc93064a966342c677367568046 100644 --- a/core/client/db/src/cache/list_storage.rs +++ b/core/client/db/src/cache/list_storage.rs @@ -97,19 +97,19 @@ pub struct DbColumns { pub struct DbStorage { name: Vec, meta_key: Vec, - db: Arc, + db: Arc, columns: DbColumns, } impl DbStorage { /// Create new database-backed list cache storage. - pub fn new(name: Vec, db: Arc, columns: DbColumns) -> Self { + pub fn new(name: Vec, db: Arc, columns: DbColumns) -> Self { let meta_key = meta::key(&name); DbStorage { name, meta_key, db, columns } } /// Get reference to the database. - pub fn db(&self) -> &Arc { &self.db } + pub fn db(&self) -> &Arc { &self.db } /// Get reference to the database columns. pub fn columns(&self) -> &DbColumns { &self.columns } diff --git a/core/client/db/src/cache/mod.rs b/core/client/db/src/cache/mod.rs index b5dd45f11dd52e69ea715243924ac5e799e038b1..64d3c4a25e7bf7e2d2a0e594295722b5bd64c307 100644 --- a/core/client/db/src/cache/mod.rs +++ b/core/client/db/src/cache/mod.rs @@ -25,9 +25,9 @@ use client::blockchain::Cache as BlockchainCache; use client::error::Result as ClientResult; use parity_codec::{Encode, Decode}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, As}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; use consensus_common::well_known_cache_keys::Id as CacheKeyId; -use crate::utils::{self, COLUMN_META}; +use crate::utils::{self, COLUMN_META, db_err}; use self::list_cache::ListCache; @@ -35,8 +35,19 @@ mod list_cache; mod list_entry; mod list_storage; -/// Minimal post-finalization age age of finalized blocks before they'll pruned. -const PRUNE_DEPTH: u64 = 1024; +/// Minimal post-finalization age of finalized blocks before they'll pruned. +const PRUNE_DEPTH: u32 = 1024; + +/// The type of entry that is inserted to the cache. +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum EntryType { + /// Non-final entry. + NonFinal, + /// Final entry. + Final, + /// Genesis entry (inserted during cache initialization). + Genesis, +} /// Block identifier that holds both hash and number. #[derive(Clone, Debug, Encode, Decode, PartialEq)] @@ -66,20 +77,22 @@ impl CacheItemT for T where T: Clone + Decode + Encode + PartialEq {} /// Database-backed blockchain data cache. pub struct DbCache { cache_at: HashMap, self::list_storage::DbStorage>>, - db: Arc, + db: Arc, key_lookup_column: Option, header_column: Option, authorities_column: Option, + genesis_hash: Block::Hash, best_finalized_block: ComplexBlockId, } impl DbCache { /// Create new cache. pub fn new( - db: Arc, + db: Arc, key_lookup_column: Option, header_column: Option, authorities_column: Option, + genesis_hash: Block::Hash, best_finalized_block: ComplexBlockId, ) -> Self { Self { @@ -88,10 +101,16 @@ impl DbCache { key_lookup_column, header_column, authorities_column, + genesis_hash, best_finalized_block, } } + /// Set genesis block hash. + pub fn set_genesis_hash(&mut self, genesis_hash: Block::Hash) { + self.genesis_hash = genesis_hash; + } + /// Begin cache transaction. pub fn transaction<'a>(&'a mut self, tx: &'a mut DBTransaction) -> DbCacheTransaction<'a, Block> { DbCacheTransaction { @@ -131,7 +150,7 @@ impl DbCache { fn get_cache_helper<'a, Block: BlockT>( cache_at: &'a mut HashMap, self::list_storage::DbStorage>>, name: CacheKeyId, - db: &Arc, + db: &Arc, key_lookup: Option, header: Option, cache: Option, @@ -147,7 +166,7 @@ fn get_cache_helper<'a, Block: BlockT>( cache, }, ), - As::sa(PRUNE_DEPTH), + PRUNE_DEPTH.into(), best_finalized_block.clone(), ) }) @@ -182,7 +201,7 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { parent: ComplexBlockId, block: ComplexBlockId, data_at: HashMap>, - is_final: bool, + entry_type: EntryType, ) -> ClientResult { assert!(self.cache_at_op.is_empty()); @@ -203,7 +222,7 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { parent.clone(), block.clone(), value.or(cache.value_at_block(&parent)?), - is_final, + entry_type, )?; if let Some(op) = op { self.cache_at_op.insert(name, op); @@ -214,8 +233,10 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { data_at.into_iter().try_for_each(|(name, data)| insert_op(name, Some(data)))?; missed_caches.into_iter().try_for_each(|name| insert_op(name, None))?; - if is_final { - self.best_finalized_block = Some(block); + match entry_type { + EntryType::Final | EntryType::Genesis => + self.best_finalized_block = Some(block), + EntryType::NonFinal => (), } Ok(self) @@ -254,6 +275,25 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { pub struct DbCacheSync(pub RwLock>); impl BlockchainCache for DbCacheSync { + fn initialize(&self, key: &CacheKeyId, data: Vec) -> ClientResult<()> { + let mut cache = self.0.write(); + let genesis_hash = cache.genesis_hash; + let cache_contents = vec![(*key, data)].into_iter().collect(); + let db = cache.db.clone(); + let mut dbtx = DBTransaction::new(); + let tx = cache.transaction(&mut dbtx); + let tx = tx.on_block_insert( + ComplexBlockId::new(Default::default(), Zero::zero()), + ComplexBlockId::new(genesis_hash, Zero::zero()), + cache_contents, + EntryType::Genesis, + )?; + let tx_ops = tx.into_ops(); + db.write(dbtx).map_err(db_err)?; + cache.commit(tx_ops); + Ok(()) + } + fn get_at(&self, key: &CacheKeyId, at: &BlockId) -> Option> { let cache = self.0.read(); let storage = cache.cache_at.get(key)?.storage(); diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index e730c0888d6b456a900b0888fb4369177fa63f9c..674e8022dcf1872121108723090b481d1a460361 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -46,12 +46,15 @@ use parking_lot::{Mutex, RwLock}; use primitives::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash}; use primitives::storage::well_known_keys; use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor, Zero, Digest, DigestItem}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, NumberFor, Zero, One, Digest, DigestItem, + SaturatedConversion +}; use runtime_primitives::BuildStorage; use state_machine::backend::Backend as StateBackend; use executor::RuntimeInfo; use state_machine::{CodeExecutor, DBValue}; -use crate::utils::{Meta, db_err, meta_keys, open_database, read_db, block_id_to_lookup_key, read_meta}; +use crate::utils::{Meta, db_err, meta_keys, read_db, block_id_to_lookup_key, read_meta}; use client::leaves::{LeafSet, FinalizationDisplaced}; use client::children; use state_db::StateDb; @@ -64,10 +67,101 @@ pub use state_db::PruningMode; use client::in_mem::Backend as InMemoryBackend; const CANONICALIZATION_DELAY: u64 = 4096; -const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u64 = 32768; +const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u32 = 32768; /// DB-backed patricia trie state, transaction type is an overlay of changes to commit. -pub type DbState = state_machine::TrieBackend>, Blake2Hasher>; +pub type DbState = state_machine::TrieBackend>, Blake2Hasher>; + +pub struct RefTrackingState { + state: DbState, + storage: Arc>, + parent_hash: Option, +} + +impl RefTrackingState { + fn new(state: DbState, storage: Arc>, parent_hash: Option) -> RefTrackingState { + if let Some(hash) = &parent_hash { + storage.state_db.pin(hash); + } + RefTrackingState { + state, + parent_hash, + storage, + } + } +} + +impl Drop for RefTrackingState { + fn drop(&mut self) { + if let Some(hash) = &self.parent_hash { + self.storage.state_db.unpin(hash); + } + } +} + +impl StateBackend for RefTrackingState { + type Error = >::Error; + type Transaction = >::Transaction; + type TrieBackendStorage = >::TrieBackendStorage; + + fn storage(&self, key: &[u8]) -> Result>, Self::Error> { + self.state.storage(key) + } + + fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { + self.state.storage_hash(key) + } + + fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result>, Self::Error> { + self.state.child_storage(storage_key, key) + } + + fn exists_storage(&self, key: &[u8]) -> Result { + self.state.exists_storage(key) + } + + fn exists_child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result { + self.state.exists_child_storage(storage_key, key) + } + + fn for_keys_with_prefix(&self, prefix: &[u8], f: F) { + self.state.for_keys_with_prefix(prefix, f) + } + + fn for_keys_in_child_storage(&self, storage_key: &[u8], f: F) { + self.state.for_keys_in_child_storage(storage_key, f) + } + + fn storage_root(&self, delta: I) -> (H256, Self::Transaction) + where + I: IntoIterator, Option>)> + { + self.state.storage_root(delta) + } + + fn child_storage_root(&self, storage_key: &[u8], delta: I) -> (Vec, bool, Self::Transaction) + where + I: IntoIterator, Option>)>, + { + self.state.child_storage_root(storage_key, delta) + } + + fn pairs(&self) -> Vec<(Vec, Vec)> { + self.state.pairs() + } + + fn keys(&self, prefix: &[u8]) -> Vec> { + self.state.keys(prefix) + } + + fn child_keys(&self, child_key: &[u8], prefix: &[u8]) -> Vec> { + self.state.child_keys(child_key, prefix) + } + + fn as_trie_backend(&mut self) -> Option<&state_machine::TrieBackend> { + self.state.as_trie_backend() + } +} /// Database settings. pub struct DatabaseSettings { @@ -119,7 +213,7 @@ struct PendingBlock { } // wrapper that implements trait required for state_db -struct StateMetaDb<'a>(&'a KeyValueDB); +struct StateMetaDb<'a>(&'a dyn KeyValueDB); impl<'a> state_db::MetaDb for StateMetaDb<'a> { type Error = io::Error; @@ -131,13 +225,13 @@ impl<'a> state_db::MetaDb for StateMetaDb<'a> { /// Block database pub struct BlockchainDb { - db: Arc, + db: Arc, meta: Arc, Block::Hash>>>, leaves: RwLock>>, } impl BlockchainDb { - fn new(db: Arc) -> Result { + fn new(db: Arc) -> Result { let meta = read_meta::(&*db, columns::META, columns::HEADER)?; let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?; Ok(BlockchainDb { @@ -177,15 +271,15 @@ impl client::blockchain::HeaderBackend for BlockchainDb Result, client::error::Error> { + fn info(&self) -> client::blockchain::Info { let meta = self.meta.read(); - Ok(client::blockchain::Info { + client::blockchain::Info { best_hash: meta.best_hash, best_number: meta.best_number, genesis_hash: meta.genesis_hash, finalized_hash: meta.finalized_hash, finalized_number: meta.finalized_number, - }) + } } fn status(&self, id: BlockId) -> Result { @@ -246,7 +340,7 @@ impl client::blockchain::Backend for BlockchainDb { Ok(self.meta.read().finalized_hash.clone()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } @@ -260,14 +354,14 @@ impl client::blockchain::Backend for BlockchainDb { } impl client::blockchain::ProvideCache for BlockchainDb { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } /// Database transaction pub struct BlockImportOperation { - old_state: CachingState, + old_state: CachingState, Block>, db_updates: PrefixedMemoryDB, storage_updates: Vec<(Vec, Option>)>, changes_trie_updates: MemoryDB, @@ -292,7 +386,7 @@ impl client::backend::BlockImportOperation for BlockImportOperation where Block: BlockT, { - type State = CachingState; + type State = CachingState, Block>; fn state(&self) -> Result, client::error::Error> { Ok(Some(&self.old_state)) @@ -324,29 +418,26 @@ where Block: BlockT, Ok(()) } - fn reset_storage(&mut self, mut top: StorageOverlay, children: ChildrenStorageOverlay) -> Result { + fn reset_storage(&mut self, top: StorageOverlay, children: ChildrenStorageOverlay) -> Result { if top.iter().any(|(k, _)| well_known_keys::is_child_storage_key(k)) { return Err(client::error::Error::GenesisInvalid.into()); } - let mut transaction: PrefixedMemoryDB = Default::default(); - - for (child_key, child_map) in children { + for child_key in children.keys() { if !well_known_keys::is_child_storage_key(&child_key) { return Err(client::error::Error::GenesisInvalid.into()); } - - let (root, is_default, update) = self.old_state.child_storage_root(&child_key, child_map.into_iter().map(|(k, v)| (k, Some(v)))); - transaction.consolidate(update); - - if !is_default { - top.insert(child_key, root); - } } - let (root, update) = self.old_state.storage_root(top.into_iter().map(|(k, v)| (k, Some(v)))); - transaction.consolidate(update); + let child_delta = children.into_iter() + .map(|(storage_key, child_overlay)| + (storage_key, child_overlay.into_iter().map(|(k, v)| (k, Some(v))))); + + let (root, transaction) = self.old_state.full_storage_root( + top.into_iter().map(|(k, v)| (k, Some(v))), + child_delta + ); self.db_updates = transaction; Ok(root) @@ -382,7 +473,7 @@ where Block: BlockT, } struct StorageDb { - pub db: Arc, + pub db: Arc, pub state_db: StateDb>, } @@ -421,13 +512,13 @@ impl state_machine::Storage for DbGenesisStorage { } pub struct DbChangesTrieStorage { - db: Arc, + db: Arc, meta: Arc, Block::Hash>>>, - min_blocks_to_keep: Option, + min_blocks_to_keep: Option, _phantom: ::std::marker::PhantomData, } -impl DbChangesTrieStorage { +impl> DbChangesTrieStorage { /// Commit new changes trie. pub fn commit(&self, tx: &mut DBTransaction, mut changes_trie: MemoryDB) { for (key, (val, _)) in changes_trie.drain() { @@ -446,53 +537,79 @@ impl DbChangesTrieStorage { state_machine::prune_changes_tries( config, &*self, - min_blocks_to_keep, + min_blocks_to_keep.into(), &state_machine::ChangesTrieAnchorBlockId { hash: convert_hash(&block_hash), - number: block_num.as_(), + number: block_num, }, |node| tx.delete(columns::CHANGES_TRIE, node.as_ref())); } } -impl client::backend::PrunableStateChangesTrieStorage for DbChangesTrieStorage { +impl client::backend::PrunableStateChangesTrieStorage + for DbChangesTrieStorage +where + Block: BlockT, +{ fn oldest_changes_trie_block( &self, config: &ChangesTrieConfiguration, - best_finalized_block: u64 - ) -> u64 { + best_finalized_block: NumberFor, + ) -> NumberFor { match self.min_blocks_to_keep { Some(min_blocks_to_keep) => state_machine::oldest_non_pruned_changes_trie( config, - min_blocks_to_keep, + min_blocks_to_keep.into(), best_finalized_block, ), - None => 1, + None => One::one(), } } } -impl state_machine::ChangesTrieRootsStorage for DbChangesTrieStorage { - fn root(&self, anchor: &state_machine::ChangesTrieAnchorBlockId, block: u64) -> Result, String> { +impl state_machine::ChangesTrieRootsStorage> + for DbChangesTrieStorage +where + Block: BlockT, +{ + fn build_anchor( + &self, + hash: H256, + ) -> Result>, String> { + utils::read_header::(&*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Hash(hash)) + .map_err(|e| e.to_string()) + .and_then(|maybe_header| maybe_header.map(|header| + state_machine::ChangesTrieAnchorBlockId { + hash, + number: *header.number(), + } + ).ok_or_else(|| format!("Unknown header: {}", hash))) + } + + fn root( + &self, + anchor: &state_machine::ChangesTrieAnchorBlockId>, + block: NumberFor, + ) -> Result, String> { // check API requirement: we can't get NEXT block(s) based on anchor if block > anchor.number { return Err(format!("Can't get changes trie root at {} using anchor at {}", block, anchor.number)); } // we need to get hash of the block to resolve changes trie root - let block_id = if block <= self.meta.read().finalized_number.as_() { + let block_id = if block <= self.meta.read().finalized_number { // if block is finalized, we could just read canonical hash - BlockId::Number(As::sa(block)) + BlockId::Number(block) } else { // the block is not finalized let mut current_num = anchor.number; let mut current_hash: Block::Hash = convert_hash(&anchor.hash); let maybe_anchor_header: Block::Header = utils::require_header::( - &*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Number(As::sa(current_num)) + &*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Number(current_num) ).map_err(|e| e.to_string())?; if maybe_anchor_header.hash() == current_hash { // if anchor is canonicalized, then the block is also canonicalized - BlockId::Number(As::sa(block)) + BlockId::Number(block) } else { // else (block is not finalized + anchor is not canonicalized): // => we should find the required block hash by traversing @@ -503,7 +620,7 @@ impl state_machine::ChangesTrieRootsStorage for DbC ).map_err(|e| e.to_string())?; current_hash = *current_header.parent_hash(); - current_num = current_num - 1; + current_num = current_num - One::one(); } BlockId::Hash(current_hash) @@ -517,7 +634,11 @@ impl state_machine::ChangesTrieRootsStorage for DbC } } -impl state_machine::ChangesTrieStorage for DbChangesTrieStorage { +impl state_machine::ChangesTrieStorage> + for DbChangesTrieStorage +where + Block: BlockT, +{ fn get(&self, key: &H256, _prefix: &[u8]) -> Result, String> { self.db.get(columns::CHANGES_TRIE, &key[..]) .map_err(|err| format!("{}", err)) @@ -535,6 +656,7 @@ pub struct Backend { blockchain: BlockchainDb, canonicalization_delay: u64, shared_cache: SharedCache, + import_lock: Mutex<()>, } impl> Backend { @@ -542,8 +664,19 @@ impl> Backend { /// /// The pruning window is how old a block must be before the state is pruned. pub fn new(config: DatabaseSettings, canonicalization_delay: u64) -> Result { - let db = open_database(&config, columns::META, "full")?; + Self::new_inner(config, canonicalization_delay) + } + + #[cfg(feature = "kvdb-rocksdb")] + fn new_inner(config: DatabaseSettings, canonicalization_delay: u64) -> Result { + let db = crate::utils::open_database(&config, columns::META, "full")?; + Backend::from_kvdb(db as Arc<_>, config.pruning, canonicalization_delay, config.state_cache_size) + } + #[cfg(not(feature = "kvdb-rocksdb"))] + fn new_inner(config: DatabaseSettings, canonicalization_delay: u64) -> Result { + log::warn!("Running without the RocksDB feature. The database will NOT be saved."); + let db = Arc::new(kvdb_memorydb::create(crate::utils::NUM_COLUMNS)); Backend::from_kvdb(db as Arc<_>, config.pruning, canonicalization_delay, config.state_cache_size) } @@ -561,7 +694,12 @@ impl> Backend { ).expect("failed to create test-db") } - fn from_kvdb(db: Arc, pruning: PruningMode, canonicalization_delay: u64, state_cache_size: usize) -> Result { + fn from_kvdb( + db: Arc, + pruning: PruningMode, + canonicalization_delay: u64, + state_cache_size: usize + ) -> Result { let is_archive_pruning = pruning.is_archive(); let blockchain = BlockchainDb::new(db.clone())?; let meta = blockchain.meta.clone(); @@ -585,6 +723,7 @@ impl> Backend { blockchain, canonicalization_delay, shared_cache: new_shared_cache(state_cache_size), + import_lock: Default::default(), }) } @@ -610,7 +749,7 @@ impl> Backend { } // insert all other headers + bodies + justifications - let info = self.blockchain.info().unwrap(); + let info = self.blockchain.info(); for (number, hash, header) in headers { let id = BlockId::Hash(hash); let justification = self.blockchain.justification(id).unwrap(); @@ -764,7 +903,7 @@ impl> Backend { Ok((*hash, number, false, true)) } - // performs forced canonicaliziation with a delay after importning a non-finalized block. + // performs forced canonicaliziation with a delay after importing a non-finalized block. fn force_delayed_canonicalize( &self, transaction: &mut DBTransaction, @@ -773,7 +912,7 @@ impl> Backend { ) -> Result<(), client::error::Error> { - let number_u64 = number.as_(); + let number_u64 = number.saturated_into::(); if number_u64 > self.canonicalization_delay { let new_canonical = number_u64 - self.canonicalization_delay; @@ -784,7 +923,7 @@ impl> Backend { let hash = if new_canonical == number_u64 { hash } else { - ::client::blockchain::HeaderBackend::hash(&self.blockchain, As::sa(new_canonical))? + ::client::blockchain::HeaderBackend::hash(&self.blockchain, new_canonical.saturated_into())? .expect("existence of block with number `new_canonical` \ implies existence of blocks with all numbers before it; qed") }; @@ -868,7 +1007,7 @@ impl> Backend { changeset.deleted.push(key); } } - let number_u64 = number.as_(); + let number_u64 = number.saturated_into::(); let commit = self.storage.state_db.insert_block(&hash, number_u64, &pending_block.header.parent_hash(), changeset) .map_err(|e: state_db::Error| client::error::Error::from(format!("State database error: {:?}", e)))?; apply_state_commit(&mut transaction, commit); @@ -881,6 +1020,8 @@ impl> Backend { let changes_trie_updates = operation.changes_trie_updates; self.changes_tries_storage.commit(&mut transaction, changes_trie_updates); + let cache = operation.old_state.release(); // release state reference so that it can be finalized + if finalized { // TODO: ensure best chain contains this block. @@ -912,7 +1053,7 @@ impl> Backend { meta_updates.push((hash, number, pending_block.leaf_state.is_best(), finalized)); - Some((number, hash, enacted, retracted, displaced_leaf, is_best)) + Some((number, hash, enacted, retracted, displaced_leaf, is_best, cache)) } else { None }; @@ -934,7 +1075,7 @@ impl> Backend { let write_result = self.storage.db.write(transaction).map_err(db_err); - if let Some((number, hash, enacted, retracted, displaced_leaf, is_best)) = imported { + if let Some((number, hash, enacted, retracted, displaced_leaf, is_best, mut cache)) = imported { if let Err(e) = write_result { let mut leaves = self.blockchain.leaves.write(); let mut undo = leaves.undo(); @@ -949,7 +1090,7 @@ impl> Backend { return Err(e) } - operation.old_state.sync_cache( + cache.sync_cache( &enacted, &retracted, operation.storage_updates, @@ -981,7 +1122,7 @@ impl> Backend { { let f_num = f_header.number().clone(); - if self.storage.state_db.best_canonical().map(|c| f_num.as_() > c).unwrap_or(true) { + if self.storage.state_db.best_canonical().map(|c| f_num.saturated_into::() > c).unwrap_or(true) { let parent_hash = f_header.parent_hash().clone(); let lookup_key = utils::number_and_hash_to_lookup_key(f_num, f_hash.clone()); @@ -1049,7 +1190,7 @@ impl client::backend::AuxStore for Backend where Block: BlockT client::backend::Backend for Backend where Block: BlockT { type BlockImportOperation = BlockImportOperation; type Blockchain = BlockchainDb; - type State = CachingState; + type State = CachingState, Block>; type ChangesTrieStorage = DbChangesTrieStorage; fn begin_operation(&self) -> Result { @@ -1124,14 +1265,14 @@ impl client::backend::Backend for Backend whe } fn revert(&self, n: NumberFor) -> Result, client::error::Error> { - let mut best = self.blockchain.info()?.best_number; - let finalized = self.blockchain.info()?.finalized_number; + let mut best = self.blockchain.info().best_number; + let finalized = self.blockchain.info().finalized_number; let revertible = best - finalized; let n = if revertible < n { revertible } else { n }; - for c in 0 .. n.as_() { - if best == As::sa(0) { - return Ok(As::sa(c)) + for c in 0 .. n.saturated_into::() { + if best.is_zero() { + return Ok(c.saturated_into::>()) } let mut transaction = DBTransaction::new(); match self.storage.state_db.revert_one() { @@ -1141,7 +1282,7 @@ impl client::backend::Backend for Backend whe || client::error::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; - best -= As::sa(1); // prev block + best -= One::one(); // prev block let hash = self.blockchain.hash(best)?.ok_or_else( || client::error::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; @@ -1153,7 +1294,7 @@ impl client::backend::Backend for Backend whe self.blockchain.update_meta(hash, best, true, false); self.blockchain.leaves.write().revert(removed.hash().clone(), removed.number().clone(), removed.parent_hash().clone()); } - None => return Ok(As::sa(c)) + None => return Ok(c.saturated_into::>()) } } Ok(n) @@ -1176,7 +1317,8 @@ impl client::backend::Backend for Backend whe BlockId::Hash(h) if h == Default::default() => { let genesis_storage = DbGenesisStorage::new(); let root = genesis_storage.0.clone(); - let state = DbState::new(Arc::new(genesis_storage), root); + let db_state = DbState::new(Arc::new(genesis_storage), root); + let state = RefTrackingState::new(db_state, self.storage.clone(), None); return Ok(CachingState::new(state, self.shared_cache.clone(), None)); }, _ => {} @@ -1185,9 +1327,10 @@ impl client::backend::Backend for Backend whe match self.blockchain.header(block) { Ok(Some(ref hdr)) => { let hash = hdr.hash(); - if !self.storage.state_db.is_pruned(&hash, hdr.number().as_()) { + if !self.storage.state_db.is_pruned(&hash, (*hdr.number()).saturated_into::()) { let root = H256::from_slice(hdr.state_root().as_ref()); - let state = DbState::new(self.storage.clone(), root); + let db_state = DbState::new(self.storage.clone(), root); + let state = RefTrackingState::new(db_state, self.storage.clone(), Some(hash.clone())); Ok(CachingState::new(state, self.shared_cache.clone(), Some(hash))) } else { Err(client::error::Error::UnknownBlock(format!("State already discarded for {:?}", block))) @@ -1199,16 +1342,20 @@ impl client::backend::Backend for Backend whe } fn have_state_at(&self, hash: &Block::Hash, number: NumberFor) -> bool { - !self.storage.state_db.is_pruned(hash, number.as_()) + !self.storage.state_db.is_pruned(hash, number.saturated_into::()) } - fn destroy_state(&self, mut state: Self::State) -> Result<(), client::error::Error> { - if let Some(hash) = state.parent_hash.clone() { + fn destroy_state(&self, state: Self::State) -> Result<(), client::error::Error> { + if let Some(hash) = state.cache.parent_hash.clone() { let is_best = || self.blockchain.meta.read().best_hash == hash; - state.sync_cache(&[], &[], vec![], None, None, is_best); + state.release().sync_cache(&[], &[], vec![], None, None, is_best); } Ok(()) } + + fn get_import_lock(&self) -> &Mutex<()> { + &self.import_lock + } } impl client::backend::LocalBackend for Backend @@ -1327,7 +1474,7 @@ mod tests { }; let backend = Backend::::from_kvdb(backing, PruningMode::keep_blocks(1), 0, 16777216).unwrap(); - assert_eq!(backend.blockchain().info().unwrap().best_number, 9); + assert_eq!(backend.blockchain().info().best_number, 9); for i in 0..10 { assert!(backend.blockchain().hash(i).unwrap().is_some()) } diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index a571ffe142920578f9435e67c02033081f04719b..b3398bfdffae7c0379e84d4c5113a8957faf2863 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -17,6 +17,7 @@ //! RocksDB-based light client blockchain storage. use std::{sync::Arc, collections::HashMap}; +use std::convert::TryInto; use parking_lot::RwLock; use kvdb::{KeyValueDB, DBTransaction}; @@ -31,12 +32,13 @@ use client::light::blockchain::Storage as LightBlockchainStorage; use parity_codec::{Decode, Encode}; use primitives::Blake2Hasher; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, - Zero, One, As, NumberFor, Digest, DigestItem}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, + Zero, One, NumberFor, Digest, DigestItem, +}; use consensus_common::well_known_cache_keys; -use crate::cache::{DbCacheSync, DbCache, ComplexBlockId}; -use crate::utils::{self, meta_keys, Meta, db_err, open_database, - read_db, block_id_to_lookup_key, read_meta}; +use crate::cache::{DbCacheSync, DbCache, ComplexBlockId, EntryType as CacheEntryType}; +use crate::utils::{self, meta_keys, Meta, db_err, read_db, block_id_to_lookup_key, read_meta}; use crate::DatabaseSettings; use log::{trace, warn, debug}; @@ -57,7 +59,7 @@ const CHANGES_TRIE_CHT_PREFIX: u8 = 1; /// Light blockchain storage. Stores most recent headers + CHTs for older headers. /// Locks order: meta, leaves, cache. pub struct LightStorage { - db: Arc, + db: Arc, meta: RwLock, Block::Hash>>, leaves: RwLock>>, cache: Arc>, @@ -69,8 +71,19 @@ impl LightStorage { /// Create new storage with given settings. pub fn new(config: DatabaseSettings) -> ClientResult { - let db = open_database(&config, columns::META, "light")?; + Self::new_inner(config) + } + + #[cfg(feature = "kvdb-rocksdb")] + fn new_inner(config: DatabaseSettings) -> ClientResult { + let db = crate::utils::open_database(&config, columns::META, "light")?; + Self::from_kvdb(db as Arc<_>) + } + #[cfg(not(feature = "kvdb-rocksdb"))] + fn new_inner(_config: DatabaseSettings) -> ClientResult { + log::warn!("Running without the RocksDB feature. The database will NOT be saved."); + let db = Arc::new(kvdb_memorydb::create(crate::utils::NUM_COLUMNS)); Self::from_kvdb(db as Arc<_>) } @@ -83,7 +96,7 @@ impl LightStorage Self::from_kvdb(db as Arc<_>).expect("failed to create test-db") } - fn from_kvdb(db: Arc) -> ClientResult { + fn from_kvdb(db: Arc) -> ClientResult { let meta = read_meta::(&*db, columns::META, columns::HEADER)?; let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?; let cache = DbCache::new( @@ -91,6 +104,7 @@ impl LightStorage columns::KEY_LOOKUP, columns::HEADER, columns::CACHE, + meta.genesis_hash, ComplexBlockId::new(meta.finalized_hash, meta.finalized_number), ); @@ -141,15 +155,15 @@ impl BlockchainHeaderBackend for LightStorage utils::read_header(&*self.db, columns::KEY_LOOKUP, columns::HEADER, id) } - fn info(&self) -> ClientResult> { + fn info(&self) -> BlockchainInfo { let meta = self.meta.read(); - Ok(BlockchainInfo { + BlockchainInfo { best_hash: meta.best_hash, best_number: meta.best_number, genesis_hash: meta.genesis_hash, finalized_hash: meta.finalized_hash, finalized_number: meta.finalized_number, - }) + } } fn status(&self, id: BlockId) -> ClientResult { @@ -266,12 +280,18 @@ impl LightStorage { transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); // build new CHT(s) if required - if let Some(new_cht_number) = cht::is_build_required(cht::SIZE, *header.number()) { - let new_cht_start: NumberFor = cht::start_number(cht::SIZE, new_cht_number); + if let Some(new_cht_number) = cht::is_build_required(cht::size(), *header.number()) { + let new_cht_start: NumberFor = cht::start_number(cht::size(), new_cht_number); + + let mut current_num = new_cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); let new_header_cht_root = cht::compute_root::( - cht::SIZE, new_cht_number, (new_cht_start.as_()..) - .map(|num| self.hash(As::sa(num))) + cht::size(), new_cht_number, cht_range.map(|num| self.hash(num)) )?; transaction.put( columns::CHT, @@ -281,9 +301,15 @@ impl LightStorage { // if the header includes changes trie root, let's build a changes tries roots CHT if header.digest().log(DigestItem::as_changes_trie_root).is_some() { + let mut current_num = new_cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); let new_changes_trie_cht_root = cht::compute_root::( - cht::SIZE, new_cht_number, (new_cht_start.as_()..) - .map(|num| self.changes_trie_root(BlockId::Number(As::sa(num)))) + cht::size(), new_cht_number, cht_range + .map(|num| self.changes_trie_root(BlockId::Number(num))) )?; transaction.put( columns::CHT, @@ -294,7 +320,7 @@ impl LightStorage { // prune headers that are replaced with CHT let mut prune_block = new_cht_start; - let new_cht_end = cht::end_number(cht::SIZE, new_cht_number); + let new_cht_end = cht::end_number(cht::size(), new_cht_number); trace!(target: "db", "Replacing blocks [{}..{}] with CHT#{}", new_cht_start, new_cht_end, new_cht_number); @@ -327,7 +353,7 @@ impl LightStorage { fn read_cht_root( &self, cht_type: u8, - cht_size: u64, + cht_size: NumberFor, block: NumberFor ) -> ClientResult { let no_cht_for_block = || ClientError::Backend(format!("CHT for block {} not exists", block)); @@ -406,6 +432,7 @@ impl LightBlockchainStorage for LightStorage let is_genesis = number.is_zero(); if is_genesis { + self.cache.0.write().set_genesis_hash(hash); transaction.put(columns::META, meta_keys::GENESIS_HASH, hash.as_ref()); } @@ -434,7 +461,7 @@ impl LightBlockchainStorage for LightStorage ComplexBlockId::new(*header.parent_hash(), if number.is_zero() { Zero::zero() } else { number - One::one() }), ComplexBlockId::new(hash, number), cache_at, - finalized, + if finalized { CacheEntryType::Final } else { CacheEntryType::NonFinal }, )? .into_ops(); @@ -478,11 +505,19 @@ impl LightBlockchainStorage for LightStorage } } - fn header_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult { + fn header_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult { self.read_cht_root(HEADER_CHT_PREFIX, cht_size, block) } - fn changes_trie_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult { + fn changes_trie_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult { self.read_cht_root(CHANGES_TRIE_CHT_PREFIX, cht_size, block) } @@ -522,13 +557,13 @@ impl LightBlockchainStorage for LightStorage Ok(self.meta.read().finalized_hash.clone()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { Some(self.cache.clone()) } } /// Build the key for inserting header-CHT at given block. -fn cht_key>(cht_type: u8, block: N) -> [u8; 5] { +fn cht_key>(cht_type: u8, block: N) -> [u8; 5] { let mut key = [cht_type; 5]; key[1..].copy_from_slice(&utils::number_index_key(block)); key @@ -620,12 +655,12 @@ pub(crate) mod tests { fn returns_info() { let db = LightStorage::new_test(); let genesis_hash = insert_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); - let info = db.info().unwrap(); + let info = db.info(); assert_eq!(info.best_hash, genesis_hash); assert_eq!(info.best_number, 0); assert_eq!(info.genesis_hash, genesis_hash); let best_hash = insert_block(&db, HashMap::new(), || default_header(&genesis_hash, 1)); - let info = db.info().unwrap(); + let info = db.info(); assert_eq!(info.best_hash, best_hash); assert_eq!(info.best_number, 1); assert_eq!(info.genesis_hash, genesis_hash); @@ -666,33 +701,44 @@ pub(crate) mod tests { fn finalized_ancient_headers_are_replaced_with_cht() { fn insert_headers Header>(header_producer: F) -> LightStorage { let db = LightStorage::new_test(); + let cht_size: u64 = cht::size(); + let ucht_size: usize = cht_size as _; // insert genesis block header (never pruned) let mut prev_hash = insert_final_block(&db, HashMap::new(), || header_producer(&Default::default(), 0)); // insert SIZE blocks && ensure that nothing is pruned - for number in 0..cht::SIZE { + + for number in 0..cht::size() { prev_hash = insert_block(&db, HashMap::new(), || header_producer(&prev_hash, 1 + number)); } - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE) as usize); + assert_eq!(db.db.iter(columns::HEADER).count(), 1 + ucht_size); assert_eq!(db.db.iter(columns::CHT).count(), 0); // insert next SIZE blocks && ensure that nothing is pruned - for number in 0..cht::SIZE { - prev_hash = insert_block(&db, HashMap::new(), || header_producer(&prev_hash, 1 + cht::SIZE + number)); + for number in 0..(cht_size as _) { + prev_hash = insert_block( + &db, + HashMap::new(), + || header_producer(&prev_hash, 1 + cht_size + number), + ); } - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE + cht::SIZE) as usize); + assert_eq!(db.db.iter(columns::HEADER).count(), 1 + ucht_size + ucht_size); assert_eq!(db.db.iter(columns::CHT).count(), 0); - // insert block #{2 * cht::SIZE + 1} && check that new CHT is created + headers of this CHT are pruned + // insert block #{2 * cht::size() + 1} && check that new CHT is created + headers of this CHT are pruned // nothing is yet finalized, so nothing is pruned. - prev_hash = insert_block(&db, HashMap::new(), || header_producer(&prev_hash, 1 + cht::SIZE + cht::SIZE)); - assert_eq!(db.db.iter(columns::HEADER).count(), (2 + cht::SIZE + cht::SIZE) as usize); + prev_hash = insert_block( + &db, + HashMap::new(), + || header_producer(&prev_hash, 1 + cht_size + cht_size), + ); + assert_eq!(db.db.iter(columns::HEADER).count(), 2 + ucht_size + ucht_size); assert_eq!(db.db.iter(columns::CHT).count(), 0); // now finalize the block. - for i in (0..(cht::SIZE + cht::SIZE)).map(|i| i + 1) { - db.finalize_header(BlockId::Number(i)).unwrap(); + for i in (0..(ucht_size + ucht_size)).map(|i| i + 1) { + db.finalize_header(BlockId::Number(i as _)).unwrap(); } db.finalize_header(BlockId::Hash(prev_hash)).unwrap(); db @@ -700,34 +746,36 @@ pub(crate) mod tests { // when headers are created without changes tries roots let db = insert_headers(default_header); - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE + 1) as usize); - assert_eq!(db.db.iter(columns::KEY_LOOKUP).count(), (2 * (1 + cht::SIZE + 1)) as usize); + let cht_size: u64 = cht::size(); + assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht_size + 1) as usize); + assert_eq!(db.db.iter(columns::KEY_LOOKUP).count(), (2 * (1 + cht_size + 1)) as usize); assert_eq!(db.db.iter(columns::CHT).count(), 1); - assert!((0..cht::SIZE).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE / 2).is_ok()); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE / 2).is_err()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); + assert!((0..cht_size as _).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); + assert!(db.header_cht_root(cht_size, cht_size / 2).is_ok()); + assert!(db.header_cht_root(cht_size, cht_size + cht_size / 2).is_err()); + assert!(db.changes_trie_cht_root(cht_size, cht_size / 2).is_err()); + assert!(db.changes_trie_cht_root(cht_size, cht_size + cht_size / 2).is_err()); // when headers are created with changes tries roots let db = insert_headers(header_with_changes_trie); - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE + 1) as usize); + assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht_size + 1) as usize); assert_eq!(db.db.iter(columns::CHT).count(), 2); - assert!((0..cht::SIZE).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE / 2).is_ok()); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE / 2).is_ok()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); + assert!((0..cht_size as _).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); + assert!(db.header_cht_root(cht_size, cht_size / 2).is_ok()); + assert!(db.header_cht_root(cht_size, cht_size + cht_size / 2).is_err()); + assert!(db.changes_trie_cht_root(cht_size, cht_size / 2).is_ok()); + assert!(db.changes_trie_cht_root(cht_size, cht_size + cht_size / 2).is_err()); } #[test] fn get_cht_fails_for_genesis_block() { - assert!(LightStorage::::new_test().header_cht_root(cht::SIZE, 0).is_err()); + assert!(LightStorage::::new_test().header_cht_root(cht::size(), 0).is_err()); } #[test] fn get_cht_fails_for_non_existant_cht() { - assert!(LightStorage::::new_test().header_cht_root(cht::SIZE, (cht::SIZE / 2) as u64).is_err()); + let cht_size: u64 = cht::size(); + assert!(LightStorage::::new_test().header_cht_root(cht_size, cht_size / 2).is_err()); } #[test] @@ -736,20 +784,22 @@ pub(crate) mod tests { // insert 1 + SIZE + SIZE + 1 blocks so that CHT#0 is created let mut prev_hash = insert_final_block(&db, HashMap::new(), || header_with_changes_trie(&Default::default(), 0)); - for i in 1..1 + cht::SIZE + cht::SIZE + 1 { + let cht_size: u64 = cht::size(); + let ucht_size: usize = cht_size as _; + for i in 1..1 + ucht_size + ucht_size + 1 { prev_hash = insert_block(&db, HashMap::new(), || header_with_changes_trie(&prev_hash, i as u64)); db.finalize_header(BlockId::Hash(prev_hash)).unwrap(); } - let cht_root_1 = db.header_cht_root(cht::SIZE, cht::start_number(cht::SIZE, 0)).unwrap(); - let cht_root_2 = db.header_cht_root(cht::SIZE, (cht::start_number(cht::SIZE, 0) + cht::SIZE / 2) as u64).unwrap(); - let cht_root_3 = db.header_cht_root(cht::SIZE, cht::end_number(cht::SIZE, 0)).unwrap(); + let cht_root_1 = db.header_cht_root(cht_size, cht::start_number(cht_size, 0)).unwrap(); + let cht_root_2 = db.header_cht_root(cht_size, cht::start_number(cht_size, 0) + cht_size / 2).unwrap(); + let cht_root_3 = db.header_cht_root(cht_size, cht::end_number(cht_size, 0)).unwrap(); assert_eq!(cht_root_1, cht_root_2); assert_eq!(cht_root_2, cht_root_3); - let cht_root_1 = db.changes_trie_cht_root(cht::SIZE, cht::start_number(cht::SIZE, 0)).unwrap(); - let cht_root_2 = db.changes_trie_cht_root(cht::SIZE, (cht::start_number(cht::SIZE, 0) + cht::SIZE / 2) as u64).unwrap(); - let cht_root_3 = db.changes_trie_cht_root(cht::SIZE, cht::end_number(cht::SIZE, 0)).unwrap(); + let cht_root_1 = db.changes_trie_cht_root(cht_size, cht::start_number(cht_size, 0)).unwrap(); + let cht_root_2 = db.changes_trie_cht_root(cht_size, cht::start_number(cht_size, 0) + cht_size / 2).unwrap(); + let cht_root_3 = db.changes_trie_cht_root(cht_size, cht::end_number(cht_size, 0)).unwrap(); assert_eq!(cht_root_1, cht_root_2); assert_eq!(cht_root_2, cht_root_3); } @@ -838,7 +888,7 @@ pub(crate) mod tests { map } - fn get_authorities(cache: &BlockchainCache, at: BlockId) -> Option> { + fn get_authorities(cache: &dyn BlockchainCache, at: BlockId) -> Option> { cache.get_at(&well_known_cache_keys::AUTHORITIES, &at).and_then(|val| Decode::decode(&mut &val[..])) } @@ -984,12 +1034,12 @@ pub(crate) mod tests { fn database_is_reopened() { let db = LightStorage::new_test(); let hash0 = insert_final_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); - assert_eq!(db.info().unwrap().best_hash, hash0); + assert_eq!(db.info().best_hash, hash0); assert_eq!(db.header(BlockId::Hash(hash0)).unwrap().unwrap().hash(), hash0); let db = db.db; let db = LightStorage::from_kvdb(db).unwrap(); - assert_eq!(db.info().unwrap().best_hash, hash0); + assert_eq!(db.info().best_hash, hash0); assert_eq!(db.header(BlockId::Hash::(hash0)).unwrap().unwrap().hash(), hash0); } @@ -1040,4 +1090,24 @@ pub(crate) mod tests { // leaves at same height stay. Leaves at lower heights pruned. assert_eq!(db.leaves.read().hashes(), vec![block2_a, block2_b, block2_c]); } + + #[test] + fn cache_can_be_initialized_after_genesis_inserted() { + let db = LightStorage::::new_test(); + + // before cache is initialized => None + assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), None); + + // insert genesis block (no value for cache is provided) + insert_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); + + // after genesis is inserted => None + assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), None); + + // initialize cache + db.cache().initialize(b"test", vec![42]).unwrap(); + + // after genesis is inserted + cache is initialized => Some + assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), Some(vec![42])); + } } diff --git a/core/client/db/src/storage_cache.rs b/core/client/db/src/storage_cache.rs index 439a749c85346668b0f4620ed6bc709469382d28..cc4670866caadb62ad8417b4c50893251abe44fb 100644 --- a/core/client/db/src/storage_cache.rs +++ b/core/client/db/src/storage_cache.rs @@ -99,6 +99,17 @@ struct LocalCache { hashes: HashMap>, } +/// Cache changes. +pub struct CacheChanges { + /// Shared canonical state cache. + shared_cache: SharedCache, + /// Local cache of values for this state. + local_cache: RwLock>, + /// Hash of the block on top of which this instance was created or + /// `None` if cache is disabled + pub parent_hash: Option, +} + /// State abstraction. /// Manages shared global state cache which reflects the canonical /// state as it is on the disk. @@ -109,56 +120,11 @@ struct LocalCache { pub struct CachingState, B: Block> { /// Backing state. state: S, - /// Shared canonical state cache. - shared_cache: SharedCache, - /// Local cache of values for this state. - local_cache: RwLock>, - /// Hash of the block on top of which this instance was created or - /// `None` if cache is disabled - pub parent_hash: Option, + /// Cache data. + pub cache: CacheChanges } -impl, B: Block> CachingState { - /// Create a new instance wrapping generic State and shared cache. - pub fn new(state: S, shared_cache: SharedCache, parent_hash: Option) -> CachingState { - CachingState { - state, - shared_cache, - local_cache: RwLock::new(LocalCache { - storage: Default::default(), - hashes: Default::default(), - }), - parent_hash: parent_hash, - } - } - - fn storage_insert(cache: &mut Cache, k: StorageValue, v: Option) { - if let Some(v_) = &v { - while cache.storage_used_size + v_.len() > cache.shared_cache_size { - // pop until space constraint satisfied - match cache.storage.remove_lru() { - Some((_, Some(popped_v))) => - cache.storage_used_size = cache.storage_used_size - popped_v.len(), - Some((_, None)) => continue, - None => break, - }; - } - cache.storage_used_size = cache.storage_used_size + v_.len(); - } - cache.storage.insert(k, v); - } - - fn storage_remove( - storage: &mut LruCache>, - k: &StorageKey, - storage_used_size: &mut usize, - ) { - let v = storage.remove(k); - if let Some(Some(v_)) = v { - *storage_used_size = *storage_used_size - v_.len(); - } - } - +impl CacheChanges { /// Propagate local cache into the shared cache and synchronize /// the shared cache with the best block state. /// This function updates the shared cache by removing entries @@ -189,7 +155,7 @@ impl, B: Block> CachingState { m.is_canon = true; for a in &m.storage { trace!("Reverting enacted key {:?}", a); - CachingState::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); + CacheChanges::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); } false } else { @@ -205,7 +171,7 @@ impl, B: Block> CachingState { m.is_canon = false; for a in &m.storage { trace!("Retracted key {:?}", a); - CachingState::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); + CacheChanges::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); } false } else { @@ -228,7 +194,7 @@ impl, B: Block> CachingState { if is_best { trace!("Committing {} local, {} hashes, {} modified entries", local_cache.storage.len(), local_cache.hashes.len(), changes.len()); for (k, v) in local_cache.storage.drain() { - CachingState::::storage_insert(cache, k, v); + CacheChanges::::storage_insert(cache, k, v); } for (k, v) in local_cache.hashes.drain() { cache.hashes.insert(k, v); @@ -248,7 +214,7 @@ impl, B: Block> CachingState { modifications.insert(k.clone()); if is_best { cache.hashes.remove(&k); - CachingState::::storage_insert(cache, k, v); + CacheChanges::::storage_insert(cache, k, v); } } // Save modified storage. These are ordered by the block number. @@ -272,6 +238,50 @@ impl, B: Block> CachingState { } } + fn storage_insert(cache: &mut Cache, k: StorageValue, v: Option) { + if let Some(v_) = &v { + while cache.storage_used_size + v_.len() > cache.shared_cache_size { + // pop until space constraint satisfied + match cache.storage.remove_lru() { + Some((_, Some(popped_v))) => + cache.storage_used_size = cache.storage_used_size - popped_v.len(), + Some((_, None)) => continue, + None => break, + }; + } + cache.storage_used_size = cache.storage_used_size + v_.len(); + } + cache.storage.insert(k, v); + } + + fn storage_remove( + storage: &mut LruCache>, + k: &StorageKey, + storage_used_size: &mut usize, + ) { + let v = storage.remove(k); + if let Some(Some(v_)) = v { + *storage_used_size = *storage_used_size - v_.len(); + } + } +} + +impl, B: Block> CachingState { + /// Create a new instance wrapping generic State and shared cache. + pub fn new(state: S, shared_cache: SharedCache, parent_hash: Option) -> CachingState { + CachingState { + state, + cache: CacheChanges { + shared_cache, + local_cache: RwLock::new(LocalCache { + storage: Default::default(), + hashes: Default::default(), + }), + parent_hash: parent_hash, + }, + } + } + /// Check if the key can be returned from cache by matching current block parent hash against canonical /// state and filtering out entries modified in later blocks. fn is_allowed( @@ -312,6 +322,11 @@ impl, B: Block> CachingState { trace!("Cache lookup skipped for {:?}: parent hash is unknown", key); false } + + /// Dispose state and return cache data. + pub fn release(self) -> CacheChanges { + self.cache + } } impl, B:Block> StateBackend for CachingState { @@ -320,13 +335,13 @@ impl, B:Block> StateBackend for CachingState Result>, Self::Error> { - let local_cache = self.local_cache.upgradable_read(); + let local_cache = self.cache.local_cache.upgradable_read(); if let Some(entry) = local_cache.storage.get(key).cloned() { trace!("Found in local cache: {:?}", key); return Ok(entry) } - let mut cache = self.shared_cache.lock(); - if Self::is_allowed(key, &self.parent_hash, &cache.modifications) { + let mut cache = self.cache.shared_cache.lock(); + if Self::is_allowed(key, &self.cache.parent_hash, &cache.modifications) { if let Some(entry) = cache.storage.get_mut(key).map(|a| a.clone()) { trace!("Found in shared cache: {:?}", key); return Ok(entry) @@ -339,13 +354,13 @@ impl, B:Block> StateBackend for CachingState Result, Self::Error> { - let local_cache = self.local_cache.upgradable_read(); + let local_cache = self.cache.local_cache.upgradable_read(); if let Some(entry) = local_cache.hashes.get(key).cloned() { trace!("Found hash in local cache: {:?}", key); return Ok(entry) } - let mut cache = self.shared_cache.lock(); - if Self::is_allowed(key, &self.parent_hash, &cache.modifications) { + let mut cache = self.cache.shared_cache.lock(); + if Self::is_allowed(key, &self.cache.parent_hash, &cache.modifications) { if let Some(entry) = cache.hashes.get_mut(key).map(|a| a.clone()) { trace!("Found hash in shared cache: {:?}", key); return Ok(entry) @@ -397,12 +412,16 @@ impl, B:Block> StateBackend for CachingState) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { self.state.keys(prefix) } - fn try_into_trie_backend(self) -> Option> { - self.state.try_into_trie_backend() + fn child_keys(&self, child_key: &[u8], prefix: &[u8]) -> Vec> { + self.state.child_keys(child_key, prefix) + } + + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { + self.state.as_trie_backend() } } @@ -432,22 +451,22 @@ mod tests { // blocks [ 3a(c) 2a(c) 2b 1b 1a(c) 0 ] // state [ 5 5 4 3 2 2 ] let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], Some(h0.clone()), Some(0), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], Some(h0.clone()), Some(0), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h0.clone())); - s.sync_cache(&[], &[], vec![], Some(h1a.clone()), Some(1), || true); + s.cache.sync_cache(&[], &[], vec![], Some(h1a.clone()), Some(1), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h0.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], Some(h1b.clone()), Some(1), || false); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], Some(h1b.clone()), Some(1), || false); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1b.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![4]))], Some(h2b.clone()), Some(2), || false); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![4]))], Some(h2b.clone()), Some(2), || false); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1a.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![5]))], Some(h2a.clone()), Some(2), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![5]))], Some(h2a.clone()), Some(2), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2a.clone())); - s.sync_cache(&[], &[], vec![], Some(h3a.clone()), Some(3), || true); + s.cache.sync_cache(&[], &[], vec![], Some(h3a.clone()), Some(3), || true); let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a.clone())); assert_eq!(s.storage(&key).unwrap().unwrap(), vec![5]); @@ -464,7 +483,14 @@ mod tests { // reorg to 3b // blocks [ 3b(c) 3a 2a 2b(c) 1b 1a 0 ] let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2b.clone())); - s.sync_cache(&[h1b.clone(), h2b.clone(), h3b.clone()], &[h1a.clone(), h2a.clone(), h3a.clone()], vec![], Some(h3b.clone()), Some(3), || true); + s.cache.sync_cache( + &[h1b.clone(), h2b.clone(), h3b.clone()], + &[h1a.clone(), h2a.clone(), h3a.clone()], + vec![], + Some(h3b.clone()), + Some(3), + || true + ); let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a.clone())); assert!(s.storage(&key).unwrap().is_none()); } @@ -478,11 +504,11 @@ mod tests { let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); let key = H256::random()[..].to_vec(); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2, 3]))], Some(h0.clone()), Some(0), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2, 3]))], Some(h0.clone()), Some(0), || true); assert_eq!(shared.lock().used_storage_cache_size(), 3 /* bytes */); let key = H256::random()[..].to_vec(); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2]))], Some(h0.clone()), Some(0), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2]))], Some(h0.clone()), Some(0), || true); assert_eq!(shared.lock().used_storage_cache_size(), 5 /* bytes */); } @@ -495,11 +521,11 @@ mod tests { let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); let key = H256::random()[..].to_vec(); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2, 3, 4]))], Some(h0.clone()), Some(0), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2, 3, 4]))], Some(h0.clone()), Some(0), || true); assert_eq!(shared.lock().used_storage_cache_size(), 4 /* bytes */); let key = H256::random()[..].to_vec(); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2]))], Some(h0.clone()), Some(0), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2]))], Some(h0.clone()), Some(0), || true); assert_eq!(shared.lock().used_storage_cache_size(), 2 /* bytes */); } } diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index b51faae6de857620702f839be2ac38ea9913d035..bd7cf660ea4db03d8f70e3e0bb0b4ac163dbc4e1 100644 --- a/core/client/db/src/utils.rs +++ b/core/client/db/src/utils.rs @@ -17,10 +17,10 @@ //! Db-based backend utility structures and functions, used by both //! full and light storages. -use std::sync::Arc; -use std::io; +use std::{io, convert::TryInto, sync::Arc}; use kvdb::{KeyValueDB, DBTransaction}; +#[cfg(feature = "kvdb-rocksdb")] use kvdb_rocksdb::{Database, DatabaseConfig}; use log::debug; @@ -28,7 +28,10 @@ use client; use parity_codec::Decode; use trie::DBValue; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, Zero}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Zero, UniqueSaturatedFrom, + UniqueSaturatedInto, CheckedConversion +}; use crate::DatabaseSettings; /// Number of columns in the db. Must be the same for both full && light dbs. @@ -78,10 +81,8 @@ pub type NumberIndexKey = [u8; 4]; /// /// In the current database schema, this kind of key is only used for /// lookups into an index, NOT for storing header data or others. -pub fn number_index_key(n: N) -> NumberIndexKey where N: As { - let n: u64 = n.as_(); - assert!(n & 0xffffffff00000000 == 0); - +pub fn number_index_key>(n: N) -> NumberIndexKey { + let n = n.checked_into::().unwrap(); [ (n >> 24) as u8, ((n >> 16) & 0xff) as u8, @@ -93,7 +94,7 @@ pub fn number_index_key(n: N) -> NumberIndexKey where N: As { /// Convert number and hash into long lookup key for blocks that are /// not in the canonical chain. pub fn number_and_hash_to_lookup_key(number: N, hash: H) -> Vec where - N: As, + N: TryInto, H: AsRef<[u8]> { let mut lookup_key = number_index_key(number).to_vec(); @@ -103,18 +104,20 @@ pub fn number_and_hash_to_lookup_key(number: N, hash: H) -> Vec where /// Convert block lookup key into block number. /// all block lookup keys start with the block number. -pub fn lookup_key_to_number(key: &[u8]) -> client::error::Result where N: As { +pub fn lookup_key_to_number(key: &[u8]) -> client::error::Result where + N: From +{ if key.len() < 4 { return Err(client::error::Error::Backend("Invalid block key".into())); } - Ok((key[0] as u64) << 24 - | (key[1] as u64) << 16 - | (key[2] as u64) << 8 - | (key[3] as u64)).map(As::sa) + Ok((key[0] as u32) << 24 + | (key[1] as u32) << 16 + | (key[2] as u32) << 8 + | (key[3] as u32)).map(Into::into) } /// Delete number to hash mapping in DB transaction. -pub fn remove_number_to_key_mapping>( +pub fn remove_number_to_key_mapping>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -123,7 +126,7 @@ pub fn remove_number_to_key_mapping>( } /// Remove key mappings. -pub fn remove_key_mappings, H: AsRef<[u8]>>( +pub fn remove_key_mappings, H: AsRef<[u8]>>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -135,7 +138,7 @@ pub fn remove_key_mappings, H: AsRef<[u8]>>( /// Place a number mapping into the database. This maps number to current perceived /// block hash at that position. -pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( +pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -149,7 +152,7 @@ pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( } /// Insert a hash to key mapping in the database. -pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( +pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -166,12 +169,12 @@ pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( /// block lookup key is the DB-key header, block and justification are stored under. /// looks up lookup key by hash from DB as necessary. pub fn block_id_to_lookup_key( - db: &KeyValueDB, + db: &dyn KeyValueDB, key_lookup_col: Option, id: BlockId ) -> Result>, client::error::Error> where Block: BlockT, - ::runtime_primitives::traits::NumberFor: As, + ::runtime_primitives::traits::NumberFor: UniqueSaturatedFrom + UniqueSaturatedInto, { let res = match id { BlockId::Number(n) => db.get( @@ -191,7 +194,12 @@ pub fn db_err(err: io::Error) -> client::error::Error { } /// Open RocksDB database. -pub fn open_database(config: &DatabaseSettings, col_meta: Option, db_type: &str) -> client::error::Result> { +#[cfg(feature = "kvdb-rocksdb")] +pub fn open_database( + config: &DatabaseSettings, + col_meta: Option, + db_type: &str +) -> client::error::Result> { let mut db_config = DatabaseConfig::with_columns(Some(NUM_COLUMNS)); db_config.memory_budget = config.cache_size; let path = config.path.to_str().ok_or_else(|| client::error::Error::Backend("Invalid database path".into()))?; @@ -216,7 +224,12 @@ pub fn open_database(config: &DatabaseSettings, col_meta: Option, db_type: } /// Read database column entry for the given block. -pub fn read_db(db: &KeyValueDB, col_index: Option, col: Option, id: BlockId) -> client::error::Result> +pub fn read_db( + db: &dyn KeyValueDB, + col_index: Option, + col: Option, + id: BlockId +) -> client::error::Result> where Block: BlockT, { @@ -228,7 +241,7 @@ pub fn read_db(db: &KeyValueDB, col_index: Option, col: Option, /// Read a header from the database. pub fn read_header( - db: &KeyValueDB, + db: &dyn KeyValueDB, col_index: Option, col: Option, id: BlockId, @@ -246,7 +259,7 @@ pub fn read_header( /// Required header from the database. pub fn require_header( - db: &KeyValueDB, + db: &dyn KeyValueDB, col_index: Option, col: Option, id: BlockId, @@ -256,7 +269,7 @@ pub fn require_header( } /// Read meta from the database. -pub fn read_meta(db: &KeyValueDB, col_meta: Option, col_header: Option) -> Result< +pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: Option) -> Result< Meta<<::Header as HeaderT>::Number, Block::Hash>, client::error::Error, > diff --git a/core/client/src/backend.rs b/core/client/src/backend.rs index 09faab1a12fedaed23ce6c3017d471acf5487fa6..5028b9dde7a6e3e0614a4588b444a8b9a7872f0b 100644 --- a/core/client/src/backend.rs +++ b/core/client/src/backend.rs @@ -26,6 +26,7 @@ use state_machine::ChangesTrieStorage as StateChangesTrieStorage; use consensus::well_known_cache_keys; use hash_db::Hasher; use trie::MemoryDB; +use parking_lot::Mutex; /// State of a new block. #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -127,7 +128,7 @@ pub trait Backend: AuxStore + Send + Sync where /// Associated state backend type. type State: StateBackend; /// Changes trie storage. - type ChangesTrieStorage: PrunableStateChangesTrieStorage; + type ChangesTrieStorage: PrunableStateChangesTrieStorage; /// Begin a new block insertion transaction with given parent block id. /// When constructing the genesis, this is called with all-zero hash. @@ -174,12 +175,25 @@ pub trait Backend: AuxStore + Send + Sync where fn get_aux(&self, key: &[u8]) -> error::Result>> { AuxStore::get_aux(self, key) } + + /// Gain access to the import lock around this backend. + /// _Note_ Backend isn't expected to acquire the lock by itself ever. Rather + /// the using components should acquire and hold the lock whenever they do + /// something that the import of a block would interfere with, e.g. importing + /// a new block or calculating the best head. + fn get_import_lock(&self) -> &Mutex<()>; } /// Changes trie storage that supports pruning. -pub trait PrunableStateChangesTrieStorage: StateChangesTrieStorage { +pub trait PrunableStateChangesTrieStorage: + StateChangesTrieStorage> +{ /// Get number block of oldest, non-pruned changes trie. - fn oldest_changes_trie_block(&self, config: &ChangesTrieConfiguration, best_finalized: u64) -> u64; + fn oldest_changes_trie_block( + &self, + config: &ChangesTrieConfiguration, + best_finalized: NumberFor, + ) -> NumberFor; } /// Mark for all Backend implementations, that are making use of state data, stored locally. diff --git a/core/client/src/block_builder/block_builder.rs b/core/client/src/block_builder/block_builder.rs index 5c168b2f057d215e739be9ff5e5f9a1a516bc627..4564c29aae4191956e48cd9d9ac21342c1e5f224 100644 --- a/core/client/src/block_builder/block_builder.rs +++ b/core/client/src/block_builder/block_builder.rs @@ -20,14 +20,13 @@ use parity_codec::Encode; use runtime_primitives::ApplyOutcome; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ - Header as HeaderT, Hash, Block as BlockT, One, HashFor, ProvideRuntimeApi, ApiRef + Header as HeaderT, Hash, Block as BlockT, One, HashFor, ProvideRuntimeApi, ApiRef, DigestFor, }; use primitives::{H256, ExecutionContext}; use crate::blockchain::HeaderBackend; -use crate::runtime_api::Core; +use crate::runtime_api::{Core, ApiExt}; use crate::error; - /// Utility for building new (valid) blocks from a stream of extrinsics. pub struct BlockBuilder<'a, Block, A: ProvideRuntimeApi> where Block: BlockT { header: ::Header, @@ -42,14 +41,24 @@ where A: ProvideRuntimeApi + HeaderBackend + 'a, A::Api: BlockBuilderApi, { - /// Create a new instance of builder from the given client, building on the latest block. - pub fn new(api: &'a A) -> error::Result { - api.info().and_then(|i| Self::at_block(&BlockId::Hash(i.best_hash), api)) + /// Create a new instance of builder from the given client, building on the + /// latest block. + pub fn new(api: &'a A, inherent_digests: DigestFor) -> error::Result { + Self::at_block(&BlockId::Hash(api.info().best_hash), api, false, inherent_digests) } - /// Create a new instance of builder from the given client using a particular block's ID to - /// build upon. - pub fn at_block(block_id: &BlockId, api: &'a A) -> error::Result { + /// Create a new instance of builder from the given client using a + /// particular block's ID to build upon with optional proof recording enabled. + /// + /// While proof recording is enabled, all accessed trie nodes are saved. + /// These recorded trie nodes can be used by a third party to prove the + /// output of this block builder without having access to the full storage. + pub fn at_block( + block_id: &BlockId, + api: &'a A, + proof_recording: bool, + inherent_digests: DigestFor, + ) -> error::Result { let number = api.block_number_from_id(block_id)? .ok_or_else(|| error::Error::UnknownBlock(format!("{}", block_id)))? + One::one(); @@ -61,10 +70,19 @@ where Default::default(), Default::default(), parent_hash, - Default::default() + inherent_digests, ); - let api = api.runtime_api(); - api.initialize_block_with_context(block_id, ExecutionContext::BlockConstruction, &header)?; + + let mut api = api.runtime_api(); + + if proof_recording { + api.record_proof(); + } + + api.initialize_block_with_context( + block_id, ExecutionContext::BlockConstruction, &header, + )?; + Ok(BlockBuilder { header, extrinsics: Vec::new(), @@ -77,13 +95,15 @@ where /// /// This will ensure the extrinsic can be validly executed (by executing it); pub fn push(&mut self, xt: ::Extrinsic) -> error::Result<()> { - use crate::runtime_api::ApiExt; - let block_id = &self.block_id; let extrinsics = &mut self.extrinsics; self.api.map_api_result(|api| { - match api.apply_extrinsic_with_context(block_id, ExecutionContext::BlockConstruction, xt.clone())? { + match api.apply_extrinsic_with_context( + block_id, + ExecutionContext::BlockConstruction, + xt.clone() + )? { Ok(ApplyOutcome::Success) | Ok(ApplyOutcome::Fail) => { extrinsics.push(xt); Ok(()) @@ -97,13 +117,34 @@ where /// Consume the builder to return a valid `Block` containing all pushed extrinsics. pub fn bake(mut self) -> error::Result { - self.header = self.api.finalize_block_with_context(&self.block_id, ExecutionContext::BlockConstruction)?; + self.bake_impl()?; + Ok(::new(self.header, self.extrinsics)) + } + + fn bake_impl(&mut self) -> error::Result<()> { + self.header = self.api.finalize_block_with_context( + &self.block_id, ExecutionContext::BlockConstruction + )?; debug_assert_eq!( self.header.extrinsics_root().clone(), - HashFor::::ordered_trie_root(self.extrinsics.iter().map(Encode::encode)), + HashFor::::ordered_trie_root( + self.extrinsics.iter().map(Encode::encode) + ), ); - Ok(::new(self.header, self.extrinsics)) + Ok(()) + } + + /// Consume the builder to return a valid `Block` containing all pushed extrinsics + /// and the generated proof. + /// + /// The proof will be `Some(_)`, if proof recording was enabled while creating + /// the block builder. + pub fn bake_and_extract_proof(mut self) -> error::Result<(Block, Option>>)> { + self.bake_impl()?; + + let proof = self.api.extract_proof(); + Ok((::new(self.header, self.extrinsics), proof)) } } diff --git a/core/client/src/blockchain.rs b/core/client/src/blockchain.rs index b0e7c2943ac86ee71726675f57782312e799d600..b07e26396efb5bee8eda6edaab74d97913b26989 100644 --- a/core/client/src/blockchain.rs +++ b/core/client/src/blockchain.rs @@ -30,7 +30,7 @@ pub trait HeaderBackend: Send + Sync { /// Get block header. Returns `None` if block is not found. fn header(&self, id: BlockId) -> Result>; /// Get blockchain info. - fn info(&self) -> Result>; + fn info(&self) -> Info; /// Get block status. fn status(&self, id: BlockId) -> Result; /// Get block number by hash. Returns `None` if the header is not in the chain. @@ -81,7 +81,7 @@ pub trait Backend: HeaderBackend { /// Get last finalized block hash. fn last_finalized(&self) -> Result; /// Returns data cache reference, if it is enabled on this backend. - fn cache(&self) -> Option>>; + fn cache(&self) -> Option>>; /// Returns hashes of all blocks that are leaves of the block tree. /// in other words, that have no children, are chain heads. @@ -95,11 +95,16 @@ pub trait Backend: HeaderBackend { /// Provides access to the optional cache. pub trait ProvideCache { /// Returns data cache reference, if it is enabled on this backend. - fn cache(&self) -> Option>>; + fn cache(&self) -> Option>>; } /// Blockchain optional data cache. pub trait Cache: Send + Sync { + /// Initialize genesis value for the given cache. + /// + /// The operation should be performed once before anything else is inserted in the cache. + /// Otherwise cache may end up in inconsistent state. + fn initialize(&self, key: &well_known_cache_keys::Id, value_at_genesis: Vec) -> Result<()>; /// Returns cached value by the given key. fn get_at(&self, key: &well_known_cache_keys::Id, block: &BlockId) -> Option>; } diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index 4f6f02c94c5938d78ca395c40999335bb17347a6..f956f27b5058b813452a00e448599da946be27f9 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -14,21 +14,23 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::{sync::Arc, cmp::Ord, panic::UnwindSafe, result}; +use std::{sync::Arc, cmp::Ord, panic::UnwindSafe, result, cell::RefCell, rc::Rc}; use parity_codec::{Encode, Decode}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, RuntimeApiInfo}; +use runtime_primitives::{ + generic::BlockId, traits::Block as BlockT, +}; use state_machine::{ - self, OverlayedChanges, Ext, CodeExecutor, ExecutionManager, ExecutionStrategy, NeverOffchainExt, + self, OverlayedChanges, Ext, CodeExecutor, ExecutionManager, + ExecutionStrategy, NeverOffchainExt, backend::Backend as _, }; use executor::{RuntimeVersion, RuntimeInfo, NativeVersion}; use hash_db::Hasher; use trie::MemoryDB; -use primitives::{H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue, OffchainExt}; +use primitives::{offchain, H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue}; +use crate::runtime_api::{ProofRecorder, InitializeBlock}; use crate::backend; use crate::error; -use crate::runtime_api::Core as CoreApi; /// Method call executor. pub trait CallExecutor @@ -44,7 +46,7 @@ where /// /// No changes are made. fn call< - O: OffchainExt, + O: offchain::Externalities, >( &self, id: &BlockId, @@ -60,8 +62,9 @@ where /// Before executing the method, passed header is installed as the current header /// of the execution context. fn contextual_call< - O: OffchainExt, - PB: Fn() -> error::Result, + 'a, + O: offchain::Externalities, + IB: Fn() -> error::Result<()>, EM: Fn( Result, Self::Error>, Result, Self::Error> @@ -70,15 +73,16 @@ where NC: FnOnce() -> result::Result + UnwindSafe, >( &self, + initialize_block_fn: IB, at: &BlockId, method: &str, call_data: &[u8], - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, - prepare_environment_block: PB, + changes: &RefCell, + initialize_block: InitializeBlock<'a, B>, execution_manager: ExecutionManager, native_call: Option, side_effects_handler: Option<&mut O>, + proof_recorder: &Option>>>, ) -> error::Result> where ExecutionManager: Clone; /// Extract RuntimeVersion of given block @@ -90,7 +94,7 @@ where /// /// No changes are made. fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: state_machine::Backend, F: FnOnce( Result, Self::Error>, @@ -113,14 +117,17 @@ where /// No changes are made. fn prove_at_state>( &self, - state: S, + mut state: S, overlay: &mut OverlayedChanges, method: &str, call_data: &[u8] ) -> Result<(Vec, Vec>), error::Error> { - let trie_state = state.try_into_trie_backend() - .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box)?; - self.prove_at_trie_state(&trie_state, overlay, method, call_data) + let trie_state = state.as_trie_backend() + .ok_or_else(|| + Box::new(state_machine::ExecutionError::UnableToGenerateProof) + as Box + )?; + self.prove_at_trie_state(trie_state, overlay, method, call_data) } /// Execute a call to a contract on top of given trie state, gathering execution proof. @@ -172,7 +179,8 @@ where { type Error = E::Error; - fn call(&self, + fn call( + &self, id: &BlockId, method: &str, call_data: &[u8], @@ -200,8 +208,9 @@ where } fn contextual_call< - O: OffchainExt, - PB: Fn() -> error::Result, + 'a, + O: offchain::Externalities, + IB: Fn() -> error::Result<()>, EM: Fn( Result, Self::Error>, Result, Self::Error> @@ -210,64 +219,75 @@ where NC: FnOnce() -> result::Result + UnwindSafe, >( &self, + initialize_block_fn: IB, at: &BlockId, method: &str, call_data: &[u8], - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, - prepare_environment_block: PB, + changes: &RefCell, + initialize_block: InitializeBlock<'a, Block>, execution_manager: ExecutionManager, native_call: Option, - mut side_effects_handler: Option<&mut O>, + side_effects_handler: Option<&mut O>, + recorder: &Option>>>, ) -> Result, error::Error> where ExecutionManager: Clone { - let state = self.backend.state_at(*at)?; + match initialize_block { + InitializeBlock::Do(ref init_block) + if init_block.borrow().as_ref().map(|id| id != at).unwrap_or(true) => { + initialize_block_fn()?; + }, + // We don't need to initialize the runtime at a block. + _ => {}, + } - let core_version = self.runtime_version(at)?.apis.iter().find(|a| a.0 == CoreApi::::ID).map(|a| a.1); - let init_block_function = if core_version < Some(2) { - "Core_initialise_block" - } else { - "Core_initialize_block" - }; + let mut state = self.backend.state_at(*at)?; - if method != init_block_function && initialized_block.map(|id| id != *at).unwrap_or(true) { - let header = prepare_environment_block()?; - state_machine::new( + match recorder { + Some(recorder) => { + let trie_state = state.as_trie_backend() + .ok_or_else(|| + Box::new(state_machine::ExecutionError::UnableToGenerateProof) + as Box + )?; + + let backend = state_machine::ProvingBackend::new_with_recorder( + trie_state, + recorder.clone() + ); + + state_machine::new( + &backend, + self.backend.changes_trie_storage(), + side_effects_handler, + &mut *changes.borrow_mut(), + &self.executor, + method, + call_data, + ) + .execute_using_consensus_failure_handler( + execution_manager, + false, + native_call, + ) + .map(|(result, _, _)| result) + .map_err(Into::into) + } + None => state_machine::new( &state, self.backend.changes_trie_storage(), - side_effects_handler.as_mut().map(|x| &mut **x), - changes, + side_effects_handler, + &mut *changes.borrow_mut(), &self.executor, - init_block_function, - &header.encode(), - ).execute_using_consensus_failure_handler::<_, R, fn() -> _>( - execution_manager.clone(), + method, + call_data, + ) + .execute_using_consensus_failure_handler( + execution_manager, false, - None, - )?; - *initialized_block = Some(*at); + native_call, + ) + .map(|(result, _, _)| result) + .map_err(Into::into) } - - let result = state_machine::new( - &state, - self.backend.changes_trie_storage(), - side_effects_handler, - changes, - &self.executor, - method, - call_data, - ).execute_using_consensus_failure_handler( - execution_manager, - false, - native_call, - ).map(|(result, _, _)| result)?; - - // If the method is `initialize_block` we need to set the `initialized_block` - if method == init_block_function { - *initialized_block = Some(*at); - } - - self.backend.destroy_state(state)?; - Ok(result) } fn runtime_version(&self, id: &BlockId) -> error::Result { @@ -278,7 +298,7 @@ where } fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: state_machine::Backend, F: FnOnce( Result, Self::Error>, diff --git a/core/client/src/children.rs b/core/client/src/children.rs index 3a9f0a6bea5b43c9242e9e6a7d9a60b682c74693..4423ad8939467e911382a7d286387e4f9bcf683f 100644 --- a/core/client/src/children.rs +++ b/core/client/src/children.rs @@ -26,7 +26,7 @@ use std::hash::Hash; pub fn read_children< K: Eq + Hash + Clone + Encode + Decode, V: Eq + Hash + Clone + Encode + Decode, ->(db: &KeyValueDB, column: Option, prefix: &[u8], parent_hash: K) -> error::Result> { +>(db: &dyn KeyValueDB, column: Option, prefix: &[u8], parent_hash: K) -> error::Result> { let mut buf = prefix.to_vec(); parent_hash.using_encoded(|s| buf.extend(s)); @@ -116,6 +116,6 @@ mod tests { let r2: Vec = read_children(&db, None, PREFIX, 1_2).unwrap(); assert_eq!(r1, vec![1_3, 1_5]); - assert_eq!(r2.len(), 0); + assert_eq!(r2.len(), 0); } } diff --git a/core/client/src/cht.rs b/core/client/src/cht.rs index 13db1c67ebe81c7168bd2f75b3fcecc57f825121..fc8920327e90b64b58542ca62161f4f9af2b5c77 100644 --- a/core/client/src/cht.rs +++ b/core/client/src/cht.rs @@ -26,11 +26,11 @@ use std::collections::HashSet; use hash_db; -use heapsize::HeapSizeOf; +use parity_codec::Encode; use trie; use primitives::{H256, convert_hash}; -use runtime_primitives::traits::{As, Header as HeaderT, SimpleArithmetic, One}; +use runtime_primitives::traits::{Header as HeaderT, SimpleArithmetic, Zero, One}; use state_machine::backend::InMemory as InMemoryState; use state_machine::{MemoryDB, TrieBackend, Backend as StateBackend, prove_read_on_trie_backend, read_proof_check, read_proof_check_on_proving_backend}; @@ -39,14 +39,19 @@ use crate::error::{Error as ClientError, Result as ClientResult}; /// The size of each CHT. This value is passed to every CHT-related function from /// production code. Other values are passed from tests. -pub const SIZE: u64 = 2048; +const SIZE: u32 = 2048; + +/// Gets default CHT size. +pub fn size>() -> N { + SIZE.into() +} /// Returns Some(cht_number) if CHT is need to be built when the block with given number is canonized. -pub fn is_build_required(cht_size: u64, block_num: N) -> Option +pub fn is_build_required(cht_size: N, block_num: N) -> Option where N: Clone + SimpleArithmetic, { - let block_cht_num = block_to_cht_number(cht_size, block_num.clone())?; + let block_cht_num = block_to_cht_number(cht_size.clone(), block_num.clone())?; let two = N::one() + N::one(); if block_cht_num < two { return None; @@ -63,7 +68,7 @@ pub fn is_build_required(cht_size: u64, block_num: N) -> Option /// SIZE items. The items are assumed to proceed sequentially from `start_number(cht_num)`. /// Discards the trie's nodes. pub fn compute_root( - cht_size: u64, + cht_size: Header::Number, cht_num: Header::Number, hashes: I, ) -> ClientResult @@ -80,7 +85,7 @@ pub fn compute_root( /// Build CHT-based header proof. pub fn build_proof( - cht_size: u64, + cht_size: Header::Number, cht_num: Header::Number, blocks: BlocksI, hashes: HashesI @@ -88,7 +93,7 @@ pub fn build_proof( where Header: HeaderT, Hasher: hash_db::Hasher, - Hasher::Out: Ord + HeapSizeOf, + Hasher::Out: Ord, BlocksI: IntoIterator, HashesI: IntoIterator>>, { @@ -96,14 +101,14 @@ pub fn build_proof( .into_iter() .map(|(k, v)| (None, k, Some(v))) .collect::>(); - let storage = InMemoryState::::default().update(transaction); - let trie_storage = storage.try_into_trie_backend() - .expect("InMemoryState::try_into_trie_backend always returns Some; qed"); + let mut storage = InMemoryState::::default().update(transaction); + let trie_storage = storage.as_trie_backend() + .expect("InMemoryState::as_trie_backend always returns Some; qed"); let mut total_proof = HashSet::new(); for block in blocks.into_iter() { debug_assert_eq!(block_to_cht_number(cht_size, block), Some(cht_num)); - let (value, proof) = prove_read_on_trie_backend(&trie_storage, &encode_cht_key(block))?; + let (value, proof) = prove_read_on_trie_backend(trie_storage, &encode_cht_key(block))?; assert!(value.is_some(), "we have just built trie that includes the value for block"); total_proof.extend(proof); } @@ -120,7 +125,7 @@ pub fn check_proof( where Header: HeaderT, Hasher: hash_db::Hasher, - Hasher::Out: Ord + HeapSizeOf, + Hasher::Out: Ord, { do_check_proof::(local_root, local_number, remote_hash, move |local_root, local_cht_key| read_proof_check::(local_root, remote_proof, @@ -137,7 +142,7 @@ pub fn check_proof_on_proving_backend( where Header: HeaderT, Hasher: hash_db::Hasher, - Hasher::Out: Ord + HeapSizeOf, + Hasher::Out: Ord, { do_check_proof::(local_root, local_number, remote_hash, |_, local_cht_key| read_proof_check_on_proving_backend::( @@ -154,7 +159,7 @@ fn do_check_proof( where Header: HeaderT, Hasher: hash_db::Hasher, - Hasher::Out: Ord + HeapSizeOf, + Hasher::Out: Ord, F: FnOnce(Hasher::Out, &[u8]) -> ClientResult>>, { let root: Hasher::Out = convert_hash(&local_root); @@ -171,7 +176,7 @@ fn do_check_proof( /// Group ordered blocks by CHT number and call functor with blocks of each group. pub fn for_each_cht_group( - cht_size: u64, + cht_size: Header::Number, blocks: I, mut functor: F, mut functor_param: P, @@ -184,7 +189,7 @@ pub fn for_each_cht_group( let mut current_cht_num = None; let mut current_cht_blocks = Vec::new(); for block in blocks { - let new_cht_num = match block_to_cht_number(cht_size, block.as_()) { + let new_cht_num = match block_to_cht_number(cht_size, block) { Some(new_cht_num) => new_cht_num, None => return Err(ClientError::Backend(format!( "Cannot compute CHT root for the block #{}", block)).into() @@ -199,7 +204,7 @@ pub fn for_each_cht_group( functor_param = functor( functor_param, - As::sa(current_cht_num), + current_cht_num, ::std::mem::replace(&mut current_cht_blocks, Vec::new()), )?; } @@ -211,7 +216,7 @@ pub fn for_each_cht_group( if let Some(current_cht_num) = current_cht_num { functor( functor_param, - As::sa(current_cht_num), + current_cht_num, ::std::mem::replace(&mut current_cht_blocks, Vec::new()), )?; } @@ -221,7 +226,7 @@ pub fn for_each_cht_group( /// Build pairs for computing CHT. fn build_pairs( - cht_size: u64, + cht_size: Header::Number, cht_num: Header::Number, hashes: I ) -> ClientResult, Vec)>> @@ -231,22 +236,25 @@ fn build_pairs( { let start_num = start_number(cht_size, cht_num); let mut pairs = Vec::new(); - let mut hash_number = start_num; - for hash in hashes.into_iter().take(cht_size as usize) { + let mut hash_index = Header::Number::zero(); + for hash in hashes.into_iter() { let hash = hash?.ok_or_else(|| ClientError::from( - ClientError::MissingHashRequiredForCHT(cht_num.as_(), hash_number.as_()) + ClientError::MissingHashRequiredForCHT ))?; pairs.push(( - encode_cht_key(hash_number).to_vec(), + encode_cht_key(start_num + hash_index).to_vec(), encode_cht_value(hash) )); - hash_number += Header::Number::one(); + hash_index += Header::Number::one(); + if hash_index == cht_size { + break; + } } - if pairs.len() as u64 == cht_size { + if hash_index == cht_size { Ok(pairs) } else { - Err(ClientError::MissingHashRequiredForCHT(cht_num.as_(), hash_number.as_())) + Err(ClientError::MissingHashRequiredForCHT) } } @@ -256,38 +264,28 @@ fn build_pairs( /// More generally: CHT N includes block (1 + N*SIZE)...((N+1)*SIZE). /// This is because the genesis hash is assumed to be known /// and including it would be redundant. -pub fn start_number(cht_size: u64, cht_num: N) -> N { - (cht_num * As::sa(cht_size)) + N::one() +pub fn start_number(cht_size: N, cht_num: N) -> N { + (cht_num * cht_size) + N::one() } /// Get the ending block of a given CHT. -pub fn end_number(cht_size: u64, cht_num: N) -> N { - (cht_num + N::one()) * As::sa(cht_size) +pub fn end_number(cht_size: N, cht_num: N) -> N { + (cht_num + N::one()) * cht_size } /// Convert a block number to a CHT number. /// Returns `None` for `block_num` == 0, `Some` otherwise. -pub fn block_to_cht_number(cht_size: u64, block_num: N) -> Option { +pub fn block_to_cht_number(cht_size: N, block_num: N) -> Option { if block_num == N::zero() { None } else { - Some((block_num - N::one()) / As::sa(cht_size)) + Some((block_num - N::one()) / cht_size) } } /// Convert header number into CHT key. -pub fn encode_cht_key>(number: N) -> Vec { - let number: u64 = number.as_(); - vec![ - (number >> 56) as u8, - ((number >> 48) & 0xff) as u8, - ((number >> 40) & 0xff) as u8, - ((number >> 32) & 0xff) as u8, - ((number >> 24) & 0xff) as u8, - ((number >> 16) & 0xff) as u8, - ((number >> 8) & 0xff) as u8, - (number & 0xff) as u8 - ] +pub fn encode_cht_key(number: N) -> Vec { + number.encode() } /// Convert header hash into CHT value. @@ -312,8 +310,8 @@ mod tests { #[test] fn is_build_required_works() { - assert_eq!(is_build_required(SIZE, 0u64), None); - assert_eq!(is_build_required(SIZE, 1u64), None); + assert_eq!(is_build_required(SIZE, 0u32.into()), None); + assert_eq!(is_build_required(SIZE, 1u32.into()), None); assert_eq!(is_build_required(SIZE, SIZE), None); assert_eq!(is_build_required(SIZE, SIZE + 1), None); assert_eq!(is_build_required(SIZE, 2 * SIZE), None); @@ -324,73 +322,101 @@ mod tests { #[test] fn start_number_works() { - assert_eq!(start_number(SIZE, 0u64), 1u64); - assert_eq!(start_number(SIZE, 1u64), SIZE + 1); - assert_eq!(start_number(SIZE, 2u64), SIZE + SIZE + 1); + assert_eq!(start_number(SIZE, 0u32), 1u32); + assert_eq!(start_number(SIZE, 1u32), SIZE + 1); + assert_eq!(start_number(SIZE, 2u32), SIZE + SIZE + 1); } #[test] fn end_number_works() { - assert_eq!(end_number(SIZE, 0u64), SIZE); - assert_eq!(end_number(SIZE, 1u64), SIZE + SIZE); - assert_eq!(end_number(SIZE, 2u64), SIZE + SIZE + SIZE); + assert_eq!(end_number(SIZE, 0u32), SIZE); + assert_eq!(end_number(SIZE, 1u32), SIZE + SIZE); + assert_eq!(end_number(SIZE, 2u32), SIZE + SIZE + SIZE); } #[test] fn build_pairs_fails_when_no_enough_blocks() { - assert!(build_pairs::(SIZE, 0, + assert!(build_pairs::(SIZE as _, 0, ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize / 2)).is_err()); } #[test] fn build_pairs_fails_when_missing_block() { - assert!(build_pairs::(SIZE, 0, ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize / 2) - .chain(::std::iter::once(Ok(None))) - .chain(::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(2)))).take(SIZE as usize / 2 - 1))).is_err()); + assert!(build_pairs::( + SIZE as _, + 0, + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize / 2) + .chain(::std::iter::once(Ok(None))) + .chain(::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(2)))) + .take(SIZE as usize / 2 - 1)) + ).is_err()); } #[test] fn compute_root_works() { - assert!(compute_root::(SIZE, 42, - ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize)).is_ok()); + assert!(compute_root::( + SIZE as _, + 42, + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize) + ).is_ok()); } #[test] #[should_panic] fn build_proof_panics_when_querying_wrong_block() { assert!(build_proof::( - SIZE, 0, vec![(SIZE * 1000) as u64], - ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize)).is_err()); + SIZE as _, + 0, + vec![(SIZE * 1000) as u64], + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize) + ).is_err()); } #[test] fn build_proof_works() { assert!(build_proof::( - SIZE, 0, vec![(SIZE / 2) as u64], - ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize)).is_ok()); + SIZE as _, + 0, + vec![(SIZE / 2) as u64], + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize) + ).is_ok()); } #[test] #[should_panic] fn for_each_cht_group_panics() { - let _ = for_each_cht_group::(SIZE, vec![SIZE * 5, SIZE * 2], |_, _, _| Ok(()), ()); + let cht_size = SIZE as u64; + let _ = for_each_cht_group::( + cht_size, + vec![cht_size * 5, cht_size * 2], + |_, _, _| Ok(()), + (), + ); } #[test] fn for_each_cht_group_works() { - let _ = for_each_cht_group::(SIZE, vec![ - SIZE * 2 + 1, SIZE * 2 + 2, SIZE * 2 + 5, - SIZE * 4 + 1, SIZE * 4 + 7, - SIZE * 6 + 1 - ], |_, cht_num, blocks| { - match cht_num { - 2 => assert_eq!(blocks, vec![SIZE * 2 + 1, SIZE * 2 + 2, SIZE * 2 + 5]), - 4 => assert_eq!(blocks, vec![SIZE * 4 + 1, SIZE * 4 + 7]), - 6 => assert_eq!(blocks, vec![SIZE * 6 + 1]), - _ => unreachable!(), - } - - Ok(()) - }, ()); + let cht_size = SIZE as u64; + let _ = for_each_cht_group::( + cht_size, + vec![ + cht_size * 2 + 1, cht_size * 2 + 2, cht_size * 2 + 5, + cht_size * 4 + 1, cht_size * 4 + 7, + cht_size * 6 + 1 + ], |_, cht_num, blocks| { + match cht_num { + 2 => assert_eq!(blocks, vec![cht_size * 2 + 1, cht_size * 2 + 2, cht_size * 2 + 5]), + 4 => assert_eq!(blocks, vec![cht_size * 4 + 1, cht_size * 4 + 7]), + 6 => assert_eq!(blocks, vec![cht_size * 6 + 1]), + _ => unreachable!(), + } + + Ok(()) + }, () + ); } } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 2b4465f19cabe9084ac13407db341a3a34654661..59af1b6419d63c4758c61ab27d9ac88e87d17528 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -16,7 +16,10 @@ //! Substrate Client -use std::{marker::PhantomData, collections::{HashSet, BTreeMap, HashMap}, sync::Arc, panic::UnwindSafe, result}; +use std::{ + marker::PhantomData, collections::{HashSet, BTreeMap, HashMap}, sync::Arc, + panic::UnwindSafe, result, cell::RefCell, rc::Rc, +}; use crate::error::Error; use futures::sync::mpsc; use parking_lot::{Mutex, RwLock}; @@ -26,22 +29,31 @@ use runtime_primitives::{ generic::{BlockId, SignedBlock}, }; use consensus::{ - Error as ConsensusError, ErrorKind as ConsensusErrorKind, ImportBlock, ImportResult, - BlockOrigin, ForkChoiceStrategy, well_known_cache_keys::Id as CacheKeyId, + Error as ConsensusError, ImportBlock, + ImportResult, BlockOrigin, ForkChoiceStrategy, + well_known_cache_keys::Id as CacheKeyId, + SelectChain, self, }; use runtime_primitives::traits::{ - Block as BlockT, Header as HeaderT, Zero, As, NumberFor, CurrentHeight, BlockNumberToHash, - ApiRef, ProvideRuntimeApi, Digest, DigestItem + Block as BlockT, Header as HeaderT, Zero, NumberFor, CurrentHeight, + BlockNumberToHash, ApiRef, ProvideRuntimeApi, Digest, DigestItem, + SaturatedConversion, One, DigestFor, }; use runtime_primitives::BuildStorage; -use crate::runtime_api::{CallRuntimeAt, ConstructRuntimeApi}; -use primitives::{Blake2Hasher, H256, ChangesTrieConfiguration, convert_hash, NeverNativeValue, ExecutionContext}; +use crate::runtime_api::{ + CallRuntimeAt, ConstructRuntimeApi, Core as CoreApi, ProofRecorder, + InitializeBlock, +}; +use primitives::{ + Blake2Hasher, H256, ChangesTrieConfiguration, convert_hash, + NeverNativeValue, ExecutionContext +}; use primitives::storage::{StorageKey, StorageData}; use primitives::storage::well_known_keys; use parity_codec::{Encode, Decode}; use state_machine::{ DBValue, Backend as StateBackend, CodeExecutor, ChangesTrieAnchorBlockId, - ExecutionStrategy, ExecutionManager, prove_read, + ExecutionStrategy, ExecutionManager, prove_read, prove_child_read, ChangesTrieRootsStorage, ChangesTrieStorage, key_changes, key_changes_proof, OverlayedChanges, NeverOffchainExt, }; @@ -49,8 +61,8 @@ use hash_db::Hasher; use crate::backend::{self, BlockImportOperation, PrunableStateChangesTrieStorage}; use crate::blockchain::{ - self, Info as ChainInfo, Backend as ChainBackend, HeaderBackend as ChainHeaderBackend, - ProvideCache, Cache, + self, Info as ChainInfo, Backend as ChainBackend, + HeaderBackend as ChainHeaderBackend, ProvideCache, Cache, }; use crate::call_executor::{CallExecutor, LocalCallExecutor}; use executor::{RuntimeVersion, RuntimeInfo}; @@ -61,7 +73,6 @@ use crate::error; use crate::in_mem; use crate::block_builder::{self, api::BlockBuilder as BlockBuilderAPI}; use crate::genesis; -use consensus; use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; use log::{info, trace, warn}; @@ -72,7 +83,11 @@ pub type ImportNotifications = mpsc::UnboundedReceiver = mpsc::UnboundedReceiver>; -type StorageUpdate = <<>::BlockImportOperation as BlockImportOperation>::State as state_machine::Backend>::Transaction; +type StorageUpdate = < + < + >::BlockImportOperation + as BlockImportOperation + >::State as state_machine::Backend>::Transaction; type ChangesUpdate = trie::MemoryDB; /// Execution strategies settings. @@ -109,7 +124,6 @@ pub struct Client where Block: BlockT { storage_notifications: Mutex>, import_notification_sinks: Mutex>>>, finality_notification_sinks: Mutex>>>, - import_lock: Mutex<()>, // holds the block hash currently being imported. TODO: replace this with block queue importing_block: RwLock>, execution_strategies: ExecutionStrategies, @@ -136,22 +150,17 @@ pub trait BlockchainEvents { /// Get storage changes event stream. /// /// Passing `None` as `filter_keys` subscribes to all storage changes. - fn storage_changes_notification_stream(&self, filter_keys: Option<&[StorageKey]>) -> error::Result>; -} - -/// Chain head information. -pub trait ChainHead { - /// Get best block header. - fn best_block_header(&self) -> Result<::Header, error::Error>; - /// Get all leaves of the chain: block hashes that have no children currently. - /// Leaves that can never be finalized will not be returned. - fn leaves(&self) -> Result::Hash>, error::Error>; + fn storage_changes_notification_stream(&self, + filter_keys: Option<&[StorageKey]> + ) -> error::Result>; } /// Fetch block body by ID. pub trait BlockBody { /// Get block body by ID. Returns `None` if the body is not stored. - fn block_body(&self, id: &BlockId) -> error::Result::Extrinsic>>>; + fn block_body(&self, + id: &BlockId + ) -> error::Result::Extrinsic>>>; } /// Client info @@ -159,10 +168,6 @@ pub trait BlockBody { pub struct ClientInfo { /// Best block hash. pub chain: ChainInfo, - /// Best block number in the queue. - pub best_queued_number: Option<<::Header as HeaderT>::Number>, - /// Best queued block hash. - pub best_queued_hash: Option, } /// Block status. @@ -241,16 +246,20 @@ impl PrePostHeader { pub fn new_in_mem( executor: E, genesis_storage: S, -) -> error::Result, LocalCallExecutor, E>, Block, RA>> - where - E: CodeExecutor + RuntimeInfo, - S: BuildStorage, - Block: BlockT, +) -> error::Result, + LocalCallExecutor, E>, + Block, + RA +>> where + E: CodeExecutor + RuntimeInfo, + S: BuildStorage, + Block: BlockT, { new_with_backend(Arc::new(in_mem::Backend::new()), executor, genesis_storage) } -/// Create a client with the explicitely provided backend. +/// Create a client with the explicitly provided backend. /// This is useful for testing backend implementations. pub fn new_with_backend( backend: Arc, @@ -285,7 +294,10 @@ impl Client where backend.begin_state_operation(&mut op, BlockId::Hash(Default::default()))?; let state_root = op.reset_storage(genesis_storage, children_genesis_storage)?; let genesis_block = genesis::construct_genesis_block::(state_root.into()); - info!("Initializing Genesis block/state (state: {}, header-hash: {})", genesis_block.header().state_root(), genesis_block.header().hash()); + info!("Initializing Genesis block/state (state: {}, header-hash: {})", + genesis_block.header().state_root(), + genesis_block.header().hash() + ); op.set_block_data( genesis_block.deconstruct().0, Some(vec![]), @@ -301,7 +313,6 @@ impl Client where storage_notifications: Default::default(), import_notification_sinks: Default::default(), finality_notification_sinks: Default::default(), - import_lock: Default::default(), importing_block: Default::default(), execution_strategies, _phantom: Default::default(), @@ -319,27 +330,59 @@ impl Client where } /// Expose backend reference. To be used in tests only + #[doc(hidden)] + #[deprecated(note="Rather than relying on `client` to provide this, access \ + to the backend should be handled at setup only - see #1134. This function \ + will be removed once that is in place.")] pub fn backend(&self) -> &Arc { &self.backend } - /// Return storage entry keys in state in a block of given hash with given prefix. + /// Given a `BlockId` and a key prefix, return the matching child storage keys in that block. pub fn storage_keys(&self, id: &BlockId, key_prefix: &StorageKey) -> error::Result> { let keys = self.state_at(id)?.keys(&key_prefix.0).into_iter().map(StorageKey).collect(); Ok(keys) } - /// Return single storage entry of contract under given address in state in a block of given hash. + /// Given a `BlockId` and a key, return the value under the key in that block. pub fn storage(&self, id: &BlockId, key: &StorageKey) -> error::Result> { Ok(self.state_at(id)? .storage(&key.0).map_err(|e| error::Error::from_state(Box::new(e)))? .map(StorageData)) } + /// Given a `BlockId`, a key prefix, and a child storage key, return the matching child storage keys. + pub fn child_storage_keys( + &self, + id: &BlockId, + child_storage_key: &StorageKey, + key_prefix: &StorageKey + ) -> error::Result> { + let keys = self.state_at(id)? + .child_keys(&child_storage_key.0, &key_prefix.0) + .into_iter() + .map(StorageKey) + .collect(); + Ok(keys) + } + + /// Given a `BlockId`, a key and a child storage key, return the value under the key in that block. + pub fn child_storage( + &self, + id: &BlockId, + child_storage_key: &StorageKey, + key: &StorageKey + ) -> error::Result> { + Ok(self.state_at(id)? + .child_storage(&child_storage_key.0, &key.0).map_err(|e| error::Error::from_state(Box::new(e)))? + .map(StorageData)) + } + /// Get the code at a given block. pub fn code_at(&self, id: &BlockId) -> error::Result> { Ok(self.storage(id, &StorageKey(well_known_keys::CODE.to_vec()))? - .expect("None is returned if there's no value stored for the given key; ':code' key is always defined; qed").0) + .expect("None is returned if there's no value stored for the given key;\ + ':code' key is always defined; qed").0) } /// Get the RuntimeVersion at a given block. @@ -360,11 +403,29 @@ impl Client where .map_err(Into::into)) } + /// Reads child storage value at a given block + storage_key + key, returning + /// read proof. + pub fn read_child_proof( + &self, + id: &BlockId, + storage_key: &[u8], + key: &[u8] + ) -> error::Result>> { + self.state_at(id) + .and_then(|state| prove_child_read(state, storage_key, key) + .map(|(_, proof)| proof) + .map_err(Into::into)) + } + /// Execute a call to a contract on top of state in a block of given hash /// AND returning execution proof. /// /// No changes are made. - pub fn execution_proof(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result<(Vec, Vec>)> { + pub fn execution_proof(&self, + id: &BlockId, + method: &str, + call_data: &[u8] + ) -> error::Result<(Vec, Vec>)> { let state = self.state_at(id)?; let header = self.prepare_environment_block(id)?; prove_execution(state, header, &self.executor, method, call_data) @@ -372,22 +433,34 @@ impl Client where /// Reads given header and generates CHT-based header proof. pub fn header_proof(&self, id: &BlockId) -> error::Result<(Block::Header, Vec>)> { - self.header_proof_with_cht_size(id, cht::SIZE) + self.header_proof_with_cht_size(id, cht::size()) } /// Get block hash by number. - pub fn block_hash(&self, block_number: <::Header as HeaderT>::Number) -> error::Result> { + pub fn block_hash(&self, + block_number: <::Header as HeaderT>::Number + ) -> error::Result> { self.backend.blockchain().hash(block_number) } /// Reads given header and generates CHT-based header proof for CHT of given size. - pub fn header_proof_with_cht_size(&self, id: &BlockId, cht_size: u64) -> error::Result<(Block::Header, Vec>)> { + pub fn header_proof_with_cht_size( + &self, + id: &BlockId, + cht_size: NumberFor, + ) -> error::Result<(Block::Header, Vec>)> { let proof_error = || error::Error::Backend(format!("Failed to generate header proof for {:?}", id)); let header = self.backend.blockchain().expect_header(*id)?; let block_num = *header.number(); let cht_num = cht::block_to_cht_number(cht_size, block_num).ok_or_else(proof_error)?; let cht_start = cht::start_number(cht_size, cht_num); - let headers = (cht_start.as_()..).map(|num| self.block_hash(As::sa(num))); + let mut current_num = cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); + let headers = cht_range.map(|num| self.block_hash(num)); let proof = cht::build_proof::(cht_size, cht_num, ::std::iter::once(block_num), headers)?; Ok((header, proof)) } @@ -405,14 +478,13 @@ impl Client where Some((config, storage)) => (config, storage), None => return Ok(None), }; - let first = first.as_(); - let last_num = self.backend.blockchain().expect_block_number_from_id(&last)?.as_(); + let last_num = self.backend.blockchain().expect_block_number_from_id(&last)?; if first > last_num { return Err(error::Error::ChangesTrieAccessFailed("Invalid changes trie range".into())); } - let finalized_number = self.backend.blockchain().info()?.finalized_number; - let oldest = storage.oldest_changes_trie_block(&config, finalized_number.as_()); - let first = As::sa(::std::cmp::max(first, oldest)); + let finalized_number = self.backend.blockchain().info().finalized_number; + let oldest = storage.oldest_changes_trie_block(&config, finalized_number); + let first = ::std::cmp::max(first, oldest); Ok(Some((first, last))) } @@ -425,20 +497,20 @@ impl Client where key: &StorageKey ) -> error::Result, u32)>> { let (config, storage) = self.require_changes_trie()?; - let last_number = self.backend.blockchain().expect_block_number_from_id(&last)?.as_(); + let last_number = self.backend.blockchain().expect_block_number_from_id(&last)?; let last_hash = self.backend.blockchain().expect_block_hash_from_id(&last)?; - key_changes::<_, Blake2Hasher>( + key_changes::<_, Blake2Hasher, _>( &config, &*storage, - first.as_(), + first, &ChangesTrieAnchorBlockId { hash: convert_hash(&last_hash), number: last_number, }, - self.backend.blockchain().info()?.best_number.as_(), + self.backend.blockchain().info().best_number, &key.0) - .and_then(|r| r.map(|r| r.map(|(block, tx)| (As::sa(block), tx))).collect::>()) + .and_then(|r| r.map(|r| r.map(|(block, tx)| (block, tx))).collect::>()) .map_err(|err| error::Error::ChangesTrieAccessFailed(err)) } @@ -462,7 +534,7 @@ impl Client where min, max, key, - cht::SIZE, + cht::size(), ) } @@ -474,21 +546,29 @@ impl Client where min: Block::Hash, max: Block::Hash, key: &StorageKey, - cht_size: u64, + cht_size: NumberFor, ) -> error::Result> { struct AccessedRootsRecorder<'a, Block: BlockT> { - storage: &'a ChangesTrieStorage, - min: u64, + storage: &'a dyn ChangesTrieStorage>, + min: NumberFor, required_roots_proofs: Mutex, H256>>, }; - impl<'a, Block: BlockT> ChangesTrieRootsStorage for AccessedRootsRecorder<'a, Block> { - fn root(&self, anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { + impl<'a, Block: BlockT> ChangesTrieRootsStorage> for AccessedRootsRecorder<'a, Block> { + fn build_anchor(&self, hash: H256) -> Result>, String> { + self.storage.build_anchor(hash) + } + + fn root( + &self, + anchor: &ChangesTrieAnchorBlockId>, + block: NumberFor, + ) -> Result, String> { let root = self.storage.root(anchor, block)?; if block < self.min { if let Some(ref root) = root { self.required_roots_proofs.lock().insert( - As::sa(block), + block, root.clone() ); } @@ -497,7 +577,7 @@ impl Client where } } - impl<'a, Block: BlockT> ChangesTrieStorage for AccessedRootsRecorder<'a, Block> { + impl<'a, Block: BlockT> ChangesTrieStorage> for AccessedRootsRecorder<'a, Block> { fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { self.storage.get(key, prefix) } @@ -508,19 +588,21 @@ impl Client where let recording_storage = AccessedRootsRecorder:: { storage, - min: min_number.as_(), + min: min_number, required_roots_proofs: Mutex::new(BTreeMap::new()), }; let max_number = ::std::cmp::min( - self.backend.blockchain().info()?.best_number, + self.backend.blockchain().info().best_number, self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(max))?, ); // fetch key changes proof - let first_number = self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(first))?.as_(); - let last_number = self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(last))?.as_(); - let key_changes_proof = key_changes_proof::<_, Blake2Hasher>( + let first_number = self.backend.blockchain() + .expect_block_number_from_id(&BlockId::Hash(first))?; + let last_number = self.backend.blockchain() + .expect_block_number_from_id(&BlockId::Hash(last))?; + let key_changes_proof = key_changes_proof::<_, Blake2Hasher, _>( &config, &recording_storage, first_number, @@ -528,7 +610,7 @@ impl Client where hash: convert_hash(&last), number: last_number, }, - max_number.as_(), + max_number, &key.0 ) .map_err(|err| error::Error::from(error::Error::ChangesTrieAccessFailed(err)))?; @@ -549,7 +631,7 @@ impl Client where /// Generate CHT-based proof for roots of changes tries at given blocks. fn changes_trie_roots_proof>>( &self, - cht_size: u64, + cht_size: NumberFor, blocks: I ) -> error::Result>> { // most probably we have touched several changes tries that are parts of the single CHT @@ -568,12 +650,19 @@ impl Client where /// Generates CHT-based proof for roots of changes tries at given blocks (that are part of single CHT). fn changes_trie_roots_proof_at_cht( &self, - cht_size: u64, + cht_size: NumberFor, cht_num: NumberFor, blocks: Vec> ) -> error::Result>> { let cht_start = cht::start_number(cht_size, cht_num); - let roots = (cht_start.as_()..).map(|num| self.header(&BlockId::Number(As::sa(num))) + let mut current_num = cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); + let roots = cht_range + .map(|num| self.header(&BlockId::Number(num)) .map(|block| block.and_then(|block| block.digest().log(DigestItem::as_changes_trie_root).cloned()))); let proof = cht::build_proof::(cht_size, cht_num, blocks, roots)?; Ok(proof) @@ -591,26 +680,47 @@ impl Client where /// Create a new block, built on the head of the chain. pub fn new_block( - &self + &self, + inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, RA: Send + Sync, Self: ProvideRuntimeApi, ::Api: BlockBuilderAPI { - block_builder::BlockBuilder::new(self) + block_builder::BlockBuilder::new(self, inherent_digests) } /// Create a new block, built on top of `parent`. pub fn new_block_at( - &self, parent: &BlockId + &self, + parent: &BlockId, + inherent_digests: DigestFor, + ) -> error::Result> where + E: Clone + Send + Sync, + RA: Send + Sync, + Self: ProvideRuntimeApi, + ::Api: BlockBuilderAPI + { + block_builder::BlockBuilder::at_block(parent, &self, false, inherent_digests) + } + + /// Create a new block, built on top of `parent` with proof recording enabled. + /// + /// While proof recording is enabled, all accessed trie nodes are saved. + /// These recorded trie nodes can be used by a third party to proof the + /// output of this block builder without having access to the full storage. + pub fn new_block_at_with_proof_recording( + &self, + parent: &BlockId, + inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, RA: Send + Sync, Self: ProvideRuntimeApi, ::Api: BlockBuilderAPI { - block_builder::BlockBuilder::at_block(parent, &self) + block_builder::BlockBuilder::at_block(parent, &self, true, inherent_digests) } /// Lock the import lock, and run operations inside. @@ -619,7 +729,7 @@ impl Client where Err: From, { let inner = || { - let _import_lock = self.import_lock.lock(); + let _import_lock = self.backend.get_import_lock().lock(); let mut op = ClientImportOperation { op: self.backend.begin_operation()?, @@ -706,7 +816,7 @@ impl Client where }; let hash = import_headers.post().hash(); - let height: u64 = import_headers.post().number().as_(); + let height = (*import_headers.post().number()).saturated_into::(); *self.importing_block.write() = Some(hash); @@ -754,7 +864,7 @@ impl Client where } let (last_best, last_best_number) = { - let info = self.backend.blockchain().info()?; + let info = self.backend.blockchain().info(); (info.best_hash, info.best_number) }; @@ -1027,7 +1137,7 @@ impl Client where justification: Option, notify: bool, ) -> error::Result<()> { - let last_best = self.backend.blockchain().info()?.best_hash; + let last_best = self.backend.blockchain().info().best_hash; let to_finalize_hash = self.backend.blockchain().expect_block_hash_from_id(&id)?; self.apply_finality_with_block_hash(operation, to_finalize_hash, justification, last_best, notify) } @@ -1040,7 +1150,7 @@ impl Client where /// while performing major synchronization work. pub fn finalize_block(&self, id: BlockId, justification: Option, notify: bool) -> error::Result<()> { self.lock_import_and_run(|operation| { - let last_best = self.backend.blockchain().info()?.best_hash; + let last_best = self.backend.blockchain().info().best_hash; let to_finalize_hash = self.backend.blockchain().expect_block_hash_from_id(&id)?; self.apply_finality_with_block_hash(operation, to_finalize_hash, justification, last_best, notify) }) @@ -1053,13 +1163,11 @@ impl Client where } /// Get blockchain info. - pub fn info(&self) -> error::Result> { - let info = self.backend.blockchain().info().map_err(|e| error::Error::from_blockchain(Box::new(e)))?; - Ok(ClientInfo { + pub fn info(&self) -> ClientInfo { + let info = self.backend.blockchain().info(); + ClientInfo { chain: info, - best_queued_hash: None, - best_queued_number: None, - }) + } } /// Get block status. @@ -1076,7 +1184,7 @@ impl Client where }; match hash_and_number { Some((hash, number)) => { - if self.backend().have_state_at(&hash, number) { + if self.backend.have_state_at(&hash, number) { Ok(BlockStatus::InChainWithState) } else { Ok(BlockStatus::InChainPruned) @@ -1112,132 +1220,6 @@ impl Client where }) } - /// Get best block header. - pub fn best_block_header(&self) -> error::Result<::Header> { - let info = self.backend.blockchain().info().map_err(|e| error::Error::from_blockchain(Box::new(e)))?; - Ok(self.header(&BlockId::Hash(info.best_hash))?.expect("Best block header must always exist")) - } - - /// Get the most recent block hash of the best (longest) chains - /// that contain block with the given `target_hash`. - /// - /// The search space is always limited to blocks which are in the finalized - /// chain or descendents of it. - /// - /// If `maybe_max_block_number` is `Some(max_block_number)` - /// the search is limited to block `numbers <= max_block_number`. - /// in other words as if there were no blocks greater `max_block_number`. - /// TODO : we want to move this implement to `blockchain::Backend`, see [#1443](https://github.com/paritytech/substrate/issues/1443) - /// Returns `Ok(None)` if `target_hash` is not found in search space. - /// TODO: document time complexity of this, see [#1444](https://github.com/paritytech/substrate/issues/1444) - pub fn best_containing(&self, target_hash: Block::Hash, maybe_max_number: Option>) - -> error::Result> - { - let target_header = { - match self.backend.blockchain().header(BlockId::Hash(target_hash))? { - Some(x) => x, - // target not in blockchain - None => { return Ok(None); }, - } - }; - - if let Some(max_number) = maybe_max_number { - // target outside search range - if target_header.number() > &max_number { - return Ok(None); - } - } - - let (leaves, best_already_checked) = { - // ensure no blocks are imported during this code block. - // an import could trigger a reorg which could change the canonical chain. - // we depend on the canonical chain staying the same during this code block. - let _import_lock = self.import_lock.lock(); - - let info = self.backend.blockchain().info()?; - - let canon_hash = self.backend.blockchain().hash(*target_header.number())? - .ok_or_else(|| error::Error::from(format!("failed to get hash for block number {}", target_header.number())))?; - - if canon_hash == target_hash { - // if no block at the given max depth exists fallback to the best block - if let Some(max_number) = maybe_max_number { - if let Some(header) = self.backend.blockchain().hash(max_number)? { - return Ok(Some(header)); - } - } - - return Ok(Some(info.best_hash)); - } else if info.finalized_number >= *target_header.number() { - // header is on a dead fork. - return Ok(None); - } - - (self.backend.blockchain().leaves()?, info.best_hash) - }; - - // for each chain. longest chain first. shortest last - for leaf_hash in leaves { - // ignore canonical chain which we already checked above - if leaf_hash == best_already_checked { - continue; - } - - // start at the leaf - let mut current_hash = leaf_hash; - - // if search is not restricted then the leaf is the best - let mut best_hash = leaf_hash; - - // go backwards entering the search space - // waiting until we are <= max_number - if let Some(max_number) = maybe_max_number { - loop { - let current_header = self.backend.blockchain().header(BlockId::Hash(current_hash.clone()))? - .ok_or_else(|| error::Error::from(format!("failed to get header for hash {}", current_hash)))?; - - if current_header.number() <= &max_number { - best_hash = current_header.hash(); - break; - } - - current_hash = *current_header.parent_hash(); - } - } - - // go backwards through the chain (via parent links) - loop { - // until we find target - if current_hash == target_hash { - return Ok(Some(best_hash)); - } - - let current_header = self.backend.blockchain().header(BlockId::Hash(current_hash.clone()))? - .ok_or_else(|| error::Error::from(format!("failed to get header for hash {}", current_hash)))?; - - // stop search in this chain once we go below the target's block number - if current_header.number() < target_header.number() { - break; - } - - current_hash = *current_header.parent_hash(); - } - } - - // header may be on a dead fork -- the only leaves that are considered are - // those which can still be finalized. - // - // FIXME #1558 only issue this warning when not on a dead fork - warn!( - "Block {:?} exists in chain but not found when following all \ - leaves backwards. Number limit = {:?}", - target_hash, - maybe_max_number, - ); - - Ok(None) - } - /// Gets the uncles of the block with `target_hash` going back `max_generation` ancestors. pub fn uncles(&self, target_hash: Block::Hash, max_generation: NumberFor) -> error::Result> { let load_header = |id: Block::Hash| -> error::Result { @@ -1247,7 +1229,7 @@ impl Client where } }; - let genesis_hash = self.backend.blockchain().info()?.genesis_hash; + let genesis_hash = self.backend.blockchain().info().genesis_hash; if genesis_hash == target_hash { return Ok(Vec::new()); } let mut current_hash = target_hash; @@ -1256,7 +1238,7 @@ impl Client where let mut ancestor = load_header(ancestor_hash)?; let mut uncles = Vec::new(); - for _generation in 0..max_generation.as_() { + for _generation in 0..max_generation.saturated_into() { let children = self.backend.blockchain().children(ancestor_hash)?; uncles.extend(children.into_iter().filter(|h| h != ¤t_hash)); current_hash = ancestor_hash; @@ -1270,7 +1252,7 @@ impl Client where } fn changes_trie_config(&self) -> Result, Error> { - Ok(self.backend.state_at(BlockId::Number(self.backend.blockchain().info()?.best_number))? + Ok(self.backend.state_at(BlockId::Number(self.backend.blockchain().info().best_number))? .storage(well_known_keys::CHANGES_TRIE_CONFIG) .map_err(|e| error::Error::from_state(Box::new(e)))? .and_then(|c| Decode::decode(&mut &*c))) @@ -1278,11 +1260,12 @@ impl Client where /// Prepare in-memory header that is used in execution environment. fn prepare_environment_block(&self, parent: &BlockId) -> error::Result { + let parent_header = self.backend.blockchain().expect_header(*parent)?; Ok(<::Header as HeaderT>::new( - self.backend.blockchain().expect_block_number_from_id(parent)? + As::sa(1), + self.backend.blockchain().expect_block_number_from_id(parent)? + One::one(), Default::default(), Default::default(), - self.backend.blockchain().expect_block_hash_from_id(&parent)?, + parent_header.hash(), Default::default(), )) } @@ -1298,7 +1281,7 @@ impl ChainHeaderBackend for Client wher self.backend.blockchain().header(id) } - fn info(&self) -> error::Result> { + fn info(&self) -> blockchain::Info { self.backend.blockchain().info() } @@ -1319,7 +1302,7 @@ impl ProvideCache for Client where B: backend::Backend, Block: BlockT, { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { self.backend.blockchain().cache() } } @@ -1340,27 +1323,36 @@ impl ProvideRuntimeApi for Client where impl CallRuntimeAt for Client where B: backend::Backend, E: CallExecutor + Clone + Send + Sync, - Block: BlockT + Block: BlockT, { fn call_api_at< + 'a, R: Encode + Decode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, + C: CoreApi, >( &self, + core_api: &C, at: &BlockId, function: &'static str, args: Vec, - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, + changes: &RefCell, + initialize_block: InitializeBlock<'a, Block>, native_call: Option, context: ExecutionContext, + recorder: &Option>>>, ) -> error::Result> { let manager = match context { - ExecutionContext::BlockConstruction => self.execution_strategies.block_construction.get_manager(), - ExecutionContext::Syncing => self.execution_strategies.syncing.get_manager(), - ExecutionContext::Importing => self.execution_strategies.importing.get_manager(), - ExecutionContext::OffchainWorker(_) => self.execution_strategies.offchain_worker.get_manager(), - ExecutionContext::Other => self.execution_strategies.other.get_manager(), + ExecutionContext::BlockConstruction => + self.execution_strategies.block_construction.get_manager(), + ExecutionContext::Syncing => + self.execution_strategies.syncing.get_manager(), + ExecutionContext::Importing => + self.execution_strategies.importing.get_manager(), + ExecutionContext::OffchainWorker(_) => + self.execution_strategies.offchain_worker.get_manager(), + ExecutionContext::Other => + self.execution_strategies.other.get_manager(), }; let mut offchain_extensions = match context { @@ -1369,15 +1361,16 @@ impl CallRuntimeAt for Client where }; self.executor.contextual_call::<_, _, fn(_,_) -> _,_,_>( + || core_api.initialize_block(at, &self.prepare_environment_block(at)?), at, function, &args, changes, - initialized_block, - || self.prepare_environment_block(at), + initialize_block, manager, native_call, offchain_extensions.as_mut(), + recorder, ) } @@ -1402,7 +1395,7 @@ impl consensus::BlockImport for Client ) -> Result { self.lock_import_and_run(|operation| { self.apply_block(operation, import_block, new_cache) - }).map_err(|e| ConsensusErrorKind::ClientImport(e.to_string()).into()) + }).map_err(|e| ConsensusError::ClientImport(e.to_string()).into()) } /// Check block preconditions. @@ -1412,7 +1405,7 @@ impl consensus::BlockImport for Client parent_hash: Block::Hash, ) -> Result { match self.block_status(&BlockId::Hash(parent_hash)) - .map_err(|e| ConsensusError::from(ConsensusErrorKind::ClientImport(e.to_string())))? + .map_err(|e| ConsensusError::ClientImport(e.to_string()))? { BlockStatus::InChainWithState | BlockStatus::Queued => {}, BlockStatus::Unknown | BlockStatus::InChainPruned => return Ok(ImportResult::UnknownParent), @@ -1420,7 +1413,7 @@ impl consensus::BlockImport for Client } match self.block_status(&BlockId::Hash(hash)) - .map_err(|e| ConsensusError::from(ConsensusErrorKind::ClientImport(e.to_string())))? + .map_err(|e| ConsensusError::ClientImport(e.to_string()))? { BlockStatus::InChainWithState | BlockStatus::Queued => return Ok(ImportResult::AlreadyInChain), BlockStatus::Unknown | BlockStatus::InChainPruned => {}, @@ -1438,7 +1431,7 @@ impl CurrentHeight for Client where { type BlockNumber = ::Number; fn current_height(&self) -> Self::BlockNumber { - self.backend.blockchain().info().map(|i| i.best_number).unwrap_or_else(|_| Zero::zero()) + self.backend.blockchain().info().best_number } } @@ -1479,14 +1472,161 @@ where } } -impl ChainHead for Client +/// Implement Longest Chain Select implementation +/// where 'longest' is defined as the highest number of blocks +pub struct LongestChain { + backend: Arc, + _phantom: PhantomData +} + +impl Clone for LongestChain { + fn clone(&self) -> Self { + let backend = self.backend.clone(); + LongestChain { + backend, + _phantom: Default::default() + } + } +} + +impl LongestChain where B: backend::Backend, - E: CallExecutor, Block: BlockT, { + /// Instantiate a new LongestChain for Backend B + pub fn new(backend: Arc) -> Self { + LongestChain { + backend, + _phantom: Default::default() + } + } + fn best_block_header(&self) -> error::Result<::Header> { - Client::best_block_header(self) + let info : ChainInfo = self.backend.blockchain().info(); + Ok(self.backend.blockchain().header(BlockId::Hash(info.best_hash))? + .expect("Best block header must always exist")) + } + + /// Get the most recent block hash of the best (longest) chains + /// that contain block with the given `target_hash`. + /// + /// The search space is always limited to blocks which are in the finalized + /// chain or descendents of it. + /// + /// If `maybe_max_block_number` is `Some(max_block_number)` + /// the search is limited to block `numbers <= max_block_number`. + /// in other words as if there were no blocks greater `max_block_number`. + /// Returns `Ok(None)` if `target_hash` is not found in search space. + /// TODO: document time complexity of this, see [#1444](https://github.com/paritytech/substrate/issues/1444) + fn best_containing( + &self, + target_hash: Block::Hash, + maybe_max_number: Option> + ) -> error::Result> { + let target_header = { + match self.backend.blockchain().header(BlockId::Hash(target_hash))? { + Some(x) => x, + // target not in blockchain + None => { return Ok(None); }, + } + }; + + if let Some(max_number) = maybe_max_number { + // target outside search range + if target_header.number() > &max_number { + return Ok(None); + } + } + + let (leaves, best_already_checked) = { + // ensure no blocks are imported during this code block. + // an import could trigger a reorg which could change the canonical chain. + // we depend on the canonical chain staying the same during this code block. + let _import_lock = self.backend.get_import_lock().lock(); + + let info = self.backend.blockchain().info(); + + let canon_hash = self.backend.blockchain().hash(*target_header.number())? + .ok_or_else(|| error::Error::from(format!("failed to get hash for block number {}", target_header.number())))?; + + if canon_hash == target_hash { + // if no block at the given max depth exists fallback to the best block + if let Some(max_number) = maybe_max_number { + if let Some(header) = self.backend.blockchain().hash(max_number)? { + return Ok(Some(header)); + } + } + + return Ok(Some(info.best_hash)); + } else if info.finalized_number >= *target_header.number() { + // header is on a dead fork. + return Ok(None); + } + + (self.backend.blockchain().leaves()?, info.best_hash) + }; + + // for each chain. longest chain first. shortest last + for leaf_hash in leaves { + // ignore canonical chain which we already checked above + if leaf_hash == best_already_checked { + continue; + } + + // start at the leaf + let mut current_hash = leaf_hash; + + // if search is not restricted then the leaf is the best + let mut best_hash = leaf_hash; + + // go backwards entering the search space + // waiting until we are <= max_number + if let Some(max_number) = maybe_max_number { + loop { + let current_header = self.backend.blockchain().header(BlockId::Hash(current_hash.clone()))? + .ok_or_else(|| error::Error::from(format!("failed to get header for hash {}", current_hash)))?; + + if current_header.number() <= &max_number { + best_hash = current_header.hash(); + break; + } + + current_hash = *current_header.parent_hash(); + } + } + + // go backwards through the chain (via parent links) + loop { + // until we find target + if current_hash == target_hash { + return Ok(Some(best_hash)); + } + + let current_header = self.backend.blockchain().header(BlockId::Hash(current_hash.clone()))? + .ok_or_else(|| error::Error::from(format!("failed to get header for hash {}", current_hash)))?; + + // stop search in this chain once we go below the target's block number + if current_header.number() < target_header.number() { + break; + } + + current_hash = *current_header.parent_hash(); + } + } + + // header may be on a dead fork -- the only leaves that are considered are + // those which can still be finalized. + // + // FIXME #1558 only issue this warning when not on a dead fork + warn!( + "Block {:?} exists in chain but not found when following all \ + leaves backwards. Number limit = {:?}", + target_hash, + maybe_max_number, + ); + + Ok(None) } fn leaves(&self) -> Result::Hash>, error::Error> { @@ -1494,6 +1634,34 @@ where } } +impl SelectChain for LongestChain +where + B: backend::Backend, + Block: BlockT, +{ + + fn leaves(&self) -> Result::Hash>, ConsensusError> { + LongestChain::leaves(self) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) + } + + fn best_chain(&self) + -> Result<::Header, ConsensusError> + { + LongestChain::best_block_header(&self) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) + } + + fn finality_target( + &self, + target_hash: Block::Hash, + maybe_max_number: Option> + ) -> Result, ConsensusError> { + LongestChain::best_containing(self, target_hash, maybe_max_number) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) + } +} + impl BlockBody for Client where B: backend::Backend, @@ -1539,11 +1707,11 @@ pub(crate) mod tests { use primitives::blake2_256; use runtime_primitives::traits::DigestItem as DigestItemT; use runtime_primitives::generic::DigestItem; - use test_client::{self, TestClient, AccountKeyring}; - use consensus::BlockOrigin; - use test_client::client::backend::Backend as TestBackend; - use test_client::BlockBuilderExt; - use test_client::runtime::{self, Block, Transfer, RuntimeApi, TestAPI}; + use consensus::{BlockOrigin, SelectChain}; + use test_client::{ + TestClient, AccountKeyring, client::backend::Backend as TestBackend, TestClientBuilder, + BlockBuilderExt, runtime::{self, Block, Transfer, RuntimeApi, TestAPI} + }; /// Returns tuple, consisting of: /// 1) test client pre-filled with blocks changing balances; @@ -1564,10 +1732,10 @@ pub(crate) mod tests { // prepare client ang import blocks let mut local_roots = Vec::new(); - let remote_client = test_client::new_with_changes_trie(); + let remote_client = TestClientBuilder::new().set_support_changes_trie(true).build(); let mut nonces: HashMap<_, u64> = Default::default(); for (i, block_transfers) in blocks_transfers.into_iter().enumerate() { - let mut builder = remote_client.new_block().unwrap(); + let mut builder = remote_client.new_block(Default::default()).unwrap(); for (from, to) in block_transfers { builder.push_transfer(Transfer { from: from.into(), @@ -1624,14 +1792,14 @@ pub(crate) mod tests { assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Alice.into() ).unwrap(), 1000 ); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Ferdie.into() ).unwrap(), 0 @@ -1642,18 +1810,18 @@ pub(crate) mod tests { fn block_builder_works_with_no_transactions() { let client = test_client::new(); - let builder = client.new_block().unwrap(); + let builder = client.new_block(Default::default()).unwrap(); client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_number, 1); + assert_eq!(client.info().chain.best_number, 1); } #[test] fn block_builder_works_with_transactions() { let client = test_client::new(); - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1664,18 +1832,21 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_number, 1); - assert!(client.state_at(&BlockId::Number(1)).unwrap().pairs() != client.state_at(&BlockId::Number(0)).unwrap().pairs()); + assert_eq!(client.info().chain.best_number, 1); + assert_ne!( + client.state_at(&BlockId::Number(1)).unwrap().pairs(), + client.state_at(&BlockId::Number(0)).unwrap().pairs() + ); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Alice.into() ).unwrap(), 958 ); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Ferdie.into() ).unwrap(), 42 @@ -1686,7 +1857,7 @@ pub(crate) mod tests { fn block_builder_does_not_include_invalid() { let client = test_client::new(); - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1704,8 +1875,11 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_number, 1); - assert!(client.state_at(&BlockId::Number(1)).unwrap().pairs() != client.state_at(&BlockId::Number(0)).unwrap().pairs()); + assert_eq!(client.info().chain.best_number, 1); + assert_ne!( + client.state_at(&BlockId::Number(1)).unwrap().pairs(), + client.state_at(&BlockId::Number(0)).unwrap().pairs() + ); assert_eq!(client.body(&BlockId::Number(1)).unwrap().unwrap().len(), 1) } @@ -1714,11 +1888,14 @@ pub(crate) mod tests { // block tree: // G - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; - assert_eq!(genesis_hash.clone(), client.best_containing(genesis_hash.clone(), None).unwrap().unwrap()); + assert_eq!( + genesis_hash.clone(), + longest_chain_select.finality_target(genesis_hash.clone(), None).unwrap().unwrap() + ); } #[test] @@ -1726,11 +1903,14 @@ pub(crate) mod tests { // block tree: // G - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); - let uninserted_block = client.new_block().unwrap().bake().unwrap(); + let uninserted_block = client.new_block(Default::default()).unwrap().bake().unwrap(); - assert_eq!(None, client.best_containing(uninserted_block.hash().clone(), None).unwrap()); + assert_eq!( + None, + longest_chain_select.finality_target(uninserted_block.hash().clone(), None).unwrap() + ); } #[test] @@ -1740,11 +1920,11 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block().unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); let v: Vec = Vec::new(); assert_eq!(v, client.uncles(a2.hash(), 3).unwrap()); @@ -1760,27 +1940,27 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1792,15 +1972,15 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1812,7 +1992,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1823,7 +2003,7 @@ pub(crate) mod tests { let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; let uncles1 = client.uncles(a4.hash(), 10).unwrap(); assert_eq!(vec![b2.hash(), d2.hash()], uncles1); @@ -1845,63 +2025,58 @@ pub(crate) mod tests { } #[test] - fn best_containing_with_single_chain_3_blocks() { + fn best_containing_on_longest_chain_with_single_chain_3_blocks() { // block tree: // G -> A1 -> A2 - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block().unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; - assert_eq!(a2.hash(), client.best_containing(genesis_hash, None).unwrap().unwrap()); - assert_eq!(a2.hash(), client.best_containing(a1.hash(), None).unwrap().unwrap()); - assert_eq!(a2.hash(), client.best_containing(a2.hash(), None).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target(genesis_hash, None).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target(a1.hash(), None).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target(a2.hash(), None).unwrap().unwrap()); } #[test] - fn best_containing_with_multiple_forks() { - // NOTE: we use the version of the trait from `test_client` - // because that is actually different than the version linked to - // in the test facade crate. - use test_client::blockchain::Backend as BlockchainBackendT; - + fn best_containing_on_longest_chain_with_multiple_forks() { // block tree: // G -> A1 -> A2 -> A3 -> A4 -> A5 // A1 -> B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1913,15 +2088,15 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1933,7 +2108,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1944,10 +2119,10 @@ pub(crate) mod tests { let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_hash, a5.hash()); + assert_eq!(client.info().chain.best_hash, a5.hash()); - let genesis_hash = client.info().unwrap().chain.genesis_hash; - let leaves = BlockchainBackendT::leaves(client.backend().blockchain()).unwrap(); + let genesis_hash = client.info().chain.genesis_hash; + let leaves = longest_chain_select.leaves().unwrap(); assert!(leaves.contains(&a5.hash())); assert!(leaves.contains(&b4.hash())); @@ -1957,147 +2132,224 @@ pub(crate) mod tests { // search without restriction - assert_eq!(a5.hash(), client.best_containing(genesis_hash, None).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a1.hash(), None).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a2.hash(), None).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a3.hash(), None).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a4.hash(), None).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a5.hash(), None).unwrap().unwrap()); - - assert_eq!(b4.hash(), client.best_containing(b2.hash(), None).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b3.hash(), None).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b4.hash(), None).unwrap().unwrap()); - - assert_eq!(c3.hash(), client.best_containing(c3.hash(), None).unwrap().unwrap()); - - assert_eq!(d2.hash(), client.best_containing(d2.hash(), None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + genesis_hash, None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a1.hash(), None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a2.hash(), None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a3.hash(), None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a4.hash(), None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a5.hash(), None).unwrap().unwrap()); + + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b2.hash(), None).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b3.hash(), None).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b4.hash(), None).unwrap().unwrap()); + + assert_eq!(c3.hash(), longest_chain_select.finality_target( + c3.hash(), None).unwrap().unwrap()); + + assert_eq!(d2.hash(), longest_chain_select.finality_target( + d2.hash(), None).unwrap().unwrap()); // search only blocks with number <= 5. equivalent to without restriction for this scenario - assert_eq!(a5.hash(), client.best_containing(genesis_hash, Some(5)).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a1.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a2.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a3.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a4.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a5.hash(), Some(5)).unwrap().unwrap()); - - assert_eq!(b4.hash(), client.best_containing(b2.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b3.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b4.hash(), Some(5)).unwrap().unwrap()); - - assert_eq!(c3.hash(), client.best_containing(c3.hash(), Some(5)).unwrap().unwrap()); - - assert_eq!(d2.hash(), client.best_containing(d2.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + genesis_hash, Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a1.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a2.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a3.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a4.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a5.hash(), Some(5)).unwrap().unwrap()); + + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b2.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b3.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b4.hash(), Some(5)).unwrap().unwrap()); + + assert_eq!(c3.hash(), longest_chain_select.finality_target( + c3.hash(), Some(5)).unwrap().unwrap()); + + assert_eq!(d2.hash(), longest_chain_select.finality_target( + d2.hash(), Some(5)).unwrap().unwrap()); // search only blocks with number <= 4 - assert_eq!(a4.hash(), client.best_containing(genesis_hash, Some(4)).unwrap().unwrap()); - assert_eq!(a4.hash(), client.best_containing(a1.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(a4.hash(), client.best_containing(a2.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(a4.hash(), client.best_containing(a3.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(a4.hash(), client.best_containing(a4.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(a5.hash(), Some(4)).unwrap()); - - assert_eq!(b4.hash(), client.best_containing(b2.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b3.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b4.hash(), Some(4)).unwrap().unwrap()); - - assert_eq!(c3.hash(), client.best_containing(c3.hash(), Some(4)).unwrap().unwrap()); - - assert_eq!(d2.hash(), client.best_containing(d2.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(a4.hash(), longest_chain_select.finality_target( + genesis_hash, Some(4)).unwrap().unwrap()); + assert_eq!(a4.hash(), longest_chain_select.finality_target( + a1.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(a4.hash(), longest_chain_select.finality_target( + a2.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(a4.hash(), longest_chain_select.finality_target( + a3.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(a4.hash(), longest_chain_select.finality_target( + a4.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a5.hash(), Some(4)).unwrap()); + + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b2.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b3.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b4.hash(), Some(4)).unwrap().unwrap()); + + assert_eq!(c3.hash(), longest_chain_select.finality_target( + c3.hash(), Some(4)).unwrap().unwrap()); + + assert_eq!(d2.hash(), longest_chain_select.finality_target( + d2.hash(), Some(4)).unwrap().unwrap()); // search only blocks with number <= 3 - assert_eq!(a3.hash(), client.best_containing(genesis_hash, Some(3)).unwrap().unwrap()); - assert_eq!(a3.hash(), client.best_containing(a1.hash(), Some(3)).unwrap().unwrap()); - assert_eq!(a3.hash(), client.best_containing(a2.hash(), Some(3)).unwrap().unwrap()); - assert_eq!(a3.hash(), client.best_containing(a3.hash(), Some(3)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(a4.hash(), Some(3)).unwrap()); - assert_eq!(None, client.best_containing(a5.hash(), Some(3)).unwrap()); - - assert_eq!(b3.hash(), client.best_containing(b2.hash(), Some(3)).unwrap().unwrap()); - assert_eq!(b3.hash(), client.best_containing(b3.hash(), Some(3)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(b4.hash(), Some(3)).unwrap()); - - assert_eq!(c3.hash(), client.best_containing(c3.hash(), Some(3)).unwrap().unwrap()); - - assert_eq!(d2.hash(), client.best_containing(d2.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(a3.hash(), longest_chain_select.finality_target( + genesis_hash, Some(3)).unwrap().unwrap()); + assert_eq!(a3.hash(), longest_chain_select.finality_target( + a1.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(a3.hash(), longest_chain_select.finality_target( + a2.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(a3.hash(), longest_chain_select.finality_target( + a3.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a4.hash(), Some(3)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a5.hash(), Some(3)).unwrap()); + + assert_eq!(b3.hash(), longest_chain_select.finality_target( + b2.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(b3.hash(), longest_chain_select.finality_target( + b3.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b4.hash(), Some(3)).unwrap()); + + assert_eq!(c3.hash(), longest_chain_select.finality_target( + c3.hash(), Some(3)).unwrap().unwrap()); + + assert_eq!(d2.hash(), longest_chain_select.finality_target( + d2.hash(), Some(3)).unwrap().unwrap()); // search only blocks with number <= 2 - assert_eq!(a2.hash(), client.best_containing(genesis_hash, Some(2)).unwrap().unwrap()); - assert_eq!(a2.hash(), client.best_containing(a1.hash(), Some(2)).unwrap().unwrap()); - assert_eq!(a2.hash(), client.best_containing(a2.hash(), Some(2)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(a3.hash(), Some(2)).unwrap()); - assert_eq!(None, client.best_containing(a4.hash(), Some(2)).unwrap()); - assert_eq!(None, client.best_containing(a5.hash(), Some(2)).unwrap()); - - assert_eq!(b2.hash(), client.best_containing(b2.hash(), Some(2)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(b3.hash(), Some(2)).unwrap()); - assert_eq!(None, client.best_containing(b4.hash(), Some(2)).unwrap()); - - assert_eq!(None, client.best_containing(c3.hash(), Some(2)).unwrap()); - - assert_eq!(d2.hash(), client.best_containing(d2.hash(), Some(2)).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target( + genesis_hash, Some(2)).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target( + a1.hash(), Some(2)).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target( + a2.hash(), Some(2)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a3.hash(), Some(2)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a4.hash(), Some(2)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a5.hash(), Some(2)).unwrap()); + + assert_eq!(b2.hash(), longest_chain_select.finality_target( + b2.hash(), Some(2)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b3.hash(), Some(2)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b4.hash(), Some(2)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + c3.hash(), Some(2)).unwrap()); + + assert_eq!(d2.hash(), longest_chain_select.finality_target( + d2.hash(), Some(2)).unwrap().unwrap()); // search only blocks with number <= 1 - assert_eq!(a1.hash(), client.best_containing(genesis_hash, Some(1)).unwrap().unwrap()); - assert_eq!(a1.hash(), client.best_containing(a1.hash(), Some(1)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(a2.hash(), Some(1)).unwrap()); - assert_eq!(None, client.best_containing(a3.hash(), Some(1)).unwrap()); - assert_eq!(None, client.best_containing(a4.hash(), Some(1)).unwrap()); - assert_eq!(None, client.best_containing(a5.hash(), Some(1)).unwrap()); - - assert_eq!(None, client.best_containing(b2.hash(), Some(1)).unwrap()); - assert_eq!(None, client.best_containing(b3.hash(), Some(1)).unwrap()); - assert_eq!(None, client.best_containing(b4.hash(), Some(1)).unwrap()); - - assert_eq!(None, client.best_containing(c3.hash(), Some(1)).unwrap()); - - assert_eq!(None, client.best_containing(d2.hash(), Some(1)).unwrap()); + assert_eq!(a1.hash(), longest_chain_select.finality_target( + genesis_hash, Some(1)).unwrap().unwrap()); + assert_eq!(a1.hash(), longest_chain_select.finality_target( + a1.hash(), Some(1)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a2.hash(), Some(1)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a3.hash(), Some(1)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a4.hash(), Some(1)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a5.hash(), Some(1)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + b2.hash(), Some(1)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b3.hash(), Some(1)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b4.hash(), Some(1)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + c3.hash(), Some(1)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + d2.hash(), Some(1)).unwrap()); // search only blocks with number <= 0 - assert_eq!(genesis_hash, client.best_containing(genesis_hash, Some(0)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(a1.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(a2.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(a3.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(a4.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(a5.hash(), Some(0)).unwrap()); - - assert_eq!(None, client.best_containing(b2.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(b3.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(b4.hash(), Some(0)).unwrap()); - - assert_eq!(None, client.best_containing(c3.hash().clone(), Some(0)).unwrap()); - - assert_eq!(None, client.best_containing(d2.hash().clone(), Some(0)).unwrap()); + assert_eq!(genesis_hash, longest_chain_select.finality_target( + genesis_hash, Some(0)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a1.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a2.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a3.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a4.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a5.hash(), Some(0)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + b2.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b3.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b4.hash(), Some(0)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + c3.hash().clone(), Some(0)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + d2.hash().clone(), Some(0)).unwrap()); } #[test] - fn best_containing_with_max_depth_higher_than_best() { + fn best_containing_on_longest_chain_with_max_depth_higher_than_best() { // block tree: // G -> A1 -> A2 - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block().unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; - assert_eq!(a2.hash(), client.best_containing(genesis_hash, Some(10)).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target(genesis_hash, Some(10)).unwrap().unwrap()); } #[test] @@ -2122,35 +2374,38 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 let justification = vec![1, 2, 3]; - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import_justified(BlockOrigin::Own, a3.clone(), justification.clone()).unwrap(); + #[allow(deprecated)] + let blockchain = client.backend().blockchain(); + assert_eq!( - client.backend().blockchain().last_finalized().unwrap(), + blockchain.last_finalized().unwrap(), a3.hash(), ); assert_eq!( - client.backend().blockchain().justification(BlockId::Hash(a3.hash())).unwrap(), + blockchain.justification(BlockId::Hash(a3.hash())).unwrap(), Some(justification), ); assert_eq!( - client.backend().blockchain().justification(BlockId::Hash(a1.hash())).unwrap(), + blockchain.justification(BlockId::Hash(a1.hash())).unwrap(), None, ); assert_eq!( - client.backend().blockchain().justification(BlockId::Hash(a2.hash())).unwrap(), + blockchain.justification(BlockId::Hash(a2.hash())).unwrap(), None, ); } diff --git a/core/client/src/error.rs b/core/client/src/error.rs index 050f867dfcb86e0816b63db2ba03ae904022f817..b807d5e11cc5dddaff2d3b93b71b4e14855478f8 100644 --- a/core/client/src/error.rs +++ b/core/client/src/error.rs @@ -42,7 +42,7 @@ pub enum Error { ApplyExtrinsicFailed(ApplyError), /// Execution error. #[display(fmt = "Execution: {}", _0)] - Execution(Box), + Execution(Box), /// Blockchain error. #[display(fmt = "Blockchain: {}", _0)] Blockchain(Box), @@ -55,7 +55,10 @@ pub enum Error { /// Genesis config is invalid. #[display(fmt = "Genesis config provided is invalid")] GenesisInvalid, - /// Bad justification for header. + /// Error decoding header justification. + #[display(fmt = "error decoding justification for header")] + JustificationDecode, + /// Justification for header is correctly encoded, but invalid. #[display(fmt = "bad justification for header: {}", _0)] BadJustification(String), /// Not available on light client. @@ -89,15 +92,15 @@ pub enum Error { #[display(fmt = "Potential long-range attack: block not in finalized chain.")] NotInFinalizedChain, /// Hash that is required for building CHT is missing. - #[display(fmt = "Failed to get hash of block#{} for building CHT#{}", _0, _1)] - MissingHashRequiredForCHT(u64, u64), + #[display(fmt = "Failed to get hash of block for building CHT")] + MissingHashRequiredForCHT, /// A convenience variant for String #[display(fmt = "{}", _0)] Msg(String), } impl error::Error for Error { - fn source(&self) -> Option<&(error::Error + 'static)> { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { match self { Error::Consensus(e) => Some(e), Error::Blockchain(e) => Some(e), @@ -125,7 +128,7 @@ impl Error { } /// Chain a state error. - pub fn from_state(e: Box) -> Self { + pub fn from_state(e: Box) -> Self { Error::Execution(e) } } diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index 74bc74360a2c9517c7344b4f1dfc31c07cc1b870..73bd1e03680bc7649a2d8bf5fd4424fba65472da 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -84,7 +84,7 @@ mod tests { state_machine::new( backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -97,7 +97,7 @@ mod tests { for tx in transactions.iter() { state_machine::new( backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -110,7 +110,7 @@ mod tests { let (ret_data, _, _) = state_machine::new( backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -157,7 +157,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let _ = state_machine::new( &backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -186,7 +186,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let _ = state_machine::new( &backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -215,7 +215,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let r = state_machine::new( &backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &Executor::new(None), diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index f6b69287a41c91d63251c3110412f82e2d5ab755..dec10d40f79f4cc2d1f905c6c40705a413689a9e 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -18,16 +18,17 @@ use std::collections::HashMap; use std::sync::Arc; -use parking_lot::RwLock; +use parking_lot::{RwLock, Mutex}; use primitives::{ChangesTrieConfiguration, storage::well_known_keys}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, - NumberFor, As, Digest, DigestItem}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Zero, + NumberFor, Digest, DigestItem +}; use runtime_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; -use state_machine::backend::{Backend as StateBackend, InMemory, Consolidate}; +use state_machine::backend::{Backend as StateBackend, InMemory}; use state_machine::{self, InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId}; use hash_db::Hasher; -use heapsize::HeapSizeOf; use trie::MemoryDB; use consensus::well_known_cache_keys::Id as CacheKeyId; @@ -296,15 +297,15 @@ impl HeaderBackend for Blockchain { })) } - fn info(&self) -> error::Result> { + fn info(&self) -> blockchain::Info { let storage = self.storage.read(); - Ok(blockchain::Info { + blockchain::Info { best_hash: storage.best_hash, best_number: storage.best_number, genesis_hash: storage.genesis_hash, finalized_hash: storage.finalized_hash, finalized_number: storage.finalized_number, - }) + } } fn status(&self, id: BlockId) -> error::Result { @@ -342,7 +343,7 @@ impl blockchain::Backend for Blockchain { Ok(self.storage.read().finalized_hash.clone()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } @@ -356,7 +357,7 @@ impl blockchain::Backend for Blockchain { } impl blockchain::ProvideCache for Blockchain { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } @@ -414,17 +415,25 @@ impl light::blockchain::Storage for Blockchain Blockchain::finalize_header(self, id, None) } - fn header_cht_root(&self, _cht_size: u64, block: NumberFor) -> error::Result { + fn header_cht_root( + &self, + _cht_size: NumberFor, + block: NumberFor, + ) -> error::Result { self.storage.read().header_cht_roots.get(&block).cloned() .ok_or_else(|| error::Error::Backend(format!("Header CHT for block {} not exists", block))) } - fn changes_trie_cht_root(&self, _cht_size: u64, block: NumberFor) -> error::Result { + fn changes_trie_cht_root( + &self, + _cht_size: NumberFor, + block: NumberFor, + ) -> error::Result { self.storage.read().changes_trie_cht_roots.get(&block).cloned() .ok_or_else(|| error::Error::Backend(format!("Changes trie CHT for block {} not exists", block))) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } @@ -446,7 +455,7 @@ where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { type State = InMemory; @@ -483,22 +492,17 @@ where Ok(()) } - fn reset_storage(&mut self, mut top: StorageOverlay, children: ChildrenStorageOverlay) -> error::Result { + fn reset_storage(&mut self, top: StorageOverlay, children: ChildrenStorageOverlay) -> error::Result { check_genesis_storage(&top, &children)?; - let mut transaction: Vec<(Option>, Vec, Option>)> = Default::default(); - - for (child_key, child_map) in children { - let (root, is_default, update) = self.old_state.child_storage_root(&child_key, child_map.into_iter().map(|(k, v)| (k, Some(v)))); - transaction.consolidate(update); + let child_delta = children.into_iter() + .map(|(storage_key, child_overlay)| + (storage_key, child_overlay.into_iter().map(|(k, v)| (k, Some(v))))); - if !is_default { - top.insert(child_key, root); - } - } - - let (root, update) = self.old_state.storage_root(top.into_iter().map(|(k, v)| (k, Some(v)))); - transaction.consolidate(update); + let (root, transaction) = self.old_state.full_storage_root( + top.into_iter().map(|(k, v)| (k, Some(v))), + child_delta + ); self.new_state = Some(InMemory::from(transaction)); Ok(root) @@ -532,18 +536,19 @@ pub struct Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { states: RwLock>>, - changes_trie_storage: ChangesTrieStorage, + changes_trie_storage: ChangesTrieStorage, blockchain: Blockchain, + import_lock: Mutex<()>, } impl Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { /// Create a new instance of in-mem backend. pub fn new() -> Backend { @@ -551,6 +556,7 @@ where states: RwLock::new(HashMap::new()), changes_trie_storage: ChangesTrieStorage(InMemoryChangesTrieStorage::new()), blockchain: Blockchain::new(), + import_lock: Default::default(), } } } @@ -559,7 +565,7 @@ impl backend::AuxStore for Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { fn insert_aux< 'a, @@ -580,12 +586,12 @@ impl backend::Backend for Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { type BlockImportOperation = BlockImportOperation; type Blockchain = Blockchain; type State = InMemory; - type ChangesTrieStorage = ChangesTrieStorage; + type ChangesTrieStorage = ChangesTrieStorage; fn begin_operation(&self) -> error::Result { let old_state = self.state_at(BlockId::Hash(Default::default()))?; @@ -625,7 +631,11 @@ where if let Some(changes_trie_root) = changes_trie_root { if let Some(changes_trie_update) = operation.changes_trie_update { let changes_trie_root: H::Out = changes_trie_root.into(); - self.changes_trie_storage.0.insert(header.number().as_(), changes_trie_root, changes_trie_update); + self.changes_trie_storage.0.insert( + *header.number(), + changes_trie_root, + changes_trie_update + ); } } @@ -674,7 +684,11 @@ where } fn revert(&self, _n: NumberFor) -> error::Result> { - Ok(As::sa(0)) + Ok(Zero::zero()) + } + + fn get_import_lock(&self) -> &Mutex<()> { + &self.import_lock } } @@ -682,14 +696,14 @@ impl backend::LocalBackend for Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, {} impl backend::RemoteBackend for Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { fn is_local_state_available(&self, block: &BlockId) -> bool { self.blockchain.expect_block_number_from_id(block) @@ -699,22 +713,45 @@ where } /// Prunable in-memory changes trie storage. -pub struct ChangesTrieStorage(InMemoryChangesTrieStorage) where H::Out: HeapSizeOf; -impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage where H::Out: HeapSizeOf { - fn oldest_changes_trie_block(&self, _config: &ChangesTrieConfiguration, _best_finalized: u64) -> u64 { - 0 +pub struct ChangesTrieStorage(InMemoryChangesTrieStorage>); +impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage { + fn oldest_changes_trie_block( + &self, + _config: &ChangesTrieConfiguration, + _best_finalized: NumberFor, + ) -> NumberFor { + Zero::zero() } } -impl state_machine::ChangesTrieRootsStorage for ChangesTrieStorage where H::Out: HeapSizeOf { - fn root(&self, anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { - self.0.root(anchor, block) +impl state_machine::ChangesTrieRootsStorage> for ChangesTrieStorage + where + Block: BlockT, + H: Hasher, +{ + fn build_anchor( + &self, + _hash: H::Out, + ) -> Result>, String> { + Err("Dummy implementation".into()) + } + + fn root( + &self, + _anchor: &ChangesTrieAnchorBlockId>, + _block: NumberFor, + ) -> Result, String> { + Err("Dummy implementation".into()) } } -impl state_machine::ChangesTrieStorage for ChangesTrieStorage where H::Out: HeapSizeOf { - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { - self.0.get(key, prefix) +impl state_machine::ChangesTrieStorage> for ChangesTrieStorage + where + Block: BlockT, + H: Hasher, +{ + fn get(&self, _key: &H::Out, _prefix: &[u8]) -> Result, String> { + Err("Dummy implementation".into()) } } diff --git a/core/client/src/leaves.rs b/core/client/src/leaves.rs index 144237f777ca8b066be3ba03882bc68bee0d8612..b0e49ead80d40e04bf829c8719fd0f40d3d11fa5 100644 --- a/core/client/src/leaves.rs +++ b/core/client/src/leaves.rs @@ -77,7 +77,7 @@ impl LeafSet where } /// Read the leaf list from the DB, using given prefix for keys. - pub fn read_from_db(db: &KeyValueDB, column: Option, prefix: &[u8]) -> error::Result { + pub fn read_from_db(db: &dyn KeyValueDB, column: Option, prefix: &[u8]) -> error::Result { let mut storage = BTreeMap::new(); for (key, value) in db.iter_from_prefix(column, prefix) { diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index d2da243d14a4db3980bcc91c200deb80ba0aed0e..574ec95dc003ff4604d5da11be7ddcd2f7c35306 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -58,12 +58,13 @@ pub use crate::client::{ new_with_backend, new_in_mem, BlockBody, BlockStatus, ImportNotifications, FinalityNotifications, BlockchainEvents, - BlockImportNotification, Client, ClientInfo, ChainHead, ExecutionStrategies, + BlockImportNotification, Client, ClientInfo, ExecutionStrategies, + LongestChain }; #[cfg(feature = "std")] pub use crate::notifications::{StorageEventStream, StorageChangeSet}; #[cfg(feature = "std")] -pub use state_machine::ExecutionStrategy; +pub use state_machine::{ExecutionStrategy, NeverOffchainExt}; #[cfg(feature = "std")] pub use crate::leaves::LeafSet; diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index f22ee8a7620737596fe85ca1f701eaca19058288..60b4c66c17c360d65bda7501ca9751e42e507091 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -20,7 +20,7 @@ use std::collections::HashMap; use std::sync::{Arc, Weak}; use futures::{Future, IntoFuture}; -use parking_lot::RwLock; +use parking_lot::{RwLock, Mutex}; use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::{Backend as StateBackend, TrieBackend, backend::InMemory as InMemoryState}; @@ -33,19 +33,19 @@ use crate::light::blockchain::{Blockchain, Storage as BlockchainStorage}; use crate::light::fetcher::{Fetcher, RemoteReadRequest}; use hash_db::Hasher; use trie::MemoryDB; -use heapsize::HeapSizeOf; use consensus::well_known_cache_keys; const IN_MEMORY_EXPECT_PROOF: &str = "InMemory state backend has Void error type and always suceeds; qed"; /// Light client backend. -pub struct Backend { +pub struct Backend { blockchain: Arc>, genesis_state: RwLock>>, + import_lock: Mutex<()>, } /// Light block (header and justification) import operation. -pub struct ImportOperation { +pub struct ImportOperation { header: Option, cache: HashMap>, leaf_state: NewBlockState, @@ -65,19 +65,20 @@ pub struct OnDemandState { } /// On-demand or in-memory genesis state. -pub enum OnDemandOrGenesisState { +pub enum OnDemandOrGenesisState { /// On-demand state - storage values are fetched from remote nodes. OnDemand(OnDemandState), /// Genesis state - storage values are stored in-memory. Genesis(InMemoryState), } -impl Backend { +impl Backend { /// Create new light backend. pub fn new(blockchain: Arc>) -> Self { Self { blockchain, genesis_state: RwLock::new(None), + import_lock: Default::default(), } } @@ -87,7 +88,7 @@ impl Backend { } } -impl AuxStore for Backend { +impl AuxStore for Backend { fn insert_aux< 'a, 'b: 'a, @@ -108,12 +109,12 @@ impl ClientBackend for Backend where S: BlockchainStorage, F: Fetcher, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { type BlockImportOperation = ImportOperation; type Blockchain = Blockchain; type State = OnDemandOrGenesisState; - type ChangesTrieStorage = in_mem::ChangesTrieStorage; + type ChangesTrieStorage = in_mem::ChangesTrieStorage; fn begin_operation(&self) -> ClientResult { Ok(ImportOperation { @@ -214,6 +215,10 @@ impl ClientBackend for Backend where fn revert(&self, _n: NumberFor) -> ClientResult> { Err(ClientError::NotAvailableOnLightClient.into()) } + + fn get_import_lock(&self) -> &Mutex<()> { + &self.import_lock + } } impl RemoteBackend for Backend @@ -222,7 +227,7 @@ where S: BlockchainStorage, F: Fetcher, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { fn is_local_state_available(&self, block: &BlockId) -> bool { self.genesis_state.read().is_some() @@ -238,7 +243,7 @@ where F: Fetcher, S: BlockchainStorage, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { type State = OnDemandOrGenesisState; @@ -279,11 +284,20 @@ where // this is only called when genesis block is imported => shouldn't be performance bottleneck let mut storage: HashMap>, StorageOverlay> = HashMap::new(); storage.insert(None, top); + + // create a list of children keys to re-compute roots for + let child_delta = children.keys() + .cloned() + .map(|storage_key| (storage_key, None)) + .collect::>(); + + // make sure to persist the child storage for (child_key, child_storage) in children { storage.insert(Some(child_key), child_storage); } + let storage_update: InMemoryState = storage.into(); - let (storage_root, _) = storage_update.storage_root(::std::iter::empty()); + let (storage_root, _) = storage_update.full_storage_root(::std::iter::empty(), child_delta); self.storage_update = Some(storage_update); Ok(storage_root) @@ -374,12 +388,12 @@ where Vec::new() } - fn keys(&self, _prefix: &Vec) -> Vec> { + fn keys(&self, _prefix: &[u8]) -> Vec> { // whole state is not available on light node Vec::new() } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { None } } @@ -390,7 +404,7 @@ where F: Fetcher, S: BlockchainStorage, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { type Error = ClientError; type Transaction = (); @@ -466,7 +480,7 @@ where } } - fn keys(&self, prefix: &Vec) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { match *self { OnDemandOrGenesisState::OnDemand(ref state) => StateBackend::::keys(state, prefix), @@ -474,10 +488,10 @@ where } } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { match self { - OnDemandOrGenesisState::OnDemand(state) => state.try_into_trie_backend(), - OnDemandOrGenesisState::Genesis(state) => state.try_into_trie_backend(), + OnDemandOrGenesisState::OnDemand(ref mut state) => state.as_trie_backend(), + OnDemandOrGenesisState::Genesis(ref mut state) => state.as_trie_backend(), } } } diff --git a/core/client/src/light/blockchain.rs b/core/client/src/light/blockchain.rs index b43247034f2dac2f00f7d711a92ed355ca4a2046..e3d9c55a6a4633c0197debdd6ac9f93b2ee93ece 100644 --- a/core/client/src/light/blockchain.rs +++ b/core/client/src/light/blockchain.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Light client blockchin backend. Only stores headers and justifications of recent +//! Light client blockchain backend. Only stores headers and justifications of recent //! blocks. CHT roots are stored for headers of ancient blocks. use std::{sync::{Weak, Arc}, collections::HashMap}; @@ -30,7 +30,7 @@ use crate::blockchain::{Backend as BlockchainBackend, BlockStatus, Cache as Bloc HeaderBackend as BlockchainHeaderBackend, Info as BlockchainInfo, ProvideCache}; use crate::cht; use crate::error::{Error as ClientError, Result as ClientResult}; -use crate::light::fetcher::{Fetcher, RemoteHeaderRequest}; +use crate::light::fetcher::{Fetcher, RemoteBodyRequest, RemoteHeaderRequest}; /// Light client blockchain storage. pub trait Storage: AuxStore + BlockchainHeaderBackend { @@ -56,13 +56,21 @@ pub trait Storage: AuxStore + BlockchainHeaderBackend { fn last_finalized(&self) -> ClientResult; /// Get headers CHT root for given block. Fails if the block is not pruned (not a part of any CHT). - fn header_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult; + fn header_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult; /// Get changes trie CHT root for given block. Fails if the block is not pruned (not a part of any CHT). - fn changes_trie_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult; + fn changes_trie_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult; /// Get storage cache. - fn cache(&self) -> Option>>; + fn cache(&self) -> Option>>; } /// Light client blockchain. @@ -116,7 +124,7 @@ impl BlockchainHeaderBackend for Blockchain where Bloc self.fetcher().upgrade().ok_or(ClientError::NotAvailableOnLightClient)? .remote_header(RemoteHeaderRequest { - cht_root: self.storage.header_cht_root(cht::SIZE, number)?, + cht_root: self.storage.header_cht_root(cht::size(), number)?, block: number, retry_count: None, }) @@ -126,7 +134,7 @@ impl BlockchainHeaderBackend for Blockchain where Bloc } } - fn info(&self) -> ClientResult> { + fn info(&self) -> BlockchainInfo { self.storage.info() } @@ -144,9 +152,19 @@ impl BlockchainHeaderBackend for Blockchain where Bloc } impl BlockchainBackend for Blockchain where Block: BlockT, S: Storage, F: Fetcher { - fn body(&self, _id: BlockId) -> ClientResult>> { - // TODO: #1445 fetch from remote node - Ok(None) + fn body(&self, id: BlockId) -> ClientResult>> { + let header = match self.header(id)? { + Some(header) => header, + None => return Ok(None), + }; + + self.fetcher().upgrade().ok_or(ClientError::NotAvailableOnLightClient)? + .remote_body(RemoteBodyRequest { + header, + retry_count: None, + }) + .into_future().wait() + .map(Some) } fn justification(&self, _id: BlockId) -> ClientResult> { @@ -157,7 +175,7 @@ impl BlockchainBackend for Blockchain where Block: Blo self.storage.last_finalized() } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { self.storage.cache() } @@ -171,7 +189,7 @@ impl BlockchainBackend for Blockchain where Block: Blo } impl, F, Block: BlockT> ProvideCache for Blockchain { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { self.storage.cache() } } @@ -205,8 +223,8 @@ pub mod tests { Err(ClientError::Backend("Test error".into())) } - fn info(&self) -> ClientResult> { - Err(ClientError::Backend("Test error".into())) + fn info(&self) -> Info { + panic!("Test error") } fn status(&self, _id: BlockId) -> ClientResult { @@ -285,7 +303,7 @@ pub mod tests { ).into()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 6fcd2f4052a8a7c11ddce30c63c88af9cf99b9e0..a6b381a8b1387ddac36b6eb5141fd03d298ba162 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -14,27 +14,33 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Light client call exector. Executes methods on remote full nodes, fetching +//! Light client call executor. Executes methods on remote full nodes, fetching //! execution proof and checking it locally. -use std::{collections::HashSet, sync::Arc, panic::UnwindSafe, result, marker::PhantomData}; +use std::{ + collections::HashSet, sync::Arc, panic::UnwindSafe, result, + marker::PhantomData, cell::RefCell, rc::Rc, +}; use futures::{IntoFuture, Future}; use parity_codec::{Encode, Decode}; -use primitives::{H256, Blake2Hasher, convert_hash, NativeOrEncoded, OffchainExt}; +use primitives::{offchain, H256, Blake2Hasher, convert_hash, NativeOrEncoded}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT}; -use state_machine::{self, Backend as StateBackend, CodeExecutor, OverlayedChanges, ExecutionStrategy, - create_proof_check_backend, execution_proof_check_on_trie_backend, ExecutionManager, NeverOffchainExt}; +use runtime_primitives::traits::{One, Block as BlockT, Header as HeaderT}; +use state_machine::{ + self, Backend as StateBackend, CodeExecutor, OverlayedChanges, + ExecutionStrategy, create_proof_check_backend, + execution_proof_check_on_trie_backend, ExecutionManager, NeverOffchainExt +}; use hash_db::Hasher; +use crate::runtime_api::{ProofRecorder, InitializeBlock}; use crate::backend::RemoteBackend; use crate::blockchain::Backend as ChainBackend; use crate::call_executor::CallExecutor; use crate::error::{Error as ClientError, Result as ClientResult}; use crate::light::fetcher::{Fetcher, RemoteCallRequest}; use executor::{RuntimeVersion, NativeVersion}; -use heapsize::HeapSizeOf; use trie::MemoryDB; /// Call executor that executes methods on remote node, querying execution proof @@ -81,7 +87,7 @@ where type Error = ClientError; fn call< - O: OffchainExt, + O: offchain::Externalities, >( &self, id: &BlockId, @@ -104,8 +110,9 @@ where } fn contextual_call< - O: OffchainExt, - PB: Fn() -> ClientResult, + 'a, + O: offchain::Externalities, + IB: Fn() -> ClientResult<()>, EM: Fn( Result, Self::Error>, Result, Self::Error> @@ -114,18 +121,26 @@ where NC, >( &self, + _initialize_block_fn: IB, at: &BlockId, method: &str, call_data: &[u8], - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, - _prepare_environment_block: PB, + changes: &RefCell, + initialize_block: InitializeBlock<'a, Block>, execution_manager: ExecutionManager, _native_call: Option, side_effects_handler: Option<&mut O>, + _recorder: &Option>>>, ) -> ClientResult> where ExecutionManager: Clone { + let block_initialized = match initialize_block { + InitializeBlock::Do(ref init_block) => { + init_block.borrow().is_some() + }, + InitializeBlock::Skip => false, + }; + // it is only possible to execute contextual call if changes are empty - if !changes.is_empty() || initialized_block.is_some() { + if !changes.borrow().is_empty() || block_initialized { return Err(ClientError::NotAvailableOnLightClient.into()); } @@ -133,13 +148,13 @@ where } fn runtime_version(&self, id: &BlockId) -> ClientResult { - let call_result = self.call(id, "version", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new())?; + let call_result = self.call(id, "Core_version", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new())?; RuntimeVersion::decode(&mut call_result.as_slice()) .ok_or_else(|| ClientError::VersionInvalid.into()) } fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: StateBackend, FF: FnOnce( Result, Self::Error>, @@ -215,7 +230,7 @@ impl CallExecutor for type Error = ClientError; fn call< - O: OffchainExt, + O: offchain::Externalities, >( &self, id: &BlockId, @@ -231,8 +246,9 @@ impl CallExecutor for } fn contextual_call< - O: OffchainExt, - PB: Fn() -> ClientResult, + 'a, + O: offchain::Externalities, + IB: Fn() -> ClientResult<()>, EM: Fn( Result, Self::Error>, Result, Self::Error> @@ -241,15 +257,16 @@ impl CallExecutor for NC: FnOnce() -> result::Result + UnwindSafe, >( &self, + initialize_block_fn: IB, at: &BlockId, method: &str, call_data: &[u8], - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, - prepare_environment_block: PB, + changes: &RefCell, + initialize_block: InitializeBlock<'a, Block>, _manager: ExecutionManager, native_call: Option, side_effects_handler: Option<&mut O>, + recorder: &Option>>>, ) -> ClientResult> where ExecutionManager: Clone { // there's no actual way/need to specify native/wasm execution strategy on light node // => we can safely ignore passed values @@ -266,15 +283,16 @@ impl CallExecutor for NC >( &self.local, + initialize_block_fn, at, method, call_data, changes, - initialized_block, - prepare_environment_block, + initialize_block, ExecutionManager::NativeWhenPossible, native_call, side_effects_handler, + recorder, ).map_err(|e| ClientError::Execution(Box::new(e.to_string()))), false => CallExecutor::contextual_call::< _, @@ -287,15 +305,16 @@ impl CallExecutor for NC >( &self.remote, + initialize_block_fn, at, method, call_data, changes, - initialized_block, - prepare_environment_block, + initialize_block, ExecutionManager::NativeWhenPossible, native_call, side_effects_handler, + recorder, ).map_err(|e| ClientError::Execution(Box::new(e.to_string()))), } } @@ -308,7 +327,7 @@ impl CallExecutor for } fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: StateBackend, FF: FnOnce( Result, Self::Error>, @@ -369,7 +388,7 @@ impl CallExecutor for /// Method is executed using passed header as environment' current block. /// Proof includes both environment preparation proof and method execution proof. pub fn prove_execution( - state: S, + mut state: S, header: Block::Header, executor: &E, method: &str, @@ -380,13 +399,13 @@ pub fn prove_execution( S: StateBackend, E: CallExecutor, { - let trie_state = state.try_into_trie_backend() - .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box)?; + let trie_state = state.as_trie_backend() + .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box)?; // prepare execution environment + record preparation proof let mut changes = Default::default(); let (_, init_proof) = executor.prove_at_trie_state( - &trie_state, + trie_state, &mut changes, "Core_initialize_block", &header.encode(), @@ -406,7 +425,7 @@ pub fn prove_execution( /// Check remote contextual execution proof using given backend. /// /// Method is executed using passed header as environment' current block. -/// Proof shoul include both environment preparation proof and method execution proof. +/// Proof should include both environment preparation proof and method execution proof. pub fn check_execution_proof( executor: &E, request: &RemoteCallRequest
, @@ -416,7 +435,7 @@ pub fn check_execution_proof( Header: HeaderT, E: CodeExecutor, H: Hasher, - H::Out: Ord + HeapSizeOf, + H::Out: Ord + 'static, { let local_state_root = request.header.state_root(); let root: H::Out = convert_hash(&local_state_root); @@ -425,11 +444,11 @@ pub fn check_execution_proof( let mut changes = OverlayedChanges::default(); let trie_backend = create_proof_check_backend(root, remote_proof)?; let next_block =
::new( - *request.header.number() + As::sa(1), + *request.header.number() + One::one(), Default::default(), Default::default(), request.header.hash(), - Default::default(), + request.header.digest().clone(), ); execution_proof_check_on_trie_backend::( &trie_backend, @@ -506,7 +525,7 @@ mod tests { for _ in 1..3 { remote_client.import_justified( BlockOrigin::Own, - remote_client.new_block().unwrap().bake().unwrap(), + remote_client.new_block(Default::default()).unwrap().bake().unwrap(), Default::default(), ).unwrap(); } diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index 28df2f8bffdaaee42bc152bbd7d8ddd5c2790219..985aa5bdaa5ccc88a70fc590ea49ed75603e7399 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -22,11 +22,15 @@ use std::marker::PhantomData; use futures::IntoFuture; use hash_db::{HashDB, Hasher}; -use heapsize::HeapSizeOf; +use parity_codec::{Decode, Encode}; use primitives::{ChangesTrieConfiguration, convert_hash}; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, NumberFor}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Hash, HashFor, NumberFor, + SimpleArithmetic, CheckedConversion, +}; use state_machine::{CodeExecutor, ChangesTrieRootsStorage, ChangesTrieAnchorBlockId, - TrieBackend, read_proof_check, key_changes_proof_check, create_proof_check_backend_storage}; + TrieBackend, read_proof_check, key_changes_proof_check, + create_proof_check_backend_storage, read_child_proof_check}; use crate::cht; use crate::error::{Error as ClientError, Result as ClientResult}; @@ -72,6 +76,21 @@ pub struct RemoteReadRequest { pub retry_count: Option, } +/// Remote storage read child request. +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +pub struct RemoteReadChildRequest { + /// Read at state of given block. + pub block: Header::Hash, + /// Header of block at which read is performed. + pub header: Header, + /// Storage key for child. + pub storage_key: Vec, + /// Child storage key to read. + pub key: Vec, + /// Number of times to retry request. None means that default RETRY_COUNT is used. + pub retry_count: Option, +} + /// Remote key changes read request. #[derive(Clone, Debug, PartialEq, Eq)] pub struct RemoteChangesRequest { @@ -109,27 +128,48 @@ pub struct ChangesProof { pub roots_proof: Vec>, } +/// Remote block body request +#[derive(Clone, Default, Debug, PartialEq, Eq, Hash)] +pub struct RemoteBodyRequest { + /// Header of the requested block body + pub header: Header, + /// Number of times to retry request. None means that default RETRY_COUNT is used. + pub retry_count: Option, +} + /// Light client data fetcher. Implementations of this trait must check if remote data /// is correct (see FetchedDataChecker) and return already checked data. pub trait Fetcher: Send + Sync { /// Remote header future. - type RemoteHeaderResult: IntoFuture; + type RemoteHeaderResult: IntoFuture; /// Remote storage read future. - type RemoteReadResult: IntoFuture>, Error=ClientError>; + type RemoteReadResult: IntoFuture>, Error = ClientError>; /// Remote call result future. - type RemoteCallResult: IntoFuture, Error=ClientError>; + type RemoteCallResult: IntoFuture, Error = ClientError>; /// Remote changes result future. - type RemoteChangesResult: IntoFuture, u32)>, Error=ClientError>; + type RemoteChangesResult: IntoFuture, u32)>, Error = ClientError>; + /// Remote block body result future. + type RemoteBodyResult: IntoFuture, Error = ClientError>; /// Fetch remote header. fn remote_header(&self, request: RemoteHeaderRequest) -> Self::RemoteHeaderResult; /// Fetch remote storage value. - fn remote_read(&self, request: RemoteReadRequest) -> Self::RemoteReadResult; + fn remote_read( + &self, + request: RemoteReadRequest + ) -> Self::RemoteReadResult; + /// Fetch remote storage child value. + fn remote_read_child( + &self, + request: RemoteReadChildRequest + ) -> Self::RemoteReadResult; /// Fetch remote call result. fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult; /// Fetch remote changes ((block number, extrinsic index)) where given key has been changed /// at a given blocks range. fn remote_changes(&self, request: RemoteChangesRequest) -> Self::RemoteChangesResult; + /// Fetch remote block body + fn remote_body(&self, request: RemoteBodyRequest) -> Self::RemoteBodyResult; } /// Light client remote data checker. @@ -150,6 +190,12 @@ pub trait FetchChecker: Send + Sync { request: &RemoteReadRequest, remote_proof: Vec> ) -> ClientResult>>; + /// Check remote storage read proof. + fn check_read_child_proof( + &self, + request: &RemoteReadChildRequest, + remote_proof: Vec> + ) -> ClientResult>>; /// Check remote method execution proof. fn check_execution_proof( &self, @@ -162,6 +208,12 @@ pub trait FetchChecker: Send + Sync { request: &RemoteChangesRequest, proof: ChangesProof ) -> ClientResult, u32)>>; + /// Check remote body proof. + fn check_body_proof( + &self, + request: &RemoteBodyRequest, + body: Vec + ) -> ClientResult>; } /// Remote data checker. @@ -184,11 +236,11 @@ impl, F> LightDataChecker, remote_proof: ChangesProof, - cht_size: u64, + cht_size: NumberFor, ) -> ClientResult, u32)>> where H: Hasher, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { // since we need roots of all changes tries for the range begin..max // => remote node can't use max block greater that one that we have passed @@ -232,34 +284,33 @@ impl, F> LightDataChecker( + key_changes_proof_check::<_, H, _>( &request.changes_trie_config, &RootsStorage { roots: (request.tries_roots.0, &request.tries_roots.2), prev_roots: remote_roots, }, remote_proof, - request.first_block.0.as_(), + request.first_block.0, &ChangesTrieAnchorBlockId { hash: convert_hash(&request.last_block.1), - number: request.last_block.0.as_(), + number: request.last_block.0, }, - remote_max_block.as_(), + remote_max_block, &request.key) - .map(|pairs| pairs.into_iter().map(|(b, x)| (As::sa(b), x)).collect()) .map_err(|err| ClientError::ChangesTrieAccessFailed(err)) } /// Check CHT-based proof for changes tries roots. fn check_changes_tries_proof( &self, - cht_size: u64, + cht_size: NumberFor, remote_roots: &BTreeMap, B::Hash>, remote_roots_proof: Vec>, ) -> ClientResult<()> where H: Hasher, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { // all the checks are sharing the same storage let storage = create_proof_check_backend_storage(remote_roots_proof); @@ -309,7 +360,7 @@ impl FetchChecker for LightDataChecker, H: Hasher, - H::Out: Ord + HeapSizeOf, + H::Out: Ord + 'static, S: BlockchainStorage, F: Send + Sync, { @@ -339,6 +390,19 @@ impl FetchChecker for LightDataChecker, + remote_proof: Vec> + ) -> ClientResult>> { + read_child_proof_check::( + convert_hash(request.header.state_root()), + remote_proof, + &request.storage_key, + &request.key) + .map_err(Into::into) + } + fn check_execution_proof( &self, request: &RemoteCallRequest, @@ -352,30 +416,62 @@ impl FetchChecker for LightDataChecker, remote_proof: ChangesProof ) -> ClientResult, u32)>> { - self.check_changes_proof_with_cht_size(request, remote_proof, cht::SIZE) + self.check_changes_proof_with_cht_size(request, remote_proof, cht::size()) + } + + fn check_body_proof( + &self, + request: &RemoteBodyRequest, + body: Vec + ) -> ClientResult> { + + // TODO: #2621 + let extrinsics_root = HashFor::::ordered_trie_root(body.iter().map(Encode::encode)); + if *request.header.extrinsics_root() == extrinsics_root { + Ok(body) + } else { + Err(format!("RemoteBodyRequest: invalid extrinsics root expected: {} but got {}", + *request.header.extrinsics_root(), + extrinsics_root, + ).into()) + } + } } /// A view of BTreeMap as a changes trie roots storage. -struct RootsStorage<'a, Number: As, Hash: 'a> { +struct RootsStorage<'a, Number: SimpleArithmetic, Hash: 'a> { roots: (Number, &'a [Hash]), prev_roots: BTreeMap, } -impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a, Number, Hash> +impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a, Number, Hash> where H: Hasher, - Number: Send + Sync + Eq + ::std::cmp::Ord + Copy + As, + Number: ::std::fmt::Display + Clone + SimpleArithmetic + Encode + Decode + Send + Sync + 'static, Hash: 'a + Send + Sync + Clone + AsRef<[u8]>, { - fn root(&self, _anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { + fn build_anchor( + &self, + _hash: H::Out, + ) -> Result, String> { + Err("build_anchor is only called when building block".into()) + } + + fn root( + &self, + _anchor: &ChangesTrieAnchorBlockId, + block: Number, + ) -> Result, String> { // we can't ask for roots from parallel forks here => ignore anchor - let root = if block < self.roots.0.as_() { - self.prev_roots.get(&As::sa(block)).cloned() + let root = if block < self.roots.0 { + self.prev_roots.get(&Number::unique_saturated_from(block)).cloned() } else { - block.checked_sub(self.roots.0.as_()) - .and_then(|index| self.roots.1.get(index as usize)) - .cloned() + let index: Option = block.checked_sub(&self.roots.0).and_then(|index| index.checked_into()); + match index { + Some(index) => self.roots.1.get(index as usize).cloned(), + None => None, + } }; Ok(root.map(|root| { @@ -396,7 +492,7 @@ pub mod tests { use crate::error::Error as ClientError; use test_client::{ self, TestClient, blockchain::HeaderBackend, AccountKeyring, - runtime::{self, Hash, Block, Header} + runtime::{self, Hash, Block, Header, Extrinsic} }; use consensus::BlockOrigin; @@ -404,7 +500,7 @@ pub mod tests { use crate::light::fetcher::{Fetcher, FetchChecker, LightDataChecker, RemoteCallRequest, RemoteHeaderRequest}; use crate::light::blockchain::tests::{DummyStorage, DummyBlockchain}; - use primitives::{blake2_256, Blake2Hasher}; + use primitives::{blake2_256, Blake2Hasher, H256}; use primitives::storage::{StorageKey, well_known_keys}; use runtime_primitives::generic::BlockId; use state_machine::Backend; @@ -412,18 +508,30 @@ pub mod tests { pub type OkCallFetcher = Mutex>; + fn not_implemented_in_tests() -> FutureResult + where + E: std::convert::From<&'static str>, + { + err("Not implemented on test node".into()) + } + impl Fetcher for OkCallFetcher { type RemoteHeaderResult = FutureResult; type RemoteReadResult = FutureResult>, ClientError>; type RemoteCallResult = FutureResult, ClientError>; type RemoteChangesResult = FutureResult, u32)>, ClientError>; + type RemoteBodyResult = FutureResult, ClientError>; fn remote_header(&self, _request: RemoteHeaderRequest
) -> Self::RemoteHeaderResult { - err("Not implemented on test node".into()) + not_implemented_in_tests() } fn remote_read(&self, _request: RemoteReadRequest
) -> Self::RemoteReadResult { - err("Not implemented on test node".into()) + not_implemented_in_tests() + } + + fn remote_read_child(&self, _request: RemoteReadChildRequest
) -> Self::RemoteReadResult { + not_implemented_in_tests() } fn remote_call(&self, _request: RemoteCallRequest
) -> Self::RemoteCallResult { @@ -431,11 +539,21 @@ pub mod tests { } fn remote_changes(&self, _request: RemoteChangesRequest
) -> Self::RemoteChangesResult { - err("Not implemented on test node".into()) + not_implemented_in_tests() + } + + fn remote_body(&self, _request: RemoteBodyRequest
) -> Self::RemoteBodyResult { + not_implemented_in_tests() } } - type TestChecker = LightDataChecker, Blake2Hasher, Block, DummyStorage, OkCallFetcher>; + type TestChecker = LightDataChecker< + executor::NativeExecutor, + Blake2Hasher, + Block, + DummyStorage, + OkCallFetcher, + >; fn prepare_for_read_proof_check() -> (TestChecker, Header, Vec>, u32) { // prepare remote client @@ -470,7 +588,7 @@ pub mod tests { let remote_client = test_client::new(); let mut local_headers_hashes = Vec::new(); for i in 0..4 { - let builder = remote_client.new_block().unwrap(); + let builder = remote_client.new_block(Default::default()).unwrap(); remote_client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); local_headers_hashes.push(remote_client.block_hash(i + 1) .map_err(|_| ClientError::Backend("TestError".into()))); @@ -491,10 +609,18 @@ pub mod tests { (local_checker, local_cht_root, remote_block_header, remote_header_proof) } + fn header_with_computed_extrinsics_root(extrinsics: Vec) -> Header { + let extrinsics_root = + trie::ordered_trie_root::(extrinsics.iter().map(Encode::encode)); + + // only care about `extrinsics_root` + Header::new(0, extrinsics_root, H256::zero(), H256::zero(), Default::default()) + } + #[test] fn storage_read_proof_is_generated_and_checked() { let (local_checker, remote_block_header, remote_read_proof, authorities_len) = prepare_for_read_proof_check(); - assert_eq!((&local_checker as &FetchChecker).check_read_proof(&RemoteReadRequest::
{ + assert_eq!((&local_checker as &dyn FetchChecker).check_read_proof(&RemoteReadRequest::
{ block: remote_block_header.hash(), header: remote_block_header, key: well_known_keys::AUTHORITY_COUNT.to_vec(), @@ -505,7 +631,7 @@ pub mod tests { #[test] fn header_proof_is_generated_and_checked() { let (local_checker, local_cht_root, remote_block_header, remote_header_proof) = prepare_for_header_proof_check(true); - assert_eq!((&local_checker as &FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ + assert_eq!((&local_checker as &dyn FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ cht_root: local_cht_root, block: 1, retry_count: None, @@ -516,7 +642,7 @@ pub mod tests { fn check_header_proof_fails_if_cht_root_is_invalid() { let (local_checker, _, mut remote_block_header, remote_header_proof) = prepare_for_header_proof_check(true); remote_block_header.number = 100; - assert!((&local_checker as &FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ + assert!((&local_checker as &dyn FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ cht_root: Default::default(), block: 1, retry_count: None, @@ -527,7 +653,7 @@ pub mod tests { fn check_header_proof_fails_if_invalid_header_provided() { let (local_checker, local_cht_root, mut remote_block_header, remote_header_proof) = prepare_for_header_proof_check(true); remote_block_header.number = 100; - assert!((&local_checker as &FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ + assert!((&local_checker as &dyn FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ cht_root: local_cht_root, block: 1, retry_count: None, @@ -541,9 +667,9 @@ pub mod tests { Arc::new(DummyBlockchain::new(DummyStorage::new())), test_client::LocalExecutor::new(None) ); - let local_checker = &local_checker as &FetchChecker; - let max = remote_client.info().unwrap().chain.best_number; - let max_hash = remote_client.info().unwrap().chain.best_hash; + let local_checker = &local_checker as &dyn FetchChecker; + let max = remote_client.info().chain.best_number; + let max_hash = remote_client.info().chain.best_hash; for (index, (begin, end, key, expected_result)) in test_cases.into_iter().enumerate() { let begin_hash = remote_client.block_hash(begin).unwrap().unwrap(); @@ -637,9 +763,9 @@ pub mod tests { Arc::new(DummyBlockchain::new(DummyStorage::new())), test_client::LocalExecutor::new(None) ); - let local_checker = &local_checker as &FetchChecker; - let max = remote_client.info().unwrap().chain.best_number; - let max_hash = remote_client.info().unwrap().chain.best_hash; + let local_checker = &local_checker as &dyn FetchChecker; + let max = remote_client.info().chain.best_number; + let max_hash = remote_client.info().chain.best_hash; let (begin, end, key, _) = test_cases[0].clone(); let begin_hash = remote_client.block_hash(begin).unwrap().unwrap(); @@ -730,4 +856,47 @@ pub mod tests { ); assert!(local_checker.check_changes_tries_proof(4, &remote_proof.roots, vec![]).is_err()); } + + #[test] + fn check_body_proof_faulty() { + let header = header_with_computed_extrinsics_root( + vec![Extrinsic::IncludeData(vec![1, 2, 3, 4])] + ); + let block = Block::new(header.clone(), Vec::new()); + + let local_checker = TestChecker::new( + Arc::new(DummyBlockchain::new(DummyStorage::new())), + test_client::LocalExecutor::new(None) + ); + + let body_request = RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }; + + assert!( + local_checker.check_body_proof(&body_request, block.extrinsics).is_err(), + "vec![1, 2, 3, 4] != vec![]" + ); + } + + #[test] + fn check_body_proof_of_same_data_should_succeed() { + let extrinsics = vec![Extrinsic::IncludeData(vec![1, 2, 3, 4, 5, 6, 7, 8, 255])]; + + let header = header_with_computed_extrinsics_root(extrinsics.clone()); + let block = Block::new(header.clone(), extrinsics); + + let local_checker = TestChecker::new( + Arc::new(DummyBlockchain::new(DummyStorage::new())), + test_client::LocalExecutor::new(None) + ); + + let body_request = RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }; + + assert!(local_checker.check_body_proof(&body_request, block.extrinsics).is_ok()); + } } diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index 68eed3b73ce8fc0a15d307ce4dd4503e7307cb08..e456c166dc3ee5e49e9cebce6016c611ecc79687 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -24,11 +24,14 @@ pub use state_machine::OverlayedChanges; pub use primitives::NativeOrEncoded; #[doc(hidden)] pub use runtime_primitives::{ - traits::{AuthorityIdFor, Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, Header as HeaderT, ApiRef, RuntimeApiInfo}, + traits::{ + AuthorityIdFor, Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, + Header as HeaderT, ApiRef, RuntimeApiInfo, Hash as HashT, + }, generic::BlockId, transaction_validity::TransactionValidity, }; #[doc(hidden)] -pub use primitives::{ExecutionContext, OffchainExt}; +pub use primitives::{offchain, ExecutionContext}; #[doc(hidden)] pub use runtime_version::{ApiId, RuntimeVersion, ApisVec, create_apis_vec}; #[doc(hidden)] @@ -42,8 +45,16 @@ use crate::error; use sr_api_macros::decl_runtime_apis; use primitives::OpaqueMetadata; #[cfg(feature = "std")] -use std::panic::UnwindSafe; +use std::{panic::UnwindSafe, cell::RefCell, rc::Rc}; use rstd::vec::Vec; +#[cfg(feature = "std")] +use primitives::Hasher as HasherT; + +#[cfg(feature = "std")] +/// A type that records all accessed trie nodes and generates a proof out of it. +pub type ProofRecorder = state_machine::ProofRecorder< + <<<::Header as HeaderT>::Hashing as HashT>::Hasher as HasherT>::Out +>; /// Something that can be constructed to a runtime api. #[cfg(feature = "std")] @@ -87,6 +98,35 @@ pub trait ApiExt { /// Returns the runtime version at the given block id. fn runtime_version_at(&self, at: &BlockId) -> error::Result; + + /// Start recording all accessed trie nodes for generating proofs. + fn record_proof(&mut self); + + /// Extract the recorded proof. + /// This stops the proof recording. + fn extract_proof(&mut self) -> Option>>; +} + +/// Before calling any runtime api function, the runtime need to be initialized +/// at the requested block. However, some functions like `execute_block` or +/// `initialize_block` itself don't require to have the runtime initialized +/// at the requested block. +/// +/// `call_api_at` is instructed by this enum to do the initialization or to skip +/// it. +#[cfg(feature = "std")] +#[derive(Clone, Copy)] +pub enum InitializeBlock<'a, Block: BlockT> { + /// Skip initializing the runtime for a given block. + /// + /// This is used by functions who do the initialization by themself or don't + /// require it. + Skip, + /// Initialize the runtime for a given block. + /// + /// If the stored `BlockId` is `Some(_)`, the runtime is currently initialized + /// at this block. + Do(&'a RefCell>>), } /// Something that can call into the runtime at a given block. @@ -95,17 +135,21 @@ pub trait CallRuntimeAt { /// Calls the given api function with the given encoded arguments at the given block /// and returns the encoded result. fn call_api_at< + 'a, R: Encode + Decode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, + C: Core, >( &self, + core_api: &C, at: &BlockId, function: &'static str, args: Vec, - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, + changes: &RefCell, + initialize_block: InitializeBlock<'a, Block>, native_call: Option, context: ExecutionContext, + recorder: &Option>>>, ) -> error::Result>; /// Returns the runtime version at the given block. @@ -120,13 +164,13 @@ decl_runtime_apis! { /// Returns the version of the runtime. fn version() -> RuntimeVersion; /// Execute the given block. + #[skip_initialize_block] fn execute_block(block: Block); /// Initialize a block with the given header. #[renamed("initialise_block", 2)] + #[skip_initialize_block] + #[initialize_block] fn initialize_block(header: &::Header); - /// Returns the authorities. - #[deprecated(since = "1.0", note = "Please switch to `AuthoritiesApi`.")] - fn authorities() -> Vec>; } /// The `Metadata` api trait that returns metadata for the runtime. diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index a776a9203544b4291333cb15747c37ad4b92a91a..446dcbff3a0d750a5ae5da232215f1f65756774a 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-consensus-aura" -version = "1.0.1" +version = "2.0.0" authors = ["Parity Technologies "] description = "Aura consensus algorithm for substrate" edition = "2018" @@ -18,14 +18,13 @@ srml-consensus = { path = "../../../srml/consensus" } srml-aura = { path = "../../../srml/aura" } client = { package = "substrate-client", path = "../../client" } substrate-telemetry = { path = "../../telemetry" } -futures = "0.1.17" -tokio = "0.1.7" -parking_lot = "0.7.1" -error-chain = "0.12" -log = "0.4" consensus_common = { package = "substrate-consensus-common", path = "../common" } authorities = { package = "substrate-consensus-authorities", path = "../authorities" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +futures = "0.1.17" +tokio = "0.1.7" +parking_lot = "0.8.0" +log = "0.4" [dev-dependencies] keyring = { package = "substrate-keyring", path = "../../keyring" } diff --git a/core/consensus/aura/primitives/Cargo.toml b/core/consensus/aura/primitives/Cargo.toml index 759dfae37cd6979bd458670606c7454bedcddf8e..a5e24e6fbee827c2a6b774ab4f5106fc86c2d972 100644 --- a/core/consensus/aura/primitives/Cargo.toml +++ b/core/consensus/aura/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-consensus-aura-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" @@ -12,5 +12,6 @@ runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives [features] default = ["std"] std = [ + "runtime_primitives/std", "substrate-client/std", ] diff --git a/core/consensus/aura/src/digest.rs b/core/consensus/aura/src/digest.rs new file mode 100644 index 0000000000000000000000000000000000000000..fe85c5807ea9d499e059a991b615ca0dbf5c08e0 --- /dev/null +++ b/core/consensus/aura/src/digest.rs @@ -0,0 +1,67 @@ +// Copyright 2018-2019 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 . + +//! Aura (Authority-Round) digests +//! +//! This implements the digests for AuRa, to allow the private +//! `CompatibleDigestItem` trait to appear in public interfaces. +use primitives::Pair; +use aura_primitives::AURA_ENGINE_ID; +use runtime_primitives::generic::DigestItem; +use parity_codec::{Encode, Decode}; + +type Signature

=

::Signature; + +/// A digest item which is usable with aura consensus. +pub trait CompatibleDigestItem: Sized { + /// Construct a digest item which contains a signature on the hash. + fn aura_seal(signature: Signature) -> Self; + + /// If this item is an Aura seal, return the signature. + fn as_aura_seal(&self) -> Option<&Signature>; + + /// Construct a digest item which contains the slot number + fn aura_pre_digest(slot_num: u64) -> Self; + + /// If this item is an AuRa pre-digest, return the slot number + fn as_aura_pre_digest(&self) -> Option; +} + +impl CompatibleDigestItem

for DigestItem + where P: Pair, P::Signature: Clone + Encode + Decode, +{ + fn aura_seal(signature: Signature

) -> Self { + DigestItem::Seal(AURA_ENGINE_ID, signature) + } + + fn as_aura_seal(&self) -> Option<&Signature

> { + match self { + DigestItem::Seal(AURA_ENGINE_ID, ref sig) => Some(sig), + _ => None, + } + } + + fn aura_pre_digest(slot_num: u64) -> Self { + DigestItem::PreRuntime(AURA_ENGINE_ID, slot_num.encode()) + } + + fn as_aura_pre_digest(&self) -> Option { + match self { + DigestItem::PreRuntime(AURA_ENGINE_ID, ref buffer) => Decode::decode(&mut &buffer[..]), + _ => None, + } + } +} diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index fd32e1501fbe4782ee90fe17b6a4e079b0999779..e3fffad33fbff5a3ca5c154af4e196239c03364b 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -25,36 +25,39 @@ //! //! Blocks from future steps will be either deferred or rejected depending on how //! far in the future they are. -#![deny(warnings)] #![forbid(missing_docs, unsafe_code)] use std::{sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fmt::Debug}; use parity_codec::{Encode, Decode}; use consensus_common::{self, Authorities, BlockImport, Environment, Proposer, ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, + SelectChain, well_known_cache_keys +}; +use consensus_common::import_queue::{ + Verifier, BasicQueue, SharedBlockImport, SharedJustificationImport, SharedFinalityProofImport, + SharedFinalityProofRequestBuilder, }; -use consensus_common::well_known_cache_keys; -use consensus_common::import_queue::{Verifier, BasicQueue, SharedBlockImport, SharedJustificationImport}; use client::{ - ChainHead, block_builder::api::BlockBuilder as BlockBuilderApi, blockchain::ProvideCache, runtime_api::{ApiExt, Core as CoreApi}, error::Result as CResult, backend::AuxStore, }; -use aura_primitives::AURA_ENGINE_ID; -use runtime_primitives::{generic, generic::BlockId, Justification}; + +use runtime_primitives::{generic::{self, BlockId}, Justification}; use runtime_primitives::traits::{ Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, + Zero, Member, }; + use primitives::Pair; -use inherents::{InherentDataProviders, InherentData, RuntimeString}; +use inherents::{InherentDataProviders, InherentData}; use authorities::AuthoritiesApi; -use futures::{Future, IntoFuture, future, stream::Stream}; +use futures::{Future, IntoFuture, future}; use tokio::timer::Timeout; -use log::{warn, debug, info, trace}; +use log::{error, warn, debug, info, trace}; use srml_aura::{ InherentType as AuraInherent, AuraInherentData, @@ -62,31 +65,18 @@ use srml_aura::{ }; use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_WARN, CONSENSUS_INFO}; -use slots::{CheckedHeader, SlotWorker, SlotInfo, SlotCompatible}; +use slots::{CheckedHeader, SlotData, SlotWorker, SlotInfo, SlotCompatible, slot_now, check_equivocation}; pub use aura_primitives::*; -pub use consensus_common::SyncOracle; +pub use consensus_common::{SyncOracle, ExtraVerification}; +pub use digest::CompatibleDigestItem; -type AuthorityId

=

::Public; -type Signature

=

::Signature; +mod digest; -/// A handle to the network. This is generally implemented by providing some -/// handle to a gossip service or similar. -/// -/// Intended to be a lightweight handle such as an `Arc`. -#[deprecated( - since = "1.0.1", - note = "This is dead code and will be removed in a future release", -)] -pub trait Network: Clone { - /// A stream of input messages for a topic. - type In: Stream,Error=()>; - - /// Send a message at a specific round out. - fn send_message(&self, slot: u64, message: Vec); -} +type AuthorityId

=

::Public; /// A slot duration. Create with `get_or_compute`. +#[derive(Clone, Copy, Debug, Encode, Decode, Hash, PartialOrd, Ord, PartialEq, Eq)] pub struct SlotDuration(slots::SlotDuration); impl SlotDuration { @@ -120,66 +110,6 @@ fn slot_author(slot_num: u64, authorities: &[AuthorityId

]) -> Option Some(current_author) } -fn duration_now() -> Option { - use std::time::SystemTime; - - let now = SystemTime::now(); - now.duration_since(SystemTime::UNIX_EPOCH).map_err(|e| { - warn!("Current time {:?} is before unix epoch. Something is wrong: {:?}", now, e); - }).ok() -} - -/// Get the slot for now. -fn slot_now(slot_duration: u64) -> Option { - duration_now().map(|s| s.as_secs() / slot_duration) -} - -fn inherent_to_common_error(err: RuntimeString) -> consensus_common::Error { - consensus_common::ErrorKind::InherentData(err.into()).into() -} - -/// A digest item which is usable with aura consensus. -pub trait CompatibleDigestItem: Sized { - /// Construct a digest item which contains a slot number and a signature on the - /// hash. - fn aura_seal(slot_num: u64, signature: Signature) -> Self; - - /// If this item is an Aura seal, return the slot number and signature. - fn as_aura_seal(&self) -> Option<(u64, Signature)>; - - /// Return `true` if this seal type is deprecated. Otherwise, return - /// `false`. - fn is_deprecated(&self) -> bool; -} - -impl CompatibleDigestItem

for generic::DigestItem - where P: Pair, P::Signature: Clone + Encode + Decode, -{ - /// Construct a digest item which is a slot number and a signature on the - /// hash. - fn aura_seal(slot_number: u64, signature: Signature

) -> Self { - generic::DigestItem::Consensus(AURA_ENGINE_ID, (slot_number, signature).encode()) - } - - /// If this item is an Aura seal, return the slot number and signature. - #[allow(deprecated)] - fn as_aura_seal(&self) -> Option<(u64, Signature

)> { - match self { - generic::DigestItem::Seal(slot, ref sig) => Some((*slot, (*sig).clone())), - generic::DigestItem::Consensus(AURA_ENGINE_ID, seal) => Decode::decode(&mut &seal[..]), - _ => None, - } - } - - #[allow(deprecated)] - fn is_deprecated(&self) -> bool { - match self { - generic::DigestItem::Seal(_, _) => true, - _ => false, - } - } -} - #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] struct AuraSlotCompatible; @@ -189,102 +119,62 @@ impl SlotCompatible for AuraSlotCompatible { ) -> Result<(TimestampInherent, AuraInherent), consensus_common::Error> { data.timestamp_inherent_data() .and_then(|t| data.aura_inherent_data().map(|a| (t, a))) - .map_err(inherent_to_common_error) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) } } -/// Start the aura worker in a separate thread. -pub fn start_aura_thread( - slot_duration: SlotDuration, - local_key: Arc

, - client: Arc, - block_import: Arc, - env: Arc, - sync_oracle: SO, - on_exit: OnExit, - inherent_data_providers: InherentDataProviders, - force_authoring: bool, -) -> Result<(), consensus_common::Error> where - B: Block + 'static, - C: ChainHead + ProvideRuntimeApi + ProvideCache + Send + Sync + 'static, - C::Api: AuthoritiesApi, - E: Environment + Send + Sync + 'static, - E::Proposer: Proposer + Send + 'static, - <>::Create as IntoFuture>::Future: Send + 'static, - I: BlockImport + Send + Sync + 'static, - Error: From + 'static, - P: Pair + Send + Sync + 'static, - P::Public: Encode + Decode + Eq + Clone + Debug + Hash + Send + Sync + 'static, - P::Signature: Encode, - SO: SyncOracle + Send + Sync + Clone + 'static, - OnExit: Future + Send + 'static, - DigestItemFor: CompatibleDigestItem

+ DigestItem> + 'static, - Error: ::std::error::Error + Send + From<::consensus_common::Error> + 'static, -{ - let worker = AuraWorker { - client: client.clone(), - block_import, - env, - local_key, - inherent_data_providers: inherent_data_providers.clone(), - sync_oracle: sync_oracle.clone(), - force_authoring, - }; - - slots::start_slot_worker_thread::<_, _, _, _, AuraSlotCompatible, u64, _>( - slot_duration.0, - client, - Arc::new(worker), - sync_oracle, - on_exit, - inherent_data_providers - ) -} - /// Start the aura worker. The returned future should be run in a tokio runtime. -pub fn start_aura( +pub fn start_aura( slot_duration: SlotDuration, local_key: Arc

, client: Arc, + select_chain: SC, block_import: Arc, env: Arc, sync_oracle: SO, - on_exit: OnExit, inherent_data_providers: InherentDataProviders, force_authoring: bool, ) -> Result, consensus_common::Error> where - B: Block, - C: ChainHead + ProvideRuntimeApi + ProvideCache, + B: Block, + C: ProvideRuntimeApi + ProvideCache + AuxStore + Send + Sync, C::Api: AuthoritiesApi, - E: Environment, + SC: SelectChain, + generic::DigestItem: DigestItem, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, - I: BlockImport + Send + Sync + 'static, P: Pair + Send + Sync + 'static, - P::Public: Hash + Eq + Send + Sync + Clone + Debug + Encode + Decode + 'static, - P::Signature: Encode, - SO: SyncOracle + Send + Sync + Clone, + P::Public: Hash + Member + Encode + Decode, + P::Signature: Hash + Member + Encode + Decode, DigestItemFor: CompatibleDigestItem

+ DigestItem>, + H: Header< + Digest=generic::Digest>, + Hash=B::Hash, + >, + E: Environment, + I: BlockImport + Send + Sync + 'static, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, - OnExit: Future, + SO: SyncOracle + Send + Sync + Clone, { let worker = AuraWorker { client: client.clone(), block_import, env, local_key, - inherent_data_providers: inherent_data_providers.clone(), sync_oracle: sync_oracle.clone(), force_authoring, }; - slots::start_slot_worker::<_, _, _, _, _, AuraSlotCompatible, _>( + register_aura_inherent_data_provider( + &inherent_data_providers, + slot_duration.0.slot_duration() + )?; + Ok(slots::start_slot_worker::<_, _, _, _, _, AuraSlotCompatible>( slot_duration.0, - client, - Arc::new(worker), + select_chain, + worker, sync_oracle, - on_exit, inherent_data_providers - ) + )) } struct AuraWorker { @@ -293,32 +183,29 @@ struct AuraWorker { env: Arc, local_key: Arc

, sync_oracle: SO, - inherent_data_providers: InherentDataProviders, force_authoring: bool, } -impl SlotWorker for AuraWorker where - C: ProvideRuntimeApi + ProvideCache, +impl SlotWorker for AuraWorker where + B: Block, + C: ProvideRuntimeApi + ProvideCache + Sync, C::Api: AuthoritiesApi, E: Environment, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, + H: Header< + Digest=generic::Digest>, + Hash=B::Hash, + >, I: BlockImport + Send + Sync + 'static, P: Pair + Send + Sync + 'static, - P::Public: Hash + Eq + Send + Sync + Clone + Debug + Encode + Decode + 'static, - P::Signature: Encode, + P::Public: Member + Encode + Decode + Hash, + P::Signature: Member + Encode + Decode + Hash + Debug, SO: SyncOracle + Send + Clone, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, + DigestItemFor: CompatibleDigestItem

+ DigestItem, Hash=B::Hash>, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { - type OnSlot = Box + Send>; - - fn on_start( - &self, - slot_duration: u64 - ) -> Result<(), consensus_common::Error> { - register_aura_inherent_data_provider(&self.inherent_data_providers, slot_duration) - } + type OnSlot = Box + Send>; fn on_slot( &self, @@ -385,7 +272,15 @@ impl SlotWorker for AuraWorker as CompatibleDigestItem

>::aura_pre_digest(slot_num), + ], + }, + remaining_duration, + ).into_future(), remaining_duration, ) } else { @@ -393,107 +288,129 @@ impl SlotWorker for AuraWorker slot_num - ); - return - } + Box::new(proposal_work.map(move |b| { + // minor hack since we don't have access to the timestamp + // that is actually set by the proposer. + let slot_after_building = slot_now(slot_duration); + if slot_after_building != Some(slot_num) { + info!( + "Discarding proposal for slot {}; block production took too long", + slot_num + ); + telemetry!(CONSENSUS_INFO; "aura.discarding_proposal_took_too_long"; + "slot" => slot_num + ); + return + } - let (header, body) = b.deconstruct(); - let header_num = header.number().clone(); - let pre_hash = header.hash(); - let parent_hash = header.parent_hash().clone(); - - // sign the pre-sealed hash of the block and then - // add it to a digest item. - let to_sign = (slot_num, pre_hash).encode(); - let signature = pair.sign(&to_sign[..]); - let item = as CompatibleDigestItem

>::aura_seal( - slot_num, - signature, - ); - - let import_block: ImportBlock = ImportBlock { - origin: BlockOrigin::Own, - header, - justification: None, - post_digests: vec![item], - body: Some(body), - finalized: false, - auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, - }; - - info!("Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", - header_num, - import_block.post_header().hash(), - pre_hash - ); - telemetry!(CONSENSUS_INFO; "aura.pre_sealed_block"; - "header_num" => ?header_num, - "hash_now" => ?import_block.post_header().hash(), - "hash_previously" => ?pre_hash - ); - - if let Err(e) = block_import.import_block(import_block, Default::default()) { - warn!(target: "aura", "Error with block built on {:?}: {:?}", - parent_hash, e); - telemetry!(CONSENSUS_WARN; "aura.err_with_block_built_on"; - "hash" => ?parent_hash, "err" => ?e - ); - } - }) - .map_err(|e| consensus_common::ErrorKind::ClientImport(format!("{:?}", e)).into()) - ) + let (header, body) = b.deconstruct(); + let pre_digest: Result = find_pre_digest::(&header); + if let Err(e) = pre_digest { + error!(target: "aura", "FATAL ERROR: Invalid pre-digest: {}!", e); + return + } else { + trace!(target: "aura", "Got correct number of seals. Good!") + }; + + let header_num = header.number().clone(); + let parent_hash = header.parent_hash().clone(); + + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let header_hash = header.hash(); + let signature = pair.sign(header_hash.as_ref()); + let signature_digest_item = as CompatibleDigestItem

>::aura_seal(signature); + + let import_block: ImportBlock = ImportBlock { + origin: BlockOrigin::Own, + header, + justification: None, + post_digests: vec![signature_digest_item], + body: Some(body), + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + + info!("Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", + header_num, + import_block.post_header().hash(), + header_hash + ); + telemetry!(CONSENSUS_INFO; "aura.pre_sealed_block"; + "header_num" => ?header_num, + "hash_now" => ?import_block.post_header().hash(), + "hash_previously" => ?header_hash + ); + + if let Err(e) = block_import.import_block(import_block, Default::default()) { + warn!(target: "aura", "Error with block built on {:?}: {:?}", + parent_hash, e); + telemetry!(CONSENSUS_WARN; "aura.err_with_block_built_on"; + "hash" => ?parent_hash, "err" => ?e + ); + } + }).map_err(|e| consensus_common::Error::ClientImport(format!("{:?}", e)).into())) + } +} + +macro_rules! aura_err { + ($($i: expr),+) => { + { debug!(target: "aura", $($i),+) + ; format!($($i),+) + } + }; +} + +fn find_pre_digest(header: &B::Header) -> Result + where DigestItemFor: CompatibleDigestItem

, + P::Signature: Decode, + P::Public: Encode + Decode + PartialEq + Clone, +{ + let mut pre_digest: Option = None; + for log in header.digest().logs() { + trace!(target: "aura", "Checking log {:?}", log); + match (log.as_aura_pre_digest(), pre_digest.is_some()) { + (Some(_), true) => Err(aura_err!("Multiple AuRa pre-runtime headers, rejecting!"))?, + (None, _) => trace!(target: "aura", "Ignoring digest not meant for us"), + (s, false) => pre_digest = s, + } } + pre_digest.ok_or_else(|| aura_err!("No AuRa pre-runtime digest found")) } + /// check a header has been signed by the right key. If the slot is too far in the future, an error will be returned. /// if it's successful, returns the pre-header and the digest item containing the seal. /// /// This digest item will always return `Some` when used with `as_aura_seal`. // // FIXME #1018 needs misbehavior types -#[forbid(deprecated)] -fn check_header( +fn check_header( + client: &C, slot_now: u64, mut header: B::Header, hash: B::Hash, authorities: &[AuthorityId

], - allow_old_seals: bool, -) -> Result>, String> - where DigestItemFor: CompatibleDigestItem

, - P::Public: AsRef, - P::Signature: Decode, +) -> Result)>, String> where + DigestItemFor: CompatibleDigestItem

, + P::Signature: Decode, + C: client::backend::AuxStore, + P::Public: AsRef + Encode + Decode + PartialEq + Clone, { - let digest_item = match header.digest_mut().pop() { + let seal = match header.digest_mut().pop() { Some(x) => x, None => return Err(format!("Header {:?} is unsealed", hash)), }; - if !allow_old_seals && digest_item.is_deprecated() { - debug!(target: "aura", "Header {:?} uses old seal format, rejecting", hash); - return Err(format!("Header {:?} uses old seal format, rejecting", hash)) - } - - let (slot_num, sig) = digest_item.as_aura_seal().ok_or_else(|| { - debug!(target: "aura", "Header {:?} is unsealed", hash); - format!("Header {:?} is unsealed", hash) + let sig = seal.as_aura_seal().ok_or_else(|| { + aura_err!("Header {:?} has a bad seal", hash) })?; + let slot_num = find_pre_digest::(&header)?; + if slot_num > slot_now { - header.digest_mut().push(digest_item); + header.digest_mut().push(seal); Ok(CheckedHeader::Deferred(header, slot_num)) } else { // check the signature is valid under the expected authority and @@ -504,37 +421,36 @@ fn check_header( }; let pre_hash = header.hash(); - let to_sign = (slot_num, pre_hash).encode(); - let public = expected_author; - if P::verify(&sig, &to_sign[..], public) { - Ok(CheckedHeader::Checked(header, digest_item)) + if P::verify(&sig, pre_hash.as_ref(), expected_author) { + if let Some(equivocation_proof) = check_equivocation( + client, + slot_now, + slot_num, + &header, + expected_author, + ).map_err(|e| e.to_string())? { + info!( + "Slot author is equivocating at slot {} with headers {:?} and {:?}", + slot_num, + equivocation_proof.fst_header().hash(), + equivocation_proof.snd_header().hash(), + ); + } + + Ok(CheckedHeader::Checked(header, (slot_num, seal))) } else { Err(format!("Bad signature on {:?}", hash)) } } } -/// Extra verification for Aura blocks. -pub trait ExtraVerification: Send + Sync { - /// Future that resolves when the block is verified or fails with error if not. - type Verified: IntoFuture; - - /// Do additional verification for this block. - fn verify( - &self, - header: &B::Header, - body: Option<&[B::Extrinsic]>, - ) -> Self::Verified; -} - /// A verifier for Aura blocks. pub struct AuraVerifier { client: Arc, extra: E, phantom: PhantomData

, inherent_data_providers: inherents::InherentDataProviders, - allow_old_seals: bool, } impl AuraVerifier @@ -603,7 +519,7 @@ impl ExtraVerification for NothingExtra { #[forbid(deprecated)] impl Verifier for AuraVerifier where - C: ProvideRuntimeApi + Send + Sync, + C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore, C::Api: BlockBuilderApi, DigestItemFor: CompatibleDigestItem

+ DigestItem>, E: ExtraVerification, @@ -633,19 +549,17 @@ impl Verifier for AuraVerifier where ); // we add one to allow for some small drift. - // FIXME #1019 in the future, alter this queue to allow deferring of headers - let checked_header = check_header::( + // FIXME #1019 in the future, alter this queue to allow deferring of + // headers + let checked_header = check_header::( + &self.client, slot_now + 1, header, hash, &authorities[..], - self.allow_old_seals, )?; match checked_header { - CheckedHeader::Checked(pre_header, seal) => { - let (slot_num, _) = seal.as_aura_seal() - .expect("check_header always returns a seal digest item; qed"); - + CheckedHeader::Checked(pre_header, (slot_num, seal)) => { // if the body is passed through, we need to use the runtime // to check that the internally-set timestamp in the inherents // actually matches the slot set in the seal. @@ -656,7 +570,7 @@ impl Verifier for AuraVerifier where // skip the inherents verification if the runtime API is old. if self.client .runtime_api() - .has_api_with::, _>(&BlockId::Hash(parent_hash), |v| v >= 2) + .has_api_with::, _>(&BlockId::Hash(parent_hash), |v| v >= 2) .map_err(|e| format!("{:?}", e))? { self.check_inherents( @@ -676,6 +590,10 @@ impl Verifier for AuraVerifier where extra_verification.into_future().wait()?; + let new_authorities = pre_header.digest() + .log(DigestItem::as_authorities_change) + .map(|digest| digest.to_vec()); + let import_block = ImportBlock { origin, header: pre_header, @@ -687,8 +605,7 @@ impl Verifier for AuraVerifier where fork_choice: ForkChoiceStrategy::LongestChain, }; - // FIXME #1019 extract authorities - Ok((import_block, None)) + Ok((import_block, new_authorities)) } CheckedHeader::Deferred(a, b) => { debug!(target: "aura", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); @@ -713,6 +630,38 @@ impl Authorities for AuraVerifier where } } +fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where + B: Block, + C: ProvideRuntimeApi + ProvideCache, + C::Api: AuthoritiesApi, +{ + // no cache => no initialization + let cache = match client.cache() { + Some(cache) => cache, + None => return Ok(()), + }; + + // check if we already have initialized the cache + let genesis_id = BlockId::Number(Zero::zero()); + let genesis_authorities: Option>> = cache + .get_at(&well_known_cache_keys::AUTHORITIES, &genesis_id) + .and_then(|v| Decode::decode(&mut &v[..])); + if genesis_authorities.is_some() { + return Ok(()); + } + + let map_err = |error| consensus_common::Error::from(consensus_common::Error::ClientImport( + format!( + "Error initializing authorities cache: {}", + error, + ))); + let genesis_authorities = authorities(client, &genesis_id)?; + cache.initialize(&well_known_cache_keys::AUTHORITIES, genesis_authorities.encode()) + .map_err(map_err)?; + + Ok(()) +} + #[allow(deprecated)] fn authorities(client: &C, at: &BlockId) -> Result>, ConsensusError> where B: Block, @@ -721,15 +670,12 @@ fn authorities(client: &C, at: &BlockId) -> Result>(at).unwrap_or(false) { - AuthoritiesApi::authorities(&*client.runtime_api(), at).ok() - } else { - CoreApi::authorities(&*client.runtime_api(), at).ok() - } - }).ok_or_else(|| consensus_common::ErrorKind::InvalidAuthoritiesSet.into()) + .and_then(|cache| cache + .get_at(&well_known_cache_keys::AUTHORITIES, at) + .and_then(|v| Decode::decode(&mut &v[..])) + ) + .or_else(|| AuthoritiesApi::authorities(&*client.runtime_api(), at).ok()) + .ok_or_else(|| consensus_common::Error::InvalidAuthoritiesSet.into()) } /// The Aura import queue type. @@ -743,7 +689,8 @@ fn register_aura_inherent_data_provider( if !inherent_data_providers.has_provider(&srml_aura::INHERENT_IDENTIFIER) { inherent_data_providers .register_provider(srml_aura::InherentDataProvider::new(slot_duration)) - .map_err(inherent_to_common_error) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) } else { Ok(()) } @@ -754,47 +701,14 @@ pub fn import_queue( slot_duration: SlotDuration, block_import: SharedBlockImport, justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, client: Arc, extra: E, inherent_data_providers: InherentDataProviders, ) -> Result, consensus_common::Error> where B: Block, - C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync, - C::Api: BlockBuilderApi + AuthoritiesApi, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, - E: 'static + ExtraVerification, - P: Pair + Send + Sync + 'static, - P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode + AsRef, - P::Signature: Encode + Decode, -{ - register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; - - let verifier = Arc::new( - AuraVerifier { - client: client.clone(), - extra, - inherent_data_providers, - phantom: PhantomData, - allow_old_seals: false, - } - ); - Ok(BasicQueue::new(verifier, block_import, justification_import)) -} - -/// Start an import queue for the Aura consensus algorithm with backwards compatibility. -#[deprecated( - note = "should not be used unless backwards compatibility with an older chain is needed." -)] -pub fn import_queue_accept_old_seals( - slot_duration: SlotDuration, - block_import: SharedBlockImport, - justification_import: Option>, - client: Arc, - extra: E, - inherent_data_providers: InherentDataProviders, -) -> Result, consensus_common::Error> where - B: Block, - C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync, + C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore, C::Api: BlockBuilderApi + AuthoritiesApi, DigestItemFor: CompatibleDigestItem

+ DigestItem>, E: 'static + ExtraVerification, @@ -803,6 +717,7 @@ pub fn import_queue_accept_old_seals( P::Signature: Encode + Decode, { register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; + initialize_authorities_cache(&*client)?; let verifier = Arc::new( AuraVerifier { @@ -810,25 +725,31 @@ pub fn import_queue_accept_old_seals( extra, inherent_data_providers, phantom: PhantomData, - allow_old_seals: true, } ); - Ok(BasicQueue::new(verifier, block_import, justification_import)) + Ok(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, + )) } #[cfg(test)] mod tests { use super::*; + use futures::stream::Stream as _; use consensus_common::NoNetwork as DummyOracle; use network::test::*; - use network::test::{Block as TestBlock, PeersClient}; - use runtime_primitives::traits::Block as BlockT; + use network::test::{Block as TestBlock, PeersClient, PeersFullClient}; + use runtime_primitives::traits::{Block as BlockT, DigestFor}; use network::config::ProtocolConfig; use parking_lot::Mutex; use tokio::runtime::current_thread; - use keyring::ed25519::Keyring; - use primitives::ed25519; - use client::BlockchainEvents; + use keyring::sr25519::Keyring; + use primitives::sr25519; + use client::{LongestChain, BlockchainEvents}; use test_client; type Error = client::error::Error; @@ -842,7 +763,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &::Header, _authorities: &[AuthorityId]) + fn init(&self, parent_header: &::Header, _authorities: &[AuthorityId]) -> Result { Ok(DummyProposer(parent_header.number + 1, self.0.clone())) @@ -853,8 +774,13 @@ mod tests { type Error = Error; type Create = Result; - fn propose(&self, _: InherentData, _: Duration) -> Result { - self.1.new_block().unwrap().bake().map_err(|e| e.into()) + fn propose( + &self, + _: InherentData, + digests: DigestFor, + _: Duration, + ) -> Result { + self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) } } @@ -868,7 +794,7 @@ mod tests { impl TestNetFactory for AuraTestNet { type Specialization = DummySpecialization; - type Verifier = AuraVerifier; + type Verifier = AuraVerifier; type PeerData = (); /// Create new test network with peers and given config. @@ -879,25 +805,33 @@ mod tests { } } - fn make_verifier(&self, client: Arc, _cfg: &ProtocolConfig) + fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) -> Arc { - let slot_duration = SlotDuration::get_or_compute(&*client) - .expect("slot duration available"); - let inherent_data_providers = InherentDataProviders::new(); - register_aura_inherent_data_provider( - &inherent_data_providers, - slot_duration.get() - ).expect("Registers aura inherent data provider"); + match client { + PeersClient::Full(client) => { + let slot_duration = SlotDuration::get_or_compute(&*client) + .expect("slot duration available"); + let inherent_data_providers = InherentDataProviders::new(); + register_aura_inherent_data_provider( + &inherent_data_providers, + slot_duration.get() + ).expect("Registers aura inherent data provider"); + + assert_eq!(slot_duration.get(), SLOT_DURATION); + Arc::new(AuraVerifier { + client, + extra: NothingExtra, + inherent_data_providers, + phantom: Default::default(), + }) + }, + PeersClient::Light(_) => unreachable!("No (yet) tests for light client + Aura"), + } + } - assert_eq!(slot_duration.get(), SLOT_DURATION); - Arc::new(AuraVerifier { - client, - extra: NothingExtra, - inherent_data_providers, - phantom: Default::default(), - allow_old_seals: false, - }) + fn uses_tokio(&self) -> bool { + true } fn peer(&self, i: usize) -> &Peer { @@ -922,6 +856,7 @@ mod tests { } #[test] + #[allow(deprecated)] fn authoring_blocks() { let _ = ::env_logger::try_init(); let mut net = AuraTestNet::new(3); @@ -939,7 +874,11 @@ mod tests { let mut runtime = current_thread::Runtime::new().unwrap(); for (peer_id, key) in peers { - let client = net.lock().peer(*peer_id).client().clone(); + let client = net.lock().peer(*peer_id).client().as_full().expect("full clients are created").clone(); + #[allow(deprecated)] + let select_chain = LongestChain::new( + client.backend().clone(), + ); let environ = Arc::new(DummyFactory(client.clone())); import_notifications.push( client.import_notification_stream() @@ -955,14 +894,14 @@ mod tests { &inherent_data_providers, slot_duration.get() ).expect("Registers aura inherent data provider"); - let aura = start_aura::<_, _, _, _, ed25519::Pair, _, _, _>( + let aura = start_aura::<_, _, _, _, _, sr25519::Pair, _, _, _>( slot_duration, Arc::new(key.clone().into()), client.clone(), + select_chain, client, environ.clone(), DummyOracle, - futures::empty(), inherent_data_providers, false, ).expect("Starts aura"); @@ -991,7 +930,7 @@ mod tests { fn authorities_call_works() { let client = test_client::new(); - assert_eq!(client.info().unwrap().chain.best_number, 0); + assert_eq!(client.info().chain.best_number, 0); assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ Keyring::Alice.into(), Keyring::Bob.into(), diff --git a/core/consensus/authorities/Cargo.toml b/core/consensus/authorities/Cargo.toml index cfd73ed70940ec69fa3769d9ba03f1a11e9d2b47..c4249f39d463537db1396cbe2063e3694f7fcf59 100644 --- a/core/consensus/authorities/Cargo.toml +++ b/core/consensus/authorities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-consensus-authorities" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 7cd787e02cd6c67e5bf8b9f17a9046631da9983c..04cd42c6806aa1c692dea02a00910592c72e600d 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-consensus-babe" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "BABE consensus algorithm for substrate" edition = "2018" @@ -16,6 +16,7 @@ runtime_io = { package = "sr-io", path = "../../sr-io" } inherents = { package = "substrate-inherents", path = "../../inherents" } srml-consensus = { path = "../../../srml/consensus" } substrate-telemetry = { path = "../../telemetry" } +srml-babe = { path = "../../../srml/babe" } client = { package = "substrate-client", path = "../../client" } consensus_common = { package = "substrate-consensus-common", path = "../common" } authorities = { package = "substrate-consensus-authorities", path = "../authorities" } @@ -23,13 +24,11 @@ slots = { package = "substrate-consensus-slots", path = "../slots" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } futures = "0.1.26" tokio = "0.1.18" -parking_lot = "0.7.1" -error-chain = "0.12.0" +parking_lot = "0.8.0" log = "0.4.6" - -[dependencies.schnorrkel] -git = "https://github.com/paritytech/schnorrkel" -branch = "master" +schnorrkel = "0.1.1" +rand = "0.6.5" +merlin = "1.0.3" [dev-dependencies] keyring = { package = "substrate-keyring", path = "../../keyring" } diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index 3abe7d5e6eca472d762638b602295cd6042bc81f..67700c8ee0abe9175de61d09948ca1370ad758c2 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-consensus-babe-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Primitives for BABE consensus" edition = "2018" @@ -9,11 +9,13 @@ edition = "2018" substrate-client = { path = "../../../client", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } -parity-codec = "^3.4.0" +parity-codec = { version = "3.5.1", default-features = false } [features] default = ["std"] std = [ + "runtime_primitives/std", "substrate-client/std", + "parity-codec/std", "slots", ] diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index 4f83cce5bd3a76a355ff2b0563d8a6daa1e71472..0e49c451983cce36ac9685e1ba33f0c87d833823 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . //! Primitives for BABE. -#![forbid(warnings, unsafe_code, missing_docs)] +#![deny(warnings, unsafe_code, missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] use runtime_primitives::ConsensusEngineId; @@ -29,31 +29,28 @@ pub const BABE_ENGINE_ID: ConsensusEngineId = [b'b', b'a', b'b', b'e']; /// Configuration data used by the BABE consensus engine. #[derive(Copy, Clone, Hash, PartialEq, Eq, Debug, Encode, Decode)] pub struct BabeConfiguration { - slot_duration: u64, - expected_block_time: u64, -} + /// The slot duration in milliseconds for BABE. Currently, only + /// the value provided by this type at genesis will be used. + /// + /// Dynamic slot duration may be supported in the future. + pub slot_duration: u64, -impl BabeConfiguration { - /// Return the expected block time in milliseconds for BABE. Currently, + /// The expected block time in milliseconds for BABE. Currently, /// only the value provided by this type at genesis will be used. /// /// Dynamic expected block time may be supported in the future. - pub fn expected_block_time(&self) -> u64 { - self.expected_block_time - } + pub expected_block_time: u64, - /// Return the slot duration in milliseconds for BABE. Currently, only - /// the value provided by this type at genesis will be used. + /// The maximum permitted VRF output, or *threshold*, for BABE. Currently, + /// only the value provided by this type at genesis will be used. /// - /// Dynamic slot duration may be supported in the future. - pub fn slot_duration(&self) -> u64 { - self.slot_duration - } + /// Dynamic thresholds may be supported in the future. + pub threshold: u64, } #[cfg(feature = "std")] impl slots::SlotData for BabeConfiguration { - /// Return the slot duration in milliseconds for BABE. Currently, only + /// Return the slot duration in milliseconds for BABE. Currently, only /// the value provided by this type at genesis will be used. /// /// Dynamic slot duration may be supported in the future. @@ -67,7 +64,7 @@ impl slots::SlotData for BabeConfiguration { decl_runtime_apis! { /// API necessary for block authorship with BABE. pub trait BabeApi { - /// Return the configuration for BABE. Currently, + /// Return the configuration for BABE. Currently, /// only the value provided by this type at genesis will be used. /// /// Dynamic configuration may be supported in the future. diff --git a/core/consensus/babe/src/digest.rs b/core/consensus/babe/src/digest.rs new file mode 100644 index 0000000000000000000000000000000000000000..b26a1508b59927a468c58971debc67749756f31b --- /dev/null +++ b/core/consensus/babe/src/digest.rs @@ -0,0 +1,149 @@ +// Copyright 2019 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 . + +//! Private mplementation details of BABE digests. +use primitives::sr25519::{Public, Signature}; +use babe_primitives::BABE_ENGINE_ID; +use runtime_primitives::generic::DigestItem; +use std::fmt::Debug; +use parity_codec::{Decode, Encode, Input}; +use log::info; +use schnorrkel::{ + vrf::{VRFProof, VRFOutput, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}, + PUBLIC_KEY_LENGTH, +}; + +/// A BABE pre-digest. It includes: +/// +/// * The public key of the author. +/// * The VRF proof. +/// * The VRF output. +/// * The slot number. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct BabePreDigest { + pub(super) vrf_output: VRFOutput, + pub(super) proof: VRFProof, + pub(super) author: Public, + pub(super) slot_num: u64, +} + +/// The prefix used by BABE for its VRF keys. +pub const BABE_VRF_PREFIX: &'static [u8] = b"substrate-babe-vrf"; + +type TmpDecode = ( + [u8; VRF_OUTPUT_LENGTH], + [u8; VRF_PROOF_LENGTH], + [u8; PUBLIC_KEY_LENGTH], + u64, +); + +impl Encode for BabePreDigest { + fn encode(&self) -> Vec { + let tmp: TmpDecode = ( + *self.vrf_output.as_bytes(), + self.proof.to_bytes(), + self.author.0, + self.slot_num, + ); + parity_codec::Encode::encode(&tmp) + } +} + +impl Decode for BabePreDigest { + fn decode(i: &mut R) -> Option { + let (output, proof, public_key, slot_num): TmpDecode = Decode::decode(i)?; + Some(BabePreDigest { + proof: VRFProof::from_bytes(&proof).ok()?, + vrf_output: VRFOutput::from_bytes(&output).ok()?, + author: Public(public_key), + slot_num, + }) + } +} + +/// A digest item which is usable with BABE consensus. +pub trait CompatibleDigestItem: Sized { + /// Construct a digest item which contains a BABE pre-digest. + fn babe_pre_digest(seal: BabePreDigest) -> Self; + + /// If this item is an BABE pre-digest, return it. + fn as_babe_pre_digest(&self) -> Option; + + /// Construct a digest item which contains a BABE seal. + fn babe_seal(signature: Signature) -> Self; + + /// If this item is a BABE signature, return the signature. + fn as_babe_seal(&self) -> Option; +} + +impl CompatibleDigestItem for DigestItem> +{ + fn babe_pre_digest(digest: BabePreDigest) -> Self { + DigestItem::PreRuntime(BABE_ENGINE_ID, digest.encode()) + } + + fn as_babe_pre_digest(&self) -> Option { + match self { + DigestItem::PreRuntime(BABE_ENGINE_ID, seal) => { + let decoded = Decode::decode(&mut &seal[..]); + if decoded.is_none() { + info!(target: "babe", "Failed to decode {:?}", seal) + } + decoded + } + _ => { + info!(target: "babe", "Invalid consensus: {:?}!", self); + None + } + } + } + + fn babe_seal(signature: Signature) -> Self { + DigestItem::Seal(BABE_ENGINE_ID, signature.encode()) + } + + fn as_babe_seal(&self) -> Option { + match self { + DigestItem::Seal(BABE_ENGINE_ID, signature) => Decode::decode(&mut &signature[..]), + _ => None, + } + } +} + +impl CompatibleDigestItem for DigestItem +{ + fn babe_pre_digest(digest: BabePreDigest) -> Self { + DigestItem::PreRuntime(BABE_ENGINE_ID, digest.encode()) + } + + fn as_babe_pre_digest(&self) -> Option { + match self { + DigestItem::PreRuntime(BABE_ENGINE_ID, seal) => Decode::decode(&mut &seal[..]), + _ => None, + } + } + + fn babe_seal(signature: Signature) -> Self { + DigestItem::Seal(BABE_ENGINE_ID, signature) + } + + fn as_babe_seal(&self) -> Option { + match self { + DigestItem::Seal(BABE_ENGINE_ID, signature) => Some(signature.clone()), + _ => None, + } + } +} \ No newline at end of file diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index 0881f8bb9706267f20eae357c689f8d9cff779e3..c66eb6813776c4c2af15202096ffda488e21ecbc 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -14,89 +14,1040 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! BABE (Blind Assignment for Blockchain Extension) consensus in substrate. -#![forbid(warnings, unsafe_code, missing_docs)] - +//! # BABE consensus +//! +//! BABE (Blind Assignment for Blockchain Extension) consensus in Substrate. +//! +//! # Stability +//! +//! This crate is highly unstable and experimental. Breaking changes may +//! happen at any point. This crate is also missing features, such as banning +//! of malicious validators, that are essential for a production network. +#![forbid(unsafe_code, missing_docs)] +#![deny(warnings)] +extern crate core; +mod digest; +use digest::CompatibleDigestItem; +pub use digest::{BabePreDigest, BABE_VRF_PREFIX}; pub use babe_primitives::*; -use parity_codec::{Decode, Encode, Input}; -use runtime_primitives::generic; -use primitives::sr25519::{ - Public, - Signature, - LocalizedSignature, +pub use consensus_common::SyncOracle; +use consensus_common::ExtraVerification; +use runtime_primitives::{generic, generic::BlockId, Justification}; +use runtime_primitives::traits::{ + Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, + SimpleBitOps, +}; +use std::{sync::Arc, u64, fmt::{Debug, Display}}; +use runtime_support::serde::{Serialize, Deserialize}; +use parity_codec::{Decode, Encode}; +use primitives::{ + crypto::Pair, + sr25519::{Public, Signature, self}, +}; +use merlin::Transcript; +use inherents::{InherentDataProviders, InherentData}; +use substrate_telemetry::{ + telemetry, + CONSENSUS_TRACE, + CONSENSUS_DEBUG, + CONSENSUS_WARN, + CONSENSUS_INFO, }; - use schnorrkel::{ - SecretKey as Secret, - vrf::{VRFProof, VRF_PROOF_LENGTH}, - PUBLIC_KEY_LENGTH, SIGNATURE_LENGTH, + keys::Keypair, + vrf::{ + VRFProof, VRFProofBatchable, VRFInOut, + }, +}; +use authorities::AuthoritiesApi; +use consensus_common::{ + self, Authorities, BlockImport, Environment, Proposer, + ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, +}; +use srml_babe::{ + BabeInherentData, + timestamp::{TimestampInherentData, InherentType as TimestampInherent} }; +use consensus_common::{SelectChain, well_known_cache_keys}; +use consensus_common::import_queue::{Verifier, BasicQueue}; +use client::{ + block_builder::api::BlockBuilder as BlockBuilderApi, + blockchain::ProvideCache, + runtime_api::ApiExt, + error::Result as CResult, + backend::AuxStore, +}; +use slots::{CheckedHeader, check_equivocation}; +use futures::{Future, IntoFuture, future}; +use tokio::timer::Timeout; +use log::{error, warn, debug, info, trace}; + +use slots::{SlotWorker, SlotData, SlotInfo, SlotCompatible, slot_now}; + + +/// A slot duration. Create with `get_or_compute`. +// FIXME: Once Rust has higher-kinded types, the duplication between this +// and `super::babe::Config` can be eliminated. +// https://github.com/paritytech/substrate/issues/2434 +pub struct Config(slots::SlotDuration); + +impl Config { + /// Either fetch the slot duration from disk or compute it from the genesis + /// state. + pub fn get_or_compute(client: &C) -> CResult + where + C: AuxStore, C: ProvideRuntimeApi, C::Api: BabeApi, + { + trace!(target: "babe", "Getting slot duration"); + match slots::SlotDuration::get_or_compute(client, |a, b| a.startup_data(b)).map(Self) { + Ok(s) => Ok(s), + Err(s) => { + warn!(target: "babe", "Failed to get slot duration"); + Err(s) + } + } + } + + /// Get the slot duration in milliseconds. + pub fn get(&self) -> u64 { + self.0.slot_duration + } + + /// Retrieve the threshold for BABE + pub fn threshold(&self) -> u64 { + self.0.threshold + } +} + +struct BabeSlotCompatible; + +impl SlotCompatible for BabeSlotCompatible { + fn extract_timestamp_and_slot( + data: &InherentData + ) -> Result<(TimestampInherent, u64), consensus_common::Error> { + trace!(target: "babe", "extract timestamp"); + data.timestamp_inherent_data() + .and_then(|t| data.babe_inherent_data().map(|a| (t, a))) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) + } +} + +/// Parameters for BABE. +pub struct BabeParams { + + /// The configuration for BABE. Includes the slot duration, threshold, and + /// other parameters. + pub config: Config, + + /// The key of the node we are running on. + pub local_key: Arc, + + /// The client to use + pub client: Arc, + + /// The SelectChain Strategy + pub select_chain: SC, + + /// A block importer + pub block_import: Arc, + + /// The environment + pub env: Arc, + + /// A sync oracle + pub sync_oracle: SO, + + /// Providers for inherent data. + pub inherent_data_providers: InherentDataProviders, + + /// Force authoring of blocks even if we are offline + pub force_authoring: bool, +} + +/// Start the babe worker. The returned future should be run in a tokio runtime. +pub fn start_babe(BabeParams { + config, + local_key, + client, + select_chain, + block_import, + env, + sync_oracle, + inherent_data_providers, + force_authoring, +}: BabeParams) -> Result< + impl Future, + consensus_common::Error, +> where + B: Block, + C: ProvideRuntimeApi + ProvideCache, + C::Api: AuthoritiesApi, + SC: SelectChain, + generic::DigestItem: DigestItem, + E::Proposer: Proposer, + <>::Create as IntoFuture>::Future: Send + 'static, + DigestItemFor: CompatibleDigestItem + DigestItem, + H: Header< + Digest=generic::Digest>, + Hash=B::Hash, + >, + E: Environment, + I: BlockImport + Send + Sync + 'static, + Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, + SO: SyncOracle + Send + Sync + Clone, +{ + let worker = BabeWorker { + client: client.clone(), + block_import, + env, + local_key, + sync_oracle: sync_oracle.clone(), + force_authoring, + threshold: config.threshold(), + }; + register_babe_inherent_data_provider(&inherent_data_providers, config.0.slot_duration())?; + Ok(slots::start_slot_worker::<_, _, _, _, _, BabeSlotCompatible>( + config.0, + select_chain, + worker, + sync_oracle, + inherent_data_providers + )) +} + +struct BabeWorker { + client: Arc, + block_import: Arc, + env: Arc, + local_key: Arc, + sync_oracle: SO, + force_authoring: bool, + threshold: u64, +} + +impl SlotWorker for BabeWorker where + B: Block, + C: ProvideRuntimeApi + ProvideCache, + C::Api: AuthoritiesApi, + E: Environment, + E::Proposer: Proposer, + <>::Create as IntoFuture>::Future: Send + 'static, + Hash: Debug + Eq + Copy + SimpleBitOps + Encode + Decode + Serialize + + for<'de> Deserialize<'de> + Debug + Default + AsRef<[u8]> + AsMut<[u8]> + + std::hash::Hash + Display + Send + Sync + 'static, + H: Header< + Digest=generic::Digest>, + Hash=B::Hash, + >, + I: BlockImport + Send + Sync + 'static, + SO: SyncOracle + Send + Clone, + Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, +{ + type OnSlot = Box + Send>; + + fn on_slot( + &self, + chain_head: B::Header, + slot_info: SlotInfo, + ) -> Self::OnSlot { + let pair = self.local_key.clone(); + let ref client = self.client; + let block_import = self.block_import.clone(); + let ref env = self.env; + + let (timestamp, slot_num, slot_duration) = + (slot_info.timestamp, slot_info.number, slot_info.duration); + + let authorities = match authorities(client.as_ref(), &BlockId::Hash(chain_head.hash())) { + Ok(authorities) => authorities, + Err(e) => { + error!( + target: "babe", + "Unable to fetch authorities at block {:?}: {:?}", + chain_head.hash(), + e + ); + telemetry!(CONSENSUS_WARN; "babe.unable_fetching_authorities"; + "slot" => ?chain_head.hash(), "err" => ?e + ); + return Box::new(future::ok(())); + } + }; + + if !self.force_authoring && self.sync_oracle.is_offline() && authorities.len() > 1 { + debug!(target: "babe", "Skipping proposal slot. Waiting for the network."); + telemetry!(CONSENSUS_DEBUG; "babe.skipping_proposal_slot"; + "authorities_len" => authorities.len() + ); + return Box::new(future::ok(())); + } + + // FIXME replace the dummy empty slices with real data + // https://github.com/paritytech/substrate/issues/2435 + // https://github.com/paritytech/substrate/issues/2436 + let proposal_work = if let Some((inout, proof, _batchable_proof)) = claim_slot( + &[0u8; 0], + slot_info.number, + &[0u8; 0], + 0, + &authorities, + &pair, + self.threshold, + ) { + debug!( + target: "babe", "Starting authorship at slot {}; timestamp = {}", + slot_num, + timestamp, + ); + telemetry!(CONSENSUS_DEBUG; "babe.starting_authorship"; + "slot_num" => slot_num, "timestamp" => timestamp + ); + + // we are the slot author. make a block and sign it. + let proposer = match env.init(&chain_head, &authorities) { + Ok(p) => p, + Err(e) => { + warn!(target: "babe", "Unable to author block in slot {:?}: {:?}", slot_num, e); + telemetry!(CONSENSUS_WARN; "babe.unable_authoring_block"; + "slot" => slot_num, "err" => ?e + ); + return Box::new(future::ok(())) + } + }; + + let inherent_digest = BabePreDigest { + proof, + vrf_output: inout.to_output(), + author: pair.public(), + slot_num, + }; -/// A BABE seal. It includes: -/// -/// * The public key -/// * The VRF proof -/// * The signature -/// * The slot number -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct BabeSeal { - proof: VRFProof, - signature: LocalizedSignature, - slot_num: u64, -} - -impl Encode for BabeSeal { - fn encode(&self) -> Vec { - parity_codec::Encode::encode(&( - self.proof.to_bytes(), - self.signature.signature.0, - self.signature.signer.0, - self.slot_num, - )) - } -} - -impl Decode for BabeSeal { - fn decode(i: &mut R) -> Option { - let (public_key, proof, sig, slot_num): ( - [u8; PUBLIC_KEY_LENGTH], - [u8; VRF_PROOF_LENGTH], - [u8; SIGNATURE_LENGTH], - u64, - ) = Decode::decode(i)?; - Some(BabeSeal { - proof: VRFProof::from_bytes(&proof).ok()?, - signature: LocalizedSignature { - signature: Signature(sig), - signer: Public(public_key), - }, - slot_num, - }) - } -} - -/// A digest item which is usable with BABE consensus. -pub trait CompatibleDigestItem: Sized { - /// Construct a digest item which contains a slot number and a signature on the - /// hash. - fn babe_seal(signature: BabeSeal) -> Self; - - /// If this item is an Babe seal, return the slot number and signature. - fn as_babe_seal(&self) -> Option; -} - -impl CompatibleDigestItem for generic::DigestItem { - /// Construct a digest item which is aaAASSAAAAAASDC a slot number and a signature on the - /// hash. - fn babe_seal(signature: BabeSeal) -> Self { - generic::DigestItem::Consensus(BABE_ENGINE_ID, signature.encode()) - } - - /// If this item is an BABE seal, return the slot number and signature. - fn as_babe_seal(&self) -> Option { - match self { - generic::DigestItem::Consensus(BABE_ENGINE_ID, seal) => Decode::decode(&mut &seal[..]), - _ => None, + // deadline our production to approx. the end of the slot + let remaining_duration = slot_info.remaining_duration(); + Timeout::new( + proposer.propose( + slot_info.inherent_data, + generic::Digest { + logs: vec![ + generic::DigestItem::babe_pre_digest(inherent_digest.clone()), + ], + }, + remaining_duration, + ).into_future(), + remaining_duration, + ) + } else { + return Box::new(future::ok(())); + }; + + Box::new(proposal_work.map(move |b| { + // minor hack since we don't have access to the timestamp + // that is actually set by the proposer. + let slot_after_building = slot_now(slot_duration); + if slot_after_building != Some(slot_num) { + info!( + target: "babe", + "Discarding proposal for slot {}; block production took too long", + slot_num + ); + telemetry!(CONSENSUS_INFO; "babe.discarding_proposal_took_too_long"; + "slot" => slot_num + ); + return + } + + let (header, body) = b.deconstruct(); + let pre_digest: Result = find_pre_digest::(&header); + if let Err(e) = pre_digest { + error!(target: "babe", "FATAL ERROR: Invalid pre-digest: {}!", e); + return + } else { + trace!(target: "babe", "Got correct number of seals. Good!") + }; + + let header_num = header.number().clone(); + let parent_hash = header.parent_hash().clone(); + + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let header_hash = header.hash(); + let signature = pair.sign(header_hash.as_ref()); + let signature_digest_item = DigestItemFor::::babe_seal(signature); + + let import_block: ImportBlock = ImportBlock { + origin: BlockOrigin::Own, + header, + justification: None, + post_digests: vec![signature_digest_item], + body: Some(body), + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + + info!(target: "babe", + "Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", + header_num, + import_block.post_header().hash(), + header_hash, + ); + telemetry!(CONSENSUS_INFO; "babe.pre_sealed_block"; + "header_num" => ?header_num, + "hash_now" => ?import_block.post_header().hash(), + "hash_previously" => ?header_hash, + ); + + if let Err(e) = block_import.import_block(import_block, Default::default()) { + warn!(target: "babe", "Error with block built on {:?}: {:?}", + parent_hash, e); + telemetry!(CONSENSUS_WARN; "babe.err_with_block_built_on"; + "hash" => ?parent_hash, "err" => ?e + ); + } + }).map_err(|e| { + warn!("Client import failed: {:?}", e); + consensus_common::Error::ClientImport(format!("{:?}", e)).into() + })) + } +} + +macro_rules! babe_err { + ($($i: expr),+) => { + { debug!(target: "babe", $($i),+) + ; format!($($i),+) + } + }; +} + +fn find_pre_digest(header: &B::Header) -> Result + where DigestItemFor: CompatibleDigestItem, +{ + let mut pre_digest: Option<_> = None; + for log in header.digest().logs() { + trace!(target: "babe", "Checking log {:?}", log); + match (log.as_babe_pre_digest(), pre_digest.is_some()) { + (Some(_), true) => Err(babe_err!("Multiple BABE pre-runtime headers, rejecting!"))?, + (None, _) => trace!(target: "babe", "Ignoring digest not meant for us"), + (s, false) => pre_digest = s, + } + } + pre_digest.ok_or_else(|| babe_err!("No BABE pre-runtime digest found")) +} + +/// check a header has been signed by the right key. If the slot is too far in +/// the future, an error will be returned. If successful, returns the pre-header +/// and the digest item containing the seal. +/// +/// The seal must be the last digest. Otherwise, the whole header is considered +/// unsigned. This is required for security and must not be changed. +/// +/// This digest item will always return `Some` when used with `as_babe_pre_digest`. +// +// FIXME #1018 needs misbehavior types +#[forbid(warnings)] +fn check_header( + client: &C, + slot_now: u64, + mut header: B::Header, + hash: B::Hash, + authorities: &[Public], + threshold: u64, +) -> Result, DigestItemFor)>, String> + where DigestItemFor: CompatibleDigestItem, +{ + trace!(target: "babe", "Checking header"); + let seal = match header.digest_mut().pop() { + Some(x) => x, + None => return Err(babe_err!("Header {:?} is unsealed", hash)), + }; + + let sig = seal.as_babe_seal().ok_or_else(|| { + babe_err!("Header {:?} has a bad seal", hash) + })?; + + let pre_digest = find_pre_digest::(&header)?; + let BabePreDigest { slot_num, ref author, ref proof, ref vrf_output } = pre_digest; + + if slot_num > slot_now { + header.digest_mut().push(seal); + Ok(CheckedHeader::Deferred(header, slot_num)) + } else if !authorities.contains(&author) { + Err(babe_err!("Slot author not found")) + } else { + let pre_hash = header.hash(); + + if sr25519::Pair::verify(&sig, pre_hash, author) { + let (inout, _batchable_proof) = { + let transcript = make_transcript( + Default::default(), + slot_num, + Default::default(), + 0, + ); + schnorrkel::PublicKey::from_bytes(author.as_slice()).and_then(|p| { + p.vrf_verify(transcript, vrf_output, proof) + }).map_err(|s| { + babe_err!("VRF verification failed: {:?}", s) + })? + }; + + if !check(&inout, threshold) { + return Err(babe_err!("VRF verification of block by author {:?} failed: \ + threshold {} exceeded", author, threshold)); + } + + if let Some(equivocation_proof) = check_equivocation( + client, + slot_now, + slot_num, + &header, + author, + ).map_err(|e| e.to_string())? { + info!( + "Slot author {:?} is equivocating at slot {} with headers {:?} and {:?}", + author, + slot_num, + equivocation_proof.fst_header().hash(), + equivocation_proof.snd_header().hash(), + ); + } + + let pre_digest = CompatibleDigestItem::babe_pre_digest(pre_digest); + Ok(CheckedHeader::Checked(header, (pre_digest, seal))) + } else { + Err(babe_err!("Bad signature on {:?}", hash)) + } + } +} + +/// A verifier for Babe blocks. +pub struct BabeVerifier { + client: Arc, + extra: E, + inherent_data_providers: inherents::InherentDataProviders, + threshold: u64, +} + +impl BabeVerifier { + fn check_inherents( + &self, + block: B, + block_id: BlockId, + inherent_data: InherentData, + ) -> Result<(), String> + where C: ProvideRuntimeApi, C::Api: BlockBuilderApi + { + let inherent_res = self.client.runtime_api().check_inherents( + &block_id, + block, + inherent_data, + ).map_err(|e| format!("{:?}", e))?; + + if !inherent_res.ok() { + inherent_res + .into_errors() + .try_for_each(|(i, e)| Err(self.inherent_data_providers.error_to_string(&i, &e))) + } else { + Ok(()) } } } + +/// No-op extra verification. +#[derive(Debug, Clone, Copy)] +pub struct NothingExtra; + +impl ExtraVerification for NothingExtra { + type Verified = Result<(), String>; + + fn verify(&self, _: &B::Header, _: Option<&[B::Extrinsic]>) -> Self::Verified { + Ok(()) + } +} + +impl Verifier for BabeVerifier where + C: ProvideRuntimeApi + Send + Sync + AuxStore, + C::Api: BlockBuilderApi, + DigestItemFor: CompatibleDigestItem + DigestItem, + E: ExtraVerification, + Self: Authorities, +{ + fn verify( + &self, + origin: BlockOrigin, + header: B::Header, + justification: Option, + mut body: Option>, + ) -> Result<(ImportBlock, Option>), String> { + trace!( + target: "babe", + "Verifying origin: {:?} header: {:?} justification: {:?} body: {:?}", + origin, + header, + justification, + body, + ); + + debug!(target: "babe", "We have {:?} logs in this header", header.digest().logs().len()); + let mut inherent_data = self + .inherent_data_providers + .create_inherent_data() + .map_err(String::from)?; + let (_, slot_now) = BabeSlotCompatible::extract_timestamp_and_slot(&inherent_data) + .map_err(|e| format!("Could not extract timestamp and slot: {:?}", e))?; + let hash = header.hash(); + let parent_hash = *header.parent_hash(); + let authorities = self.authorities(&BlockId::Hash(parent_hash)) + .map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?; + + let extra_verification = self.extra.verify( + &header, + body.as_ref().map(|x| &x[..]), + ); + + // we add one to allow for some small drift. + // FIXME #1019 in the future, alter this queue to allow deferring of + // headers + let checked_header = check_header::( + &self.client, + slot_now + 1, + header, + hash, + &authorities[..], + self.threshold, + )?; + match checked_header { + CheckedHeader::Checked(pre_header, (pre_digest, seal)) => { + let BabePreDigest { slot_num, .. } = pre_digest.as_babe_pre_digest() + .expect("check_header always returns a pre-digest digest item; qed"); + + // if the body is passed through, we need to use the runtime + // to check that the internally-set timestamp in the inherents + // actually matches the slot set in the seal. + if let Some(inner_body) = body.take() { + inherent_data.babe_replace_inherent_data(slot_num); + let block = B::new(pre_header.clone(), inner_body); + + self.check_inherents( + block.clone(), + BlockId::Hash(parent_hash), + inherent_data, + )?; + + let (_, inner_body) = block.deconstruct(); + body = Some(inner_body); + } + + trace!(target: "babe", "Checked {:?}; importing.", pre_header); + telemetry!( + CONSENSUS_TRACE; + "babe.checked_and_importing"; + "pre_header" => ?pre_header); + + extra_verification.into_future().wait()?; + + let new_authorities = pre_header.digest() + .log(DigestItem::as_authorities_change) + .map(|digest| digest.to_vec()); + + let import_block = ImportBlock { + origin, + header: pre_header, + post_digests: vec![seal], + body, + finalized: false, + justification, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + + // FIXME #1019 extract authorities + Ok((import_block, new_authorities)) + } + CheckedHeader::Deferred(a, b) => { + debug!(target: "babe", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); + telemetry!(CONSENSUS_DEBUG; "babe.header_too_far_in_future"; + "hash" => ?hash, "a" => ?a, "b" => ?b + ); + Err(format!("Header {:?} rejected: too far in the future", hash)) + } + } + } +} + +impl Authorities for BabeVerifier where + B: Block, + C: ProvideRuntimeApi + ProvideCache, + C::Api: AuthoritiesApi, +{ + type Error = ConsensusError; + + fn authorities(&self, at: &BlockId) -> Result>, Self::Error> { + authorities(self.client.as_ref(), at) + } +} + +fn authorities(client: &C, at: &BlockId) -> Result< + Vec>, + ConsensusError, +> where + B: Block, + C: ProvideRuntimeApi + ProvideCache, + C::Api: AuthoritiesApi, +{ + client + .cache() + .and_then(|cache| cache.get_at(&well_known_cache_keys::AUTHORITIES, at) + .and_then(|v| Decode::decode(&mut &v[..]))) + .or_else(|| { + if client.runtime_api().has_api::>(at).unwrap_or(false) { + AuthoritiesApi::authorities(&*client.runtime_api(), at).ok() + } else { + panic!("We don’t support deprecated code with new consensus algorithms, \ + therefore this is unreachable; qed") + } + }).ok_or(consensus_common::Error::InvalidAuthoritiesSet) +} + +/// The BABE import queue type. +pub type BabeImportQueue = BasicQueue; + +/// Register the babe inherent data provider, if not registered already. +fn register_babe_inherent_data_provider( + inherent_data_providers: &InherentDataProviders, + slot_duration: u64, +) -> Result<(), consensus_common::Error> { + debug!(target: "babe", "Registering"); + if !inherent_data_providers.has_provider(&srml_babe::INHERENT_IDENTIFIER) { + inherent_data_providers + .register_provider(srml_babe::InherentDataProvider::new(slot_duration)) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) + } else { + Ok(()) + } +} + +fn get_keypair(q: &sr25519::Pair) -> &Keypair { + q.as_ref() +} + +#[allow(deprecated)] +fn make_transcript( + randomness: &[u8], + slot_number: u64, + genesis_hash: &[u8], + epoch: u64, +) -> Transcript { + let mut transcript = Transcript::new(&BABE_ENGINE_ID); + transcript.commit_bytes(b"slot number", &slot_number.to_le_bytes()); + transcript.commit_bytes(b"genesis block hash", genesis_hash); + transcript.commit_bytes(b"current epoch", &epoch.to_le_bytes()); + transcript.commit_bytes(b"chain randomness", randomness); + transcript +} + +fn check(inout: &VRFInOut, threshold: u64) -> bool { + u64::from_le_bytes(inout.make_bytes::<[u8; 8]>(BABE_VRF_PREFIX)) < threshold +} + +/// Claim a slot if it is our turn. Returns `None` if it is not our turn. +/// +/// This hashes the slot number, epoch, genesis hash, and chain randomness into +/// the VRF. If the VRF produces a value less than `threshold`, it is our turn, +/// so it returns `Some(_)`. Otherwise, it returns `None`. +fn claim_slot( + randomness: &[u8], + slot_number: u64, + genesis_hash: &[u8], + epoch: u64, + authorities: &[sr25519::Public], + key: &sr25519::Pair, + threshold: u64, +) -> Option<(VRFInOut, VRFProof, VRFProofBatchable)> { + if !authorities.contains(&key.public()) { return None } + let transcript = make_transcript( + randomness, + slot_number, + genesis_hash, + epoch, + ); + + // Compute the threshold we will use. + // + // We already checked that authorities contains `key.public()`, so it can’t + // be empty. Therefore, this division is safe. + let threshold = threshold / authorities.len() as u64; + + get_keypair(key).vrf_sign_n_check(transcript, |inout| check(inout, threshold)) +} + +#[cfg(test)] +#[allow(dead_code, unused_imports, deprecated)] +// FIXME #2532: need to allow deprecated until refactor is done +// https://github.com/paritytech/substrate/issues/2532 + +mod tests { + use super::*; + + use client::LongestChain; + use consensus_common::NoNetwork as DummyOracle; + use network::test::*; + use network::test::{Block as TestBlock, PeersClient}; + use runtime_primitives::traits::{Block as BlockT, DigestFor}; + use network::config::ProtocolConfig; + use parking_lot::Mutex; + use tokio::runtime::current_thread; + use keyring::sr25519::Keyring; + use super::generic::DigestItem; + use client::BlockchainEvents; + use test_client; + use futures::stream::Stream; + use log::debug; + use std::time::Duration; + type Item = generic::DigestItem; + use test_client::AuthorityKeyring; + + type Error = client::error::Error; + + type TestClient = client::Client< + test_client::Backend, + test_client::Executor, + TestBlock, + test_client::runtime::RuntimeApi, + >; + + struct DummyFactory(Arc); + struct DummyProposer(u64, Arc); + + impl Environment for DummyFactory { + type Proposer = DummyProposer; + type Error = Error; + + fn init(&self, parent_header: &::Header, _authorities: &[Public]) + -> Result + { + Ok(DummyProposer(parent_header.number + 1, self.0.clone())) + } + } + + impl Proposer for DummyProposer { + type Error = Error; + type Create = Result; + + fn propose(&self, _: InherentData, digests: DigestFor, _: Duration) -> Result { + self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) + } + } + + const SLOT_DURATION: u64 = 1; + const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50); + + pub struct BabeTestNet { + peers: Vec>>, + started: bool, + } + + impl TestNetFactory for BabeTestNet { + type Specialization = DummySpecialization; + type Verifier = BabeVerifier; + type PeerData = (); + + /// Create new test network with peers and given config. + fn from_config(_config: &ProtocolConfig) -> Self { + debug!(target: "babe", "Creating test network from config"); + BabeTestNet { + peers: Vec::new(), + started: false, + } + } + + fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) + -> Arc + { + let client = client.as_full().expect("only full clients are used in test"); + trace!(target: "babe", "Creating a verifier"); + let config = Config::get_or_compute(&*client) + .expect("slot duration available"); + let inherent_data_providers = InherentDataProviders::new(); + register_babe_inherent_data_provider( + &inherent_data_providers, + config.get() + ).expect("Registers babe inherent data provider"); + trace!(target: "babe", "Provider registered"); + + assert_eq!(config.get(), SLOT_DURATION); + Arc::new(BabeVerifier { + client, + extra: NothingExtra, + inherent_data_providers, + threshold: config.threshold(), + }) + } + + fn uses_tokio(&self) -> bool { + true + } + + fn peer(&self, i: usize) -> &Peer { + trace!(target: "babe", "Retreiving a peer"); + &self.peers[i] + } + + fn peers(&self) -> &Vec>> { + trace!(target: "babe", "Retreiving peers"); + &self.peers + } + + fn mut_peers>>)>( + &mut self, + closure: F, + ) { + closure(&mut self.peers); + } + + fn started(&self) -> bool { + self.started + } + + fn set_started(&mut self, new: bool) { + self.started = new; + } + } + + #[test] + fn can_serialize_block() { + drop(env_logger::try_init()); + assert!(BabePreDigest::decode(&mut &b""[..]).is_none()); + } + + #[test] + fn authoring_blocks() { + drop(env_logger::try_init()); + debug!(target: "babe", "checkpoint 1"); + let mut net = BabeTestNet::new(3); + debug!(target: "babe", "checkpoint 2"); + + net.start(); + debug!(target: "babe", "checkpoint 3"); + + let peers = &[ + (0, Keyring::Alice), + (1, Keyring::Bob), + (2, Keyring::Charlie), + ]; + + let net = Arc::new(Mutex::new(net)); + let mut import_notifications = Vec::new(); + debug!(target: "babe", "checkpoint 4"); + let mut runtime = current_thread::Runtime::new().unwrap(); + for (peer_id, key) in peers { + let client = net.lock().peer(*peer_id).client().as_full().unwrap(); + let environ = Arc::new(DummyFactory(client.clone())); + import_notifications.push( + client.import_notification_stream() + .take_while(|n| Ok(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) + .for_each(move |_| Ok(())) + ); + + let config = Config::get_or_compute(&*client) + .expect("slot duration available"); + + let inherent_data_providers = InherentDataProviders::new(); + register_babe_inherent_data_provider( + &inherent_data_providers, config.get() + ).expect("Registers babe inherent data provider"); + + + #[allow(deprecated)] + let select_chain = LongestChain::new(client.backend().clone()); + + let babe = start_babe(BabeParams { + config, + local_key: Arc::new(key.clone().into()), + block_import: client.clone(), + select_chain, + client, + env: environ.clone(), + sync_oracle: DummyOracle, + inherent_data_providers, + force_authoring: false, + }).expect("Starts babe"); + + runtime.spawn(babe); + } + debug!(target: "babe", "checkpoint 5"); + + // wait for all finalized on each. + let wait_for = ::futures::future::join_all(import_notifications) + .map(drop) + .map_err(drop); + + let drive_to_completion = ::tokio::timer::Interval::new_interval(TEST_ROUTING_INTERVAL) + .for_each(move |_| { + net.lock().send_import_notifications(); + net.lock().sync_without_disconnects(); + Ok(()) + }) + .map(drop) + .map_err(drop); + + runtime.block_on(wait_for.select(drive_to_completion).map_err(drop)).unwrap(); + } + + #[test] + fn wrong_consensus_engine_id_rejected() { + drop(env_logger::try_init()); + let sig = sr25519::Pair::generate().sign(b""); + let bad_seal: Item = DigestItem::Seal([0; 4], sig); + assert!(bad_seal.as_babe_pre_digest().is_none()); + assert!(bad_seal.as_babe_seal().is_none()) + } + + #[test] + fn malformed_pre_digest_rejected() { + drop(env_logger::try_init()); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, Signature([0; 64])); + assert!(bad_seal.as_babe_pre_digest().is_none()); + } + + #[test] + fn sig_is_not_pre_digest() { + drop(env_logger::try_init()); + let sig = sr25519::Pair::generate().sign(b""); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig); + assert!(bad_seal.as_babe_pre_digest().is_none()); + assert!(bad_seal.as_babe_seal().is_some()) + } + + #[test] + fn can_author_block() { + drop(env_logger::try_init()); + let randomness = &[]; + let pair = sr25519::Pair::generate(); + let mut i = 0; + loop { + match claim_slot(randomness, i, &[], 0, &[pair.public()], &pair, u64::MAX / 10) { + None => i += 1, + Some(s) => { + debug!(target: "babe", "Authored block {:?}", s); + break + } + } + } + } + + #[test] + fn authorities_call_works() { + drop(env_logger::try_init()); + let client = test_client::new(); + + assert_eq!(client.info().chain.best_number, 0); + assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ + Keyring::Alice.into(), + Keyring::Bob.into(), + Keyring::Charlie.into() + ]); + } +} diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index dab387886324ccb320f0eb0b997799276c94a653..3d133461e7673beb54128c6cf70e031698f1b6f1 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -1,26 +1,28 @@ [package] name = "substrate-consensus-common" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Common utilities for substrate consensus" edition = "2018" [dependencies] +derive_more = "0.14.0" crossbeam-channel = "0.3.4" -libp2p = { version = "0.7.0", default-features = false } +libp2p = { version = "0.9.0", default-features = false } log = "0.4" primitives = { package = "substrate-primitives", path= "../../primitives" } inherents = { package = "substrate-inherents", path = "../../inherents" } -error-chain = "0.12" futures = "0.1" +rstd = { package = "sr-std", path = "../../sr-std" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } -tokio = "0.1.7" +tokio-timer = "0.2" parity-codec = { version = "3.3", features = ["derive"] } +parking_lot = "0.8.0" [dev-dependencies] test_client = { package = "substrate-test-client", path = "../../test-client" } [features] default = [] -test-helpers = [] \ No newline at end of file +test-helpers = [] diff --git a/core/consensus/common/src/block_import.rs b/core/consensus/common/src/block_import.rs index 7debe1acfec7fd89d76e3026cbaf1f8979f76f49..8ce60191316dce711dc4f740970fbf03ff5e6b33 100644 --- a/core/consensus/common/src/block_import.rs +++ b/core/consensus/common/src/block_import.rs @@ -22,6 +22,8 @@ use std::borrow::Cow; use std::collections::HashMap; use crate::well_known_cache_keys; +use crate::import_queue::Verifier; + /// Block import result. #[derive(Debug, PartialEq, Eq)] pub enum ImportResult { @@ -44,6 +46,8 @@ pub struct ImportedAux { pub needs_justification: bool, /// Received a bad justification. pub bad_justification: bool, + /// Request a finality proof for the given block. + pub needs_finality_proof: bool, } impl Default for ImportedAux { @@ -52,6 +56,7 @@ impl Default for ImportedAux { clear_justification_requests: false, needs_justification: false, bad_justification: false, + needs_finality_proof: false, } } } @@ -192,7 +197,7 @@ pub trait JustificationImport { type Error: ::std::error::Error + Send + 'static; /// Called by the import queue when it is started. - fn on_start(&self, _link: &crate::import_queue::Link) { } + fn on_start(&self, _link: &dyn crate::import_queue::Link) { } /// Import a Block justification and finalize the given block. fn import_justification( @@ -202,3 +207,26 @@ pub trait JustificationImport { justification: Justification, ) -> Result<(), Self::Error>; } + +/// Finality proof import trait. +pub trait FinalityProofImport { + type Error: std::error::Error + Send + 'static; + + /// Called by the import queue when it is started. + fn on_start(&self, _link: &dyn crate::import_queue::Link) { } + + /// Import a Block justification and finalize the given block. Returns finalized block or error. + fn import_finality_proof( + &self, + hash: B::Hash, + number: NumberFor, + finality_proof: Vec, + verifier: &dyn Verifier, + ) -> Result<(B::Hash, NumberFor), Self::Error>; +} + +/// Finality proof request builder. +pub trait FinalityProofRequestBuilder: Send { + /// Build data blob, associated with the request. + fn build_request_data(&self, hash: &B::Hash) -> Vec; +} diff --git a/core/consensus/common/src/error.rs b/core/consensus/common/src/error.rs index 0f1914087bf8c979441dc907a2694fc80138e305..d8683d0b685472de860b405aef7c728e71a84704 100644 --- a/core/consensus/common/src/error.rs +++ b/core/consensus/common/src/error.rs @@ -16,94 +16,69 @@ //! Error types in Consensus use runtime_version::RuntimeVersion; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; use primitives::ed25519::{Public, Signature}; +use std::error; + +/// Result type alias. +pub type Result = std::result::Result; + +/// Error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Missing state at block with given descriptor. + #[display(fmt="State unavailable at block {}", _0)] + StateUnavailable(String), + /// I/O terminated unexpectedly + #[display(fmt="I/O terminated unexpectedly.")] + IoTerminated, + /// Unable to schedule wakeup. + #[display(fmt="Timer error: {}", _0)] + FaultyTimer(tokio_timer::Error), + /// Error while working with inherent data. + #[display(fmt="InherentData error: {}", _0)] + InherentData(String), + /// Unable to propose a block. + #[display(fmt="Unable to create block proposal.")] + CannotPropose, + /// Error checking signature + #[display(fmt="Message signature {:?} by {:?} is invalid.", _0, _1)] + InvalidSignature(Signature, Public), + /// Invalid authorities set received from the runtime. + #[display(fmt="Current state of blockchain has invalid authorities set")] + InvalidAuthoritiesSet, + /// Account is not an authority. + #[display(fmt="Message sender {:?} is not a valid authority.", _0)] + InvalidAuthority(Public), + /// Authoring interface does not match the runtime. + #[display(fmt="Authoring for current \ + runtime is not supported. Native ({}) cannot author for on-chain ({}).", native, on_chain)] + IncompatibleAuthoringRuntime { native: RuntimeVersion, on_chain: RuntimeVersion }, + /// Authoring interface does not match the runtime. + #[display(fmt="Authoring for current runtime is not supported since it has no version.")] + RuntimeVersionMissing, + /// Authoring interface does not match the runtime. + #[display(fmt="Authoring in current build is not supported since it has no runtime.")] + NativeRuntimeMissing, + /// Justification requirements not met. + #[display(fmt="Invalid justification.")] + InvalidJustification, + /// Some other error. + #[display(fmt="Other error: {}", _0)] + Other(Box), + /// Error from the client while importing + #[display(fmt="Import failed: {}", _0)] + ClientImport(String), + /// Error from the client while importing + #[display(fmt="Chain lookup failed: {}", _0)] + ChainLookup(String), +} -error_chain! { - errors { - /// Missing state at block with given descriptor. - StateUnavailable(b: String) { - description("State missing at given block."), - display("State unavailable at block {}", b), - } - - /// I/O terminated unexpectedly - IoTerminated { - description("I/O terminated unexpectedly."), - display("I/O terminated unexpectedly."), - } - - /// Unable to schedule wakeup. - FaultyTimer(e: ::tokio::timer::Error) { - description("Timer error"), - display("Timer error: {}", e), - } - - /// Error while working with inherent data. - InherentData(e: String) { - description("InherentData error"), - display("InherentData error: {}", e), - } - - /// Unable to propose a block. - CannotPropose { - description("Unable to create block proposal."), - display("Unable to create block proposal."), - } - - /// Error checking signature - InvalidSignature(s: Signature, a: Public) { - description("Message signature is invalid"), - display("Message signature {:?} by {:?} is invalid.", s, a), - } - - /// Invalid authorities set received from the runtime. - InvalidAuthoritiesSet { - description("authorities set is invalid"), - display("Current state of blockchain has invalid authorities set"), - } - - /// Account is not an authority. - InvalidAuthority(a: Public) { - description("Message sender is not a valid authority"), - display("Message sender {:?} is not a valid authority.", a), - } - - /// Authoring interface does not match the runtime. - IncompatibleAuthoringRuntime(native: RuntimeVersion, on_chain: RuntimeVersion) { - description("Authoring for current runtime is not supported"), - display("Authoring for current runtime is not supported. Native ({}) cannot author for on-chain ({}).", native, on_chain), - } - - /// Authoring interface does not match the runtime. - RuntimeVersionMissing { - description("Current runtime has no version"), - display("Authoring for current runtime is not supported since it has no version."), - } - - /// Authoring interface does not match the runtime. - NativeRuntimeMissing { - description("This build has no native runtime"), - display("Authoring in current build is not supported since it has no runtime."), - } - - /// Justification requirements not met. - InvalidJustification { - description("Invalid justification"), - display("Invalid justification."), - } - - /// Some other error. - Other(e: Box<::std::error::Error + Send>) { - description("Other error") - display("Other error: {}", e.description()) - } - - /// Error from the client while importing - ClientImport(reason: String) { - description("Import failed"), - display("Import failed: {}", reason), +impl error::Error for Error { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + match self { + Error::FaultyTimer(ref err) => Some(err), + Error::Other(ref err) => Some(&**err), + _ => None, } } } diff --git a/core/consensus/common/src/evaluation.rs b/core/consensus/common/src/evaluation.rs index 48016b1e94c93f0b55e8806d8e28cdcc79e6a6bc..ed7515a419194c1cc8ea651a903d89650f03373e 100644 --- a/core/consensus/common/src/evaluation.rs +++ b/core/consensus/common/src/evaluation.rs @@ -19,36 +19,37 @@ use super::MAX_BLOCK_SIZE; use parity_codec::Encode; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As}; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind, bail}; - -type BlockNumber = u64; - -error_chain! { - errors { - BadProposalFormat { - description("Proposal provided not a block."), - display("Proposal provided not a block."), - } - WrongParentHash(expected: String, got: String) { - description("Proposal had wrong parent hash."), - display("Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got), - } - WrongNumber(expected: BlockNumber, got: BlockNumber) { - description("Proposal had wrong number."), - display("Proposal had wrong number. Expected {}, got {}", expected, got), - } - ProposalTooLarge(size: usize) { - description("Proposal exceeded the maximum size."), - display( - "Proposal exceeded the maximum size of {} by {} bytes.", - MAX_BLOCK_SIZE, size.saturating_sub(MAX_BLOCK_SIZE) - ), - } - } +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, One, CheckedConversion}; + +// This is just a best effort to encode the number. None indicated that it's too big to encode +// in a u128. +type BlockNumber = Option; + +/// Result type alias. +pub type Result = std::result::Result; + +/// Error type. +#[derive(Debug, derive_more::Display)] +pub enum Error { + /// Proposal provided not a block. + #[display(fmt="Proposal provided not a block.")] + BadProposalFormat, + /// Proposal had wrong parent hash. + #[display(fmt="Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got)] + WrongParentHash { expected: String, got: String }, + /// Proposal had wrong number. + #[display(fmt="Proposal had wrong number. Expected {:?}, got {:?}", expected, got)] + WrongNumber { expected: BlockNumber, got: BlockNumber }, + /// Proposal exceeded the maximum size. + #[display( + fmt="Proposal exceeded the maximum size of {} by {} bytes.", + "MAX_BLOCK_SIZE", "_0.saturating_sub(MAX_BLOCK_SIZE)" + )] + ProposalTooLarge(usize), } +impl std::error::Error for Error {} + /// Attempt to evaluate a substrate block as a node block, returning error /// upon any initial validity checks failing. pub fn evaluate_initial( @@ -59,21 +60,24 @@ pub fn evaluate_initial( let encoded = Encode::encode(proposal); let proposal = Block::decode(&mut &encoded[..]) - .ok_or_else(|| ErrorKind::BadProposalFormat)?; + .ok_or_else(|| Error::BadProposalFormat)?; if encoded.len() > MAX_BLOCK_SIZE { - bail!(ErrorKind::ProposalTooLarge(encoded.len())) + return Err(Error::ProposalTooLarge(encoded.len())) } if *parent_hash != *proposal.header().parent_hash() { - bail!(ErrorKind::WrongParentHash( - format!("{:?}", *parent_hash), - format!("{:?}", proposal.header().parent_hash()) - )); + return Err(Error::WrongParentHash { + expected: format!("{:?}", *parent_hash), + got: format!("{:?}", proposal.header().parent_hash()) + }); } - if parent_number.as_() + 1 != proposal.header().number().as_() { - bail!(ErrorKind::WrongNumber(parent_number.as_() + 1, proposal.header().number().as_())); + if parent_number + One::one() != *proposal.header().number() { + return Err(Error::WrongNumber { + expected: parent_number.checked_into::().map(|x| x + 1), + got: (*proposal.header().number()).checked_into::(), + }); } Ok(()) diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index d1c5c69d02311c2a98efcddd788030093456a97f..118bc641b2f7b0bde30425c07d140b0396db2d39 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -17,36 +17,54 @@ //! Import Queue primitive: something which can verify and import blocks. //! //! This serves as an intermediate and abstracted step between synchronization -//! and import. Each mode of consensus will have its own requirements for block verification. -//! Some algorithms can verify in parallel, while others only sequentially. +//! and import. Each mode of consensus will have its own requirements for block +//! verification. Some algorithms can verify in parallel, while others only +//! sequentially. //! -//! The `ImportQueue` trait allows such verification strategies to be instantiated. -//! The `BasicQueue` and `BasicVerifier` traits allow serial queues to be -//! instantiated simply. +//! The `ImportQueue` trait allows such verification strategies to be +//! instantiated. The `BasicQueue` and `BasicVerifier` traits allow serial +//! queues to be instantiated simply. use crate::block_import::{ BlockImport, BlockOrigin, ImportBlock, ImportedAux, ImportResult, JustificationImport, + FinalityProofImport, FinalityProofRequestBuilder, }; use crossbeam_channel::{self as channel, Receiver, Sender}; use parity_codec::Encode; +use parking_lot::Mutex; use std::sync::Arc; use std::thread; use runtime_primitives::traits::{ - AuthorityIdFor, Block as BlockT, Header as HeaderT, NumberFor + AuthorityIdFor, Block as BlockT, Header as HeaderT, NumberFor, Digest, }; use runtime_primitives::Justification; use crate::error::Error as ConsensusError; use parity_codec::alloc::collections::hash_map::HashMap; +/// Reputation change for peers which send us a block with an incomplete header. +const INCOMPLETE_HEADER_REPUTATION_CHANGE: i32 = -(1 << 20); +/// Reputation change for peers which send us a block which we fail to verify. +const VERIFICATION_FAIL_REPUTATION_CHANGE: i32 = -(1 << 20); +/// Reputation change for peers which send us a bad block. +const BAD_BLOCK_REPUTATION_CHANGE: i32 = -(1 << 29); +/// Reputation change for peers which send us a block with bad justifications. +const BAD_JUSTIFICATION_REPUTATION_CHANGE: i32 = -(1 << 16); + /// Shared block import struct used by the queue. pub type SharedBlockImport = Arc + Send + Sync>; /// Shared justification import struct used by the queue. pub type SharedJustificationImport = Arc + Send + Sync>; +/// Shared finality proof import struct used by the queue. +pub type SharedFinalityProofImport = Arc + Send + Sync>; + +/// Shared finality proof request builder struct used by the queue. +pub type SharedFinalityProofRequestBuilder = Arc + Send + Sync>; + /// Maps to the Origin used by the network. pub type Origin = libp2p::PeerId; @@ -66,7 +84,7 @@ pub struct IncomingBlock { } /// Verify a justification of a block -pub trait Verifier: Send + Sync + Sized { +pub trait Verifier: Send + Sync { /// Verify the given data and return the ImportBlock and an optional /// new set of validators to import. If not, err with an Error-Message /// presented to the User in the logs. @@ -80,141 +98,254 @@ pub trait Verifier: Send + Sync + Sized { } /// Blocks import queue API. -pub trait ImportQueue: Send + Sync + ImportQueueClone { +pub trait ImportQueue: Send + Sync { /// Start background work for the queue as necessary. /// /// This is called automatically by the network service when synchronization /// begins. - fn start(&self, _link: Box>) -> Result<(), std::io::Error> { + fn start(&self, _link: Box>) -> Result<(), std::io::Error> { Ok(()) } - /// Clears the import queue and stops importing. - fn stop(&self); /// Import bunch of blocks. fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>); /// Import a block justification. fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification); + /// Import block finality proof. + fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec); } -pub trait ImportQueueClone { - fn clone_box(&self) -> Box>; +/// Basic block import queue that performs import in the caller thread. +pub struct BasicSyncQueue> { + data: Arc>, +} + +struct BasicSyncQueueData> { + link: Mutex>>>, + block_import: SharedBlockImport, + verifier: Arc, + justification_import: Option>, + finality_proof_import: Option>, } -impl Clone for Box> { - fn clone(&self) -> Box> { - self.clone_box() +impl> BasicSyncQueue { + pub fn new( + block_import: SharedBlockImport, + verifier: Arc, + justification_import: Option>, + finality_proof_import: Option>, + ) -> Self { + BasicSyncQueue { + data: Arc::new(BasicSyncQueueData { + link: Mutex::new(None), + block_import, + verifier, + justification_import, + finality_proof_import, + }), + } + } +} + +impl> ImportQueue for BasicSyncQueue { + fn start(&self, link: Box>) -> Result<(), std::io::Error> { + if let Some(justification_import) = self.data.justification_import.as_ref() { + justification_import.on_start(&*link); + } + *self.data.link.lock() = Some(link); + Ok(()) + } + + fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>) { + if blocks.is_empty() { + return; + } + + let (imported, count, results) = import_many_blocks( + &*self.data.block_import, + origin, + blocks, + self.data.verifier.clone(), + ); + + let link_ref = self.data.link.lock(); + let link = match link_ref.as_ref() { + Some(link) => link, + None => { + trace!(target: "sync", "Trying to import blocks before starting import queue"); + return; + }, + }; + + process_import_results(&**link, results); + + trace!(target: "sync", "Imported {} of {}", imported, count); + } + + fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification) { + import_single_justification( + &*self.data.link.lock(), + &self.data.justification_import, + who, + hash, + number, + justification, + ) + } + + fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { + let result = import_single_finality_proof( + &self.data.finality_proof_import, + &*self.data.verifier, + &who, + hash, + number, + finality_proof, + ); + if let Some(link) = self.data.link.lock().as_ref() { + link.finality_proof_imported(who, (hash, number), result); + } } } -/// Interface to a basic block import queue that is importing blocks sequentially in a separate thread, -/// with pluggable verification. +/// Interface to a basic block import queue that is importing blocks +/// sequentially in a separate thread, with pluggable verification. #[derive(Clone)] pub struct BasicQueue { - sender: Sender>, + sender: Option>>, } -impl ImportQueueClone for BasicQueue { - fn clone_box(&self) -> Box> { - Box::new(self.clone()) +impl Drop for BasicQueue { + fn drop(&mut self) { + if let Some(sender) = self.sender.take() { + let (shutdown_sender, shutdown_receiver) = channel::unbounded(); + if sender.send(BlockImportMsg::Shutdown(shutdown_sender)).is_ok() { + let _ = shutdown_receiver.recv(); + } + } } } /// "BasicQueue" is a wrapper around a channel sender to the "BlockImporter". -/// "BasicQueue" itself does not keep any state or do any importing work, and can therefore be send to other threads. +/// "BasicQueue" itself does not keep any state or do any importing work, and +/// can therefore be send to other threads. /// -/// "BasicQueue" implements "ImportQueue" by sending messages to the "BlockImporter", which runs in it's own thread. +/// "BasicQueue" implements "ImportQueue" by sending messages to the +/// "BlockImporter", which runs in it's own thread. /// -/// The "BlockImporter" is responsible for handling incoming requests from the "BasicQueue", -/// some of these requests are handled by the "BlockImporter" itself, such as "is_importing" or "status", -/// and justifications are also imported by the "BlockImporter". +/// The "BlockImporter" is responsible for handling incoming requests from the +/// "BasicQueue". Some of these requests are handled by the "BlockImporter" +/// itself, such as "is_importing", "status", and justifications. /// -/// The "import block" work will be offloaded to a single "BlockImportWorker", running in another thread. -/// Offloading the work is done via a channel, -/// ensuring blocks in this implementation are imported sequentially and in order(as received by the "BlockImporter") +/// The "import block" work will be offloaded to a single "BlockImportWorker", +/// running in another thread. Offloading the work is done via a channel, +/// ensuring blocks in this implementation are imported sequentially and in +/// order (as received by the "BlockImporter"). /// -/// As long as the "BasicQueue" is not dropped, the "BlockImporter" will keep running. -/// The "BlockImporter" owns a sender to the "BlockImportWorker", ensuring that the worker is kept alive until that sender is dropped. +/// As long as the "BasicQueue" is not dropped, the "BlockImporter" will keep +/// running. The "BlockImporter" owns a sender to the "BlockImportWorker", +/// ensuring that the worker is kept alive until that sender is dropped. impl BasicQueue { /// Instantiate a new basic queue, with given verifier. pub fn new>( verifier: Arc, block_import: SharedBlockImport, - justification_import: Option> + justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, ) -> Self { let (result_sender, result_port) = channel::unbounded(); - let worker_sender = BlockImportWorker::new(result_sender, verifier, block_import); - let importer_sender = BlockImporter::new(result_port, worker_sender, justification_import); + let worker_sender = BlockImportWorker::new( + result_sender, + verifier.clone(), + block_import, + finality_proof_import.clone(), + ); + let importer_sender = BlockImporter::new( + result_port, + worker_sender, + verifier, + justification_import, + finality_proof_import, + finality_proof_request_builder, + ); Self { - sender: importer_sender, + sender: Some(importer_sender), } } /// Send synchronization request to the block import channel. /// - /// The caller should wait for Link::synchronized() call to ensure that it has synchronized - /// with ImportQueue. + /// The caller should wait for Link::synchronized() call to ensure that it + /// has synchronized with ImportQueue. #[cfg(any(test, feature = "test-helpers"))] pub fn synchronize(&self) { - self - .sender - .send(BlockImportMsg::Synchronize) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + if let Some(ref sender) = self.sender { + let _ = sender.send(BlockImportMsg::Synchronize); + } } } impl ImportQueue for BasicQueue { - fn start(&self, link: Box>) -> Result<(), std::io::Error> { - let (sender, port) = channel::unbounded(); - let _ = self - .sender - .send(BlockImportMsg::Start(link, sender)) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); - port.recv().expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed") - } - - fn stop(&self) { - let _ = self - .sender - .send(BlockImportMsg::Stop) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + fn start(&self, link: Box>) -> Result<(), std::io::Error> { + let connect_err = || Err(std::io::Error::new( + std::io::ErrorKind::Other, + "Failed to connect import queue threads", + )); + if let Some(ref sender) = self.sender { + let (start_sender, start_port) = channel::unbounded(); + let _ = sender.send(BlockImportMsg::Start(link, start_sender)); + start_port.recv().unwrap_or_else(|_| connect_err()) + } else { + connect_err() + } } fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>) { if blocks.is_empty() { return; } - let _ = self - .sender - .send(BlockImportMsg::ImportBlocks(origin, blocks)) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + + if let Some(ref sender) = self.sender { + let _ = sender.send(BlockImportMsg::ImportBlocks(origin, blocks)); + } } fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification) { - let _ = self - .sender - .send(BlockImportMsg::ImportJustification(who.clone(), hash, number, justification)) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + if let Some(ref sender) = self.sender { + let _ = sender.send(BlockImportMsg::ImportJustification(who.clone(), hash, number, justification)); + } + } + + fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { + if let Some(ref sender) = self.sender { + let _ = sender.send(BlockImportMsg::ImportFinalityProof(who, hash, number, finality_proof)); + } } } pub enum BlockImportMsg { ImportBlocks(BlockOrigin, Vec>), ImportJustification(Origin, B::Hash, NumberFor, Justification), - Start(Box>, Sender>), - Stop, + ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), + Start(Box>, Sender>), + Shutdown(Sender<()>), #[cfg(any(test, feature = "test-helpers"))] Synchronize, } +#[cfg_attr(test, derive(Debug))] pub enum BlockImportWorkerMsg { ImportBlocks(BlockOrigin, Vec>), - Imported( + ImportedBlocks( Vec<( Result>, BlockImportError>, B::Hash, )>, ), + ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), + ImportedFinalityProof(Origin, (B::Hash, NumberFor), Result<(B::Hash, NumberFor), ()>), + Shutdown(Sender<()>), #[cfg(any(test, feature = "test-helpers"))] Synchronize, } @@ -227,17 +358,24 @@ enum ImportMsgType { struct BlockImporter { port: Receiver>, result_port: Receiver>, - worker_sender: Sender>, + worker_sender: Option>>, link: Option>>, + verifier: Arc>, justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, } impl BlockImporter { fn new( result_port: Receiver>, worker_sender: Sender>, + verifier: Arc>, justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, ) -> Sender> { + trace!(target: "block_import", "Creating new Block Importer!"); let (sender, port) = channel::bounded(4); let _ = thread::Builder::new() .name("ImportQueue".into()) @@ -245,9 +383,12 @@ impl BlockImporter { let mut importer = BlockImporter { port, result_port, - worker_sender, + worker_sender: Some(worker_sender), link: None, + verifier, justification_import, + finality_proof_import, + finality_proof_request_builder, }; while importer.run() { // Importing until all senders have been dropped... @@ -258,6 +399,7 @@ impl BlockImporter { } fn run(&mut self) -> bool { + trace!(target: "import_queue", "Running import queue"); let msg = select! { recv(self.port) -> msg => { match msg { @@ -285,21 +427,49 @@ impl BlockImporter { self.handle_import_blocks(origin, incoming_blocks) }, BlockImportMsg::ImportJustification(who, hash, number, justification) => { - self.handle_import_justification(who, hash, number, justification) + import_single_justification( + &self.link, + &self.justification_import, + who, + hash, + number, + justification, + ); + }, + BlockImportMsg::ImportFinalityProof(who, hash, number, finality_proof) => { + self.handle_import_finality_proof(who, hash, number, finality_proof) }, BlockImportMsg::Start(link, sender) => { + if let Some(finality_proof_request_builder) = self.finality_proof_request_builder.take() { + link.set_finality_proof_request_builder(finality_proof_request_builder); + } if let Some(justification_import) = self.justification_import.as_ref() { justification_import.on_start(&*link); } + if let Some(finality_proof_import) = self.finality_proof_import.as_ref() { + finality_proof_import.on_start(&*link); + } self.link = Some(link); let _ = sender.send(Ok(())); }, - BlockImportMsg::Stop => return false, + BlockImportMsg::Shutdown(result_sender) => { + // stop worker thread + if let Some(worker_sender) = self.worker_sender.take() { + let (sender, receiver) = channel::unbounded(); + if worker_sender.send(BlockImportWorkerMsg::Shutdown(sender)).is_ok() { + let _ = receiver.recv(); + } + } + // send shutdown notification + let _ = result_sender.send(()); + return false; + }, #[cfg(any(test, feature = "test-helpers"))] BlockImportMsg::Synchronize => { - self.worker_sender - .send(BlockImportWorkerMsg::Synchronize) - .expect("1. This is holding a sender to the worker, 2. the worker should not quit while a sender is still held; qed"); + trace!(target: "sync", "Received synchronization message"); + if let Some(ref worker_sender) = self.worker_sender { + let _ = worker_sender.send(BlockImportWorkerMsg::Synchronize); + } }, } true @@ -315,99 +485,46 @@ impl BlockImporter { }; let results = match msg { - BlockImportWorkerMsg::Imported(results) => (results), + BlockImportWorkerMsg::ImportedBlocks(results) => (results), + BlockImportWorkerMsg::ImportedFinalityProof(who, request_block, finalization_result) => { + link.finality_proof_imported(who, request_block, finalization_result); + return true; + }, #[cfg(any(test, feature = "test-helpers"))] BlockImportWorkerMsg::Synchronize => { + trace!(target: "sync", "Synchronizing link"); link.synchronized(); return true; }, - _ => unreachable!("Import Worker does not send ImportBlocks message; qed"), + BlockImportWorkerMsg::ImportBlocks(_, _) + | BlockImportWorkerMsg::ImportFinalityProof(_, _, _, _) + | BlockImportWorkerMsg::Shutdown(_) + => unreachable!("Import Worker does not send Import*/Shutdown messages; qed"), }; - let mut has_error = false; - let mut hashes = vec![]; - for (result, hash) in results { - hashes.push(hash); - - if has_error { - continue; - } - if result.is_err() { - has_error = true; - } - - match result { - Ok(BlockImportResult::ImportedKnown(number)) => link.block_imported(&hash, number), - Ok(BlockImportResult::ImportedUnknown(number, aux, who)) => { - link.block_imported(&hash, number); - - if aux.clear_justification_requests { - trace!(target: "sync", "Block imported clears all pending justification requests {}: {:?}", number, hash); - link.clear_justification_requests(); - } - - if aux.needs_justification { - trace!(target: "sync", "Block imported but requires justification {}: {:?}", number, hash); - link.request_justification(&hash, number); - } - - if aux.bad_justification { - if let Some(peer) = who { - link.useless_peer(peer, "Sent block with bad justification to import"); - } - } - }, - Err(BlockImportError::IncompleteHeader(who)) => { - if let Some(peer) = who { - link.note_useless_and_restart_sync(peer, "Sent block with incomplete header to import"); - } - }, - Err(BlockImportError::VerificationFailed(who, e)) => { - if let Some(peer) = who { - link.note_useless_and_restart_sync(peer, &format!("Verification failed: {}", e)); - } - }, - Err(BlockImportError::BadBlock(who)) => { - if let Some(peer) = who { - link.note_useless_and_restart_sync(peer, "Sent us a bad block"); - } - }, - Err(BlockImportError::UnknownParent) | Err(BlockImportError::Error) => { - link.restart(); - }, - }; - } - if let Some(link) = self.link.as_ref() { - link.blocks_processed(hashes, has_error); - } + process_import_results(&**link, results); true } - fn handle_import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification) { - let success = self.justification_import.as_ref().map(|justification_import| { - justification_import.import_justification(hash, number, justification) - .map_err(|e| { - debug!(target: "sync", "Justification import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}", e, hash, number, who); - e - }).is_ok() - }).unwrap_or(false); - - if let Some(link) = self.link.as_ref() { - link.justification_imported(who, &hash, number, success); + fn handle_import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { + if let Some(ref worker_sender) = self.worker_sender { + trace!(target: "sync", "Scheduling finality proof of {}/{} for import", number, hash); + let _ = worker_sender.send(BlockImportWorkerMsg::ImportFinalityProof(who, hash, number, finality_proof)); } } fn handle_import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) { - trace!(target: "sync", "Scheduling {} blocks for import", blocks.len()); - self.worker_sender - .send(BlockImportWorkerMsg::ImportBlocks(origin, blocks)) - .expect("1. This is holding a sender to the worker, 2. the worker should not quit while a sender is still held; qed"); + if let Some(ref worker_sender) = self.worker_sender { + trace!(target: "sync", "Scheduling {} blocks for import", blocks.len()); + let _ = worker_sender.send(BlockImportWorkerMsg::ImportBlocks(origin, blocks)); + } } } struct BlockImportWorker> { result_sender: Sender>, block_import: SharedBlockImport, + finality_proof_import: Option>, verifier: Arc, } @@ -416,6 +533,7 @@ impl> BlockImportWorker { result_sender: Sender>, verifier: Arc, block_import: SharedBlockImport, + finality_proof_import: Option>, ) -> Sender> { let (sender, port) = channel::bounded(4); let _ = thread::Builder::new() @@ -425,6 +543,7 @@ impl> BlockImportWorker { result_sender, verifier, block_import, + finality_proof_import, }; for msg in port.iter() { // Working until all senders have been dropped... @@ -432,11 +551,21 @@ impl> BlockImportWorker { BlockImportWorkerMsg::ImportBlocks(origin, blocks) => { worker.import_a_batch_of_blocks(origin, blocks); }, + BlockImportWorkerMsg::ImportFinalityProof(who, hash, number, proof) => { + worker.import_finality_proof(who, hash, number, proof); + }, + BlockImportWorkerMsg::Shutdown(result_sender) => { + let _ = result_sender.send(()); + break; + }, #[cfg(any(test, feature = "test-helpers"))] BlockImportWorkerMsg::Synchronize => { + trace!(target: "sync", "Sending sync message"); let _ = worker.result_sender.send(BlockImportWorkerMsg::Synchronize); }, - _ => unreachable!("Import Worker does not receive the Imported message; qed"), + BlockImportWorkerMsg::ImportedBlocks(_) + | BlockImportWorkerMsg::ImportedFinalityProof(_, _, _) + => unreachable!("Import Worker does not receive the Imported* messages; qed"), } } }) @@ -445,50 +574,33 @@ impl> BlockImportWorker { } fn import_a_batch_of_blocks(&self, origin: BlockOrigin, blocks: Vec>) { - let count = blocks.len(); - let mut imported = 0; + let (imported, count, results) = import_many_blocks( + &*self.block_import, + origin, + blocks, + self.verifier.clone(), + ); - let blocks_range = match ( - blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), - blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), - ) { - (Some(first), Some(last)) if first != last => format!(" ({}..{})", first, last), - (Some(first), Some(_)) => format!(" ({})", first), - _ => Default::default(), - }; - - trace!(target: "sync", "Starting import of {} blocks {}", count, blocks_range); - - let mut results = vec![]; + let _ = self + .result_sender + .send(BlockImportWorkerMsg::ImportedBlocks(results)); - let mut has_error = false; + trace!(target: "sync", "Imported {} of {}", imported, count); + } - // Blocks in the response/drain should be in ascending order. - for block in blocks { - let import_result = if has_error { - Err(BlockImportError::Error) - } else { - import_single_block( - &*self.block_import, - origin.clone(), - block.clone(), - self.verifier.clone(), - ) - }; - let was_ok = import_result.is_ok(); - results.push((import_result, block.hash)); - if was_ok { - imported += 1; - } else { - has_error = true; - } - } + fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { + let result = import_single_finality_proof( + &self.finality_proof_import, + &*self.verifier, + &who, + hash, + number, + finality_proof, + ); let _ = self .result_sender - .send(BlockImportWorkerMsg::Imported(results)); - - trace!(target: "sync", "Imported {} of {}", imported, count); + .send(BlockImportWorkerMsg::ImportedFinalityProof(who, (hash, number), result)); } } @@ -505,10 +617,23 @@ pub trait Link: Send { fn clear_justification_requests(&self) {} /// Request a justification for the given block. fn request_justification(&self, _hash: &B::Hash, _number: NumberFor) {} - /// Disconnect from peer. - fn useless_peer(&self, _who: Origin, _reason: &str) {} - /// Disconnect from peer and restart sync. - fn note_useless_and_restart_sync(&self, _who: Origin, _reason: &str) {} + /// Finality proof import result. + /// + /// Even though we have asked for finality proof of block A, provider could return proof of + /// some earlier block B, if the proof for A was too large. The sync module should continue + /// asking for proof of A in this case. + fn finality_proof_imported( + &self, + _who: Origin, + _request_block: (B::Hash, NumberFor), + _finalization_result: Result<(B::Hash, NumberFor), ()>, + ) {} + /// Request a finality proof for the given block. + fn request_finality_proof(&self, _hash: &B::Hash, _number: NumberFor) {} + /// Remember finality proof request builder on start. + fn set_finality_proof_request_builder(&self, _request_builder: SharedFinalityProofRequestBuilder) {} + /// Adjusts the reputation of the given peer. + fn report_peer(&self, _who: Origin, _reputation_change: i32) {} /// Restart sync. fn restart(&self) {} /// Synchronization request has been processed. @@ -540,9 +665,196 @@ pub enum BlockImportError { Error, } +/// Imports single notification and send notification to the link (if provided). +fn import_single_justification( + link: &Option>>, + justification_import: &Option>, + who: Origin, + hash: B::Hash, + number: NumberFor, + justification: Justification, +) { + let success = justification_import.as_ref().map(|justification_import| { + justification_import.import_justification(hash, number, justification) + .map_err(|e| { + debug!( + target: "sync", + "Justification import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}", + e, + hash, + number, + who, + ); + e + }).is_ok() + }).unwrap_or(false); + + if let Some(ref link) = link { + link.justification_imported(who, &hash, number, success); + } +} + +/// Imports single finality_proof. +fn import_single_finality_proof>( + finality_proof_import: &Option>, + verifier: &V, + who: &Origin, + hash: B::Hash, + number: NumberFor, + finality_proof: Vec, +) -> Result<(B::Hash, NumberFor), ()> { + let result = finality_proof_import.as_ref().map(|finality_proof_import| { + finality_proof_import.import_finality_proof(hash, number, finality_proof, verifier) + .map_err(|e| { + debug!( + "Finality proof import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}", + e, + hash, + number, + who, + ); + }) + }).unwrap_or(Err(())); + + trace!(target: "sync", "Imported finality proof for {}/{}", number, hash); + + result +} + +/// Process result of block(s) import. +fn process_import_results( + link: &dyn Link, + results: Vec<( + Result>, BlockImportError>, + B::Hash, + )>, +) +{ + let mut has_error = false; + let mut hashes = vec![]; + for (result, hash) in results { + hashes.push(hash); + + if has_error { + continue; + } + + if result.is_err() { + has_error = true; + } + + match result { + Ok(BlockImportResult::ImportedKnown(number)) => link.block_imported(&hash, number), + Ok(BlockImportResult::ImportedUnknown(number, aux, who)) => { + link.block_imported(&hash, number); + + if aux.clear_justification_requests { + trace!(target: "sync", "Block imported clears all pending justification requests {}: {:?}", number, hash); + link.clear_justification_requests(); + } + + if aux.needs_justification { + trace!(target: "sync", "Block imported but requires justification {}: {:?}", number, hash); + link.request_justification(&hash, number); + } + + if aux.bad_justification { + if let Some(peer) = who { + info!("Sent block with bad justification to import"); + link.report_peer(peer, BAD_JUSTIFICATION_REPUTATION_CHANGE); + } + } + + if aux.needs_finality_proof { + trace!(target: "sync", "Block imported but requires finality proof {}: {:?}", number, hash); + link.request_finality_proof(&hash, number); + } + }, + Err(BlockImportError::IncompleteHeader(who)) => { + if let Some(peer) = who { + info!("Peer sent block with incomplete header to import"); + link.report_peer(peer, INCOMPLETE_HEADER_REPUTATION_CHANGE); + link.restart(); + } + }, + Err(BlockImportError::VerificationFailed(who, e)) => { + if let Some(peer) = who { + info!("Verification failed from peer: {}", e); + link.report_peer(peer, VERIFICATION_FAIL_REPUTATION_CHANGE); + link.restart(); + } + }, + Err(BlockImportError::BadBlock(who)) => { + if let Some(peer) = who { + info!("Bad block"); + link.report_peer(peer, BAD_BLOCK_REPUTATION_CHANGE); + link.restart(); + } + }, + Err(BlockImportError::UnknownParent) | Err(BlockImportError::Error) => { + link.restart(); + }, + }; + } + link.blocks_processed(hashes, has_error); +} + +/// Import several blocks at once, returning import result for each block. +fn import_many_blocks>( + import_handle: &dyn BlockImport, + blocks_origin: BlockOrigin, + blocks: Vec>, + verifier: Arc, +) -> (usize, usize, Vec<( + Result>, BlockImportError>, + B::Hash, +)>) { + let count = blocks.len(); + let mut imported = 0; + + let blocks_range = match ( + blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), + blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), + ) { + (Some(first), Some(last)) if first != last => format!(" ({}..{})", first, last), + (Some(first), Some(_)) => format!(" ({})", first), + _ => Default::default(), + }; + + trace!(target: "sync", "Starting import of {} blocks {}", count, blocks_range); + + let mut results = vec![]; + + let mut has_error = false; + + // Blocks in the response/drain should be in ascending order. + for block in blocks { + let block_hash = block.hash; + let import_result = if has_error { + Err(BlockImportError::Error) + } else { + import_single_block( + import_handle, + blocks_origin.clone(), + block, + verifier.clone(), + ) + }; + let was_ok = import_result.is_ok(); + results.push((import_result, block_hash)); + if was_ok { + imported += 1; + } else { + has_error = true; + } + } + + (imported, count, results) +} + /// Single block import function. pub fn import_single_block>( - import_handle: &BlockImport, + import_handle: &dyn BlockImport, block_origin: BlockOrigin, block: IncomingBlock, verifier: Arc, @@ -561,6 +873,8 @@ pub fn import_single_block>( }, }; + trace!(target: "sync", "Header {} has {:?} logs", block.hash, header.digest().logs().len()); + let number = header.number().clone(); let hash = header.hash(); let parent = header.parent_hash().clone(); @@ -589,7 +903,7 @@ pub fn import_single_block>( match import_error(import_handle.check_block(hash, parent))? { BlockImportResult::ImportedUnknown { .. } => (), - r @ _ => return Ok(r), // Any other successfull result means that the block is already imported. + r => return Ok(r), // Any other successful result means that the block is already imported. } let (import_block, new_authorities) = verifier.verify(block_origin, header, justification, block.body) @@ -613,12 +927,14 @@ pub fn import_single_block>( #[cfg(test)] mod tests { use super::*; + use crate::block_import::ForkChoiceStrategy; use libp2p::PeerId; use test_client::runtime::{Block, Hash}; #[derive(Debug, PartialEq)] enum LinkMsg { BlockImported, + FinalityProofImported, Disconnected, Restarted, } @@ -640,24 +956,49 @@ mod tests { fn block_imported(&self, _hash: &Hash, _number: NumberFor) { let _ = self.sender.send(LinkMsg::BlockImported); } - fn useless_peer(&self, _: Origin, _: &str) { - let _ = self.sender.send(LinkMsg::Disconnected); + fn finality_proof_imported( + &self, + _: Origin, + _: (Hash, NumberFor), + _: Result<(Hash, NumberFor), ()>, + ) { + let _ = self.sender.send(LinkMsg::FinalityProofImported); } - fn note_useless_and_restart_sync(&self, id: Origin, r: &str) { - self.useless_peer(id, r); - self.restart(); + fn report_peer(&self, _: Origin, _: i32) { + let _ = self.sender.send(LinkMsg::Disconnected); } fn restart(&self) { let _ = self.sender.send(LinkMsg::Restarted); } } + impl Verifier for () { + fn verify( + &self, + origin: BlockOrigin, + header: B::Header, + justification: Option, + body: Option>, + ) -> Result<(ImportBlock, Option>>), String> { + Ok((ImportBlock { + origin, + header, + body, + finalized: false, + justification, + post_digests: vec![], + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }, None)) + } + } + #[test] fn process_import_result_works() { let (result_sender, result_port) = channel::unbounded(); let (worker_sender, _) = channel::unbounded(); let (link_sender, link_port) = channel::unbounded(); - let importer_sender = BlockImporter::::new(result_port, worker_sender, None); + let importer_sender = BlockImporter::::new(result_port, worker_sender, Arc::new(()), None, None, None); let link = TestLink::new(link_sender); let (ack_sender, start_ack_port) = channel::bounded(4); let _ = importer_sender.send(BlockImportMsg::Start(Box::new(link.clone()), ack_sender)); @@ -667,52 +1008,108 @@ mod tests { // Send a known let results = vec![(Ok(BlockImportResult::ImportedKnown(Default::default())), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); // Send a second known let results = vec![(Ok(BlockImportResult::ImportedKnown(Default::default())), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); // Send an unknown let results = vec![(Ok(BlockImportResult::ImportedUnknown(Default::default(), Default::default(), None)), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); // Send an unknown with peer and bad justification let peer_id = PeerId::random(); let results = vec![(Ok(BlockImportResult::ImportedUnknown(Default::default(), - ImportedAux { needs_justification: true, clear_justification_requests: false, bad_justification: true }, + ImportedAux { + needs_justification: true, + clear_justification_requests: false, + bad_justification: true, + needs_finality_proof: false, + }, Some(peer_id.clone()))), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); assert_eq!(link_port.recv(), Ok(LinkMsg::Disconnected)); // Send an incomplete header let results = vec![(Err(BlockImportError::IncompleteHeader(Some(peer_id.clone()))), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::Disconnected)); assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); // Send an unknown parent let results = vec![(Err(BlockImportError::UnknownParent), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); // Send a verification failed let results = vec![(Err(BlockImportError::VerificationFailed(Some(peer_id.clone()), String::new())), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::Disconnected)); assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); // Send an error let results = vec![(Err(BlockImportError::Error), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); // Drop the importer sender first, ensuring graceful shutdown. drop(importer_sender); } + + #[test] + fn process_finality_proof_import_result_works() { + let (result_sender, result_port) = channel::unbounded(); + let (worker_sender, worker_receiver) = channel::unbounded(); + let (link_sender, link_port) = channel::unbounded(); + let importer_sender = BlockImporter::::new(result_port, worker_sender, Arc::new(()), None, None, None); + let link = TestLink::new(link_sender); + let (ack_sender, start_ack_port) = channel::bounded(4); + let _ = importer_sender.send(BlockImportMsg::Start(Box::new(link.clone()), ack_sender)); + let who = Origin::random(); + + // Ensure the importer handles Start before any result messages. + start_ack_port.recv().unwrap().unwrap(); + + // Send finality proof import request to BlockImporter + importer_sender.send(BlockImportMsg::ImportFinalityProof( + who.clone(), + Default::default(), + 1, + vec![42], + )).unwrap(); + + // Wait until this request is redirected to the BlockImportWorker + match worker_receiver.recv().unwrap() { + BlockImportWorkerMsg::ImportFinalityProof( + cwho, + chash, + 1, + cproof, + ) => { + assert_eq!(cwho, who); + assert_eq!(chash, Default::default()); + assert_eq!(cproof, vec![42]); + }, + _ => unreachable!("Unexpected work request received"), + } + + // Send ack of proof import from BlockImportWorker to BlockImporter + result_sender.send(BlockImportWorkerMsg::ImportedFinalityProof( + who.clone(), + (Default::default(), 0), + Ok((Default::default(), 0)), + )).unwrap(); + + // Wait for finality proof import result + assert_eq!(link_port.recv(), Ok(LinkMsg::FinalityProofImported)); + + // Drop the importer sender first, ensuring graceful shutdown. + drop(importer_sender); + } } diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index 134a34454edf1f57a348afa949b16a67ede7d5ba..140aa579017d9e9e651b4477315db1c576d1e847 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -33,23 +33,26 @@ use std::sync::Arc; use std::time::Duration; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{AuthorityIdFor, Block}; +use runtime_primitives::traits::{AuthorityIdFor, Block, DigestFor}; use futures::prelude::*; pub use inherents::InherentData; pub mod offline_tracker; pub mod error; -mod block_import; +pub mod block_import; +mod select_chain; pub mod import_queue; pub mod evaluation; // block size limit. const MAX_BLOCK_SIZE: usize = 4 * 1024 * 1024 + 512; -pub use self::error::{Error, ErrorKind}; +pub use self::error::Error; pub use block_import::{ - BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult, JustificationImport, + BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult, + JustificationImport, FinalityProofImport, FinalityProofRequestBuilder, }; +pub use select_chain::SelectChain; /// Trait for getting the authorities at a given block. pub trait Authorities { @@ -84,7 +87,12 @@ pub trait Proposer { /// Future that resolves to a committed proposal. type Create: IntoFuture; /// Create a proposal. - fn propose(&self, inherent_data: InherentData, max_duration: Duration) -> Self::Create; + fn propose( + &self, + inherent_data: InherentData, + inherent_digests: DigestFor, + max_duration: Duration, + ) -> Self::Create; } /// An oracle for when major synchronization work is being undertaken. @@ -118,6 +126,20 @@ impl SyncOracle for Arc { } } +/// Extra verification for blocks. +pub trait ExtraVerification: Send + Sync { + /// Future that resolves when the block is verified, or fails with error if + /// not. + type Verified: IntoFuture; + + /// Do additional verification for this block. + fn verify( + &self, + header: &B::Header, + body: Option<&[B::Extrinsic]>, + ) -> Self::Verified; +} + /// A list of all well known keys in the cache. pub mod well_known_cache_keys { /// The type representing cache keys. diff --git a/core/consensus/common/src/select_chain.rs b/core/consensus/common/src/select_chain.rs new file mode 100644 index 0000000000000000000000000000000000000000..9ab21cba13ba9a08d5515cbf87b4f4151cecff98 --- /dev/null +++ b/core/consensus/common/src/select_chain.rs @@ -0,0 +1,54 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate Consensus Common. + +// Substrate Demo 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 Consensus Common 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 Consensus Common. If not, see . + +use crate::error::Error; +use runtime_primitives::traits::{Block as BlockT, NumberFor}; + + +/// The SelectChain trait defines the strategy upon which the head is chosen +/// if multiple forks are present for an opaque definition of "best" in the +/// specific chain build. +/// +/// The Strategy can be customised for the two use cases of authoring new blocks +/// upon the best chain or which fork to finalise. Unless implemented differently +/// by default finalisation methods fall back to use authoring, so as a minimum +/// `_authoring`-functions must be implemented. +/// +/// Any particular user must make explicit, however, whether they intend to finalise +/// or author through the using the right function call, as these might differ in +/// some implementations. +/// +/// Non-deterministicly finalising chains may only use the `_authoring` functions. +pub trait SelectChain: Sync + Send + Clone { + + /// Get all leaves of the chain: block hashes that have no children currently. + /// Leaves that can never be finalized will not be returned. + fn leaves(&self) -> Result::Hash>, Error>; + + /// Among those `leaves` deterministically pick one chain as the generally + /// best chain to author new blocks upon and probably finalize. + fn best_chain(&self) -> Result<::Header, Error>; + + /// Get the best ancestor of `target_hash` that we should attempt + /// to finalize next. + fn finality_target( + &self, + target_hash: ::Hash, + _maybe_max_number: Option> + ) -> Result::Hash>, Error> { + Ok(Some(target_hash)) + } +} diff --git a/core/consensus/rhd/Cargo.toml b/core/consensus/rhd/Cargo.toml index 354a608d22a979e363ab58601f67bd1371d69e0d..ee1efb8d06a5bcf4737c2891d5c496b3bff8308d 100644 --- a/core/consensus/rhd/Cargo.toml +++ b/core/consensus/rhd/Cargo.toml @@ -1,11 +1,12 @@ [package] name = "substrate-consensus-rhd" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Rhododendron Round-Based consensus-algorithm for substrate" edition = "2018" [dependencies] +derive_more = "0.14.0" futures = "0.1.17" codec = { package = "parity-codec", version = "3.2", features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../primitives" } @@ -19,8 +20,7 @@ runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } tokio = "0.1.7" -parking_lot = "0.7.1" -error-chain = "0.12" +parking_lot = "0.8.0" log = "0.4" rhododendron = { version = "0.5.0", features = ["codec"] } exit-future = "0.1" diff --git a/core/consensus/rhd/src/error.rs b/core/consensus/rhd/src/error.rs index 38081109754555b73c02c48f2c51bb1404425cf7..601cf1c963a586d883de92527818c2721fb644f5 100644 --- a/core/consensus/rhd/src/error.rs +++ b/core/consensus/rhd/src/error.rs @@ -15,45 +15,36 @@ // along with Substrate. If not, see . //! Error types in the rhododendron Consensus service. -use consensus::error::{Error as CommonError, ErrorKind as CommonErrorKind}; +use consensus::error::{Error as CommonError}; use primitives::AuthorityId; use client; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; -error_chain! { - links { - Client(client::error::Error, client::error::ErrorKind); - Common(CommonError, CommonErrorKind); - } - errors { - NotValidator(id: AuthorityId) { - description("Local account ID not a validator at this block."), - display("Local account ID ({:?}) not a validator at this block.", id), - } - PrematureDestruction { - description("Proposer destroyed before finishing proposing or evaluating"), - display("Proposer destroyed before finishing proposing or evaluating"), - } - Timer(e: ::tokio::timer::Error) { - description("Failed to register or resolve async timer."), - display("Timer failed: {}", e), - } - Executor(e: ::futures::future::ExecuteErrorKind) { - description("Unable to dispatch agreement future"), - display("Unable to dispatch agreement future: {:?}", e), - } - } +/// A result alias. +pub type Result = std::result::Result; + +/// A RHD error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Consensus error. + Common(CommonError), + /// Local account ID not a validator at this block. + #[display(fmt="Local account ID ({:?}) not a validator at this block.", _0)] + NotValidator(AuthorityId), + /// Proposer destroyed before finishing proposing or evaluating + #[display(fmt="Proposer destroyed before finishing proposing or evaluating")] + PrematureDestruction, + /// Failed to register or resolve async timer. + #[display(fmt="Timer failed: {}", _0)] + Timer(tokio::timer::Error), + /// Unable to dispatch agreement future + #[display(fmt="Unable to dispatch agreement future: {:?}", _0)] + Executor(futures::future::ExecuteErrorKind), } impl From<::rhododendron::InputStreamConcluded> for Error { fn from(_: ::rhododendron::InputStreamConcluded) -> Self { - CommonErrorKind::IoTerminated.into() - } -} - -impl From for Error { - fn from(e: CommonErrorKind) -> Self { - CommonError::from(e).into() + CommonError::IoTerminated.into() } } diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index cbdf95d987578ff5a574d6cdbaefe4bcbd7c199b..ca4b9120eb58bb6709f86ed3b92615d899ea98f0 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -45,7 +45,10 @@ use client::{Client as SubstrateClient, CallExecutor}; use client::runtime_api::{Core, BlockBuilder as BlockBuilderAPI, OldTxQueue, BlockBuilderError}; use runtime_primitives::generic::{BlockId, Era, ImportResult, ImportBlock, BlockOrigin}; use runtime_primitives::traits::{Block, Header}; -use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT, As, BlockNumberToHash}; +use runtime_primitives::traits::{ + Block as BlockT, Hash as HashT, Header as HeaderT, + BlockNumberToHash, SaturatedConversion +}; use runtime_primitives::Justification; use primitives::{AuthorityId, ed25519, Blake2Hasher, ed25519::LocalizedSignature}; use srml_system::Trait as SystemT; @@ -613,7 +616,7 @@ impl BftService .map_or(true, |x| self.can_build_on_inner(header, x)) } - /// Get a reference to the underyling client. + /// Get a reference to the underlying client. pub fn client(&self) -> &I { &*self.client } fn can_build_on_inner(&self, header: &B::Header, live: &(B::Header, AgreementHandle)) -> bool { @@ -1246,7 +1249,7 @@ impl LocalProposer<::Block> for Proposer where for (target, misbehavior) in misbehavior { let report = MisbehaviorReport { parent_hash: self.parent_hash.into(), - parent_number: self.parent_number.as_(), + parent_number: self.parent_number.saturated_into::(), target, misbehavior: match misbehavior { GenericMisbehavior::ProposeOutOfTurn(_, _, _) => continue, diff --git a/core/consensus/rhd/src/service.rs b/core/consensus/rhd/src/service.rs index e2858f767a8c08d3977803a68ce6bab46188cb60..f59393c530356dad7564e3247f8ed065c45d367c 100644 --- a/core/consensus/rhd/src/service.rs +++ b/core/consensus/rhd/src/service.rs @@ -22,7 +22,7 @@ use std::thread; use std::time::{Duration, Instant}; use std::sync::Arc; -use client::{BlockchainEvents, ChainHead, BlockBody}; +use client::{BlockchainEvents, BlockBody}; use futures::prelude::*; use transaction_pool::txpool::{Pool as TransactionPool, ChainApi as PoolChainApi}; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, BlockNumberToHash}; @@ -33,7 +33,7 @@ use tokio::runtime::current_thread::Runtime as LocalRuntime; use tokio::timer::Interval; use parking_lot::RwLock; -use consensus::offline_tracker::OfflineTracker; +use consensus::{self, offline_tracker::OfflineTracker}; use super::{Network, ProposerFactory, AuthoringApi}; use {consensus, primitives, ed25519, error, BftService, LocalProposer}; @@ -87,9 +87,9 @@ impl Service { A: AuthoringApi + BlockNumberToHash + 'static, P: PoolChainApi::Block> + 'static, C: BlockchainEvents<::Block> - + ChainHead<::Block> - + BlockBody<::Block>, - C: consensus::BlockImport<::Block> + + BlockBody<::Block> + + consensus::SelectChain<::Block> + + consensus::BlockImport<::Block> + consensus::Authorities<::Block> + Send + Sync + 'static, primitives::H256: From<<::Block as BlockT>::Hash>, <::Block as BlockT>::Hash: PartialEq + PartialEq, diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index 88e3879f7a636ef3b2ff577bbfaf1b6dc4f6f724..7a3b487dc6a80d8f4908da82a3dac49f13a65ccb 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-consensus-slots" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Generic slots-based utilities for consensus" edition = "2018" @@ -14,6 +14,8 @@ consensus_common = { package = "substrate-consensus-common", path = "../common" inherents = { package = "substrate-inherents", path = "../../inherents" } futures = "0.1.17" tokio = "0.1.7" -parking_lot = "0.7.1" -error-chain = "0.12" +parking_lot = "0.8.0" log = "0.4" + +[dev-dependencies] +test_client = { package = "substrate-test-client", path = "../../test-client" } diff --git a/core/consensus/slots/src/aux_schema.rs b/core/consensus/slots/src/aux_schema.rs new file mode 100644 index 0000000000000000000000000000000000000000..ed96bf2e22c75877ce21d8a5809714cfd16b5fed --- /dev/null +++ b/core/consensus/slots/src/aux_schema.rs @@ -0,0 +1,265 @@ +// Copyright 2019 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 . + +//! Schema for slots in the aux-db. + +use codec::{Encode, Decode}; +use client::backend::AuxStore; +use client::error::{Result as ClientResult, Error as ClientError}; +use runtime_primitives::traits::Header; + +const SLOT_HEADER_MAP_KEY: &[u8] = b"slot_header_map"; +const SLOT_HEADER_START: &[u8] = b"slot_header_start"; + +/// We keep at least this number of slots in database. +pub const MAX_SLOT_CAPACITY: u64 = 1000; +/// We prune slots when they reach this number. +pub const PRUNING_BOUND: u64 = 2 * MAX_SLOT_CAPACITY; + +fn load_decode(backend: &C, key: &[u8]) -> ClientResult> + where + C: AuxStore, + T: Decode, +{ + match backend.get_aux(key)? { + None => Ok(None), + Some(t) => T::decode(&mut &t[..]) + .ok_or_else( + || ClientError::Backend(format!("Slots DB is corrupted.")).into(), + ) + .map(Some) + } +} + +/// Represents an equivocation proof. +#[derive(Debug, Clone)] +pub struct EquivocationProof { + slot: u64, + fst_header: H, + snd_header: H, +} + +impl EquivocationProof { + /// Get the slot number where the equivocation happened. + pub fn slot(&self) -> u64 { + self.slot + } + + /// Get the first header involved in the equivocation. + pub fn fst_header(&self) -> &H { + &self.fst_header + } + + /// Get the second header involved in the equivocation. + pub fn snd_header(&self) -> &H { + &self.snd_header + } +} + +/// Checks if the header is an equivocation and returns the proof in that case. +/// +/// Note: it detects equivocations only when slot_now - slot <= MAX_SLOT_CAPACITY. +pub fn check_equivocation( + backend: &C, + slot_now: u64, + slot: u64, + header: &H, + signer: &P, +) -> ClientResult>> + where + H: Header, + C: AuxStore, + P: Clone + Encode + Decode + PartialEq, +{ + // We don't check equivocations for old headers out of our capacity. + if slot_now - slot > MAX_SLOT_CAPACITY { + return Ok(None) + } + + // Key for this slot. + let mut curr_slot_key = SLOT_HEADER_MAP_KEY.to_vec(); + slot.using_encoded(|s| curr_slot_key.extend(s)); + + // Get headers of this slot. + let mut headers_with_sig = load_decode::<_, Vec<(H, P)>>(backend, &curr_slot_key[..])? + .unwrap_or_else(Vec::new); + + // Get first slot saved. + let slot_header_start = SLOT_HEADER_START.to_vec(); + let first_saved_slot = load_decode::<_, u64>(backend, &slot_header_start[..])? + .unwrap_or(slot); + + for (prev_header, prev_signer) in headers_with_sig.iter() { + // A proof of equivocation consists of two headers: + // 1) signed by the same voter, + if prev_signer == signer { + // 2) with different hash + if header.hash() != prev_header.hash() { + return Ok(Some(EquivocationProof { + slot, // 3) and mentioning the same slot. + fst_header: prev_header.clone(), + snd_header: header.clone(), + })); + } else { + // We don't need to continue in case of duplicated header, + // since it's already saved and a possible equivocation + // would have been detected before. + return Ok(None) + } + } + } + + let mut keys_to_delete = vec![]; + let mut new_first_saved_slot = first_saved_slot; + + if slot_now - first_saved_slot >= PRUNING_BOUND { + let prefix = SLOT_HEADER_MAP_KEY.to_vec(); + new_first_saved_slot = slot_now.saturating_sub(MAX_SLOT_CAPACITY); + + for s in first_saved_slot..new_first_saved_slot { + let mut p = prefix.clone(); + s.using_encoded(|s| p.extend(s)); + keys_to_delete.push(p); + } + } + + headers_with_sig.push((header.clone(), signer.clone())); + + backend.insert_aux( + &[ + (&curr_slot_key[..], headers_with_sig.encode().as_slice()), + (&slot_header_start[..], new_first_saved_slot.encode().as_slice()), + ], + &keys_to_delete.iter().map(|k| &k[..]).collect::>()[..], + )?; + + Ok(None) +} + +#[cfg(test)] +mod test { + use primitives::{sr25519, Pair}; + use primitives::hash::H256; + use runtime_primitives::testing::{Header as HeaderTest, Digest as DigestTest}; + use test_client; + + use super::{MAX_SLOT_CAPACITY, PRUNING_BOUND, check_equivocation}; + + fn create_header(number: u64) -> HeaderTest { + // so that different headers for the same number get different hashes + let parent_hash = H256::random(); + + let header = HeaderTest { + parent_hash, + number, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: DigestTest { logs: vec![], }, + }; + + header + } + + #[test] + fn check_equivocation_works() { + let client = test_client::new(); + let pair = sr25519::Pair::generate(); + let public = pair.public(); + + let header1 = create_header(1); // @ slot 2 + let header2 = create_header(2); // @ slot 2 + let header3 = create_header(2); // @ slot 4 + let header4 = create_header(3); // @ slot MAX_SLOT_CAPACITY + 4 + let header5 = create_header(4); // @ slot MAX_SLOT_CAPACITY + 4 + let header6 = create_header(3); // @ slot 4 + + // It's ok to sign same headers. + assert!( + check_equivocation( + &client, + 2, + 2, + &header1, + &public, + ).unwrap().is_none(), + ); + + assert!( + check_equivocation( + &client, + 3, + 2, + &header1, + &public, + ).unwrap().is_none(), + ); + + // But not two different headers at the same slot. + assert!( + check_equivocation( + &client, + 4, + 2, + &header2, + &public, + ).unwrap().is_some(), + ); + + // Different slot is ok. + assert!( + check_equivocation( + &client, + 5, + 4, + &header3, + &public, + ).unwrap().is_none(), + ); + + // Here we trigger pruning and save header 4. + assert!( + check_equivocation( + &client, + PRUNING_BOUND + 2, + MAX_SLOT_CAPACITY + 4, + &header4, + &public, + ).unwrap().is_none(), + ); + + // This fails because header 5 is an equivocation of header 4. + assert!( + check_equivocation( + &client, + PRUNING_BOUND + 3, + MAX_SLOT_CAPACITY + 4, + &header5, + &public, + ).unwrap().is_some(), + ); + + // This is ok because we pruned the corresponding header. Shows that we are pruning. + assert!( + check_equivocation( + &client, + PRUNING_BOUND + 4, + 4, + &header6, + &public, + ).unwrap().is_none(), + ); + } +} diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index 258e528f159c52cdd46246683b9eedd0977ea6bf..aee398a9ce597c7e1ff0f1a4e978a5ce3d4b7130 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -23,68 +23,66 @@ #![forbid(warnings, unsafe_code, missing_docs)] mod slots; +mod aux_schema; -pub use slots::{Slots, SlotInfo}; +pub use slots::{slot_now, SlotInfo, Slots}; +pub use aux_schema::{check_equivocation, MAX_SLOT_CAPACITY, PRUNING_BOUND}; -use std::sync::{mpsc, Arc}; -use std::thread; -use std::fmt::Debug; +use codec::{Decode, Encode}; +use consensus_common::{SyncOracle, SelectChain}; use futures::prelude::*; -use futures::{Future, IntoFuture, future::{self, Either}}; -use log::{warn, debug, info}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ProvideRuntimeApi, Block, ApiRef}; -use consensus_common::SyncOracle; +use futures::{ + future::{self, Either}, + Future, IntoFuture, +}; use inherents::{InherentData, InherentDataProviders}; -use client::ChainHead; -use codec::{Encode, Decode}; +use log::{debug, error, info, warn}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::{ApiRef, Block, ProvideRuntimeApi}; +use std::fmt::Debug; +use std::ops::Deref; +use std::sync::mpsc; +use std::thread; /// A worker that should be invoked at every new slot. pub trait SlotWorker { - /// The type fo the future that will be returned when a new slot is + /// The type of the future that will be returned when a new slot is /// triggered. - type OnSlot: IntoFuture; + type OnSlot: IntoFuture; /// Called when the proposer starts. - fn on_start( - &self, - slot_duration: u64 - ) -> Result<(), consensus_common::Error>; + #[deprecated(note = "Not called. Please perform any initialization before calling start_slot_worker.")] + fn on_start(&self, _slot_duration: u64) -> Result<(), consensus_common::Error> { Ok(()) } /// Called when a new slot is triggered. - fn on_slot( - &self, - chain_head: B::Header, - slot_info: SlotInfo, - ) -> Self::OnSlot; + fn on_slot(&self, chain_head: B::Header, slot_info: SlotInfo) -> Self::OnSlot; } /// Slot compatible inherent data. pub trait SlotCompatible { /// Extract timestamp and slot from inherent data. - fn extract_timestamp_and_slot(inherent: &InherentData) -> Result<(u64, u64), consensus_common::Error>; -} - -/// Convert an inherent error to common error. -pub fn inherent_to_common_error(err: inherents::RuntimeString) -> consensus_common::Error { - consensus_common::ErrorKind::InherentData(err.into()).into() + fn extract_timestamp_and_slot( + inherent: &InherentData, + ) -> Result<(u64, u64), consensus_common::Error>; } /// Start a new slot worker in a separate thread. +#[deprecated(since = "1.1", note = "Please spawn a thread manually")] pub fn start_slot_worker_thread( slot_duration: SlotDuration, - client: Arc, - worker: Arc, + select_chain: C, + worker: W, sync_oracle: SO, on_exit: OnExit, inherent_data_providers: InherentDataProviders, -) -> Result<(), consensus_common::Error> where +) -> Result<(), consensus_common::Error> +where B: Block + 'static, - C: ChainHead + Send + Sync + 'static, + C: SelectChain + Clone + 'static, W: SlotWorker + Send + Sync + 'static, SO: SyncOracle + Send + Clone + 'static, SC: SlotCompatible + 'static, - OnExit: Future + Send + 'static, + OnExit: Future + Send + 'static, T: SlotData + Send + Clone + 'static, { use tokio::runtime::current_thread::Runtime; @@ -95,101 +93,84 @@ pub fn start_slot_worker_thread( let mut runtime = match Runtime::new() { Ok(r) => r, Err(e) => { - warn!("Unable to start authorship: {:?}", e); + warn!(target: "slots", "Unable to start authorship: {:?}", e); return; } }; - let slot_worker_future = match start_slot_worker::<_, _, _, _, _, SC, _>( + let slot_worker_future = start_slot_worker::<_, _, _, T, _, SC>( slot_duration.clone(), - client, + select_chain, worker, sync_oracle, - on_exit, inherent_data_providers, - ) { - Ok(slot_worker_future) => { - result_sender - .send(Ok(())) - .expect("Receive is not dropped before receiving a result; qed"); - slot_worker_future - }, - Err(e) => { - result_sender - .send(Err(e)) - .expect("Receive is not dropped before receiving a result; qed"); - return; - } - }; + ); + + result_sender + .send(Ok(())) + .expect("Receive is not dropped before receiving a result; qed"); - let _ = runtime.block_on(slot_worker_future); + let _ = runtime.block_on(slot_worker_future.select(on_exit).map(|_| ())); }); - result_recv.recv().expect("Slots start thread result sender dropped") + result_recv + .recv() + .expect("Slots start thread result sender dropped") } /// Start a new slot worker. -pub fn start_slot_worker( +/// +/// Every time a new slot is triggered, `worker.on_slot` is called and the future it returns is +/// polled until completion, unless we are major syncing. +pub fn start_slot_worker( slot_duration: SlotDuration, - client: Arc, - worker: Arc, + client: C, + worker: W, sync_oracle: SO, - on_exit: OnExit, inherent_data_providers: InherentDataProviders, -) -> Result, consensus_common::Error> where +) -> impl Future +where B: Block, - C: ChainHead, + C: SelectChain + Clone, W: SlotWorker, SO: SyncOracle + Send + Clone, SC: SlotCompatible, - OnExit: Future, T: SlotData + Clone, { - worker.on_start(slot_duration.slot_duration())?; - - let make_authorship = move || { - let client = client.clone(); - let worker = worker.clone(); - let sync_oracle = sync_oracle.clone(); - let SlotDuration(slot_duration) = slot_duration.clone(); - let inherent_data_providers = inherent_data_providers.clone(); - - // rather than use a timer interval, we schedule our waits ourselves - Slots::::new(slot_duration.slot_duration(), inherent_data_providers) - .map_err(|e| debug!(target: "slots", "Faulty timer: {:?}", e)) - .for_each(move |slot_info| { - let client = client.clone(); - let worker = worker.clone(); - let sync_oracle = sync_oracle.clone(); - - // only propose when we are not syncing. - if sync_oracle.is_major_syncing() { - debug!(target: "slots", "Skipping proposal slot due to sync."); + let SlotDuration(slot_duration) = slot_duration; + + // rather than use a timer interval, we schedule our waits ourselves + let mut authorship = Slots::::new(slot_duration.slot_duration(), inherent_data_providers) + .map_err(|e| debug!(target: "slots", "Faulty timer: {:?}", e)) + .for_each(move |slot_info| { + // only propose when we are not syncing. + if sync_oracle.is_major_syncing() { + debug!(target: "slots", "Skipping proposal slot due to sync."); + return Either::B(future::ok(())); + } + + let slot_num = slot_info.number; + let chain_head = match client.best_chain() { + Ok(x) => x, + Err(e) => { + warn!(target: "slots", "Unable to author block in slot {}. \ + no best block header: {:?}", slot_num, e); return Either::B(future::ok(())); } - - let slot_num = slot_info.number; - let chain_head = match client.best_block_header() { - Ok(x) => x, - Err(e) => { - warn!(target: "slots", "Unable to author block in slot {}. \ - no best block header: {:?}", slot_num, e); - return Either::B(future::ok(())) - } - }; - - Either::A( - worker.on_slot(chain_head, slot_info).into_future() - .map_err(|e| debug!(target: "slots", "Encountered consensus error: {:?}", e)) - ) - }) - }; - - let work = future::loop_fn((), move |()| { - let authorship_task = ::std::panic::AssertUnwindSafe(make_authorship()); - authorship_task.catch_unwind().then(|res| { - match res { - Ok(Ok(())) => (), + }; + + Either::A(worker.on_slot(chain_head, slot_info).into_future().map_err( + |e| warn!(target: "slots", "Encountered consensus error: {:?}", e), + )) + }); + + future::poll_fn(move || + loop { + let mut authorship = std::panic::AssertUnwindSafe(&mut authorship); + match std::panic::catch_unwind(move || authorship.poll()) { + Ok(Ok(Async::Ready(()))) => + warn!(target: "slots", "Slots stream has terminated unexpectedly."), + Ok(Ok(Async::NotReady)) => break Ok(Async::NotReady), Ok(Err(())) => warn!(target: "slots", "Authorship task terminated unexpectedly. Restarting"), Err(e) => { if let Some(s) = e.downcast_ref::<&'static str>() { @@ -199,12 +180,8 @@ pub fn start_slot_worker( warn!(target: "slots", "Restarting authorship task"); } } - - Ok(future::Loop::Continue(())) - }) - }); - - Ok(work.select(on_exit).then(|_| Ok(()))) + } + ) } /// A header which has been checked @@ -229,7 +206,9 @@ pub trait SlotData { } impl SlotData for u64 { - fn slot_duration(&self) -> u64 { *self } + fn slot_duration(&self) -> u64 { + *self + } const SLOT_KEY: &'static [u8] = b"aura_slot_duration"; } @@ -237,7 +216,25 @@ impl SlotData for u64 { /// A slot duration. Create with `get_or_compute`. // The internal member should stay private here. #[derive(Clone, Copy, Debug, Encode, Decode, Hash, PartialOrd, Ord, PartialEq, Eq)] -pub struct SlotDuration(T); +pub struct SlotDuration(T); + +impl Deref for SlotDuration { + type Target = T; + fn deref(&self) -> &T { + &self.0 + } +} + +impl SlotData for SlotDuration { + /// Get the slot duration in milliseconds. + fn slot_duration(&self) -> u64 + where T: SlotData, + { + self.0.slot_duration() + } + + const SLOT_KEY: &'static [u8] = T::SLOT_KEY; +} impl SlotDuration { /// Either fetch the slot duration from disk or compute it from the @@ -254,23 +251,25 @@ impl SlotDuration { match client.get_aux(T::SLOT_KEY)? { Some(v) => ::decode(&mut &v[..]) .map(SlotDuration) - .ok_or_else(|| ::client::error::Error::Backend( - format!("slot duration kept in invalid format"), - ).into()), + .ok_or_else(|| { + ::client::error::Error::Backend({ + error!(target: "slots", "slot duration kept in invalid format"); + format!("slot duration kept in invalid format") + }) + .into() + }), None => { use runtime_primitives::traits::Zero; - let genesis_slot_duration = cb( - client.runtime_api(), - &BlockId::number(Zero::zero()))?; + let genesis_slot_duration = + cb(client.runtime_api(), &BlockId::number(Zero::zero()))?; info!( "Loaded block-time = {:?} seconds from genesis on first-launch", genesis_slot_duration ); - genesis_slot_duration.using_encoded(|s| { - client.insert_aux(&[(T::SLOT_KEY, &s[..])], &[]) - })?; + genesis_slot_duration + .using_encoded(|s| client.insert_aux(&[(T::SLOT_KEY, &s[..])], &[]))?; Ok(SlotDuration(genesis_slot_duration)) } @@ -281,11 +280,4 @@ impl SlotDuration { pub fn get(&self) -> T { self.0.clone() } - - /// Get the slot duration in milliseconds - pub fn slot_duration(&self) -> u64 - where T: SlotData - { - self.0.slot_duration() - } } diff --git a/core/consensus/slots/src/slots.rs b/core/consensus/slots/src/slots.rs index 9b665ce0d25d6fa7f89384178cdedc96059365b2..964eeaff29cc599fb45fee23980581564be96469 100644 --- a/core/consensus/slots/src/slots.rs +++ b/core/consensus/slots/src/slots.rs @@ -18,24 +18,34 @@ //! //! This is used instead of `tokio_timer::Interval` because it was unreliable. -use std::time::{Instant, Duration}; -use std::marker::PhantomData; -use tokio::timer::Delay; +use super::SlotCompatible; +use consensus_common::Error; use futures::prelude::*; use futures::try_ready; +use inherents::{InherentData, InherentDataProviders}; use log::warn; -use inherents::{InherentDataProviders, InherentData}; -use consensus_common::{Error, ErrorKind}; -use crate::SlotCompatible; +use std::marker::PhantomData; +use std::time::{Duration, Instant}; +use tokio::timer::Delay; /// Returns current duration since unix epoch. pub fn duration_now() -> Option { use std::time::SystemTime; let now = SystemTime::now(); - now.duration_since(SystemTime::UNIX_EPOCH).map_err(|e| { - warn!("Current time {:?} is before unix epoch. Something is wrong: {:?}", now, e); - }).ok() + now.duration_since(SystemTime::UNIX_EPOCH) + .map_err(|e| { + warn!( + "Current time {:?} is before unix epoch. Something is wrong: {:?}", + now, e + ); + }) + .ok() +} + +/// Get the slot for now. +pub fn slot_now(slot_duration: u64) -> Option { + duration_now().map(|s| s.as_secs() / slot_duration) } /// Returns the duration until the next slot, based on current duration since @@ -113,34 +123,35 @@ impl Stream for Slots { }; if let Some(ref mut inner_delay) = self.inner_delay { - try_ready!(inner_delay.poll().map_err(|e| Error::from(ErrorKind::FaultyTimer(e)))); + try_ready!(inner_delay + .poll() + .map_err(Error::FaultyTimer)); } // timeout has fired. - let inherent_data = self.inherent_data_providers.create_inherent_data() - .map_err(crate::inherent_to_common_error)?; + let inherent_data = self + .inherent_data_providers + .create_inherent_data() + .map_err(|s| consensus_common::Error::InherentData(s.into_owned()))?; let (timestamp, slot_num) = SC::extract_timestamp_and_slot(&inherent_data)?; // reschedule delay for next slot. - let ends_at = Instant::now() + time_until_next(Duration::from_secs(timestamp), slot_duration); + let ends_at = + Instant::now() + time_until_next(Duration::from_secs(timestamp), slot_duration); self.inner_delay = Some(Delay::new(ends_at)); // never yield the same slot twice. if slot_num > self.last_slot { self.last_slot = slot_num; - Ok( - Async::Ready( - Some(SlotInfo { - number: slot_num, - duration: self.slot_duration, - timestamp, - ends_at, - inherent_data, - }) - ) - ) + Ok(Async::Ready(Some(SlotInfo { + number: slot_num, + duration: self.slot_duration, + timestamp, + ends_at, + inherent_data, + }))) } else { // re-poll until we get a new slot. self.poll() diff --git a/core/executor/Cargo.toml b/core/executor/Cargo.toml index 0278c1704dcd16f14d15249d0de01a5c63a35b4d..9cc198557da0f1c57657e9a31f051fabca05c42d 100644 --- a/core/executor/Cargo.toml +++ b/core/executor/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "substrate-executor" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" parity-codec = "3.3" runtime_io = { package = "sr-io", path = "../sr-io" } primitives = { package = "substrate-primitives", path = "../primitives" } @@ -17,7 +17,7 @@ panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" wasmi = { version = "0.4.3" } byteorder = "1.1" lazy_static = "1.0" -parking_lot = "0.7.1" +parking_lot = "0.8.0" log = "0.4" libsecp256k1 = "0.2.1" tiny-keccak = "1.4.2" @@ -25,7 +25,7 @@ tiny-keccak = "1.4.2" [dev-dependencies] assert_matches = "1.1" wabt = "~0.7.4" -hex-literal = "0.1.0" +hex-literal = "0.2.0" [features] default = [] diff --git a/core/executor/src/allocator.rs b/core/executor/src/allocator.rs index 4b3f7d32193cffd8d26f80404d5a4954e95b58f7..bf01dd2e90e57edaa3d74b028088f449bd93c0a1 100644 --- a/core/executor/src/allocator.rs +++ b/core/executor/src/allocator.rs @@ -163,8 +163,7 @@ impl FreeingBumpHeapAllocator { } fn le_bytes_to_u32(arr: [u8; 4]) -> u32 { - let bytes = [arr[0], arr[1], arr[2], arr[3]]; - unsafe { std::mem::transmute::<[u8; 4], u32>(bytes) }.to_le() + u32::from_le_bytes(arr) } fn write_u32_into_le_bytes(bytes: u32, slice: &mut [u8]) { diff --git a/core/executor/src/error.rs b/core/executor/src/error.rs index b27ccf01bf4cef520c3e22d0d9ce8923f7456f5c..fdcb6cbc0e30786f1d271c4651858fe3eff05315 100644 --- a/core/executor/src/error.rs +++ b/core/executor/src/error.rs @@ -16,72 +16,57 @@ //! Rust executor possible errors. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - use state_machine; use serializer; use wasmi; -use error_chain::{ - error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind -}; - -error_chain! { - foreign_links { - InvalidData(serializer::Error) #[doc = "Unserializable Data"]; - Trap(wasmi::Trap) #[doc = "Trap occured during execution"]; - Wasmi(wasmi::Error) #[doc = "Wasmi loading/instantiating error"]; - } - - errors { - /// Method is not found - MethodNotFound(t: String) { - description("method not found"), - display("Method not found: '{}'", t), - } - - /// Code is invalid (expected single byte) - InvalidCode(c: Vec) { - description("invalid code"), - display("Invalid Code: {:?}", c), - } - - /// Could not get runtime version. - VersionInvalid { - description("Runtime version error"), - display("On-chain runtime does not specify version"), - } - /// Externalities have failed. - Externalities { - description("externalities failure"), - display("Externalities error"), - } - - /// Invalid index. - InvalidIndex { - description("index given was not in range"), - display("Invalid index provided"), - } - - /// Invalid return type. - InvalidReturn { - description("u64 was not returned"), - display("Invalid type returned (should be u64)"), - } - - /// Runtime failed. - Runtime { - description("runtime failure"), - display("Runtime error"), - } +/// Result type alias. +pub type Result = std::result::Result; + +/// Error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Unserializable Data + InvalidData(serializer::Error), + /// Trap occured during execution + Trap(wasmi::Trap), + /// Wasmi loading/instantiating error + Wasmi(wasmi::Error), + /// Error in the API. Parameter is an error message. + ApiError(String), + /// Method is not found + #[display(fmt="Method not found: '{}'", _0)] + MethodNotFound(String), + /// Code is invalid (expected single byte) + #[display(fmt="Invalid Code: {:?}", _0)] + InvalidCode(Vec), + /// Could not get runtime version. + #[display(fmt="On-chain runtime does not specify version")] + VersionInvalid, + /// Externalities have failed. + #[display(fmt="Externalities error")] + Externalities, + /// Invalid index. + #[display(fmt="Invalid index provided")] + InvalidIndex, + /// Invalid return type. + #[display(fmt="Invalid type returned (should be u64)")] + InvalidReturn, + /// Runtime failed. + #[display(fmt="Runtime error")] + Runtime, + /// Runtime failed. + #[display(fmt="Invalid memory reference")] + InvalidMemoryReference, +} - /// Runtime failed. - InvalidMemoryReference { - description("invalid memory reference"), - display("Invalid memory reference"), +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::InvalidData(ref err) => Some(err), + Error::Trap(ref err) => Some(err), + Error::Wasmi(ref err) => Some(err), + _ => None, } } } diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index 586073c0d2369285f905908cb001424e526d10f2..e4a65c811bf6ae6e5ab49bc9db2fd7c38461a27e 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use std::{borrow::BorrowMut, result, cell::{RefMut, RefCell}}; -use crate::error::{Error, ErrorKind, Result}; +use crate::error::{Error, Result}; use state_machine::{CodeExecutor, Externalities}; use crate::wasm_executor::WasmExecutor; use wasmi::{Module as WasmModule, ModuleRef as WasmModuleInstanceRef}; @@ -53,11 +53,11 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( ext: &mut E, default_heap_pages: Option, ) -> Result<(&'a WasmModuleInstanceRef, &'a Option)> { - let code_hash = match ext.original_storage_hash(well_known_keys::CODE) { Some(code_hash) => code_hash, - None => return Err(ErrorKind::InvalidCode(vec![]).into()), + None => return Err(Error::InvalidCode(vec![])), }; + let maybe_runtime_preproc = cache.borrow_mut().entry(code_hash.into()) .or_insert_with(|| { let code = match ext.original_storage(well_known_keys::CODE) { @@ -69,7 +69,7 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( .or(default_heap_pages) .unwrap_or(DEFAULT_HEAP_PAGES); match WasmModule::from_buffer(code) - .map_err(|_| ErrorKind::InvalidCode(vec![]).into()) + .map_err(|_| Error::InvalidCode(vec![])) .and_then(|module| wasm_executor.prepare_module(ext, heap_pages as usize, &module)) { Ok(module) => { @@ -84,10 +84,11 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( } } }); + match maybe_runtime_preproc { RuntimePreproc::InvalidCode => { let code = ext.original_storage(well_known_keys::CODE).unwrap_or(vec![]); - Err(ErrorKind::InvalidCode(code).into()) + Err(Error::InvalidCode(code)) }, RuntimePreproc::ValidCode(m, v) => { Ok((m, v)) @@ -100,13 +101,13 @@ fn safe_call(f: F) -> Result { // Substrate uses custom panic hook that terminates process on panic. Disable termination for the native call. let _guard = panic_handler::AbortGuard::new(false); - ::std::panic::catch_unwind(f).map_err(|_| ErrorKind::Runtime.into()) + ::std::panic::catch_unwind(f).map_err(|_| Error::Runtime) } /// Set up the externalities and safe calling environment to execute calls to a native runtime. /// /// If the inner closure panics, it will be caught and return an error. -pub fn with_native_environment(ext: &mut Externalities, f: F) -> Result +pub fn with_native_environment(ext: &mut dyn Externalities, f: F) -> Result where F: UnwindSafe + FnOnce() -> U { ::runtime_io::with_externalities(ext, move || safe_call(f)) @@ -120,7 +121,7 @@ pub trait NativeExecutionDispatch: Send + Sync { /// Dispatch a method and input data to be executed natively. Returns `Some` result or `None` /// if the `method` is unknown. Panics if there's an unrecoverable error. // fn dispatch(ext: &mut Externalities, method: &str, data: &[u8]) -> Result>; - fn dispatch(ext: &mut Externalities, method: &str, data: &[u8]) -> Result>; + fn dispatch(ext: &mut dyn Externalities, method: &str, data: &[u8]) -> Result>; /// Provide native runtime version. fn native_version() -> NativeVersion; @@ -132,7 +133,7 @@ pub trait NativeExecutionDispatch: Send + Sync { /// A generic `CodeExecutor` implementation that uses a delegate to determine wasm code equivalence /// and dispatch to native code when possible, falling back on `WasmExecutor` when not. #[derive(Debug)] -pub struct NativeExecutor { +pub struct NativeExecutor { /// Dummy field to avoid the compiler complaining about us not using `D`. _dummy: ::std::marker::PhantomData, /// The fallback executor in case native isn't available. @@ -247,7 +248,7 @@ impl CodeExecutor for NativeExecutor { /// A unit struct which implements `NativeExecutionDispatch` feeding in the hard-coded runtime. $pub struct $name; - native_executor_instance!(IMPL $name, $dispatcher, $version, $code); + $crate::native_executor_instance!(IMPL $name, $dispatcher, $version, $code); }; (IMPL $name:ident, $dispatcher:path, $version:path, $code:expr) => { impl $crate::NativeExecutionDispatch for $name { @@ -282,7 +283,7 @@ macro_rules! native_executor_instance { } fn dispatch(ext: &mut $crate::Externalities<$crate::Blake2Hasher>, method: &str, data: &[u8]) -> $crate::error::Result> { $crate::with_native_environment(ext, move || $dispatcher(method, data))? - .ok_or_else(|| $crate::error::ErrorKind::MethodNotFound(method.to_owned()).into()) + .ok_or_else(|| $crate::error::Error::MethodNotFound(method.to_owned())) } fn native_version() -> $crate::NativeVersion { diff --git a/core/executor/src/sandbox.rs b/core/executor/src/sandbox.rs index cc21d762bec11fd13645a5a971640e5ddedd155b..377294f7b12d7be46db401cfe68c7074f2646d11 100644 --- a/core/executor/src/sandbox.rs +++ b/core/executor/src/sandbox.rs @@ -569,9 +569,11 @@ mod tests { use crate::allocator; use crate::sandbox::trap; use crate::wasm_executor::WasmExecutor; - use state_machine::TestExternalities; + use state_machine::TestExternalities as CoreTestExternalities; use wabt; + type TestExternalities = CoreTestExternalities; + #[test] fn sandbox_should_work() { let mut ext = TestExternalities::::default(); @@ -643,9 +645,8 @@ mod tests { let res = WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_exhaust_heap", &code); assert_eq!(res.is_err(), true); if let Err(err) = res { - let inner_err = err.iter().next().unwrap(); assert_eq!( - format!("{}", inner_err), + format!("{}", err), format!("{}", wasmi::Error::Trap(trap(allocator::OUT_OF_SPACE))) ); } diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index e687a1f4db21014604019e8da44f1ba90adf84e5..920639c0a2b053fa5830c81659f288d518de143f 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -17,6 +17,8 @@ //! Rust implementation of Substrate contracts. use std::collections::HashMap; +use std::convert::TryFrom; +use std::str; use tiny_keccak; use secp256k1; @@ -26,9 +28,10 @@ use wasmi::{ use wasmi::RuntimeValue::{I32, I64, self}; use wasmi::memory_units::{Pages}; use state_machine::{Externalities, ChildStorageKey}; -use crate::error::{Error, ErrorKind, Result}; +use crate::error::{Error, Result}; use crate::wasm_utils::UserError; use primitives::{blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair}; +use primitives::offchain; use primitives::hexdisplay::HexDisplay; use primitives::sandbox as sandbox_primitives; use primitives::{H256, Blake2Hasher}; @@ -113,6 +116,24 @@ impl ReadPrimitive for MemoryInstance { } } +fn deadline_to_timestamp(deadline: u64) -> Option { + if deadline == 0 { + None + } else { + Some(offchain::Timestamp::from_unix_millis(deadline)) + } +} + +fn u32_to_key(key: u32) -> std::result::Result, ()> { + if key > u16::max_value() as u32 { + Err(()) + } else if key == 0 { + Ok(None) + } else { + Ok(Some(offchain::CryptoKeyId(key as u16))) + } +} + impl_function_executor!(this: FunctionExecutor<'e, E>, ext_print_utf8(utf8_data: *const u8, utf8_len: u32) => { if let Ok(utf8) = this.memory.get(utf8_data, utf8_len as usize) { @@ -414,7 +435,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, .map_err(|_| UserError("Invalid attempt to write written_out in ext_child_storage_root"))?; Ok(offset) }, - ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, parent_number: u64, result: *mut u8) -> u32 => { + ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, result: *mut u8) -> u32 => { let mut parent_hash = H256::default(); if parent_hash_len != parent_hash.as_ref().len() as u32 { return Err(UserError("Invalid parent_hash_len in ext_storage_changes_root").into()); @@ -422,7 +443,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let raw_parent_hash = this.memory.get(parent_hash_data, parent_hash_len as usize) .map_err(|_| UserError("Invalid attempt to get parent_hash in ext_storage_changes_root"))?; parent_hash.as_mut().copy_from_slice(&raw_parent_hash[..]); - let r = this.ext.storage_changes_root(parent_hash, parent_number); + let r = this.ext.storage_changes_root(parent_hash) + .map_err(|_| UserError("Invaid parent_hash passed to ext_storage_changes_root"))?; if let Some(r) = r { this.memory.set(result, &r[..]).map_err(|_| UserError("Invalid attempt to set memory in ext_storage_changes_root"))?; Ok(1) @@ -458,7 +480,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let key = this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_twox_64"))?; let hashed_key = twox_64(&key); debug_trace!(target: "xxhash", "XXhash: {} -> {}", - if let Ok(_skey) = ::std::str::from_utf8(&key) { + if let Ok(_skey) = str::from_utf8(&key) { _skey } else { &format!("{}", HexDisplay::from(&key)) @@ -482,10 +504,10 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let key = this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_twox_128"))?; let hashed_key = twox_128(&key); debug_trace!(target: "xxhash", "XXhash: {} -> {}", - if let Ok(_skey) = ::std::str::from_utf8(&key) { - _skey + &if let Ok(_skey) = str::from_utf8(&key) { + *_skey } else { - &format!("{}", HexDisplay::from(&key)) + format!("{}", HexDisplay::from(&key)) }, HexDisplay::from(&hashed_key) ); @@ -589,15 +611,345 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(0) }, - ext_submit_extrinsic(msg_data: *const u8, len: u32) => { + ext_submit_transaction(msg_data: *const u8, len: u32) -> u32 => { let extrinsic = this.memory.get(msg_data, len as usize) - .map_err(|_| UserError("OOB while ext_submit_extrinsic: wasm"))?; + .map_err(|_| UserError("OOB while ext_submit_transaction: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.submit_transaction(extrinsic)) + .ok_or_else(|| UserError("Calling unavailable API ext_submit_transaction: wasm"))?; + + Ok(if res.is_ok() { 0 } else { 1 }) + }, + ext_new_crypto_key(crypto: u32) -> u32 => { + let kind = offchain::CryptoKind::try_from(crypto) + .map_err(|_| UserError("crypto kind OOB while ext_new_crypto_key: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.new_crypto_key(kind)) + .ok_or_else(|| UserError("Calling unavailable API ext_new_crypto_key: wasm"))?; + + match res { + Ok(key_id) => Ok(key_id.0 as u32), + Err(()) => Ok(u32::max_value()), + } + }, + ext_encrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8 => { + let key = u32_to_key(key) + .map_err(|_| UserError("key OOB while ext_encrypt: wasm"))?; + let message = this.memory.get(data, data_len as usize) + .map_err(|_| UserError("OOB while ext_encrypt: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.encrypt(key, &*message)) + .ok_or_else(|| UserError("Calling unavailable API ext_encrypt: wasm"))?; + + let (offset,len) = match res { + Ok(encrypted) => { + let len = encrypted.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &encrypted) + .map_err(|_| UserError("Invalid attempt to set memory in ext_encrypt"))?; + (offset, len) + }, + Err(()) => (0, u32::max_value()), + }; - this.ext.submit_extrinsic(extrinsic) - .map_err(|_| UserError("Calling unavailable API ext_submit_extrinsic: wasm"))?; + this.memory.write_primitive(msg_len, len) + .map_err(|_| UserError("Invalid attempt to write msg_len in ext_encrypt"))?; + Ok(offset) + }, + ext_decrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8 => { + let key = u32_to_key(key) + .map_err(|_| UserError("key OOB while ext_decrypt: wasm"))?; + let message = this.memory.get(data, data_len as usize) + .map_err(|_| UserError("OOB while ext_decrypt: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.decrypt(key, &*message)) + .ok_or_else(|| UserError("Calling unavailable API ext_decrypt: wasm"))?; + + let (offset,len) = match res { + Ok(decrypted) => { + let len = decrypted.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &decrypted) + .map_err(|_| UserError("Invalid attempt to set memory in ext_decrypt"))?; + (offset, len) + }, + Err(()) => (0, u32::max_value()), + }; + + this.memory.write_primitive(msg_len, len) + .map_err(|_| UserError("Invalid attempt to write msg_len in ext_decrypt"))?; + + Ok(offset) + }, + ext_sign(key: u32, data: *const u8, data_len: u32, sig_data_len: *mut u32) -> *mut u8 => { + let key = u32_to_key(key) + .map_err(|_| UserError("key OOB while ext_sign: wasm"))?; + let message = this.memory.get(data, data_len as usize) + .map_err(|_| UserError("OOB while ext_sign: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.sign(key, &*message)) + .ok_or_else(|| UserError("Calling unavailable API ext_sign: wasm"))?; + + let (offset,len) = match res { + Ok(signature) => { + let len = signature.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &signature) + .map_err(|_| UserError("Invalid attempt to set memory in ext_sign"))?; + (offset, len) + }, + Err(()) => (0, u32::max_value()), + }; + + this.memory.write_primitive(sig_data_len, len) + .map_err(|_| UserError("Invalid attempt to write sig_data_len in ext_sign"))?; + + Ok(offset) + }, + ext_verify( + key: u32, + msg: *const u8, + msg_len: u32, + signature: *const u8, + signature_len: u32 + ) -> u32 => { + let key = u32_to_key(key) + .map_err(|_| UserError("key OOB while ext_verify: wasm"))?; + let message = this.memory.get(msg, msg_len as usize) + .map_err(|_| UserError("OOB while ext_verify: wasm"))?; + let signature = this.memory.get(signature, signature_len as usize) + .map_err(|_| UserError("OOB while ext_verify: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.verify(key, &*message, &*signature)) + .ok_or_else(|| UserError("Calling unavailable API ext_verify: wasm"))?; + + match res { + Ok(true) => Ok(0), + Ok(false) => Ok(1), + Err(()) => Ok(u32::max_value()), + } + }, + ext_timestamp() -> u64 => { + let timestamp = this.ext.offchain() + .map(|api| api.timestamp()) + .ok_or_else(|| UserError("Calling unavailable API ext_timestamp: wasm"))?; + Ok(timestamp.unix_millis()) + }, + ext_sleep_until(deadline: u64) => { + this.ext.offchain() + .map(|api| api.sleep_until(offchain::Timestamp::from_unix_millis(deadline))) + .ok_or_else(|| UserError("Calling unavailable API ext_sleep_until: wasm"))?; Ok(()) }, + ext_random_seed(seed_data: *mut u8) => { + // NOTE the runtime as assumptions about seed size. + let seed: [u8; 32] = this.ext.offchain() + .map(|api| api.random_seed()) + .ok_or_else(|| UserError("Calling unavailable API ext_random_seed: wasm"))?; + + this.memory.set(seed_data, &seed) + .map_err(|_| UserError("Invalid attempt to set value in ext_random_seed"))?; + Ok(()) + }, + ext_local_storage_set(key: *const u8, key_len: u32, value: *const u8, value_len: u32) => { + let key = this.memory.get(key, key_len as usize) + .map_err(|_| UserError("OOB while ext_local_storage_set: wasm"))?; + let value = this.memory.get(value, value_len as usize) + .map_err(|_| UserError("OOB while ext_local_storage_set: wasm"))?; + + this.ext.offchain() + .map(|api| api.local_storage_set(&key, &value)) + .ok_or_else(|| UserError("Calling unavailable API ext_local_storage_set: wasm"))?; + + Ok(()) + }, + ext_local_storage_get(key: *const u8, key_len: u32, value_len: *mut u32) -> *mut u8 => { + let key = this.memory.get(key, key_len as usize) + .map_err(|_| UserError("OOB while ext_local_storage_get: wasm"))?; + + let maybe_value = this.ext.offchain() + .map(|api| api.local_storage_get(&key)) + .ok_or_else(|| UserError("Calling unavailable API ext_local_storage_get: wasm"))?; + + let (offset, len) = if let Some(value) = maybe_value { + let offset = this.heap.allocate(value.len() as u32)? as u32; + this.memory.set(offset, &value) + .map_err(|_| UserError("Invalid attempt to set memory in ext_local_storage_get"))?; + (offset, value.len() as u32) + } else { + (0, u32::max_value()) + }; + + this.memory.write_primitive(value_len, len) + .map_err(|_| UserError("Invalid attempt to write value_len in ext_local_storage_get"))?; + + Ok(offset) + }, + ext_http_request_start( + method: *const u8, + method_len: u32, + url: *const u8, + url_len: u32, + meta: *const u8, + meta_len: u32 + ) -> u32 => { + let method = this.memory.get(method, method_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_start: wasm"))?; + let url = this.memory.get(url, url_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_start: wasm"))?; + let meta = this.memory.get(meta, meta_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_start: wasm"))?; + + let method_str = str::from_utf8(&method) + .map_err(|_| UserError("invalid str while ext_http_request_start: wasm"))?; + let url_str = str::from_utf8(&url) + .map_err(|_| UserError("invalid str while ext_http_request_start: wasm"))?; + + let id = this.ext.offchain() + .map(|api| api.http_request_start(method_str, url_str, &*meta)) + .ok_or_else(|| UserError("Calling unavailable API ext_http_request_start: wasm"))?; + + if let Ok(id) = id { + Ok(id.0 as u32) + } else { + Ok(u32::max_value()) + } + }, + ext_http_request_add_header( + request_id: u32, + name: *const u8, + name_len: u32, + value: *const u8, + value_len: u32 + ) -> u32 => { + let name = this.memory.get(name, name_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_add_header: wasm"))?; + let value = this.memory.get(value, value_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_add_header: wasm"))?; + + let name_str = str::from_utf8(&name) + .map_err(|_| UserError("invalid str while ext_http_request_add_header: wasm"))?; + let value_str = str::from_utf8(&value) + .map_err(|_| UserError("invalid str while ext_http_request_add_header: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.http_request_add_header( + offchain::HttpRequestId(request_id as u16), + &name_str, + &value_str, + )) + .ok_or_else(|| UserError("Calling unavailable API ext_http_request_add_header: wasm"))?; + + Ok(if res.is_ok() { 0 } else { 1 }) + }, + ext_http_request_write_body( + request_id: u32, + chunk: *const u8, + chunk_len: u32, + deadline: u64 + ) -> u32 => { + let chunk = this.memory.get(chunk, chunk_len as usize) + .map_err(|_| UserError("OOB while ext_http_request_write_body: wasm"))?; + + let res = this.ext.offchain() + .map(|api| api.http_request_write_body( + offchain::HttpRequestId(request_id as u16), + &chunk, + deadline_to_timestamp(deadline) + )) + .ok_or_else(|| UserError("Calling unavailable API ext_http_request_write_body: wasm"))?; + + Ok(match res { + Ok(()) => 0, + Err(e) => e as u8 as u32, + }) + }, + ext_http_response_wait( + ids: *const u32, + ids_len: u32, + statuses: *mut u32, + deadline: u64 + ) => { + let ids = (0..ids_len) + .map(|i| + this.memory.read_primitive(ids + i * 4) + .map(|id: u32| offchain::HttpRequestId(id as u16)) + .map_err(|_| UserError("OOB while ext_http_response_wait: wasm")) + ) + .collect::<::std::result::Result, _>>()?; + + let res = this.ext.offchain() + .map(|api| api.http_response_wait(&ids, deadline_to_timestamp(deadline))) + .ok_or_else(|| UserError("Calling unavailable API ext_http_response_wait: wasm"))? + .into_iter() + .map(|status| status.into()) + .enumerate() + // make sure to take up to `ids_len` to avoid exceeding the mem. + .take(ids_len as usize); + + for (i, status) in res { + this.memory.write_primitive(statuses + i as u32 * 4, status) + .map_err(|_| UserError("Invalid attempt to set memory in ext_http_response_wait"))?; + } + + Ok(()) + }, + ext_http_response_headers( + request_id: u32, + written_out: *mut u32 + ) -> *mut u8 => { + use parity_codec::Encode; + + let headers = this.ext.offchain() + .map(|api| api.http_response_headers(offchain::HttpRequestId(request_id as u16))) + .ok_or_else(|| UserError("Calling unavailable API ext_http_response_headers: wasm"))?; + + let encoded = headers.encode(); + let len = encoded.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &encoded) + .map_err(|_| UserError("Invalid attempt to set memory in ext_http_response_headers"))?; + this.memory.write_primitive(written_out, len) + .map_err(|_| UserError("Invalid attempt to write written_out in ext_http_response_headers"))?; + + Ok(offset) + }, + ext_http_response_read_body( + request_id: u32, + buffer: *mut u8, + buffer_len: u32, + deadline: u64 + ) -> u32 => { + let mut internal_buffer = Vec::with_capacity(buffer_len as usize); + internal_buffer.resize(buffer_len as usize, 0); + + let res = this.ext.offchain() + .map(|api| api.http_response_read_body( + offchain::HttpRequestId(request_id as u16), + &mut internal_buffer, + deadline_to_timestamp(deadline), + )) + .ok_or_else(|| UserError("Calling unavailable API ext_http_response_read_body: wasm"))?; + + Ok(match res { + Ok(read) => { + this.memory.set(buffer, &internal_buffer[..read]) + .map_err(|_| UserError("Invalid attempt to set memory in ext_http_response_read_body"))?; + + read as u32 + }, + Err(err) => { + u32::max_value() - err as u8 as u32 + 1 + } + }) + }, ext_sandbox_instantiate( dispatch_thunk_idx: usize, wasm_ptr: *const u8, @@ -749,7 +1101,7 @@ impl WasmExecutor { /// This should be used for tests only. pub fn call_with_custom_signature< E: Externalities, - F: FnOnce(&mut FnMut(&[u8]) -> Result) -> Result>, + F: FnOnce(&mut dyn FnMut(&[u8]) -> Result) -> Result>, FR: FnOnce(Option, &MemoryRef) -> Result>, R, >( @@ -769,9 +1121,9 @@ impl WasmExecutor { fn get_mem_instance(module: &ModuleRef) -> Result { Ok(module .export_by_name("memory") - .ok_or_else(|| Error::from(ErrorKind::InvalidMemoryReference))? + .ok_or_else(|| Error::InvalidMemoryReference)? .as_memory() - .ok_or_else(|| Error::from(ErrorKind::InvalidMemoryReference))? + .ok_or_else(|| Error::InvalidMemoryReference)? .clone()) } @@ -795,7 +1147,7 @@ impl WasmExecutor { if let Some(I64(r)) = res { let offset = r as u32; let length = (r as u64 >> 32) as usize; - memory.get(offset, length).map_err(|_| ErrorKind::Runtime.into()).map(Some) + memory.get(offset, length).map_err(|_| Error::Runtime).map(Some) } else { Ok(None) } @@ -806,7 +1158,7 @@ impl WasmExecutor { /// Call a given method in the given wasm-module runtime. fn call_in_wasm_module_with_custom_signature< E: Externalities, - F: FnOnce(&mut FnMut(&[u8]) -> Result) -> Result>, + F: FnOnce(&mut dyn FnMut(&[u8]) -> Result) -> Result>, FR: FnOnce(Option, &MemoryRef) -> Result>, R, >( @@ -828,7 +1180,7 @@ impl WasmExecutor { let used_mem = memory.used_size(); let mut fec = FunctionExecutor::new(memory.clone(), table, ext)?; let parameters = create_parameters(&mut |data: &[u8]| { - let offset = fec.heap.allocate(data.len() as u32).map_err(|_| ErrorKind::Runtime)?; + let offset = fec.heap.allocate(data.len() as u32).map_err(|_| Error::Runtime)?; memory.set(offset, &data)?; Ok(offset) })?; @@ -841,7 +1193,7 @@ impl WasmExecutor { let result = match result { Ok(val) => match filter_result(val, &memory)? { Some(val) => Ok(val), - None => Err(ErrorKind::InvalidReturn.into()), + None => Err(Error::InvalidReturn), }, Err(e) => { trace!(target: "wasm-executor", "Failed to execute code with {} pages", memory.current_size().0); @@ -877,7 +1229,7 @@ impl WasmExecutor { // extract a reference to a linear memory, optional reference to a table // and then initialize FunctionExecutor. let memory = Self::get_mem_instance(intermediate_instance.not_started_instance())?; - memory.grow(Pages(heap_pages)).map_err(|_| Error::from(ErrorKind::Runtime))?; + memory.grow(Pages(heap_pages)).map_err(|_| Error::Runtime)?; let table: Option = intermediate_instance .not_started_instance() .export_by_name("__indirect_function_table") @@ -896,10 +1248,12 @@ mod tests { use parity_codec::Encode; - use state_machine::TestExternalities; - use hex_literal::{hex, hex_impl}; + use state_machine::TestExternalities as CoreTestExternalities; + use hex_literal::hex; use primitives::map; + type TestExternalities = CoreTestExternalities; + #[test] fn returning_should_work() { let mut ext = TestExternalities::default(); @@ -993,7 +1347,6 @@ mod tests { ); } - #[test] fn twox_256_should_work() { let mut ext = TestExternalities::default(); diff --git a/core/executor/src/wasm_utils.rs b/core/executor/src/wasm_utils.rs index a9fbca7f6ca4faa6ac1c35616a967e46fa62e5f6..7384f91944c503d7a335d865bc2dcd8b7f03b8ea 100644 --- a/core/executor/src/wasm_utils.rs +++ b/core/executor/src/wasm_utils.rs @@ -174,7 +174,7 @@ macro_rules! impl_function_executor { => $($pre:tt)+ ) => ( impl $( $pre ) + $structname { #[allow(unused)] - fn resolver() -> &'static $crate::wasmi::ModuleImportResolver { + fn resolver() -> &'static dyn $crate::wasmi::ModuleImportResolver { struct Resolver; impl $crate::wasmi::ModuleImportResolver for Resolver { fn resolve_func(&self, name: &str, signature: &$crate::wasmi::Signature) -> ::std::result::Result<$crate::wasmi::FuncRef, $crate::wasmi::Error> { diff --git a/core/executor/wasm/Cargo.lock b/core/executor/wasm/Cargo.lock index 23841381ed3595fea2f9f5046a650ea96842737d..34cd17116c3c1708e76d2923a21fc47b15d598ee 100644 --- a/core/executor/wasm/Cargo.lock +++ b/core/executor/wasm/Cargo.lock @@ -2,12 +2,17 @@ # It is not intended for manual editing. [[package]] name = "arrayvec" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "autocfg" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byteorder" version = "1.3.1" @@ -15,12 +20,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fixed-hash" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -28,15 +33,15 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -49,15 +54,23 @@ dependencies = [ [[package]] name = "nodrop" -version = "0.1.12" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "num-traits" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "parity-codec" version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -66,33 +79,33 @@ name = "parity-codec-derive" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro2" -version = "0.4.19" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -100,19 +113,19 @@ dependencies = [ [[package]] name = "quote" -version = "0.6.8" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "runtime-test" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "sr-io 1.0.0", - "sr-sandbox 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-sandbox 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -143,33 +156,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.79" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-io" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-sandbox" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-std" -version = "1.0.0" +version = "2.0.0" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -181,42 +194,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", + "sr-std 2.0.0", ] [[package]] name = "syn" -version = "0.15.26" +version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "uint" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -226,27 +240,29 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" +"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" -"checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" -"checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" -"checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" -"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" +"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" -"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" +"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" -"checksum proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "ffe022fb8c8bd254524b0b3305906c1921fa37a84a644e29079a9e62200c3901" -"checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "84257ccd054dc351472528c8587b4de2dbf0dc0fe2e634030c1a90bfdacebaa9" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" -"checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" -"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" diff --git a/core/executor/wasm/Cargo.toml b/core/executor/wasm/Cargo.toml index be60dfa1c9401912295017fb00e4221b8fb7d196..e9f829746d49f0952c7da8d73e1f90bfbe17c516 100644 --- a/core/executor/wasm/Cargo.toml +++ b/core/executor/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "runtime-test" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/executor/wasm/build.sh b/core/executor/wasm/build.sh index c23ac076e210aa3d00c5550e18e40b4c9d90d09c..fe2faeec6204c118fb2ff8a536f92e764fe49b4b 100755 --- a/core/executor/wasm/build.sh +++ b/core/executor/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release +CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release $@ for i in test do wasm-gc target/wasm32-unknown-unknown/release/runtime_$i.wasm target/wasm32-unknown-unknown/release/runtime_$i.compact.wasm diff --git a/core/executor/wasm/src/lib.rs b/core/executor/wasm/src/lib.rs index 294c21d146ee0a8849d64ede29896a168d9ec688..193ff5c9c0d3cbe9d39122f28126c6b052de55a5 100644 --- a/core/executor/wasm/src/lib.rs +++ b/core/executor/wasm/src/lib.rs @@ -1,7 +1,6 @@ #![no_std] #![cfg_attr(feature = "strict", deny(warnings))] -#![feature(alloc)] extern crate alloc; use alloc::vec::Vec; use alloc::slice; @@ -92,7 +91,7 @@ impl_stubs!( [sr25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec() }, test_enumerated_trie_root => |_| { - enumerated_trie_root::(&[&b"zero"[..], &b"one"[..], &b"two"[..]]).to_vec() + enumerated_trie_root::(&[&b"zero"[..], &b"one"[..], &b"two"[..]]).as_ref().to_vec() }, test_sandbox => |code: &[u8]| { let ok = execute_sandboxed(code, &[]).is_ok(); diff --git a/core/finality-grandpa/Cargo.toml b/core/finality-grandpa/Cargo.toml index 9b076f5b019572c3f5b4e6faf3e3fba987df9143..b00c646286e24a82b2ac14d5ff3e0ee932550598 100644 --- a/core/finality-grandpa/Cargo.toml +++ b/core/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-finality-grandpa" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -8,7 +8,7 @@ edition = "2018" fork-tree = { path = "../../core/util/fork-tree" } futures = "0.1" log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" tokio = "0.1.7" rand = "0.6" parity-codec = { version = "3.3", features = ["derive"] } diff --git a/core/finality-grandpa/primitives/Cargo.toml b/core/finality-grandpa/primitives/Cargo.toml index 0f915b586527881b677c0c1f8911bb020c246c1e..e51ed754eb85fb46cd526ab6143dc929e4e36457 100644 --- a/core/finality-grandpa/primitives/Cargo.toml +++ b/core/finality-grandpa/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-finality-grandpa-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/finality-grandpa/primitives/src/lib.rs b/core/finality-grandpa/primitives/src/lib.rs index 7016a708bd62b8c0f1bc05726d193dd2dc986d1e..869b5e68fd6af5f744d4f9ed34ca77af7545f822 100644 --- a/core/finality-grandpa/primitives/src/lib.rs +++ b/core/finality-grandpa/primitives/src/lib.rs @@ -17,7 +17,6 @@ //! Primitives for GRANDPA integration, suitable for WASM compilation. #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] #[cfg(not(feature = "std"))] extern crate alloc; diff --git a/core/finality-grandpa/src/aux_schema.rs b/core/finality-grandpa/src/aux_schema.rs index 9e981cb903b140948b47ce26a071e688b30f44b4..4dd6e75dd946f595a6e1d3a82bc28d9a67a42f4f 100644 --- a/core/finality-grandpa/src/aux_schema.rs +++ b/core/finality-grandpa/src/aux_schema.rs @@ -105,7 +105,7 @@ where H: Clone + Debug + PartialEq, } } -fn load_decode(backend: &B, key: &[u8]) -> ClientResult> { +pub(crate) fn load_decode(backend: &B, key: &[u8]) -> ClientResult> { match backend.get_aux(key)? { None => Ok(None), Some(t) => T::decode(&mut &t[..]) diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index 6b45fd0745138af4b2721d4b1377c1a440d1ac46..460998e707da335a4a5cd90b167ea7ff78632e84 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -425,6 +425,8 @@ struct Inner { next_rebroadcast: Instant, } +type MaybeMessage = Option<(Vec, NeighborPacket>)>; + impl Inner { fn new(config: crate::Config) -> Self { Inner { @@ -437,11 +439,9 @@ impl Inner { } /// Note a round in a set has started. - fn note_round(&mut self, round: Round, set_id: SetId, send_neighbor: F) - where F: FnOnce(Vec, NeighborPacket>) - { + fn note_round(&mut self, round: Round, set_id: SetId) -> MaybeMessage { if self.local_view.round == round && self.local_view.set_id == set_id { - return + return None; } debug!(target: "afg", "Voter {} noting beginning of round {:?} to network.", @@ -451,28 +451,28 @@ impl Inner { self.local_view.set_id = set_id; self.live_topics.push(round, set_id); - self.multicast_neighbor_packet(send_neighbor); + self.multicast_neighbor_packet() } /// Note that a voter set with given ID has started. Does nothing if the last /// call to the function was with the same `set_id`. - fn note_set(&mut self, set_id: SetId, send_neighbor: F) - where F: FnOnce(Vec, NeighborPacket>) - { - if self.local_view.set_id == set_id { return } + fn note_set(&mut self, set_id: SetId) -> MaybeMessage { + if self.local_view.set_id == set_id { + return None; + } self.local_view.update_set(set_id); self.live_topics.push(Round(0), set_id); - self.multicast_neighbor_packet(send_neighbor); + self.multicast_neighbor_packet() } /// Note that we've imported a commit finalizing a given block. - fn note_commit_finalized(&mut self, finalized: NumberFor, send_neighbor: F) - where F: FnOnce(Vec, NeighborPacket>) - { + fn note_commit_finalized(&mut self, finalized: NumberFor) -> MaybeMessage { if self.local_view.last_commit.as_ref() < Some(&finalized) { self.local_view.last_commit = Some(finalized); - self.multicast_neighbor_packet(send_neighbor) + self.multicast_neighbor_packet() + } else { + None } } @@ -560,9 +560,7 @@ impl Inner { (neighbor_topics, Action::Discard(cb)) } - fn multicast_neighbor_packet(&self, send_neighbor: F) - where F: FnOnce(Vec, NeighborPacket>) - { + fn multicast_neighbor_packet(&self) -> MaybeMessage { let packet = NeighborPacket { round: self.local_view.round, set_id: self.local_view.set_id, @@ -570,7 +568,7 @@ impl Inner { }; let peers = self.peers.inner.keys().cloned().collect(); - send_neighbor(peers, packet); + Some((peers, packet)) } } @@ -596,21 +594,30 @@ impl GossipValidator { pub(super) fn note_round(&self, round: Round, set_id: SetId, send_neighbor: F) where F: FnOnce(Vec, NeighborPacket>) { - self.inner.write().note_round(round, set_id, send_neighbor); + let maybe_msg = self.inner.write().note_round(round, set_id); + if let Some((to, msg)) = maybe_msg { + send_neighbor(to, msg); + } } /// Note that a voter set with given ID has started. pub(super) fn note_set(&self, set_id: SetId, send_neighbor: F) where F: FnOnce(Vec, NeighborPacket>) { - self.inner.write().note_set(set_id, send_neighbor); + let maybe_msg = self.inner.write().note_set(set_id); + if let Some((to, msg)) = maybe_msg { + send_neighbor(to, msg); + } } /// Note that we've imported a commit finalizing a given block. pub(super) fn note_commit_finalized(&self, finalized: NumberFor, send_neighbor: F) where F: FnOnce(Vec, NeighborPacket>) { - self.inner.write().note_commit_finalized(finalized, send_neighbor); + let maybe_msg = self.inner.write().note_commit_finalized(finalized); + if let Some((to, msg)) = maybe_msg { + send_neighbor(to, msg); + } } fn report(&self, who: PeerId, cost_benefit: i32) { @@ -622,13 +629,12 @@ impl GossipValidator { { let mut broadcast_topics = Vec::new(); let action = { - let mut inner = self.inner.write(); match GossipMessage::::decode(&mut data) { Some(GossipMessage::VoteOrPrecommit(ref message)) - => inner.validate_round_message(who, message), - Some(GossipMessage::Commit(ref message)) => inner.validate_commit_message(who, message), + => self.inner.write().validate_round_message(who, message), + Some(GossipMessage::Commit(ref message)) => self.inner.write().validate_commit_message(who, message), Some(GossipMessage::Neighbor(update)) => { - let (topics, action) = inner.import_neighbor_message( + let (topics, action) = self.inner.write().import_neighbor_message( who, update.into_neighbor_packet(), ); @@ -651,7 +657,7 @@ impl GossipValidator { } impl network_gossip::Validator for GossipValidator { - fn new_peer(&self, context: &mut ValidatorContext, who: &PeerId, _roles: Roles) { + fn new_peer(&self, context: &mut dyn ValidatorContext, who: &PeerId, _roles: Roles) { let packet_data = { let mut inner = self.inner.write(); inner.peers.new_peer(who.clone()); @@ -667,11 +673,11 @@ impl network_gossip::Validator for GossipValidator context.send_message(who, packet_data); } - fn peer_disconnected(&self, _context: &mut ValidatorContext, who: &PeerId) { + fn peer_disconnected(&self, _context: &mut dyn ValidatorContext, who: &PeerId) { self.inner.write().peers.peer_disconnected(who); } - fn validate(&self, context: &mut ValidatorContext, who: &PeerId, data: &[u8]) + fn validate(&self, context: &mut dyn ValidatorContext, who: &PeerId, data: &[u8]) -> network_gossip::ValidationResult { let (action, broadcast_topics) = self.do_validate(who, data); @@ -684,6 +690,7 @@ impl network_gossip::Validator for GossipValidator match action { Action::Keep(topic, cb) => { self.report(who.clone(), cb); + context.broadcast_message(topic, data.to_vec(), false); network_gossip::ValidationResult::ProcessAndKeep(topic) } Action::ProcessAndDiscard(topic, cb) => { @@ -698,7 +705,7 @@ impl network_gossip::Validator for GossipValidator } fn message_allowed<'a>(&'a self) - -> Box bool + 'a> + -> Box bool + 'a> { let (inner, do_rebroadcast) = { use parking_lot::RwLockWriteGuard; @@ -756,7 +763,7 @@ impl network_gossip::Validator for GossipValidator }) } - fn message_expired<'a>(&'a self) -> Box bool + 'a> { + fn message_expired<'a>(&'a self) -> Box bool + 'a> { let inner = self.inner.read(); Box::new(move |topic, mut data| { // if the topic is not one of the ones that we are keeping at the moment, diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index ec7ed330ac0eb4365a42be179b1a443d56a98882..05033c2c41689f451fe09fdb9ba76b63295c2268 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -39,7 +39,7 @@ use substrate_primitives::{ed25519, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; use runtime_primitives::ConsensusEngineId; use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; -use network::{consensus_gossip as network_gossip, Service as NetworkService}; +use network::{consensus_gossip as network_gossip, NetworkService}; use network_gossip::ConsensusMessage; use crate::{Error, Message, SignedMessage, Commit, CompactCommit}; @@ -99,6 +99,12 @@ pub trait Network: Clone + Send + 'static { /// Only should be used in case of consensus stall. fn gossip_message(&self, topic: Block::Hash, data: Vec, force: bool); + /// Register a message with the gossip service, it isn't broadcast right + /// away to any peers, but may be sent to new peers joining or when asked to + /// broadcast the topic. Useful to register previous messages on node + /// startup. + fn register_gossip_message(&self, topic: Block::Hash, data: Vec); + /// Send a message to a bunch of specific peers, even if they've seen it already. fn send_message(&self, who: Vec, data: Vec); @@ -145,11 +151,21 @@ impl Network for Arc> where engine_id: GRANDPA_ENGINE_ID, data, }; + self.with_gossip( move |gossip, ctx| gossip.multicast(ctx, topic, msg, force) ) } + fn register_gossip_message(&self, topic: B::Hash, data: Vec) { + let msg = ConsensusMessage { + engine_id: GRANDPA_ENGINE_ID, + data, + }; + + self.with_gossip(move |gossip, _| gossip.register_message(topic, msg)) + } + fn send_message(&self, who: Vec, data: Vec) { let msg = ConsensusMessage { engine_id: GRANDPA_ENGINE_ID, @@ -212,9 +228,12 @@ pub(crate) struct NetworkBridge> { impl> NetworkBridge { /// Create a new NetworkBridge to the given NetworkService. Returns the service /// handle and a future that must be polled to completion to finish startup. + /// If a voter set state is given it registers previous round votes with the + /// gossip service. pub(crate) fn new( service: N, config: crate::Config, + set_state: Option<(u64, &crate::environment::VoterSetState)>, on_exit: impl Future + Clone + Send + 'static, ) -> ( Self, @@ -225,6 +244,41 @@ impl> NetworkBridge { let validator = Arc::new(validator); service.register_validator(validator.clone()); + if let Some((set_id, set_state)) = set_state { + // register all previous votes with the gossip service so that they're + // available to peers potentially stuck on a previous round. + for round in set_state.completed_rounds().iter() { + let topic = round_topic::(round.number, set_id); + + // we need to note the round with the gossip validator otherwise + // messages will be ignored. + validator.note_round(Round(round.number), SetId(set_id), |_, _| {}); + + for signed in round.votes.iter() { + let message = gossip::GossipMessage::VoteOrPrecommit( + gossip::VoteOrPrecommitMessage:: { + message: signed.clone(), + round: Round(round.number), + set_id: SetId(set_id), + } + ); + + service.register_gossip_message( + topic, + message.encode(), + ); + } + + trace!(target: "afg", + "Registered {} messages for topic {:?} (round: {}, set_id: {})", + round.votes.len(), + topic, + round.number, + set_id, + ); + } + } + let (rebroadcast_job, neighbor_sender) = periodic::neighbor_packet_worker(service.clone()); let reporting_job = report_stream.consume(service.clone()); @@ -704,7 +758,7 @@ impl> Sink for CommitsOut { let topic = global_topic::(self.set_id.0); // the gossip validator needs to be made aware of the best commit-height we know of - // before gosipping + // before gossiping self.gossip_validator.note_commit_finalized( commit.target_number, |to, neighbor| self.network.send_message( diff --git a/core/finality-grandpa/src/communication/tests.rs b/core/finality-grandpa/src/communication/tests.rs index 2ef6d280646a4214f8564cff99806ce6c50f1db0..f2b50ab80c2b6288db97a6416da27612b67f9a74 100644 --- a/core/finality-grandpa/src/communication/tests.rs +++ b/core/finality-grandpa/src/communication/tests.rs @@ -72,6 +72,15 @@ impl super::Network for TestNetwork { let _ = self.sender.unbounded_send(Event::SendMessage(who, data)); } + /// Register a message with the gossip service, it isn't broadcast right + /// away to any peers, but may be sent to new peers joining or when asked to + /// broadcast the topic. Useful to register previous messages on node + /// startup. + fn register_gossip_message(&self, _topic: Hash, _data: Vec) { + // NOTE: only required to restore previous state on startup + // not required for tests currently + } + /// Report a peer's cost or benefit after some action. fn report(&self, who: network::PeerId, cost_benefit: i32) { let _ = self.sender.unbounded_send(Event::Report(who, cost_benefit)); @@ -136,6 +145,7 @@ fn make_test_network() -> impl Future { let (bridge, startup_work) = super::NetworkBridge::new( net.clone(), config(), + None, Exit, ); diff --git a/core/finality-grandpa/src/consensus_changes.rs b/core/finality-grandpa/src/consensus_changes.rs index cbd7b30f8e7a5ebcb2883baf4ea0be20683357d6..02ac95124151d70a42368f0917430a0c0e6d449b 100644 --- a/core/finality-grandpa/src/consensus_changes.rs +++ b/core/finality-grandpa/src/consensus_changes.rs @@ -32,6 +32,11 @@ impl ConsensusChanges { impl ConsensusChanges { + /// Returns reference to all pending changes. + pub fn pending_changes(&self) -> &[(N, H)] { + &self.pending_changes + } + /// Note unfinalized change of consensus-related data. pub(crate) fn note_change(&mut self, at: (N, H)) { let idx = self.pending_changes diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 8f5db93cae9679c1708ee1943cf6ef80276e9516..4aab32be8a34ddae56304f078b28ed36714d99bf 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -34,7 +34,7 @@ use grandpa::{ }; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ - As, Block as BlockT, Header as HeaderT, NumberFor, One, Zero, BlockNumberToHash, + Block as BlockT, Header as HeaderT, NumberFor, One, Zero, BlockNumberToHash, }; use substrate_primitives::{Blake2Hasher, ed25519, H256, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; @@ -44,6 +44,8 @@ use crate::{ PrimaryPropose, SignedMessage, NewAuthoritySet, VoterCommand, }; +use consensus_common::SelectChain; + use crate::authorities::SharedAuthoritySet; use crate::consensus_changes::SharedConsensusChanges; use crate::justification::GrandpaJustification; @@ -99,6 +101,10 @@ impl CompletedRounds { CompletedRounds { inner } } + pub fn iter(&self) -> impl Iterator> { + self.inner.iter() + } + /// Returns the last (latest) completed round. pub fn last(&self) -> &CompletedRound { self.inner.back() @@ -262,8 +268,9 @@ impl SharedVoterSetState { } /// The environment we run GRANDPA in. -pub(crate) struct Environment, RA> { +pub(crate) struct Environment, RA, SC> { pub(crate) inner: Arc>, + pub(crate) select_chain: SC, pub(crate) voters: Arc>, pub(crate) config: Config, pub(crate) authority_set: SharedAuthoritySet>, @@ -273,7 +280,7 @@ pub(crate) struct Environment, RA> { pub(crate) voter_set_state: SharedVoterSetState, } -impl, RA> Environment { +impl, RA, SC> Environment { /// Updates the voter set state using the given closure. The write lock is /// held during evaluation of the closure and the environment's voter set /// state is set to its result if successful. @@ -289,12 +296,16 @@ impl, RA> Environment } } -impl, B, E, N, RA> grandpa::Chain> for Environment where +impl, B, E, N, RA, SC> + grandpa::Chain> +for Environment +where Block: 'static, B: Backend + 'static, E: CallExecutor + 'static, N: Network + 'static, N::In: 'static, + SC: SelectChain + 'static, NumberFor: BlockNumberOps, { fn ancestry(&self, base: Block::Hash, block: Block::Hash) -> Result, GrandpaError> { @@ -317,7 +328,7 @@ impl, B, E, N, RA> grandpa::Chain { let base_header = self.inner.header(&BlockId::Hash(block)).ok()? .expect("Header known to exist after `best_containing` call; qed"); @@ -376,6 +387,7 @@ impl, B, E, N, RA> grandpa::Chain, E, RA>( client: &Client, base: Block::Hash, @@ -387,6 +399,7 @@ pub(crate) fn ancestry, E, RA>( if base == block { return Err(GrandpaError::NotDescendent) } let tree_route_res = ::client::blockchain::tree_route( + #[allow(deprecated)] client.backend().blockchain(), BlockId::Hash(block), BlockId::Hash(base), @@ -411,13 +424,17 @@ pub(crate) fn ancestry, E, RA>( Ok(tree_route.retracted().iter().skip(1).map(|e| e.hash).collect()) } -impl, N, RA> voter::Environment> for Environment where +impl, N, RA, SC> + voter::Environment> +for Environment +where Block: 'static, B: Backend + 'static, E: CallExecutor + 'static + Send + Sync, N: Network + 'static + Send, N::In: 'static + Send, RA: 'static + Send + Sync, + SC: SelectChain + 'static, NumberFor: BlockNumberOps, { type Timer = Box + Send>; @@ -505,6 +522,7 @@ impl, N, RA> voter::Environment, N, RA> voter::Environment, N, RA> voter::Environment, N, RA> voter::Environment, N, RA> voter::Environment, round: u64, commit: Commit) -> Result<(), Self::Error> { use client::blockchain::HeaderBackend; - let status = self.inner.backend().blockchain().info()?; - if number <= status.finalized_number && self.inner.backend().blockchain().hash(number)? == Some(hash) { + #[allow(deprecated)] + let blockchain = self.inner.backend().blockchain(); + let status = blockchain.info(); + if number <= status.finalized_number && blockchain.hash(number)? == Some(hash) { // This can happen after a forced change (triggered by the finality tracker when finality is stalled), since // the voter will be restarted at the median last finalized block, which can be lower than the local best // finalized block. @@ -657,7 +680,7 @@ impl, N, RA> voter::Environment, E, RA>( // finalization to remote nodes if !justification_required { if let Some(justification_period) = justification_period { - let last_finalized_number = client.info()?.chain.finalized_number; + let last_finalized_number = client.info().chain.finalized_number; justification_required = (!last_finalized_number.is_zero() || number - last_finalized_number == justification_period) && (last_finalized_number / justification_period != number / justification_period); @@ -958,6 +981,7 @@ where B: Backend, } let tree_route = client::blockchain::tree_route( + #[allow(deprecated)] client.backend().blockchain(), BlockId::Hash(*hash), BlockId::Hash(*base), diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index a3147ce33810383f6c5dd60193e0b0fb784c031e..875a60e8e095fa2080f2701677cee280033ebbd5 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -17,254 +17,613 @@ //! GRANDPA block finality proof generation and check. //! //! Finality of block B is proved by providing: -//! 1) valid headers sub-chain from the block B to the block F; -//! 2) valid (with respect to proved authorities) GRANDPA justification of the block F; -//! 3) proof-of-execution of the `grandpa_authorities` call at the block F. +//! 1) the justification for the descendant block F; +//! 2) headers sub-chain (B; F] if B != F; +//! 3) proof of GRANDPA::authorities() if the set changes at block F. //! //! Since earliest possible justification is returned, the GRANDPA authorities set //! at the block F is guaranteed to be the same as in the block B (this is because block //! that enacts new GRANDPA authorities set always comes with justification). It also //! means that the `set_id` is the same at blocks B and F. //! -//! The caller should track the `set_id`. The most straightforward way is to fetch finality -//! proofs ONLY for blocks on the tip of the chain and track the latest known `set_id`. +//! Let U be the last finalized block known to caller. If authorities set has changed several +//! times in the (U; F] interval, multiple finality proof fragments are returned (one for each +//! authority set change) and they must be verified in-order. +//! +//! Finality proof provider can choose how to provide finality proof on its own. The incomplete +//! finality proof (that finalizes some block C that is ancestor of the B and descendant +//! of the U) could be returned. -use grandpa::voter_set::VoterSet; +use std::sync::Arc; +use log::{trace, warn}; use client::{ - blockchain::Backend as BlockchainBackend, + backend::Backend, blockchain::Backend as BlockchainBackend, CallExecutor, Client, error::{Error as ClientError, Result as ClientResult}, - light::fetcher::RemoteCallRequest, + light::fetcher::{FetchChecker, RemoteCallRequest}, + ExecutionStrategy, NeverOffchainExt, }; use parity_codec::{Encode, Decode}; use grandpa::BlockNumberOps; -use runtime_primitives::generic::BlockId; +use runtime_primitives::{Justification, generic::BlockId}; use runtime_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, One, }; -use substrate_primitives::{ed25519, H256}; +use substrate_primitives::{ed25519, H256, Blake2Hasher}; use ed25519::Public as AuthorityId; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use crate::justification::GrandpaJustification; -/// Prepare proof-of-finality for the given block. +/// Maximum number of fragments that we want to return in a single prove_finality call. +const MAX_FRAGMENTS_IN_PROOF: usize = 8; + +/// GRANDPA authority set related methods for the finality proof provider. +pub trait AuthoritySetForFinalityProver: Send + Sync { + /// Call GrandpaApi::grandpa_authorities at given block. + fn authorities(&self, block: &BlockId) -> ClientResult>; + /// Prove call of GrandpaApi::grandpa_authorities at given block. + fn prove_authorities(&self, block: &BlockId) -> ClientResult>>; +} + +/// Client-based implementation of AuthoritySetForFinalityProver. +impl, RA> AuthoritySetForFinalityProver for Client + where + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, +{ + fn authorities(&self, block: &BlockId) -> ClientResult> { + self.executor().call( + block, + "GrandpaApi_grandpa_authorities", + &[], + ExecutionStrategy::NativeElseWasm, + NeverOffchainExt::new(), + ).and_then(|call_result| Decode::decode(&mut &call_result[..]) + .ok_or_else(|| ClientError::CallResultDecode( + "failed to decode GRANDPA authorities set proof".into(), + ))) + } + + fn prove_authorities(&self, block: &BlockId) -> ClientResult>> { + self.execution_proof(block, "GrandpaApi_grandpa_authorities",&[]).map(|(_, proof)| proof) + } +} + +/// GRANDPA authority set related methods for the finality proof checker. +pub trait AuthoritySetForFinalityChecker: Send + Sync { + /// Check execution proof of Grandpa::grandpa_authorities at given block. + fn check_authorities_proof( + &self, + hash: Block::Hash, + header: Block::Header, + proof: Vec>, + ) -> ClientResult>; +} + +/// FetchChecker-based implementation of AuthoritySetForFinalityChecker. +impl AuthoritySetForFinalityChecker for Arc> { + fn check_authorities_proof( + &self, + hash: Block::Hash, + header: Block::Header, + proof: Vec>, + ) -> ClientResult> { + let request = RemoteCallRequest { + block: hash, + header, + method: "GrandpaApi_grandpa_authorities".into(), + call_data: vec![], + retry_count: None, + }; + + self.check_execution_proof(&request, proof) + .and_then(|authorities| { + let authorities: Vec<(AuthorityId, u64)> = Decode::decode(&mut &authorities[..]) + .ok_or_else(|| ClientError::CallResultDecode( + "failed to decode GRANDPA authorities set proof".into(), + ))?; + Ok(authorities.into_iter().collect()) + }) + } +} + +/// Finality proof provider for serving network requests. +pub struct FinalityProofProvider, RA> { + client: Arc>, + authority_provider: Arc>, +} + +impl, RA> FinalityProofProvider + where + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, +{ + /// Create new finality proof provider using: + /// + /// - client for accessing blockchain data; + /// - authority_provider for calling and proving runtime methods. + pub fn new( + client: Arc>, + authority_provider: Arc>, + ) -> Self { + FinalityProofProvider { client, authority_provider } + } +} + +impl network::FinalityProofProvider for FinalityProofProvider + where + Block: BlockT, + NumberFor: BlockNumberOps, + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, +{ + fn prove_finality( + &self, + for_block: Block::Hash, + request: &[u8], + ) -> Result>, ClientError> { + let request: FinalityProofRequest = Decode::decode(&mut &request[..]) + .ok_or_else(|| { + warn!(target: "finality", "Unable to decode finality proof request."); + ClientError::Backend(format!("Invalid finality proof request")) + })?; + match request { + FinalityProofRequest::Original(request) => prove_finality::<_, _, GrandpaJustification>( + #[allow(deprecated)] + &*self.client.backend().blockchain(), + &*self.authority_provider, + request.authorities_set_id, + request.last_finalized, + for_block, + ), + } + } +} + +/// The effects of block finality. +#[derive(Debug, PartialEq)] +pub struct FinalityEffects { + /// The (ordered) set of headers that could be imported. + pub headers_to_import: Vec

, + /// The hash of the block that could be finalized. + pub block: Header::Hash, + /// The justification for the block. + pub justification: Vec, + /// New authorities set id that should be applied starting from block. + pub new_set_id: u64, + /// New authorities set that should be applied starting from block. + pub new_authorities: Vec<(AuthorityId, u64)>, +} + +/// Single fragment of proof-of-finality. /// -/// The proof is the serialized `FinalityProof` constructed using earliest known -/// justification of the block. None is returned if there's no known justification atm. -pub fn prove_finality( +/// Finality for block B is proved by providing: +/// 1) the justification for the descendant block F; +/// 2) headers sub-chain (B; F] if B != F; +/// 3) proof of GRANDPA::authorities() if the set changes at block F. +#[derive(Debug, PartialEq, Encode, Decode)] +struct FinalityProofFragment { + /// The hash of block F for which justification is provided. + pub block: Header::Hash, + /// Justification of the block F. + pub justification: Vec, + /// The set of headers in the range (U; F] that we believe are unknown to the caller. Ordered. + pub unknown_headers: Vec
, + /// Optional proof of execution of GRANDPA::authorities(). + pub authorities_proof: Option>>, +} + +/// Proof of finality is the ordered set of finality fragments, where: +/// - last fragment provides justification for the best possible block from the requested range; +/// - all other fragments provide justifications for GRANDPA authorities set changes within requested range. +type FinalityProof
= Vec>; + +/// Finality proof request data. +#[derive(Debug, Encode, Decode)] +enum FinalityProofRequest { + /// Original version of the request. + Original(OriginalFinalityProofRequest), +} + +/// Original version of finality proof request. +#[derive(Debug, Encode, Decode)] +struct OriginalFinalityProofRequest { + /// The authorities set id we are waiting proof from. + /// + /// The first justification in the proof must be signed by this authority set. + pub authorities_set_id: u64, + /// Hash of the last known finalized block. + pub last_finalized: H, +} + +/// Prepare data blob associated with finality proof request. +pub(crate) fn make_finality_proof_request(last_finalized: H, authorities_set_id: u64) -> Vec { + FinalityProofRequest::Original(OriginalFinalityProofRequest { + authorities_set_id, + last_finalized, + }).encode() +} + +/// Prepare proof-of-finality for the best possible block in the range: (begin; end]. +/// +/// It is assumed that the caller already have a proof-of-finality for the block 'begin'. +/// It is assumed that the caller already knows all blocks in the range (begin; end]. +/// +/// Returns None if there are no finalized blocks unknown to the caller. +pub(crate) fn prove_finality, B: BlockchainBackend, J>( blockchain: &B, - generate_execution_proof: G, - block: Block::Hash, + authorities_provider: &dyn AuthoritySetForFinalityProver, + authorities_set_id: u64, + begin: Block::Hash, + end: Block::Hash, ) -> ::client::error::Result>> where - B: BlockchainBackend, - G: Fn(&BlockId, &str, &[u8]) -> ClientResult>>, + J: ProvableJustification, { - let block_id = BlockId::Hash(block); - let mut block_number = blockchain.expect_block_number_from_id(&block_id)?; + let begin_id = BlockId::Hash(begin); + let begin_number = blockchain.expect_block_number_from_id(&begin_id)?; + + // early-return if we sure that there are no blocks finalized AFTER begin block + let info = blockchain.info(); + if info.finalized_number <= begin_number { + trace!( + target: "finality", + "Requested finality proof for descendant of #{} while we only have finalized #{}. Returning empty proof.", + begin_number, + info.finalized_number, + ); - // early-return if we sure that the block isn't finalized yet - let info = blockchain.info()?; - if info.finalized_number < block_number { return Ok(None); } + // check if blocks range is valid. It is the caller responsibility to ensure + // that it only asks peers that know about whole blocks range + let end_number = blockchain.expect_block_number_from_id(&BlockId::Hash(end))?; + if begin_number + One::one() > end_number { + return Err(ClientError::Backend( + format!("Cannot generate finality proof for invalid range: {}..{}", begin_number, end_number), + )); + } + // early-return if we sure that the block is NOT a part of canonical chain - let canonical_block = blockchain.expect_block_hash_from_id(&BlockId::Number(block_number))?; - if block != canonical_block { + let canonical_begin = blockchain.expect_block_hash_from_id(&BlockId::Number(begin_number))?; + if begin != canonical_begin { return Err(ClientError::Backend( - "Cannot generate finality proof for non-canonical block".into() - ).into()); - } - - // now that we know that the block is finalized, we can generate finalization proof - - // we need to prove grandpa authorities set that has generated justification - // BUT since `GrandpaApi::grandpa_authorities` call returns the set that becames actual - // at the next block, the proof-of execution is generated using parent block' state - // (this will fail if we're trying to prove genesis finality, but such the call itself is redundant) - let mut current_header = blockchain.expect_header(BlockId::Hash(block))?; - let parent_block_id = BlockId::Hash(*current_header.parent_hash()); - let authorities_proof = generate_execution_proof( - &parent_block_id, - "GrandpaApi_grandpa_authorities", - &[], - )?; - - // search for earliest post-block (inclusive) justification - let mut finalization_path = Vec::new(); + format!("Cannot generate finality proof for non-canonical block: {}", begin), + )); + } + + // iterate justifications && try to prove finality + let mut fragment_index = 0; + let mut current_authorities = authorities_provider.authorities(&begin_id)?; + let mut current_number = begin_number + One::one(); + let mut finality_proof = Vec::new(); + let mut unknown_headers = Vec::new(); + let mut latest_proof_fragment = None; loop { - finalization_path.push(current_header); + let current_id = BlockId::Number(current_number); - match blockchain.justification(BlockId::Number(block_number))? { - Some(justification) => return Ok(Some(FinalityProof { - finalization_path, + // check if header is unknown to the caller + if current_number > end_number { + let unknown_header = blockchain.expect_header(current_id)?; + unknown_headers.push(unknown_header); + } + + if let Some(justification) = blockchain.justification(current_id)? { + // check if the current block enacts new GRANDPA authorities set + let parent_id = BlockId::Number(current_number - One::one()); + let new_authorities = authorities_provider.authorities(&parent_id)?; + let new_authorities_proof = if current_authorities != new_authorities { + current_authorities = new_authorities; + Some(authorities_provider.prove_authorities(&parent_id)?) + } else { + None + }; + + // prepare finality proof for the current block + let current = blockchain.expect_block_hash_from_id(&BlockId::Number(current_number))?; + let proof_fragment = FinalityProofFragment { + block: current, justification, - authorities_proof, - }.encode())), - None if block_number == info.finalized_number => break, - None => { - block_number = block_number + One::one(); - current_header = blockchain.expect_header(BlockId::Number(block_number))?; - }, + unknown_headers: ::std::mem::replace(&mut unknown_headers, Vec::new()), + authorities_proof: new_authorities_proof, + }; + + // append justification to finality proof if required + let justifies_end_block = current_number >= end_number; + let justifies_authority_set_change = proof_fragment.authorities_proof.is_some(); + if justifies_end_block || justifies_authority_set_change { + // check if the proof is generated by the requested authority set + if finality_proof.is_empty() { + let justification_check_result = J::decode_and_verify( + &proof_fragment.justification, + authorities_set_id, + ¤t_authorities, + ); + if justification_check_result.is_err() { + trace!( + target: "finality", + "Can not provide finality proof with requested set id #{}\ + (possible forced change?). Returning empty proof.", + authorities_set_id, + ); + + return Ok(None); + } + } + + finality_proof.push(proof_fragment); + latest_proof_fragment = None; + } else { + latest_proof_fragment = Some(proof_fragment); + } + + // we don't need to provide more justifications + if justifies_end_block { + break; + } } + + // we can't provide more justifications + if current_number == info.finalized_number { + // append last justification - even if we can't generate finality proof for + // the end block, we try to generate it for the latest possible block + if let Some(latest_proof_fragment) = latest_proof_fragment.take() { + finality_proof.push(latest_proof_fragment); + + fragment_index += 1; + if fragment_index == MAX_FRAGMENTS_IN_PROOF { + break; + } + } + break; + } + + // else search for the next justification + current_number = current_number + One::one(); } - Err(ClientError::Backend( - "cannot find justification for finalized block".into() - ).into()) + if finality_proof.is_empty() { + trace!( + target: "finality", + "No justifications found when making finality proof for {}. Returning empty proof.", + end, + ); + + Ok(None) + } else { + trace!( + target: "finality", + "Built finality proof for {} of {} fragments. Last fragment for {}.", + end, + finality_proof.len(), + finality_proof.last().expect("checked that !finality_proof.is_empty(); qed").block, + ); + + Ok(Some(finality_proof.encode())) + } } -/// Check proof-of-finality for the given block. +/// Check GRANDPA proof-of-finality for the given block. /// -/// Returns the vector of headers (including `block` header, ordered by ASC block number) that MUST be -/// validated + imported at once (i.e. within single db transaction). If at least one of those headers -/// is invalid, all other MUST be considered invalid. -pub fn check_finality_proof, C>( - check_execution_proof: C, - parent_header: Block::Header, - block: (NumberFor, Block::Hash), - set_id: u64, +/// Returns the vector of headers that MUST be validated + imported +/// AND if at least one of those headers is invalid, all other MUST be considered invalid. +pub(crate) fn check_finality_proof, B>( + blockchain: &B, + current_set_id: u64, + current_authorities: Vec<(AuthorityId, u64)>, + authorities_provider: &dyn AuthoritySetForFinalityChecker, remote_proof: Vec, -) -> ClientResult> +) -> ClientResult> where - NumberFor: grandpa::BlockNumberOps, - C: Fn(&RemoteCallRequest) -> ClientResult>, + NumberFor: BlockNumberOps, + B: BlockchainBackend, { - do_check_finality_proof::>( - check_execution_proof, - parent_header, - block, - set_id, - remote_proof, - ) + do_check_finality_proof::<_, _, GrandpaJustification>( + blockchain, + current_set_id, + current_authorities, + authorities_provider, + remote_proof) } -/// Check proof-of-finality using given justification type. -fn do_check_finality_proof, C, J>( - check_execution_proof: C, - parent_header: Block::Header, - block: (NumberFor, Block::Hash), - set_id: u64, +fn do_check_finality_proof, B, J>( + blockchain: &B, + current_set_id: u64, + current_authorities: Vec<(AuthorityId, u64)>, + authorities_provider: &dyn AuthoritySetForFinalityChecker, remote_proof: Vec, -) -> ClientResult> +) -> ClientResult> where - NumberFor: grandpa::BlockNumberOps, - C: Fn(&RemoteCallRequest) -> ClientResult>, + NumberFor: BlockNumberOps, + B: BlockchainBackend, J: ProvableJustification, { // decode finality proof - let proof = FinalityProof::::decode(&mut &remote_proof[..]) + let proof = FinalityProof::::decode(&mut &remote_proof[..]) .ok_or_else(|| ClientError::BadJustification("failed to decode finality proof".into()))?; - // check that the first header in finalization path is the block itself - { - let finalized_header = proof.finalization_path.first() - .ok_or_else(|| ClientError::from(ClientError::BadJustification( - "finality proof: finalized path is empty".into() - )))?; - if *finalized_header.number() != block.0 || finalized_header.hash() != block.1 { - return Err(ClientError::BadJustification( - "finality proof: block is not a part of finalized path".into() - ).into()); - } + // empty proof can't prove anything + if proof.is_empty() { + return Err(ClientError::BadJustification("empty proof of finality".into())); } - // check that the last header in finalization path is the justification target block - let just_block = proof.justification.target_block(); - { - let finalized_header = proof.finalization_path.last() - .expect("checked above that proof.finalization_path is not empty; qed"); - if *finalized_header.number() != just_block.0 || finalized_header.hash() != just_block.1 { - return Err(ClientError::BadJustification( - "finality proof: target justification block is not a part of finalized path".into() - ).into()); + // iterate and verify proof fragments + let last_fragment_index = proof.len() - 1; + let mut authorities = AuthoritiesOrEffects::Authorities(current_set_id, current_authorities); + for (proof_fragment_index, proof_fragment) in proof.into_iter().enumerate() { + // check that proof is non-redundant. The proof still can be valid, but + // we do not want peer to spam us with redundant data + if proof_fragment_index != last_fragment_index { + let has_unknown_headers = !proof_fragment.unknown_headers.is_empty(); + let has_new_authorities = proof_fragment.authorities_proof.is_some(); + if has_unknown_headers || !has_new_authorities { + return Err(ClientError::BadJustification("redundant proof of finality".into())); + } } - } - // check authorities set proof && get grandpa authorities that should have signed justification - let grandpa_authorities = check_execution_proof(&RemoteCallRequest { - block: just_block.1, - header: parent_header, - method: "GrandpaApi_grandpa_authorities".into(), - call_data: vec![], - retry_count: None, - })?; - let grandpa_authorities: Vec<(AuthorityId, u64)> = Decode::decode(&mut &grandpa_authorities[..]) - .ok_or_else(|| ClientError::BadJustification("failed to decode GRANDPA authorities set proof".into()))?; + authorities = check_finality_proof_fragment::<_, _, J>( + blockchain, + authorities, + authorities_provider, + proof_fragment)?; + } - // and now check justification - proof.justification.verify(set_id, &grandpa_authorities.into_iter().collect())?; + let effects = authorities.extract_effects().expect("at least one loop iteration is guaranteed + because proof is not empty;\ + check_finality_proof_fragment is called on every iteration;\ + check_finality_proof_fragment always returns FinalityEffects;\ + qed"); telemetry!(CONSENSUS_INFO; "afg.finality_proof_ok"; - "set_id" => ?set_id, "finalized_header_hash" => ?block.1); - Ok(proof.finalization_path) + "set_id" => ?effects.new_set_id, "finalized_header_hash" => ?effects.block); + + Ok(effects) } -/// Proof of finality. -/// -/// Finality of block B is proved by providing: -/// 1) valid headers sub-chain from the block B to the block F; -/// 2) proof of `GrandpaApi::grandpa_authorities()` call at the block F; -/// 3) valid (with respect to proved authorities) GRANDPA justification of the block F. -#[derive(Debug, PartialEq, Encode, Decode)] -struct FinalityProof { - /// Headers-path (ordered by block number, ascending) from the block we're gathering proof for - /// (inclusive) to the target block of the justification (inclusive). - pub finalization_path: Vec
, - /// Justification (finalization) of the last block from the `finalization_path`. - pub justification: Justification, - /// Proof of `GrandpaApi::grandpa_authorities` call execution at the - /// justification' target block. - pub authorities_proof: Vec>, +/// Check finality proof for the single block. +fn check_finality_proof_fragment, B, J>( + blockchain: &B, + authority_set: AuthoritiesOrEffects, + authorities_provider: &dyn AuthoritySetForFinalityChecker, + proof_fragment: FinalityProofFragment, +) -> ClientResult> + where + NumberFor: BlockNumberOps, + B: BlockchainBackend, + J: Decode + ProvableJustification, +{ + // verify justification using previous authorities set + let (mut current_set_id, mut current_authorities) = authority_set.extract_authorities(); + let justification: J = Decode::decode(&mut &proof_fragment.justification[..]) + .ok_or_else(|| ClientError::JustificationDecode)?; + justification.verify(current_set_id, ¤t_authorities)?; + + // and now verify new authorities proof (if provided) + if let Some(new_authorities_proof) = proof_fragment.authorities_proof { + // it is safe to query header here, because its non-finality proves that it can't be pruned + let header = blockchain.expect_header(BlockId::Hash(proof_fragment.block))?; + let parent_hash = *header.parent_hash(); + let parent_header = blockchain.expect_header(BlockId::Hash(parent_hash))?; + current_authorities = authorities_provider.check_authorities_proof( + parent_hash, + parent_header, + new_authorities_proof, + )?; + + current_set_id = current_set_id + 1; + } + + Ok(AuthoritiesOrEffects::Effects(FinalityEffects { + headers_to_import: proof_fragment.unknown_headers, + block: proof_fragment.block, + justification: proof_fragment.justification, + new_set_id: current_set_id, + new_authorities: current_authorities, + })) } -/// Justification used to prove block finality. -trait ProvableJustification: Encode + Decode { - /// Get target block of this justification. - fn target_block(&self) -> (Header::Number, Header::Hash); +/// Authorities set from initial authorities set or finality effects. +enum AuthoritiesOrEffects { + Authorities(u64, Vec<(AuthorityId, u64)>), + Effects(FinalityEffects
), +} +impl AuthoritiesOrEffects
{ + pub fn extract_authorities(self) -> (u64, Vec<(AuthorityId, u64)>) { + match self { + AuthoritiesOrEffects::Authorities(set_id, authorities) => (set_id, authorities), + AuthoritiesOrEffects::Effects(effects) => (effects.new_set_id, effects.new_authorities), + } + } + + pub fn extract_effects(self) -> Option> { + match self { + AuthoritiesOrEffects::Authorities(_, _) => None, + AuthoritiesOrEffects::Effects(effects) => Some(effects), + } + } +} + +/// Justification used to prove block finality. +pub(crate) trait ProvableJustification: Encode + Decode { /// Verify justification with respect to authorities set and authorities set id. - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()>; + fn verify(&self, set_id: u64, authorities: &[(AuthorityId, u64)]) -> ClientResult<()>; + + /// Decode and verify justification. + fn decode_and_verify( + justification: &Justification, + set_id: u64, + authorities: &[(AuthorityId, u64)], + ) -> ClientResult { + let justification = Self::decode(&mut &**justification).ok_or(ClientError::JustificationDecode)?; + justification.verify(set_id, authorities)?; + Ok(justification) + } } impl> ProvableJustification for GrandpaJustification where NumberFor: BlockNumberOps, { - fn target_block(&self) -> (NumberFor, Block::Hash) { - (self.commit.target_number, self.commit.target_hash) - } - - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()> { - GrandpaJustification::verify(self, set_id, authorities) + fn verify(&self, set_id: u64, authorities: &[(AuthorityId, u64)]) -> ClientResult<()> { + GrandpaJustification::verify(self, set_id, &authorities.iter().cloned().collect()) } } #[cfg(test)] -mod tests { - use test_client::runtime::{Block, Header}; - use test_client::client::backend::NewBlockState; +pub(crate) mod tests { + use test_client::runtime::{Block, Header, H256}; + use test_client::client::{backend::NewBlockState}; use test_client::client::in_mem::Blockchain as InMemoryBlockchain; use super::*; - type FinalityProof = super::FinalityProof>; + type FinalityProof = super::FinalityProof
; + + impl AuthoritySetForFinalityProver for (GetAuthorities, ProveAuthorities) + where + GetAuthorities: Send + Sync + Fn(BlockId) -> ClientResult>, + ProveAuthorities: Send + Sync + Fn(BlockId) -> ClientResult>>, + { + fn authorities(&self, block: &BlockId) -> ClientResult> { + self.0(*block) + } - #[derive(Encode, Decode)] - struct ValidFinalityProof(Vec); + fn prove_authorities(&self, block: &BlockId) -> ClientResult>> { + self.1(*block) + } + } - impl ProvableJustification
for ValidFinalityProof { - fn target_block(&self) -> (u64, H256) { (3, header(3).hash()) } + struct ClosureAuthoritySetForFinalityChecker(pub Closure); - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()> { - assert_eq!(set_id, 1); - assert_eq!(authorities, &vec![ - (AuthorityId([1u8; 32]), 1), - (AuthorityId([2u8; 32]), 2), - (AuthorityId([3u8; 32]), 3), - ].into_iter().collect()); - Ok(()) + impl AuthoritySetForFinalityChecker for ClosureAuthoritySetForFinalityChecker + where + Closure: Send + Sync + Fn(H256, Header, Vec>) -> ClientResult>, + { + fn check_authorities_proof( + &self, + hash: H256, + header: Header, + proof: Vec>, + ) -> ClientResult> { + self.0(hash, header, proof) + } + } + + #[derive(Debug, PartialEq, Encode, Decode)] + pub struct TestJustification(pub bool, pub Vec); + + impl ProvableJustification
for TestJustification { + fn verify(&self, _set_id: u64, _authorities: &[(AuthorityId, u64)]) -> ClientResult<()> { + if self.0 { + Ok(()) + } else { + Err(ClientError::BadJustification("test".into())) + } } } @@ -277,7 +636,23 @@ mod tests { } fn side_header(number: u64) -> Header { - Header::new(number, H256::from_low_u64_be(0), H256::from_low_u64_be(1), header(number - 1).hash(), Default::default()) + Header::new( + number, + H256::from_low_u64_be(0), + H256::from_low_u64_be(1), + header(number - 1).hash(), + Default::default(), + ) + } + + fn second_side_header(number: u64) -> Header { + Header::new( + number, + H256::from_low_u64_be(0), + H256::from_low_u64_be(1), + side_header(number - 1).hash(), + Default::default(), + ) } fn test_blockchain() -> InMemoryBlockchain { @@ -290,13 +665,42 @@ mod tests { } #[test] - fn finality_proof_is_not_generated_for_non_final_block() { + fn finality_prove_fails_with_invalid_range() { + let blockchain = test_blockchain(); + + // their last finalized is: 2 + // they request for proof-of-finality of: 2 + // => range is invalid + prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| unreachable!("should return before calling GetAuthorities"), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(2).hash(), + header(2).hash(), + ).unwrap_err(); + } + + #[test] + fn finality_proof_is_none_if_no_more_last_finalized_blocks() { let blockchain = test_blockchain(); blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Best).unwrap(); - // when asking for finality of block 4, None is returned - let proof_of_4 = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(4).hash()) - .unwrap(); + // our last finalized is: 3 + // their last finalized is: 3 + // => we can't provide any additional justifications + let proof_of_4 = prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| unreachable!("should return before calling GetAuthorities"), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(4).hash(), + ).unwrap(); assert_eq!(proof_of_4, None); } @@ -305,128 +709,279 @@ mod tests { let blockchain = test_blockchain(); blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Best).unwrap(); blockchain.insert(side_header(4).hash(), side_header(4), None, None, NewBlockState::Best).unwrap(); + blockchain.insert(second_side_header(5).hash(), second_side_header(5), None, None, NewBlockState::Best) + .unwrap(); blockchain.insert(header(5).hash(), header(5), Some(vec![5]), None, NewBlockState::Final).unwrap(); - // when asking for finality of side-block 42, None is returned - let proof_of_side_4_fails = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), H256::from_low_u64_be(42)).is_err(); - assert_eq!(proof_of_side_4_fails, true); + // chain is 1 -> 2 -> 3 -> 4 -> 5 + // \> 4' -> 5' + // and the best finalized is 5 + // => when requesting for (4'; 5'], error is returned + prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| unreachable!("should return before calling GetAuthorities"), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + side_header(4).hash(), + second_side_header(5).hash(), + ).unwrap_err(); } #[test] - fn finality_proof_fails_if_no_justification_known() { + fn finality_proof_is_none_if_no_justification_known() { let blockchain = test_blockchain(); blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Final).unwrap(); - // when asking for finality of block 4, search for justification failing - let proof_of_4_fails = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), H256::from_low_u64_be(42)).is_err(); - assert_eq!(proof_of_4_fails, true); + // block 4 is finalized without justification + // => we can't prove finality + let proof_of_4 = prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("authorities didn't change => ProveAuthorities won't be called"), + ), + 0, + header(3).hash(), + header(4).hash(), + ).unwrap(); + assert_eq!(proof_of_4, None); } #[test] - fn prove_finality_is_generated() { + fn finality_proof_works_without_authorities_change() { let blockchain = test_blockchain(); + let just4 = TestJustification(true, vec![4]).encode(); + let just5 = TestJustification(true, vec![5]).encode(); + blockchain.insert(header(4).hash(), header(4), Some(just4), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(5).hash(), header(5), Some(just5.clone()), None, NewBlockState::Final).unwrap(); + + // blocks 4 && 5 are finalized with justification + // => since authorities are the same, we only need justification for 5 + let proof_of_5: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(5).hash(), + ).unwrap().unwrap()[..]).unwrap(); + assert_eq!(proof_of_5, vec![FinalityProofFragment { + block: header(5).hash(), + justification: just5, + unknown_headers: Vec::new(), + authorities_proof: None, + }]); + } - // when asking for finality of block 2, justification of 3 is returned - let proof_of_2: FinalityProof = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(2).hash()) - .unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - assert_eq!(proof_of_2, FinalityProof { - finalization_path: vec![header(2), header(3)], - justification: vec![3], - authorities_proof: vec![vec![42]], - }); + #[test] + fn finality_proof_finalized_earlier_block_if_no_justification_for_target_is_known() { + let blockchain = test_blockchain(); + blockchain.insert(header(4).hash(), header(4), Some(vec![4]), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(5).hash(), header(5), None, None, NewBlockState::Final).unwrap(); + + // block 4 is finalized with justification + we request for finality of 5 + // => we can't prove finality of 5, but providing finality for 4 is still useful for requester + let proof_of_5: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(5).hash(), + ).unwrap().unwrap()[..]).unwrap(); + assert_eq!(proof_of_5, vec![FinalityProofFragment { + block: header(4).hash(), + justification: vec![4], + unknown_headers: Vec::new(), + authorities_proof: None, + }]); + } - // when asking for finality of block 3, justification of 3 is returned - let proof_of_3: FinalityProof = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(3).hash()) - .unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - assert_eq!(proof_of_3, FinalityProof { - finalization_path: vec![header(3)], - justification: vec![3], - authorities_proof: vec![vec![42]], - }); + #[test] + fn finality_proof_works_with_authorities_change() { + let blockchain = test_blockchain(); + let just4 = TestJustification(true, vec![4]).encode(); + let just5 = TestJustification(true, vec![5]).encode(); + let just7 = TestJustification(true, vec![7]).encode(); + blockchain.insert(header(4).hash(), header(4), Some(just4), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(5).hash(), header(5), Some(just5.clone()), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(6).hash(), header(6), None, None, NewBlockState::Final).unwrap(); + blockchain.insert(header(7).hash(), header(7), Some(just7.clone()), None, NewBlockState::Final).unwrap(); + + // when querying for finality of 6, we assume that the #6 is the last block known to the requester + // => since we only have justification for #7, we provide #7 + let proof_of_6: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |block_id| match block_id { + BlockId::Hash(h) if h == header(3).hash() => Ok(vec![(AuthorityId::from_raw([3u8; 32]), 1u64)]), + BlockId::Number(3) => Ok(vec![(AuthorityId::from_raw([3u8; 32]), 1u64)]), + BlockId::Number(4) => Ok(vec![(AuthorityId::from_raw([4u8; 32]), 1u64)]), + BlockId::Number(6) => Ok(vec![(AuthorityId::from_raw([6u8; 32]), 1u64)]), + _ => unreachable!("no other authorities should be fetched: {:?}", block_id), + }, + |block_id| match block_id { + BlockId::Number(4) => Ok(vec![vec![40]]), + BlockId::Number(6) => Ok(vec![vec![60]]), + _ => unreachable!("no other authorities should be proved: {:?}", block_id), + }, + ), + 0, + header(3).hash(), + header(6).hash(), + ).unwrap().unwrap()[..]).unwrap(); + // initial authorities set (which start acting from #4) is [3; 32] + assert_eq!(proof_of_6, vec![ + // new authorities set starts acting from #5 => we do not provide fragment for #4 + // first fragment provides justification for #5 && authorities set that starts acting from #5 + FinalityProofFragment { + block: header(5).hash(), + justification: just5, + unknown_headers: Vec::new(), + authorities_proof: Some(vec![vec![40]]), + }, + // last fragment provides justification for #7 && unknown#7 + FinalityProofFragment { + block: header(7).hash(), + justification: just7, + unknown_headers: vec![header(7)], + authorities_proof: Some(vec![vec![60]]), + }, + ]); } #[test] - fn finality_proof_check_fails_when_block_is_not_included() { - let mut proof_of_2: FinalityProof = prove_finality( - &test_blockchain(), - |_, _, _| Ok(vec![vec![42]]), - header(2).hash(), - ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - proof_of_2.finalization_path.remove(0); - - // block for which we're trying to request finality proof is missing from finalization_path - assert_eq!(do_check_finality_proof::( - |_| Ok(Vec::::new().encode()), - header(1), - (2, header(2).hash()), + fn finality_proof_check_fails_when_proof_decode_fails() { + let blockchain = test_blockchain(); + + // when we can't decode proof from Vec + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2.encode(), - ).is_err(), true); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + vec![42], + ).unwrap_err(); } #[test] - fn finality_proof_check_fails_when_justified_block_is_not_included() { - let mut proof_of_2: FinalityProof = prove_finality( - &test_blockchain(), - |_, _, _| Ok(vec![vec![42]]), - header(2).hash(), - ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - proof_of_2.finalization_path.remove(1); - - // justified block is missing from finalization_path - assert_eq!(do_check_finality_proof::( - |_| Ok(Vec::::new().encode()), - header(1), - (2, header(2).hash()), + fn finality_proof_check_fails_when_proof_is_empty() { + let blockchain = test_blockchain(); + + // when decoded proof has zero length + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2.encode(), - ).is_err(), true); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + Vec::::new().encode(), + ).unwrap_err(); } #[test] - fn finality_proof_check_fails_when_justification_verification_fails() { - #[derive(Encode, Decode)] - struct InvalidFinalityProof(Vec); + fn finality_proof_check_fails_when_intemediate_fragment_has_unknown_headers() { + let blockchain = test_blockchain(); - impl ProvableJustification
for InvalidFinalityProof { - fn target_block(&self) -> (u64, H256) { (3, header(3).hash()) } + // when intermediate (#0) fragment has non-empty unknown headers + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, + 1, + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + vec![FinalityProofFragment { + block: header(4).hash(), + justification: TestJustification(true, vec![7]).encode(), + unknown_headers: vec![header(4)], + authorities_proof: Some(vec![vec![42]]), + }, FinalityProofFragment { + block: header(5).hash(), + justification: TestJustification(true, vec![8]).encode(), + unknown_headers: vec![header(5)], + authorities_proof: None, + }].encode(), + ).unwrap_err(); + } - fn verify(&self, _set_id: u64, _authorities: &VoterSet) -> ClientResult<()> { - Err(ClientError::Backend("test error".into())) - } - } + #[test] + fn finality_proof_check_fails_when_intemediate_fragment_has_no_authorities_proof() { + let blockchain = test_blockchain(); - let mut proof_of_2: FinalityProof = prove_finality( - &test_blockchain(), - |_, _, _| Ok(vec![vec![42]]), - header(2).hash(), - ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - proof_of_2.finalization_path.remove(1); - - // justification is not valid - assert_eq!(do_check_finality_proof::( - |_| Ok(Vec::::new().encode()), - header(1), - (2, header(2).hash()), + // when intermediate (#0) fragment has empty authorities proof + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2.encode(), - ).is_err(), true); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + vec![FinalityProofFragment { + block: header(4).hash(), + justification: TestJustification(true, vec![7]).encode(), + unknown_headers: Vec::new(), + authorities_proof: None, + }, FinalityProofFragment { + block: header(5).hash(), + justification: TestJustification(true, vec![8]).encode(), + unknown_headers: vec![header(5)], + authorities_proof: None, + }].encode(), + ).unwrap_err(); } #[test] fn finality_proof_check_works() { - let proof_of_2 = prove_finality(&test_blockchain(), |_, _, _| Ok(vec![vec![42]]), header(2).hash()) - .unwrap().unwrap(); - assert_eq!(do_check_finality_proof::( - |_| Ok(vec![ - (AuthorityId([1u8; 32]), 1u64), - (AuthorityId([2u8; 32]), 2u64), - (AuthorityId([3u8; 32]), 3u64), - ].encode()), - header(1), - (2, header(2).hash()), + let blockchain = test_blockchain(); + + let effects = do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2, - ).unwrap(), vec![header(2), header(3)]); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| Ok(vec![(AuthorityId::from_raw([4u8; 32]), 1u64)])), + vec![FinalityProofFragment { + block: header(2).hash(), + justification: TestJustification(true, vec![7]).encode(), + unknown_headers: Vec::new(), + authorities_proof: Some(vec![vec![42]]), + }, FinalityProofFragment { + block: header(4).hash(), + justification: TestJustification(true, vec![8]).encode(), + unknown_headers: vec![header(4)], + authorities_proof: None, + }].encode(), + ).unwrap(); + assert_eq!(effects, FinalityEffects { + headers_to_import: vec![header(4)], + block: header(4).hash(), + justification: TestJustification(true, vec![8]).encode(), + new_set_id: 2, + new_authorities: vec![(AuthorityId::from_raw([4u8; 32]), 1u64)], + }); + } + + #[test] + fn finality_proof_is_none_if_first_justification_is_generated_by_unknown_set() { + // this is the case for forced change: set_id has been forcibly increased on full node + // and ligh node missed that + // => justification verification will fail on light node anyways, so we do not return + // finality proof at all + let blockchain = test_blockchain(); + let just4 = TestJustification(false, vec![4]).encode(); // false makes verification fail + blockchain.insert(header(4).hash(), header(4), Some(just4), None, NewBlockState::Final).unwrap(); + + let proof_of_4 = prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(4).hash(), + ).unwrap(); + assert!(proof_of_4.is_none()); } } diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index 34e266ddd3490b4a441bf25f4f80e2110e6c5fb6..ed57c68250f013d6ec761a50af9c76efc79f4281 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -26,17 +26,18 @@ use client::blockchain::HeaderBackend; use client::backend::Backend; use client::runtime_api::ApiExt; use consensus_common::{ - BlockImport, Error as ConsensusError, ErrorKind as ConsensusErrorKind, + BlockImport, Error as ConsensusError, ImportBlock, ImportResult, JustificationImport, well_known_cache_keys, + SelectChain, }; use fg_primitives::GrandpaApi; use runtime_primitives::Justification; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ - Block as BlockT, DigestFor, DigestItemFor, DigestItem, + Block as BlockT, DigestFor, Header as HeaderT, NumberFor, ProvideRuntimeApi, }; -use substrate_primitives::{H256, ed25519, Blake2Hasher}; +use substrate_primitives::{H256, Blake2Hasher}; use crate::{Error, CommandOrError, NewAuthoritySet, VoterCommand}; use crate::authorities::{AuthoritySet, SharedAuthoritySet, DelayKind, PendingChange}; @@ -44,8 +45,6 @@ use crate::consensus_changes::SharedConsensusChanges; use crate::environment::{finalize_block, is_descendent_of}; use crate::justification::GrandpaJustification; -use ed25519::Public as AuthorityId; - /// A block-import handler for GRANDPA. /// /// This scans each imported block for signals of changing authority set. @@ -55,32 +54,30 @@ use ed25519::Public as AuthorityId; /// /// When using GRANDPA, the block import worker should be using this block import /// object. -pub struct GrandpaBlockImport, RA, PRA> { +pub struct GrandpaBlockImport, RA, PRA, SC> { inner: Arc>, + select_chain: SC, authority_set: SharedAuthoritySet>, send_voter_commands: mpsc::UnboundedSender>>, consensus_changes: SharedConsensusChanges>, api: Arc, } -impl, RA, PRA> JustificationImport - for GrandpaBlockImport where +impl, RA, PRA, SC> JustificationImport + for GrandpaBlockImport where NumberFor: grandpa::BlockNumberOps, B: Backend + 'static, E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, - DigestItemFor: DigestItem, RA: Send + Sync, PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, + SC: SelectChain, { type Error = ConsensusError; - fn on_start(&self, link: &::consensus_common::import_queue::Link) { - let chain_info = match self.inner.info() { - Ok(info) => info.chain, - _ => return, - }; + fn on_start(&self, link: &dyn consensus_common::import_queue::Link) { + let chain_info = self.inner.info().chain; // request justifications for all pending changes for which change blocks have already been imported let authorities = self.authority_set.inner().read(); @@ -89,7 +86,7 @@ impl, RA, PRA> JustificationImport pending_change.effective_number() > chain_info.finalized_number && pending_change.effective_number() <= chain_info.best_number { - let effective_block_hash = self.inner.best_containing( + let effective_block_hash = self.select_chain.finality_target( pending_change.canon_hash, Some(pending_change.effective_number()), ); @@ -158,12 +155,13 @@ impl<'a, Block: 'a + BlockT> Drop for PendingSetChanges<'a, Block> { } } -impl, RA, PRA> GrandpaBlockImport where +impl, RA, PRA, SC> + GrandpaBlockImport +where NumberFor: grandpa::BlockNumberOps, B: Backend + 'static, E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, - DigestItemFor: DigestItem, RA: Send + Sync, PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, @@ -185,12 +183,12 @@ impl, RA, PRA> GrandpaBlockImport match api.has_api_with::, _>(&at, |v| v >= 2) { - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => match api.has_api_with::, _>(&at, |v| v >= 2) { + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), Ok(true) => { // API version is high enough to support forced changes // but got error, so it is legitimate. - return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()) + return Err(ConsensusError::ClientImport(e.to_string()).into()) }, Ok(false) => { // API version isn't high enough to support forced changes @@ -215,7 +213,7 @@ impl, RA, PRA> GrandpaBlockImport Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => Err(ConsensusError::ClientImport(e.to_string()).into()), Ok(Some(change)) => Ok(Some(PendingChange { next_authorities: change.next_authorities, delay: change.delay, @@ -300,12 +298,12 @@ impl, RA, PRA> GrandpaBlockImport, RA, PRA> GrandpaBlockImport, RA, PRA> GrandpaBlockImport, RA, PRA> GrandpaBlockImport, RA, PRA> BlockImport - for GrandpaBlockImport where +impl, RA, PRA, SC> BlockImport + for GrandpaBlockImport where NumberFor: grandpa::BlockNumberOps, B: Backend + 'static, E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, - DigestItemFor: DigestItem, RA: Send + Sync, PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, @@ -396,10 +395,11 @@ impl, RA, PRA> BlockImport // early exit if block already in chain, otherwise the check for // authority changes will error when trying to re-import a change block + #[allow(deprecated)] match self.inner.backend().blockchain().status(BlockId::Hash(hash)) { Ok(blockchain::BlockStatus::InChain) => return Ok(ImportResult::AlreadyInChain), Ok(blockchain::BlockStatus::Unknown) => {}, - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), } let pending_changes = self.make_authorities_changes(&mut block, hash)?; @@ -420,7 +420,7 @@ impl, RA, PRA> BlockImport Err(e) => { debug!(target: "afg", "Restoring old authority set after block import error: {:?}", e); pending_changes.revert(); - return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()); + return Err(ConsensusError::ClientImport(e.to_string()).into()); }, } }; @@ -509,16 +509,20 @@ impl, RA, PRA> BlockImport } } -impl, RA, PRA> GrandpaBlockImport { +impl, RA, PRA, SC> + GrandpaBlockImport +{ pub(crate) fn new( inner: Arc>, + select_chain: SC, authority_set: SharedAuthoritySet>, send_voter_commands: mpsc::UnboundedSender>>, consensus_changes: SharedConsensusChanges>, api: Arc, - ) -> GrandpaBlockImport { + ) -> GrandpaBlockImport { GrandpaBlockImport { inner, + select_chain, authority_set, send_voter_commands, consensus_changes, @@ -527,12 +531,13 @@ impl, RA, PRA> GrandpaBlockImport, RA, PRA> GrandpaBlockImport - where - NumberFor: grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, - RA: Send + Sync, +impl, RA, PRA, SC> + GrandpaBlockImport +where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, { /// Import a block justification and finalize the block. @@ -547,14 +552,14 @@ impl, RA, PRA> GrandpaBlockImport Result<(), ConsensusError> { let justification = GrandpaJustification::decode_and_verify_finalizes( - justification, + &justification, (hash, number), self.authority_set.set_id(), &self.authority_set.current_authorities(), ); let justification = match justification { - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), Ok(justification) => justification, }; @@ -574,17 +579,17 @@ impl, RA, PRA> GrandpaBlockImport { return Err(match e { - Error::Grandpa(error) => ConsensusErrorKind::ClientImport(error.to_string()), - Error::Network(error) => ConsensusErrorKind::ClientImport(error), - Error::Blockchain(error) => ConsensusErrorKind::ClientImport(error), - Error::Client(error) => ConsensusErrorKind::ClientImport(error.to_string()), - Error::Safety(error) => ConsensusErrorKind::ClientImport(error), - Error::Timer(error) => ConsensusErrorKind::ClientImport(error.to_string()), + Error::Grandpa(error) => ConsensusError::ClientImport(error.to_string()), + Error::Network(error) => ConsensusError::ClientImport(error), + Error::Blockchain(error) => ConsensusError::ClientImport(error), + Error::Client(error) => ConsensusError::ClientImport(error.to_string()), + Error::Safety(error) => ConsensusError::ClientImport(error), + Error::Timer(error) => ConsensusError::ClientImport(error.to_string()), }.into()); }, Ok(_) => { diff --git a/core/finality-grandpa/src/justification.rs b/core/finality-grandpa/src/justification.rs index 5b55acec8524f95048d6eda99f212a7300a6c0cd..fc7f833c750538947133ceb090bda002005e4574 100644 --- a/core/finality-grandpa/src/justification.rs +++ b/core/finality-grandpa/src/justification.rs @@ -72,6 +72,7 @@ impl> GrandpaJustification { loop { if current_hash == commit.target_hash { break; } + #[allow(deprecated)] match client.backend().blockchain().header(BlockId::Hash(current_hash))? { Some(current_header) => { if *current_header.number() <= commit.target_number { @@ -95,17 +96,16 @@ impl> GrandpaJustification { /// Decode a GRANDPA justification and validate the commit and the votes' /// ancestry proofs finalize the given block. pub(crate) fn decode_and_verify_finalizes( - encoded: Vec, + encoded: &[u8], finalized_target: (Block::Hash, NumberFor), set_id: u64, voters: &VoterSet, ) -> Result, ClientError> where NumberFor: grandpa::BlockNumberOps, { - let justification = GrandpaJustification::::decode(&mut &*encoded).ok_or_else(|| { - let msg = "failed to decode grandpa justification".to_string(); - ClientError::from(ClientError::BadJustification(msg)) - })?; + + let justification = GrandpaJustification::::decode(&mut &*encoded) + .ok_or(ClientError::JustificationDecode)?; if (justification.commit.target_hash, justification.commit.target_number) != finalized_target { let msg = "invalid commit target in grandpa justification".to_string(); diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 5a2b084160442e28e8eb266584227329f81e324b..2a1da15499b6d8fa82b966b9758e18d0683468d0 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -51,6 +51,7 @@ //! number (this is num(signal) + N). When finalizing a block, we either apply //! or prune any signaled changes based on whether the signaling block is //! included in the newly-finalized chain. +#![forbid(warnings)] use futures::prelude::*; use log::{debug, info, warn}; @@ -62,11 +63,12 @@ use client::{ use client::blockchain::HeaderBackend; use parity_codec::Encode; use runtime_primitives::traits::{ - NumberFor, Block as BlockT, DigestFor, ProvideRuntimeApi, DigestItemFor, DigestItem, + NumberFor, Block as BlockT, DigestFor, ProvideRuntimeApi, }; use fg_primitives::GrandpaApi; use inherents::InherentDataProviders; use runtime_primitives::generic::BlockId; +use consensus_common::SelectChain; use substrate_primitives::{ed25519, H256, Pair, Blake2Hasher}; use substrate_telemetry::{telemetry, CONSENSUS_INFO, CONSENSUS_DEBUG, CONSENSUS_WARN}; use serde_json; @@ -90,15 +92,17 @@ mod environment; mod finality_proof; mod import; mod justification; +mod light_import; mod observer; mod until_imported; #[cfg(feature="service-integration")] mod service_integration; #[cfg(feature="service-integration")] -pub use service_integration::{LinkHalfForService, BlockImportForService}; +pub use service_integration::{LinkHalfForService, BlockImportForService, BlockImportForLightService}; pub use communication::Network; -pub use finality_proof::{prove_finality, check_finality_proof}; +pub use finality_proof::FinalityProofProvider; +pub use light_import::light_block_import; pub use observer::run_grandpa_observer; use aux_schema::PersistentData; @@ -152,7 +156,7 @@ pub struct Config { /// Justification generation period (in blocks). GRANDPA will try to generate justifications /// at least every justification_period blocks. There are some other events which might cause /// justification generation. - pub justification_period: u64, + pub justification_period: u32, /// The local signing key. pub local_key: Option>, /// Some local identifier of the voter. @@ -285,31 +289,38 @@ impl fmt::Display for CommandOrError { } } -pub struct LinkHalf, RA> { +pub struct LinkHalf, RA, SC> { client: Arc>, + select_chain: SC, persistent_data: PersistentData, voter_commands_rx: mpsc::UnboundedReceiver>>, } /// Make block importer and link half necessary to tie the background voter /// to it. -pub fn block_import, RA, PRA>( +pub fn block_import, RA, PRA, SC>( client: Arc>, - api: Arc -) -> Result<(GrandpaBlockImport, LinkHalf), ClientError> - where - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, - RA: Send + Sync, - PRA: ProvideRuntimeApi, - PRA::Api: GrandpaApi, + api: Arc, + select_chain: SC, +) -> Result<( + GrandpaBlockImport, + LinkHalf + ), ClientError> +where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, + SC: SelectChain, { use runtime_primitives::traits::Zero; - let chain_info = client.info()?; + let chain_info = client.info(); let genesis_hash = chain_info.chain.genesis_hash; let persistent_data = aux_schema::load_persistent( + #[allow(deprecated)] &**client.backend(), genesis_hash, >::zero(), @@ -328,6 +339,7 @@ pub fn block_import, RA, PRA>( Ok(( GrandpaBlockImport::new( client.clone(), + select_chain.clone(), persistent_data.authority_set.clone(), voter_commands_tx, persistent_data.consensus_changes.clone(), @@ -335,6 +347,7 @@ pub fn block_import, RA, PRA>( ), LinkHalf { client, + select_chain, persistent_data, voter_commands_rx, }, @@ -362,7 +375,6 @@ fn global_communication, B, E, N, RA>( N: Network, RA: Send + Sync, NumberFor: BlockNumberOps, - DigestItemFor: DigestItem, { let is_voter = local_key @@ -418,29 +430,28 @@ fn register_finality_tracker_inherent_data_provider Err(std::borrow::Cow::Owned(e.to_string())), - Ok(info) => { - telemetry!(CONSENSUS_INFO; "afg.finalized"; - "finalized_number" => ?info.finalized_number, - "finalized_hash" => ?info.finalized_hash, - ); - Ok(info.finalized_number) - }, + #[allow(deprecated)] + { + let info = client.backend().blockchain().info(); + telemetry!(CONSENSUS_INFO; "afg.finalized"; + "finalized_number" => ?info.finalized_number, + "finalized_hash" => ?info.finalized_hash, + ); + Ok(info.finalized_number) } })) - .map_err(|err| consensus_common::ErrorKind::InherentData(err.into()).into()) + .map_err(|err| consensus_common::Error::InherentData(err.into())) } else { Ok(()) } } /// Parameters used to run Grandpa. -pub struct GrandpaParams<'a, B, E, Block: BlockT, N, RA, X> { +pub struct GrandpaParams<'a, B, E, Block: BlockT, N, RA, SC, X> { /// Configuration for the GRANDPA service. pub config: Config, /// A link to the block import worker. - pub link: LinkHalf, + pub link: LinkHalf, /// The Network instance. pub network: N, /// The inherent data providers. @@ -453,17 +464,17 @@ pub struct GrandpaParams<'a, B, E, Block: BlockT, N, RA, X> { /// Run a GRANDPA voter as a task. Provide configuration and a link to a /// block import worker that has already been instantiated with `block_import`. -pub fn run_grandpa_voter, N, RA, X>( - grandpa_params: GrandpaParams, +pub fn run_grandpa_voter, N, RA, SC, X>( + grandpa_params: GrandpaParams, ) -> ::client::error::Result + Send + 'static> where Block::Hash: Ord, B: Backend + 'static, E: CallExecutor + Send + Sync + 'static, N: Network + Send + Sync + 'static, N::In: Send + 'static, + SC: SelectChain + 'static, NumberFor: BlockNumberOps, DigestFor: Encode, - DigestItemFor: DigestItem, RA: Send + Sync + 'static, X: Future + Clone + Send + 'static, { @@ -478,15 +489,22 @@ pub fn run_grandpa_voter, N, RA, X>( use futures::future::{self, Loop as FutureLoop}; - let (network, network_startup) = NetworkBridge::new(network, config.clone(), on_exit.clone()); - let LinkHalf { client, + select_chain, persistent_data, voter_commands_rx, } = link; + let PersistentData { authority_set, set_state, consensus_changes } = persistent_data; + let (network, network_startup) = NetworkBridge::new( + network, + config.clone(), + Some((authority_set.set_id(), &set_state.read())), + on_exit.clone(), + ); + register_finality_tracker_inherent_data_provider(client.clone(), &inherent_data_providers)?; if let Some(telemetry_on_connect) = telemetry_on_connect { @@ -515,6 +533,7 @@ pub fn run_grandpa_voter, N, RA, X>( let initial_environment = Arc::new(Environment { inner: client.clone(), config: config.clone(), + select_chain: select_chain.clone(), voters: Arc::new(voters), network: network.clone(), set_id: authority_set.set_id(), @@ -558,10 +577,7 @@ pub fn run_grandpa_voter, N, RA, X>( let mut maybe_voter = match &*env.voter_set_state.read() { VoterSetState::Live { completed_rounds, .. } => { - let chain_info = match client.info() { - Ok(i) => i, - Err(e) => return future::Either::B(future::err(Error::Client(e))), - }; + let chain_info = client.info(); let last_finalized = ( chain_info.chain.finalized_hash, @@ -601,6 +617,7 @@ pub fn run_grandpa_voter, N, RA, X>( let client = client.clone(); let config = config.clone(); let network = network.clone(); + let select_chain = select_chain.clone(); let authority_set = authority_set.clone(); let consensus_changes = consensus_changes.clone(); @@ -632,12 +649,14 @@ pub fn run_grandpa_voter, N, RA, X>( current_round: HasVoted::No, }; + #[allow(deprecated)] aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; let set_state: SharedVoterSetState<_> = set_state.into(); let env = Arc::new(Environment { inner: client, + select_chain, config, voters: Arc::new(new.authorities.into_iter().collect()), set_id: new.set_id, @@ -656,6 +675,8 @@ pub fn run_grandpa_voter, N, RA, X>( env.update_voter_set_state(|voter_set_state| { let completed_rounds = voter_set_state.completed_rounds(); let set_state = VoterSetState::Paused { completed_rounds }; + + #[allow(deprecated)] aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; Ok(Some(set_state)) })?; @@ -665,7 +686,7 @@ pub fn run_grandpa_voter, N, RA, X>( } }; - future::Either::A(poll_voter.select2(voter_commands_rx).then(move |res| match res { + poll_voter.select2(voter_commands_rx).then(move |res| match res { Ok(future::Either::A(((), _))) => { // voters don't conclude naturally; this could reasonably be an error. Ok(FutureLoop::Break(())) @@ -690,7 +711,7 @@ pub fn run_grandpa_voter, N, RA, X>( // some command issued internally. handle_voter_command(command, voter_commands_rx) }, - })) + }) }); let voter_work = voter_work @@ -706,17 +727,17 @@ pub fn run_grandpa_voter, N, RA, X>( } #[deprecated(since = "1.1", note = "Please switch to run_grandpa_voter.")] -pub fn run_grandpa, N, RA, X>( - grandpa_params: GrandpaParams, +pub fn run_grandpa, N, RA, SC, X>( + grandpa_params: GrandpaParams, ) -> ::client::error::Result + Send + 'static> where Block::Hash: Ord, B: Backend + 'static, E: CallExecutor + Send + Sync + 'static, N: Network + Send + Sync + 'static, N::In: Send + 'static, + SC: SelectChain + 'static, NumberFor: BlockNumberOps, DigestFor: Encode, - DigestItemFor: DigestItem, RA: Send + Sync + 'static, X: Future + Clone + Send + 'static, { diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs new file mode 100644 index 0000000000000000000000000000000000000000..c70f91d0f3f45c51d5d714a578f9bb71154a51e2 --- /dev/null +++ b/core/finality-grandpa/src/light_import.rs @@ -0,0 +1,732 @@ +// Copyright 2019 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 . + +use std::collections::HashMap; +use std::sync::Arc; +use log::{info, trace, warn}; +use parking_lot::RwLock; + +use client::{ + CallExecutor, Client, + backend::{AuxStore, Backend}, + blockchain::HeaderBackend, + error::Error as ClientError, +}; +use parity_codec::{Encode, Decode}; +use consensus_common::{ + import_queue::{Verifier, SharedFinalityProofRequestBuilder}, well_known_cache_keys, + BlockOrigin, BlockImport, FinalityProofImport, ImportBlock, ImportResult, ImportedAux, + Error as ConsensusError, FinalityProofRequestBuilder, +}; +use runtime_primitives::Justification; +use runtime_primitives::traits::{ + NumberFor, Block as BlockT, Header as HeaderT, ProvideRuntimeApi, DigestFor, +}; +use fg_primitives::GrandpaApi; +use runtime_primitives::generic::BlockId; +use substrate_primitives::{H256, Blake2Hasher, ed25519::Public as AuthorityId}; + +use crate::aux_schema::load_decode; +use crate::consensus_changes::ConsensusChanges; +use crate::environment::canonical_at_height; +use crate::finality_proof::{AuthoritySetForFinalityChecker, ProvableJustification, make_finality_proof_request}; +use crate::justification::GrandpaJustification; + +/// LightAuthoritySet is saved under this key in aux storage. +const LIGHT_AUTHORITY_SET_KEY: &[u8] = b"grandpa_voters"; +/// ConsensusChanges is saver under this key in aux storage. +const LIGHT_CONSENSUS_CHANGES_KEY: &[u8] = b"grandpa_consensus_changes"; + +/// Create light block importer. +pub fn light_block_import, RA, PRA>( + client: Arc>, + authority_set_provider: Arc>, + api: Arc, +) -> Result, ClientError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, +{ + let info = client.info(); + #[allow(deprecated)] + let import_data = load_aux_import_data(info.chain.finalized_hash, &**client.backend(), api)?; + Ok(GrandpaLightBlockImport { + client, + authority_set_provider, + data: Arc::new(RwLock::new(import_data)), + }) +} + +/// A light block-import handler for GRANDPA. +/// +/// It is responsible for: +/// - checking GRANDPA justifications; +/// - fetching finality proofs for blocks that are enacting consensus changes. +pub struct GrandpaLightBlockImport, RA> { + client: Arc>, + authority_set_provider: Arc>, + data: Arc>>, +} + +/// Mutable data of light block importer. +struct LightImportData> { + last_finalized: Block::Hash, + authority_set: LightAuthoritySet, + consensus_changes: ConsensusChanges>, +} + +/// Latest authority set tracker. +#[derive(Debug, Encode, Decode)] +struct LightAuthoritySet { + set_id: u64, + authorities: Vec<(AuthorityId, u64)>, +} + +impl, RA> GrandpaLightBlockImport { + /// Create finality proof request builder. + pub fn create_finality_proof_request_builder(&self) -> SharedFinalityProofRequestBuilder { + Arc::new(GrandpaFinalityProofRequestBuilder(self.data.clone())) as _ + } +} + +impl, RA> BlockImport + for GrandpaLightBlockImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, +{ + type Error = ConsensusError; + + fn import_block( + &self, + block: ImportBlock, + new_cache: HashMap>, + ) -> Result { + do_import_block::<_, _, _, _, GrandpaJustification>( + &*self.client, &mut *self.data.write(), block, new_cache + ) + } + + fn check_block( + &self, + hash: Block::Hash, + parent_hash: Block::Hash, + ) -> Result { + self.client.check_block(hash, parent_hash) + } +} + +impl, RA> FinalityProofImport + for GrandpaLightBlockImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, +{ + type Error = ConsensusError; + + fn on_start(&self, link: &dyn consensus_common::import_queue::Link) { + let chain_info = self.client.info().chain; + + let data = self.data.read(); + for (pending_number, pending_hash) in data.consensus_changes.pending_changes() { + if *pending_number > chain_info.finalized_number && *pending_number <= chain_info.best_number { + link.request_finality_proof(pending_hash, *pending_number); + } + } + } + + fn import_finality_proof( + &self, + hash: Block::Hash, + number: NumberFor, + finality_proof: Vec, + verifier: &dyn Verifier, + ) -> Result<(Block::Hash, NumberFor), Self::Error> { + do_import_finality_proof::<_, _, _, _, GrandpaJustification>( + &*self.client, + &*self.authority_set_provider, + &mut *self.data.write(), + hash, + number, + finality_proof, + verifier, + ) + } +} + +impl LightAuthoritySet { + /// Get a genesis set with given authorities. + pub fn genesis(initial: Vec<(AuthorityId, u64)>) -> Self { + LightAuthoritySet { + set_id: 0, + authorities: initial, + } + } + + /// Get latest set id. + pub fn set_id(&self) -> u64 { + self.set_id + } + + /// Get latest authorities set. + pub fn authorities(&self) -> Vec<(AuthorityId, u64)> { + self.authorities.clone() + } + + /// Set new authorities set. + pub fn update(&mut self, set_id: u64, authorities: Vec<(AuthorityId, u64)>) { + self.set_id = set_id; + std::mem::replace(&mut self.authorities, authorities); + } +} + +struct GrandpaFinalityProofRequestBuilder>(Arc>>); + +impl> FinalityProofRequestBuilder for GrandpaFinalityProofRequestBuilder { + fn build_request_data(&self, _hash: &B::Hash) -> Vec { + let data = self.0.read(); + make_finality_proof_request( + data.last_finalized, + data.authority_set.set_id(), + ) + } +} + +/// Try to import new block. +fn do_import_block, RA, J>( + client: &Client, + data: &mut LightImportData, + mut block: ImportBlock, + new_cache: HashMap>, +) -> Result + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + NumberFor: grandpa::BlockNumberOps, + DigestFor: Encode, + J: ProvableJustification, +{ + let hash = block.post_header().hash(); + let number = block.header.number().clone(); + + // we don't want to finalize on `inner.import_block` + let justification = block.justification.take(); + let enacts_consensus_change = !new_cache.is_empty(); + let import_result = client.import_block(block, new_cache); + + let mut imported_aux = match import_result { + Ok(ImportResult::Imported(aux)) => aux, + Ok(r) => return Ok(r), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), + }; + + match justification { + Some(justification) => { + trace!( + target: "finality", + "Imported block {}{}. Importing justification.", + if enacts_consensus_change { " which enacts consensus changes" } else { "" }, + hash, + ); + + do_import_justification::<_, _, _, _, J>(client, data, hash, number, justification) + }, + None if enacts_consensus_change => { + trace!( + target: "finality", + "Imported block {} which enacts consensus changes. Requesting finality proof.", + hash, + ); + + // remember that we need finality proof for this block + imported_aux.needs_finality_proof = true; + data.consensus_changes.note_change((number, hash)); + Ok(ImportResult::Imported(imported_aux)) + }, + None => Ok(ImportResult::Imported(imported_aux)), + } +} + +/// Try to import finality proof. +fn do_import_finality_proof, RA, J>( + client: &Client, + authority_set_provider: &dyn AuthoritySetForFinalityChecker, + data: &mut LightImportData, + _hash: Block::Hash, + _number: NumberFor, + finality_proof: Vec, + verifier: &dyn Verifier, +) -> Result<(Block::Hash, NumberFor), ConsensusError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + DigestFor: Encode, + NumberFor: grandpa::BlockNumberOps, + J: ProvableJustification, +{ + let authority_set_id = data.authority_set.set_id(); + let authorities = data.authority_set.authorities(); + let finality_effects = crate::finality_proof::check_finality_proof( + #[allow(deprecated)] + &*client.backend().blockchain(), + authority_set_id, + authorities, + authority_set_provider, + finality_proof, + ).map_err(|e| ConsensusError::ClientImport(e.to_string()))?; + + // try to import all new headers + let block_origin = BlockOrigin::NetworkBroadcast; + for header_to_import in finality_effects.headers_to_import { + let (block_to_import, new_authorities) = verifier.verify(block_origin, header_to_import, None, None) + .map_err(|e| ConsensusError::ClientImport(e))?; + assert!(block_to_import.justification.is_none(), "We have passed None as justification to verifier.verify"); + + let mut cache = HashMap::new(); + if let Some(authorities) = new_authorities { + cache.insert(well_known_cache_keys::AUTHORITIES, authorities.encode()); + } + do_import_block::<_, _, _, _, J>(client, data, block_to_import, cache)?; + } + + // try to import latest justification + let finalized_block_hash = finality_effects.block; + #[allow(deprecated)] + let finalized_block_number = client.backend().blockchain() + .expect_block_number_from_id(&BlockId::Hash(finality_effects.block)) + .map_err(|e| ConsensusError::ClientImport(e.to_string()))?; + do_finalize_block( + client, + data, + finalized_block_hash, + finalized_block_number, + finality_effects.justification.encode(), + )?; + + // apply new authorities set + data.authority_set.update( + finality_effects.new_set_id, + finality_effects.new_authorities, + ); + + Ok((finalized_block_hash, finalized_block_number)) +} + +/// Try to import justification. +fn do_import_justification, RA, J>( + client: &Client, + data: &mut LightImportData, + hash: Block::Hash, + number: NumberFor, + justification: Justification, +) -> Result + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + NumberFor: grandpa::BlockNumberOps, + J: ProvableJustification, +{ + // with justification, we have two cases + // + // optimistic: the same GRANDPA authorities set has generated intermediate justification + // => justification is verified using current authorities set + we could proceed further + // + // pessimistic scenario: the GRANDPA authorities set has changed + // => we need to fetch new authorities set (i.e. finality proof) from remote node + + // first, try to behave optimistically + let authority_set_id = data.authority_set.set_id(); + let justification = J::decode_and_verify( + &justification, + authority_set_id, + &data.authority_set.authorities(), + ); + + // BadJustification error means that justification has been successfully decoded, but + // it isn't valid within current authority set + let justification = match justification { + Err(ClientError::BadJustification(_)) => { + trace!( + target: "finality", + "Justification for {} is not valid within current authorities set. Requesting finality proof.", + hash, + ); + + let mut imported_aux = ImportedAux::default(); + imported_aux.needs_finality_proof = true; + return Ok(ImportResult::Imported(imported_aux)); + }, + Err(e) => { + trace!( + target: "finality", + "Justification for {} is not valid. Bailing.", + hash, + ); + + return Err(ConsensusError::ClientImport(e.to_string()).into()); + }, + Ok(justification) => { + trace!( + target: "finality", + "Justification for {} is valid. Finalizing the block.", + hash, + ); + + justification + }, + }; + + // finalize the block + do_finalize_block(client, data, hash, number, justification.encode()) +} + +/// Finalize the block. +fn do_finalize_block, RA>( + client: &Client, + data: &mut LightImportData, + hash: Block::Hash, + number: NumberFor, + justification: Justification, +) -> Result + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + NumberFor: grandpa::BlockNumberOps, +{ + // finalize the block + client.finalize_block(BlockId::Hash(hash), Some(justification), true).map_err(|e| { + warn!(target: "finality", "Error applying finality to block {:?}: {:?}", (hash, number), e); + ConsensusError::ClientImport(e.to_string()) + })?; + + // forget obsoleted consensus changes + let consensus_finalization_res = data.consensus_changes + .finalize((number, hash), |at_height| canonical_at_height(&client, (hash, number), true, at_height)); + match consensus_finalization_res { + Ok((true, _)) => require_insert_aux( + &client, + LIGHT_CONSENSUS_CHANGES_KEY, + &data.consensus_changes, + "consensus changes", + )?, + Ok(_) => (), + Err(error) => return Err(on_post_finalization_error(error, "consensus changes")), + } + + // update last finalized block reference + data.last_finalized = hash; + + Ok(ImportResult::imported()) +} + +/// Load light import aux data from the store. +fn load_aux_import_data, PRA>( + last_finalized: Block::Hash, + aux_store: &B, + api: Arc, +) -> Result, ClientError> + where + B: AuxStore, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, +{ + use runtime_primitives::traits::Zero; + let authority_set = match load_decode(aux_store, LIGHT_AUTHORITY_SET_KEY)? { + Some(authority_set) => authority_set, + None => { + info!(target: "afg", "Loading GRANDPA authorities \ + from genesis on what appears to be first startup."); + + // no authority set on disk: fetch authorities from genesis state + let genesis_authorities = api.runtime_api().grandpa_authorities(&BlockId::number(Zero::zero()))?; + + let authority_set = LightAuthoritySet::genesis(genesis_authorities); + let encoded = authority_set.encode(); + aux_store.insert_aux(&[(LIGHT_AUTHORITY_SET_KEY, &encoded[..])], &[])?; + + authority_set + }, + }; + + let consensus_changes = match load_decode(aux_store, LIGHT_CONSENSUS_CHANGES_KEY)? { + Some(consensus_changes) => consensus_changes, + None => { + let consensus_changes = ConsensusChanges::>::empty(); + + let encoded = authority_set.encode(); + aux_store.insert_aux(&[(LIGHT_CONSENSUS_CHANGES_KEY, &encoded[..])], &[])?; + + consensus_changes + }, + }; + + Ok(LightImportData { + last_finalized, + authority_set, + consensus_changes, + }) +} + +/// Insert into aux store. If failed, return error && show inconsistency warning. +fn require_insert_aux, RA>( + client: &Client, + key: &[u8], + value: &T, + value_type: &str, +) -> Result<(), ConsensusError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, +{ + #[allow(deprecated)] + let backend = &**client.backend(); + let encoded = value.encode(); + let update_res = Backend::insert_aux(backend, &[(key, &encoded[..])], &[]); + if let Err(error) = update_res { + return Err(on_post_finalization_error(error, value_type)); + } + + Ok(()) +} + +/// Display inconsistency warning. +fn on_post_finalization_error(error: ClientError, value_type: &str) -> ConsensusError { + warn!(target: "finality", "Failed to write updated {} to disk. Bailing.", value_type); + warn!(target: "finality", "Node is in a potentially inconsistent state."); + ConsensusError::ClientImport(error.to_string()) +} + +#[cfg(test)] +pub mod tests { + use super::*; + use consensus_common::ForkChoiceStrategy; + use substrate_primitives::H256; + use test_client::client::in_mem::Blockchain as InMemoryAuxStore; + use test_client::runtime::{Block, Header}; + use crate::tests::TestApi; + use crate::finality_proof::tests::TestJustification; + + pub struct NoJustificationsImport, RA>( + pub GrandpaLightBlockImport + ); + + impl, RA> BlockImport + for NoJustificationsImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, + { + type Error = ConsensusError; + + fn import_block( + &self, + mut block: ImportBlock, + new_cache: HashMap>, + ) -> Result { + block.justification.take(); + self.0.import_block(block, new_cache) + } + + fn check_block( + &self, + hash: Block::Hash, + parent_hash: Block::Hash, + ) -> Result { + self.0.check_block(hash, parent_hash) + } + } + + impl, RA> FinalityProofImport + for NoJustificationsImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, + { + type Error = ConsensusError; + + fn on_start(&self, link: &dyn consensus_common::import_queue::Link) { + self.0.on_start(link) + } + + fn import_finality_proof( + &self, + hash: Block::Hash, + number: NumberFor, + finality_proof: Vec, + verifier: &dyn Verifier, + ) -> Result<(Block::Hash, NumberFor), Self::Error> { + self.0.import_finality_proof(hash, number, finality_proof, verifier) + } + } + + /// Creates light block import that ignores justifications that came outside of finality proofs. + pub fn light_block_import_without_justifications, RA, PRA>( + client: Arc>, + authority_set_provider: Arc>, + api: Arc, + ) -> Result, ClientError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, + { + light_block_import(client, authority_set_provider, api).map(NoJustificationsImport) + } + + fn import_block( + new_cache: HashMap>, + justification: Option, + ) -> ImportResult { + let client = test_client::new_light(); + let mut import_data = LightImportData { + last_finalized: Default::default(), + authority_set: LightAuthoritySet::genesis(vec![(AuthorityId([1; 32]), 1)]), + consensus_changes: ConsensusChanges::empty(), + }; + let block = ImportBlock { + origin: BlockOrigin::Own, + header: Header { + number: 1, + parent_hash: client.info().chain.best_hash, + state_root: Default::default(), + digest: Default::default(), + extrinsics_root: Default::default(), + }, + justification, + post_digests: Vec::new(), + body: None, + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + do_import_block::<_, _, _, _, TestJustification>( + &client, + &mut import_data, + block, + new_cache, + ).unwrap() + } + + #[test] + fn finality_proof_not_required_when_consensus_data_does_not_changes_and_no_justification_provided() { + assert_eq!(import_block(HashMap::new(), None), ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: false, + })); + } + + #[test] + fn finality_proof_not_required_when_consensus_data_does_not_changes_and_correct_justification_provided() { + let justification = TestJustification(true, Vec::new()).encode(); + assert_eq!(import_block(HashMap::new(), Some(justification)), ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: false, + })); + } + + #[test] + fn finality_proof_required_when_consensus_data_changes_and_no_justification_provided() { + let mut cache = HashMap::new(); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId([2; 32])].encode()); + assert_eq!(import_block(cache, None), ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: true, + })); + } + + #[test] + fn finality_proof_required_when_consensus_data_changes_and_incorrect_justification_provided() { + let justification = TestJustification(false, Vec::new()).encode(); + let mut cache = HashMap::new(); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId([2; 32])].encode()); + assert_eq!( + import_block(cache, Some(justification)), + ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: true, + }, + )); + } + + + #[test] + fn aux_data_updated_on_start() { + let aux_store = InMemoryAuxStore::::new(); + let api = Arc::new(TestApi::new(vec![(AuthorityId([1; 32]), 1)])); + + // when aux store is empty initially + assert!(aux_store.get_aux(LIGHT_AUTHORITY_SET_KEY).unwrap().is_none()); + assert!(aux_store.get_aux(LIGHT_CONSENSUS_CHANGES_KEY).unwrap().is_none()); + + // it is updated on importer start + load_aux_import_data(Default::default(), &aux_store, api).unwrap(); + assert!(aux_store.get_aux(LIGHT_AUTHORITY_SET_KEY).unwrap().is_some()); + assert!(aux_store.get_aux(LIGHT_CONSENSUS_CHANGES_KEY).unwrap().is_some()); + } + + #[test] + fn aux_data_loaded_on_restart() { + let aux_store = InMemoryAuxStore::::new(); + let api = Arc::new(TestApi::new(vec![(AuthorityId([1; 32]), 1)])); + + // when aux store is non-empty initially + let mut consensus_changes = ConsensusChanges::::empty(); + consensus_changes.note_change((42, Default::default())); + aux_store.insert_aux( + &[ + ( + LIGHT_AUTHORITY_SET_KEY, + LightAuthoritySet::genesis(vec![(AuthorityId([42; 32]), 2)]).encode().as_slice(), + ), + ( + LIGHT_CONSENSUS_CHANGES_KEY, + consensus_changes.encode().as_slice(), + ), + ], + &[], + ).unwrap(); + + // importer uses it on start + let data = load_aux_import_data(Default::default(), &aux_store, api).unwrap(); + assert_eq!(data.authority_set.authorities(), vec![(AuthorityId([42; 32]), 2)]); + assert_eq!(data.consensus_changes.pending_changes(), &[(42, Default::default())]); + } +} diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index 74b5076daea1d547d2df7f7999ee403e23698d85..f172e58ee98d39193d6a9b133f8b8cd8c67a7252 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -24,14 +24,14 @@ use grandpa::{ }; use log::{debug, info, warn}; +use consensus_common::SelectChain; use client::{CallExecutor, Client, backend::Backend}; -use ed25519::Public as AuthorityId; -use runtime_primitives::traits::{NumberFor, Block as BlockT, DigestItemFor, DigestItem}; -use substrate_primitives::{ed25519, H256, Blake2Hasher}; +use runtime_primitives::traits::{NumberFor, Block as BlockT}; +use substrate_primitives::{ed25519::Public as AuthorityId, H256, Blake2Hasher}; use crate::{ AuthoritySignature, global_communication, CommandOrError, Config, environment, - Error, LinkHalf, Network, aux_schema::PersistentData, VoterCommand, VoterSetState, + LinkHalf, Network, aux_schema::PersistentData, VoterCommand, VoterSetState, }; use crate::authorities::SharedAuthoritySet; use crate::communication::NetworkBridge; @@ -90,9 +90,9 @@ fn grandpa_observer, RA, S>( }, }; - // if the commit we've received targets a block lower than the last + // if the commit we've received targets a block lower or equal to the last // finalized, ignore it and continue with the current state - if commit.target_number < last_finalized_number { + if commit.target_number <= last_finalized_number { return future::ok(last_finalized_number); } @@ -144,9 +144,9 @@ fn grandpa_observer, RA, S>( /// listening for and validating GRANDPA commits instead of following the full /// protocol. Provide configuration and a link to a block import worker that has /// already been instantiated with `block_import`. -pub fn run_grandpa_observer, N, RA>( +pub fn run_grandpa_observer, N, RA, SC>( config: Config, - link: LinkHalf, + link: LinkHalf, network: N, on_exit: impl Future + Clone + Send + 'static, ) -> ::client::error::Result + Send + 'static> where @@ -154,20 +154,27 @@ pub fn run_grandpa_observer, N, RA>( E: CallExecutor + Send + Sync + 'static, N: Network + Send + Sync + 'static, N::In: Send + 'static, + SC: SelectChain + 'static, NumberFor: BlockNumberOps, - DigestItemFor: DigestItem, RA: Send + Sync + 'static, { let LinkHalf { client, + select_chain: _, persistent_data, voter_commands_rx, } = link; let PersistentData { authority_set, consensus_changes, set_state } = persistent_data; - let initial_state = (authority_set, consensus_changes, set_state, voter_commands_rx.into_future()); - let (network, network_startup) = NetworkBridge::new(network, config.clone(), on_exit.clone()); + let (network, network_startup) = NetworkBridge::new( + network, + config.clone(), + None, + on_exit.clone(), + ); + + let initial_state = (authority_set, consensus_changes, set_state, voter_commands_rx.into_future()); let observer_work = future::loop_fn(initial_state, move |state| { let (authority_set, consensus_changes, set_state, voter_commands_rx) = state; @@ -184,12 +191,7 @@ pub fn run_grandpa_observer, N, RA>( &network, ); - let chain_info = match client.info() { - Ok(i) => i, - Err(e) => return future::Either::B(future::err(Error::Client(e))), - }; - - let last_finalized_number = chain_info.chain.finalized_number; + let last_finalized_number = client.info().chain.finalized_number; // create observer for the current set let observer = grandpa_observer( @@ -211,6 +213,7 @@ pub fn run_grandpa_observer, N, RA>( let completed_rounds = set_state.read().completed_rounds(); let set_state = VoterSetState::Paused { completed_rounds }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; set_state @@ -231,6 +234,7 @@ pub fn run_grandpa_observer, N, RA>( current_round: HasVoted::No, }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; set_state @@ -241,7 +245,7 @@ pub fn run_grandpa_observer, N, RA>( }; // run observer and listen to commands (switch authorities or pause) - future::Either::A(observer.select2(voter_commands_rx).then(move |res| match res { + observer.select2(voter_commands_rx).then(move |res| match res { Ok(future::Either::A((_, _))) => { // observer commit stream doesn't conclude naturally; this could reasonably be an error. Ok(FutureLoop::Break(())) @@ -266,7 +270,7 @@ pub fn run_grandpa_observer, N, RA>( // some command issued internally handle_voter_command(command, voter_commands_rx) }, - })) + }) }); let observer_work = observer_work diff --git a/core/finality-grandpa/src/service_integration.rs b/core/finality-grandpa/src/service_integration.rs index 3eee1dd9408d490f7275532fff3a8ea27ac7b73d..9f19b9204190bdcc16f3766db3c20a400ed40331 100644 --- a/core/finality-grandpa/src/service_integration.rs +++ b/core/finality-grandpa/src/service_integration.rs @@ -17,7 +17,7 @@ /// Integrate grandpa finality with substrate service use client; -use service::{FullBackend, FullExecutor, ServiceFactory}; +use service::{FullBackend, FullExecutor, LightBackend, LightExecutor, ServiceFactory}; pub type BlockImportForService = crate::GrandpaBlockImport< FullBackend, @@ -25,16 +25,25 @@ pub type BlockImportForService = crate::GrandpaBlockImport< ::Block, ::RuntimeApi, client::Client< - FullBackend, - FullExecutor, - ::Block, - ::RuntimeApi - >, + FullBackend, + FullExecutor, + ::Block, + ::RuntimeApi + >, + ::SelectChain, >; pub type LinkHalfForService = crate::LinkHalf< FullBackend, FullExecutor, ::Block, - ::RuntimeApi + ::RuntimeApi, + ::SelectChain +>; + +pub type BlockImportForLightService = crate::light_import::GrandpaLightBlockImport< + LightBackend, + LightExecutor, + ::Block, + ::RuntimeApi, >; diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 93d68af01b3d6badaa565c31599221785f1b176c..18342e3a1e3ba9483dda000d0239973d04e1b4f0 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -23,22 +23,26 @@ use network::config::{ProtocolConfig, Roles}; use network::consensus_gossip as network_gossip; use parking_lot::Mutex; use tokio::runtime::current_thread; -use keyring::AuthorityKeyring; +use keyring::ed25519::{Keyring as AuthorityKeyring}; use client::{ - BlockchainEvents, error::Result, - blockchain::Backend as BlockchainBackend, + error::Result, runtime_api::{Core, RuntimeVersion, ApiExt}, + LongestChain, }; use test_client::{self, runtime::BlockNumber}; use consensus_common::{BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult}; -use consensus_common::import_queue::{SharedBlockImport, SharedJustificationImport}; +use consensus_common::import_queue::{SharedBlockImport, SharedJustificationImport, SharedFinalityProofImport, + SharedFinalityProofRequestBuilder, +}; use std::collections::{HashMap, HashSet}; use std::result; +use parity_codec::Decode; use runtime_primitives::traits::{ApiRef, ProvideRuntimeApi, Header as HeaderT}; use runtime_primitives::generic::BlockId; -use substrate_primitives::{NativeOrEncoded, ExecutionContext}; +use substrate_primitives::{NativeOrEncoded, ExecutionContext, ed25519::Public as AuthorityId}; use authorities::AuthoritySet; +use finality_proof::{FinalityProofProvider, AuthoritySetForFinalityProver, AuthoritySetForFinalityChecker}; use communication::GRANDPA_ENGINE_ID; use consensus_changes::ConsensusChanges; @@ -50,6 +54,7 @@ type PeerData = test_client::Executor, Block, test_client::runtime::RuntimeApi, + LongestChain > > >; @@ -70,7 +75,7 @@ impl GrandpaTestNet { }; let config = Self::default_config(); for _ in 0..n_peers { - net.add_peer(&config); + net.add_full_peer(&config); } net } @@ -97,21 +102,68 @@ impl TestNetFactory for GrandpaTestNet { } } - fn make_verifier(&self, _client: Arc, _cfg: &ProtocolConfig) + fn make_verifier(&self, _client: PeersClient, _cfg: &ProtocolConfig) -> Arc { Arc::new(PassThroughVerifier(false)) // use non-instant finality. } - fn make_block_import(&self, client: Arc) - -> (SharedBlockImport, Option>, PeerData) + fn make_block_import(&self, client: PeersClient) + -> ( + SharedBlockImport, + Option>, + Option>, + Option>, + PeerData, + ) { - let (import, link) = block_import( - client, - Arc::new(self.test_config.clone()) - ).expect("Could not create block import for fresh peer."); - let shared_import = Arc::new(import); - (shared_import.clone(), Some(shared_import), Mutex::new(Some(link))) + match client { + PeersClient::Full(ref client) => { + #[allow(deprecated)] + let select_chain = LongestChain::new( + client.backend().clone() + ); + let (import, link) = block_import( + client.clone(), + Arc::new(self.test_config.clone()), + select_chain, + ).expect("Could not create block import for fresh peer."); + let shared_import = Arc::new(import); + (shared_import.clone(), Some(shared_import), None, None, Mutex::new(Some(link))) + }, + PeersClient::Light(ref client) => { + use crate::light_import::tests::light_block_import_without_justifications; + + let authorities_provider = Arc::new(self.test_config.clone()); + // forbid direct finalization using justification that cames with the block + // => light clients will try to fetch finality proofs + let import = light_block_import_without_justifications( + client.clone(), + authorities_provider, + Arc::new(self.test_config.clone()) + ).expect("Could not create block import for fresh peer."); + let finality_proof_req_builder = import.0.create_finality_proof_request_builder(); + let shared_import = Arc::new(import); + (shared_import.clone(), None, Some(shared_import), Some(finality_proof_req_builder), Mutex::new(None)) + }, + } + } + + fn make_finality_proof_provider( + &self, + client: PeersClient + ) -> Option>> { + match client { + PeersClient::Full(ref client) => { + let authorities_provider = Arc::new(self.test_config.clone()); + Some(Arc::new(FinalityProofProvider::new(client.clone(), authorities_provider))) + }, + PeersClient::Light(_) => None, + } + } + + fn uses_tokio(&self) -> bool { + true } fn peer(&self, i: usize) -> &GrandpaPeer { @@ -151,7 +203,7 @@ impl MessageRouting { } impl Network for MessageRouting { - type In = Box + Send>; + type In = Box + Send>; /// Get a stream of messages for a specific gossip topic. fn messages_for(&self, topic: Hash) -> Self::In { @@ -204,6 +256,11 @@ impl Network for MessageRouting { }) } + fn register_gossip_message(&self, _topic: Hash, _data: Vec) { + // NOTE: only required to restore previous state on startup + // not required for tests currently + } + fn report(&self, _who: network::PeerId, _cost_benefit: i32) { } @@ -226,14 +283,14 @@ impl Future for Exit { } #[derive(Default, Clone)] -struct TestApi { +pub(crate) struct TestApi { genesis_authorities: Vec<(AuthorityId, u64)>, scheduled_changes: Arc>>>, forced_changes: Arc)>>>, } impl TestApi { - fn new(genesis_authorities: Vec<(AuthorityId, u64)>) -> Self { + pub fn new(genesis_authorities: Vec<(AuthorityId, u64)>) -> Self { TestApi { genesis_authorities, scheduled_changes: Arc::new(Mutex::new(HashMap::new())), @@ -242,7 +299,7 @@ impl TestApi { } } -struct RuntimeApi { +pub(crate) struct RuntimeApi { inner: TestApi, } @@ -284,15 +341,6 @@ impl Core for RuntimeApi { ) -> Result> { unimplemented!("Not required for testing!") } - fn Core_authorities_runtime_api_impl( - &self, - _: &BlockId, - _: ExecutionContext, - _: Option<()>, - _: Vec, - ) -> Result>> { - unimplemented!("Not required for testing!") - } } impl ApiExt for RuntimeApi { @@ -306,21 +354,25 @@ impl ApiExt for RuntimeApi { fn runtime_version_at(&self, _: &BlockId) -> Result { unimplemented!("Not required for testing!") } + + fn record_proof(&mut self) { + unimplemented!("Not required for testing!") + } + + fn extract_proof(&mut self) -> Option>> { + unimplemented!("Not required for testing!") + } } impl GrandpaApi for RuntimeApi { fn GrandpaApi_grandpa_authorities_runtime_api_impl( &self, - at: &BlockId, + _: &BlockId, _: ExecutionContext, _: Option<()>, _: Vec, - ) -> Result>> { - if at == &BlockId::Number(0) { - Ok(self.inner.genesis_authorities.clone()).map(NativeOrEncoded::Native) - } else { - panic!("should generally only request genesis authorities") - } + ) -> Result>> { + Ok(self.inner.genesis_authorities.clone()).map(NativeOrEncoded::Native) } fn GrandpaApi_grandpa_pending_change_runtime_api_impl( @@ -359,10 +411,37 @@ impl GrandpaApi for RuntimeApi { } } +impl AuthoritySetForFinalityProver for TestApi { + fn authorities(&self, block: &BlockId) -> Result> { + let runtime_api = RuntimeApi { inner: self.clone() }; + runtime_api.GrandpaApi_grandpa_authorities_runtime_api_impl(block, ExecutionContext::Syncing, None, Vec::new()) + .map(|v| match v { + NativeOrEncoded::Native(value) => value, + _ => unreachable!("only providing native values"), + }) + } + + fn prove_authorities(&self, block: &BlockId) -> Result>> { + self.authorities(block).map(|auth| vec![auth.encode()]) + } +} + +impl AuthoritySetForFinalityChecker for TestApi { + fn check_authorities_proof( + &self, + _hash: ::Hash, + _header: ::Header, + proof: Vec>, + ) -> Result> { + Decode::decode(&mut &proof[0][..]) + .ok_or_else(|| unreachable!("incorrect value is passed as GRANDPA authorities proof")) + } +} + const TEST_GOSSIP_DURATION: Duration = Duration::from_millis(500); const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50); -fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(AuthorityId, u64)> { +fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(substrate_primitives::ed25519::Public, u64)> { keys.iter() .map(|key| AuthorityId(key.to_raw_public())) .map(|id| (id, 1)) @@ -377,7 +456,7 @@ fn run_to_completion_with( peers: &[AuthorityKeyring], with: F, ) -> u64 where - F: FnOnce(current_thread::Handle) -> Option>> + F: FnOnce(current_thread::Handle) -> Option>> { use parking_lot::RwLock; @@ -475,7 +554,7 @@ fn finalize_3_voters_no_observers() { net.sync(); for i in 0..3 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 20, + assert_eq!(net.peer(i).client().info().chain.best_number, 20, "Peer #{} failed to sync", i); } @@ -483,7 +562,7 @@ fn finalize_3_voters_no_observers() { run_to_completion(20, net.clone(), peers); // normally there's no justification for finalized blocks - assert!(net.lock().peer(0).client().backend().blockchain().justification(BlockId::Number(20)).unwrap().is_none(), + assert!(net.lock().peer(0).client().justification(&BlockId::Number(20)).unwrap().is_none(), "Extra justification for block#1"); } @@ -586,11 +665,13 @@ fn transition_3_voters_twice_1_full_observer() { net.lock().sync(); for (i, peer) in net.lock().peers().iter().enumerate() { - assert_eq!(peer.client().info().unwrap().chain.best_number, 1, + let full_client = peer.client().as_full().expect("only full clients are used in test"); + assert_eq!(full_client.info().chain.best_number, 1, "Peer #{} failed to sync", i); let set: AuthoritySet = crate::aux_schema::load_authorities( - &**peer.client().backend() + #[allow(deprecated)] + &**full_client.backend() ).unwrap(); assert_eq!(set.current(), (0, make_ids(peers_a).as_slice())); @@ -671,13 +752,16 @@ fn transition_3_voters_twice_1_full_observer() { link, ) }; + finality_notifications.push( client.finality_notification_stream() .take_while(|n| Ok(n.header.number() < &30)) .for_each(move |_| Ok(())) .map(move |()| { + let full_client = client.as_full().expect("only full clients are used in test"); let set: AuthoritySet = crate::aux_schema::load_authorities( - &**client.backend() + #[allow(deprecated)] + &**full_client.backend() ).unwrap(); assert_eq!(set.current(), (2, make_ids(peers_c).as_slice())); @@ -726,14 +810,14 @@ fn justification_is_emitted_when_consensus_data_changes() { let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 3); // import block#1 WITH consensus data change - let new_authorities = vec![AuthorityId::from_raw([42; 32])]; + let new_authorities = vec![substrate_primitives::sr25519::Public::from_raw([42; 32])]; net.peer(0).push_authorities_change_block(new_authorities); net.sync(); let net = Arc::new(Mutex::new(net)); run_to_completion(1, net.clone(), peers); - // ... and check that there's no justification for block#1 - assert!(net.lock().peer(0).client().backend().blockchain().justification(BlockId::Number(1)).unwrap().is_some(), + // ... and check that there's justification for block#1 + assert!(net.lock().peer(0).client().justification(&BlockId::Number(1)).unwrap().is_some(), "Missing justification for block#1"); } @@ -752,8 +836,7 @@ fn justification_is_generated_periodically() { // when block#32 (justification_period) is finalized, justification // is required => generated for i in 0..3 { - assert!(net.lock().peer(i).client().backend().blockchain() - .justification(BlockId::Number(32)).unwrap().is_some()); + assert!(net.lock().peer(i).client().justification(&BlockId::Number(32)).unwrap().is_some()); } } @@ -805,7 +888,7 @@ fn sync_justifications_on_change_blocks() { net.sync(); for i in 0..4 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 25, + assert_eq!(net.peer(i).client().info().chain.best_number, 25, "Peer #{} failed to sync", i); } @@ -876,7 +959,7 @@ fn finalizes_multiple_pending_changes_in_order() { // all peers imported both change blocks for i in 0..6 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 30, + assert_eq!(net.peer(i).client().info().chain.best_number, 30, "Peer #{} failed to sync", i); } @@ -896,7 +979,7 @@ fn doesnt_vote_on_the_tip_of_the_chain() { net.sync(); for i in 0..3 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 100, + assert_eq!(net.peer(i).client().info().chain.best_number, 100, "Peer #{} failed to sync", i); } @@ -926,7 +1009,7 @@ fn force_change_to_new_set() { { // add a forced transition at block 12. - let parent_hash = net.lock().peer(0).client().info().unwrap().chain.best_hash; + let parent_hash = net.lock().peer(0).client().info().chain.best_hash; forced_transitions.lock().insert(parent_hash, (0, ScheduledChange { next_authorities: voters.clone(), delay: 10, @@ -943,11 +1026,13 @@ fn force_change_to_new_set() { net.lock().sync(); for (i, peer) in net.lock().peers().iter().enumerate() { - assert_eq!(peer.client().info().unwrap().chain.best_number, 26, + assert_eq!(peer.client().info().chain.best_number, 26, "Peer #{} failed to sync", i); + let full_client = peer.client().as_full().expect("only full clients are used in test"); let set: AuthoritySet = crate::aux_schema::load_authorities( - &**peer.client().backend() + #[allow(deprecated)] + &**full_client.backend() ).unwrap(); assert_eq!(set.current(), (1, voters.as_slice())); @@ -974,7 +1059,8 @@ fn allows_reimporting_change_blocks() { let client = net.peer(0).client().clone(); let (block_import, ..) = net.make_block_import(client.clone()); - let builder = client.new_block_at(&BlockId::Number(0)).unwrap(); + let full_client = client.as_full().unwrap(); + let builder = full_client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); let block = builder.bake().unwrap(); api.scheduled_changes.lock().insert(*block.header.parent_hash(), ScheduledChange { next_authorities: make_ids(peers_b), @@ -997,7 +1083,12 @@ fn allows_reimporting_change_blocks() { assert_eq!( block_import.import_block(block(), HashMap::new()).unwrap(), - ImportResult::Imported(ImportedAux { needs_justification: true, clear_justification_requests: false, bad_justification: false }), + ImportResult::Imported(ImportedAux { + needs_justification: true, + clear_justification_requests: false, + bad_justification: false, + needs_finality_proof: false, + }), ); assert_eq!( @@ -1017,7 +1108,8 @@ fn test_bad_justification() { let client = net.peer(0).client().clone(); let (block_import, ..) = net.make_block_import(client.clone()); - let builder = client.new_block_at(&BlockId::Number(0)).unwrap(); + let full_client = client.as_full().expect("only full clients are used in test"); + let builder = full_client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); let block = builder.bake().unwrap(); api.scheduled_changes.lock().insert(*block.header.parent_hash(), ScheduledChange { next_authorities: make_ids(peers_b), @@ -1040,7 +1132,12 @@ fn test_bad_justification() { assert_eq!( block_import.import_block(block(), HashMap::new()).unwrap(), - ImportResult::Imported(ImportedAux { needs_justification: true, clear_justification_requests: false, bad_justification: true }), + ImportResult::Imported(ImportedAux { + needs_justification: true, + clear_justification_requests: false, + bad_justification: true, + ..Default::default() + }), ); assert_eq!( @@ -1068,7 +1165,7 @@ fn voter_persists_its_votes() { net.peer(0).push_blocks(20, false); net.sync(); - assert_eq!(net.peer(0).client().info().unwrap().chain.best_number, 20, + assert_eq!(net.peer(0).client().info().chain.best_number, 20, "Peer #{} failed to sync", 0); let mut runtime = current_thread::Runtime::new().unwrap(); @@ -1085,7 +1182,7 @@ fn voter_persists_its_votes() { let net = net.clone(); let voter = future::loop_fn(voter_rx, move |rx| { - let (_block_import, _, link) = net.lock().make_block_import(client.clone()); + let (_block_import, _, _, _, link) = net.lock().make_block_import(client.clone()); let link = link.lock().take().unwrap(); let grandpa_params = GrandpaParams { @@ -1147,7 +1244,12 @@ fn voter_persists_its_votes() { name: Some(format!("peer#{}", 1)), }; let routing = MessageRouting::new(net.clone(), 1); - let (network, routing_work) = communication::NetworkBridge::new(routing, config.clone(), Exit); + let (network, routing_work) = communication::NetworkBridge::new( + routing, + config.clone(), + None, + Exit, + ); runtime.block_on(routing_work).unwrap(); let (round_rx, round_tx) = network.round_communication( @@ -1180,11 +1282,12 @@ fn voter_persists_its_votes() { net.lock().peer(0).push_blocks(20, false); net.lock().sync(); - assert_eq!(net.lock().peer(0).client().info().unwrap().chain.best_number, 40, + assert_eq!(net.lock().peer(0).client().info().chain.best_number, 40, "Peer #{} failed to sync", 0); + #[allow(deprecated)] let block_30_hash = - net.lock().peer(0).client().backend().blockchain().hash(30).unwrap().unwrap(); + net.lock().peer(0).client().as_full().unwrap().backend().blockchain().hash(30).unwrap().unwrap(); // we restart alice's voter voter_tx.unbounded_send(()).unwrap(); @@ -1256,7 +1359,7 @@ fn finalize_3_voters_1_light_observer() { net.sync(); for i in 0..4 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 20, + assert_eq!(net.peer(i).client().info().chain.best_number, 20, "Peer #{} failed to sync", i); } @@ -1285,3 +1388,94 @@ fn finalize_3_voters_1_light_observer() { Some(Box::new(finality_notifications.map(|_| ()))) }); } + +#[test] +fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { + let _ = ::env_logger::try_init(); + + let peers = &[AuthorityKeyring::Alice]; + let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 1); + net.add_light_peer(&GrandpaTestNet::default_config()); + + // import block#1 WITH consensus data change. Light client ignores justification + // && instead fetches finality proof for block #1 + net.peer(0).push_authorities_change_block(vec![substrate_primitives::sr25519::Public::from_raw([42; 32])]); + let net = Arc::new(Mutex::new(net)); + run_to_completion(1, net.clone(), peers); + net.lock().sync_without_disconnects(); + + // check that the block#1 is finalized on light client + while net.lock().peer(1).client().info().chain.finalized_number != 1 { + net.lock().tick_peer(1); + net.lock().sync_without_disconnects(); + } +} + +#[test] +fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_different() { + // for debug: to ensure that without forced change light client will sync finality proof + const FORCE_CHANGE: bool = true; + + let _ = ::env_logger::try_init(); + + // two of these guys are offline. + let genesis_authorities = if FORCE_CHANGE { + vec![ + AuthorityKeyring::Alice, + AuthorityKeyring::Bob, + AuthorityKeyring::Charlie, + AuthorityKeyring::One, + AuthorityKeyring::Two, + ] + } else { + vec![ + AuthorityKeyring::Alice, + AuthorityKeyring::Bob, + AuthorityKeyring::Charlie, + ] + }; + let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let api = TestApi::new(make_ids(&genesis_authorities)); + + let voters = make_ids(peers_a); + let forced_transitions = api.forced_changes.clone(); + let net = GrandpaTestNet::new(api, 3); + let net = Arc::new(Mutex::new(net)); + + let runner_net = net.clone(); + let add_blocks = move |_| { + net.lock().peer(0).push_blocks(1, false); // best is #1 + + // add a forced transition at block 5. + if FORCE_CHANGE { + let parent_hash = net.lock().peer(0).client().info().chain.best_hash; + forced_transitions.lock().insert(parent_hash, (0, ScheduledChange { + next_authorities: voters.clone(), + delay: 3, + })); + } + + // ensure block#10 enacts authorities set change => justification is generated + // normally it will reach light client, but because of the forced change, it will not + net.lock().peer(0).push_blocks(8, false); // best is #9 + net.lock().peer(0).push_authorities_change_block( + vec![substrate_primitives::sr25519::Public::from_raw([42; 32])] + ); // #10 + net.lock().peer(0).push_blocks(1, false); // best is #11 + net.lock().sync_without_disconnects(); + + None + }; + + // finalize block #11 on full clients + run_to_completion_with(11, runner_net.clone(), peers_a, add_blocks); + // request finalization by light client + runner_net.lock().add_light_peer(&GrandpaTestNet::default_config()); + runner_net.lock().sync_without_disconnects(); + + // check block, finalized on light client + assert_eq!( + runner_net.lock().peer(3).client().info().chain.finalized_number, + if FORCE_CHANGE { 0 } else { 10 }, + ); +} diff --git a/core/inherents/Cargo.toml b/core/inherents/Cargo.toml index 54757ed2684f30a74a38c16af33ce4e0df73c04e..606d9c5ae97ba83ade7a633fd7a0f4bf1e3e08a7 100644 --- a/core/inherents/Cargo.toml +++ b/core/inherents/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "substrate-inherents" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = { version = "0.7", optional = true } +parking_lot = { version = "0.8.0", optional = true } rstd = { package = "sr-std", path = "../sr-std", default-features = false } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } diff --git a/core/inherents/src/lib.rs b/core/inherents/src/lib.rs index 7d2324bc933cdaeb5ab6d0b3f6a8d7579ec385b4..7b99c7ba526b24d2ba292a64dec2cb37556ffe48 100644 --- a/core/inherents/src/lib.rs +++ b/core/inherents/src/lib.rs @@ -44,16 +44,13 @@ use parking_lot::RwLock; #[cfg(feature = "std")] use std::{sync::Arc, format}; -#[cfg(feature = "std")] -pub mod pool; - pub use runtime_primitives::RuntimeString; /// An identifier for an inherent. pub type InherentIdentifier = [u8; 8]; /// Inherent data to include in a block. -#[derive(Clone, Default)] +#[derive(Clone, Default, Encode, Decode)] pub struct InherentData { /// All inherent data encoded with parity-codec and an identifier. data: BTreeMap> @@ -69,7 +66,7 @@ impl InherentData { /// /// # Return /// - /// Returns `Ok(())` if the data could be inserted an no data for an inherent with the same + /// Returns `Ok(())` if the data could be inserted and no data for an inherent with the same /// identifier existed, otherwise an error is returned. /// /// Inherent identifiers need to be unique, otherwise decoding of these values will not work! @@ -114,40 +111,15 @@ impl InherentData { match self.data.get(identifier) { Some(inherent) => I::decode(&mut &inherent[..]) - .ok_or_else(|| "Could not decode requested inherent type!".into()) + .ok_or_else(|| { + "Could not decode requested inherent type!".into() + }) .map(Some), None => Ok(None) } } } -impl codec::Encode for InherentData { - fn encode(&self) -> Vec { - let keys = self.data.keys().collect::>(); - let values = self.data.values().collect::>(); - - let mut encoded = keys.encode(); - encoded.extend(values.encode()); - encoded - } -} - -impl codec::Decode for InherentData { - fn decode(value: &mut I) -> Option { - Vec::::decode(value) - .and_then(|i| Vec::>::decode(value).map(|v| (i, v))) - .and_then(|(i, v)| { - if i.len() == v.len() { - Some(Self { - data: i.into_iter().zip(v.into_iter()).collect() - }) - } else { - None - } - }) - } -} - /// The result of checking inherents. /// /// It either returns okay for all checks, stores all occurred errors or just one fatal error. diff --git a/core/inherents/src/pool.rs b/core/inherents/src/pool.rs deleted file mode 100644 index 2c7e953696a55ab9d134615a2371bbc48f902628..0000000000000000000000000000000000000000 --- a/core/inherents/src/pool.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2019 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 . - -//! Inherents Pool - -use std::{fmt, mem, vec}; -use parking_lot::Mutex; - -/// Inherents Pool -/// -/// The pool is responsible to collect inherents asynchronously generated -/// by some other parts of the code and make them ready for the next block production. -pub struct InherentsPool { - data: Mutex>, -} - -impl Default for InherentsPool { - fn default() -> Self { - InherentsPool { - data: Default::default(), - } - } -} - -impl fmt::Debug for InherentsPool { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - let mut builder = fmt.debug_struct("InherentsPool"); - if let Some(data) = self.data.try_lock() { - builder.field("data", &*data); - } - builder.finish() - } -} - -impl InherentsPool { - /// Add inherent extrinsic to the pool. - /// - /// This inherent will be appended to the next produced block. - pub fn add(&self, extrinsic: T) { - self.data.lock().push(extrinsic); - } - - /// Drain all currently queued inherents. - pub fn drain(&self) -> Vec { - mem::replace(&mut *self.data.lock(), vec![]) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn should_drain_inherents_to_given_data() { - let pool = InherentsPool::default(); - pool.add(5); - pool.add(7); - - assert_eq!(pool.drain(), vec![5, 7]); - assert_eq!(pool.drain(), vec![]); - } -} diff --git a/core/keyring/Cargo.toml b/core/keyring/Cargo.toml index 74f898b83ff12207b643c62384e5046b67aac828..299d822843a3e1de0e297adf173c2fafdbeaede5 100644 --- a/core/keyring/Cargo.toml +++ b/core/keyring/Cargo.toml @@ -1,13 +1,12 @@ [package] name = "substrate-keyring" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] substrate-primitives = { path = "../primitives" } sr-primitives = { path = "../sr-primitives" } -hex-literal = { version = "0.1.0" } lazy_static = { version = "1.0" } strum = "0.14.0" strum_macros = "0.14.0" diff --git a/core/keyring/src/ed25519.rs b/core/keyring/src/ed25519.rs index 96ade6167cd78da80504b163ee49010eb795c05e..9c303b62bc58e6728603dcbe1b27be7c85f724d8 100644 --- a/core/keyring/src/ed25519.rs +++ b/core/keyring/src/ed25519.rs @@ -79,7 +79,7 @@ impl Keyring { .expect("static values are known good; qed") } - /// Returns an interator over all test accounts. + /// Returns an iterator over all test accounts. pub fn iter() -> impl Iterator { ::iter() } diff --git a/core/keyring/src/sr25519.rs b/core/keyring/src/sr25519.rs index 0097d7b2f9c5c1493dad59cdd0a7d7220550a193..24a83ab798d26442d788b9bc219b1a493bb59496 100644 --- a/core/keyring/src/sr25519.rs +++ b/core/keyring/src/sr25519.rs @@ -68,7 +68,7 @@ impl Keyring { } pub fn to_raw_public_vec(self) -> Vec { - Public::from(self).to_raw_vec() + Public::from(self).into_raw_vec() } pub fn sign(self, msg: &[u8]) -> Signature { diff --git a/core/keystore/Cargo.toml b/core/keystore/Cargo.toml index 775ae61758b3ce5323d13c1d5d5257a5c8776e08..1d4f146b7ed7fc156590dedd4fb825f84deaca8e 100644 --- a/core/keystore/Cargo.toml +++ b/core/keystore/Cargo.toml @@ -1,13 +1,12 @@ [package] name = "substrate-keystore" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] +derive_more = "0.14.0" substrate-primitives = { path = "../primitives" } -crypto = { package = "parity-crypto", version = "0.3", default-features = false } -error-chain = "0.12" hex = "0.3" rand = "0.6" serde_json = "1.0" diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index 59c1a65cfb1cd14317ab08dc41bfa5aec0ee300d..67cf2c8d327cd659fb22c75137ff0fe7a0a5702c 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -16,40 +16,42 @@ //! Keystore (and session key management) for ed25519 based chains like Polkadot. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] +#![warn(missing_docs)] use std::collections::HashMap; use std::path::PathBuf; use std::fs::{self, File}; use std::io::{self, Write}; -use error_chain::{bail, error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; - use substrate_primitives::{ed25519::{Pair, Public}, Pair as PairT}; -pub use crypto::KEY_ITERATIONS; +/// Keystore error. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// IO error. + Io(io::Error), + /// JSON error. + Json(serde_json::Error), + /// Invalid password. + #[display(fmt="Invalid password")] + InvalidPassword, + /// Invalid BIP39 phrase + #[display(fmt="Invalid recovery phrase (BIP39) data")] + InvalidPhrase, + /// Invalid seed + #[display(fmt="Invalid seed")] + InvalidSeed, +} -error_chain! { - foreign_links { - Io(io::Error); - Json(serde_json::Error); - } +/// Keystore Result +pub type Result = std::result::Result; - errors { - InvalidPassword { - description("Invalid password"), - display("Invalid password"), - } - InvalidPhrase { - description("Invalid recovery phrase (BIP39) data"), - display("Invalid recovery phrase (BIP39) data"), - } - InvalidSeed { - description("Invalid seed"), - display("Invalid seed"), +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(ref err) => Some(err), + Error::Json(ref err) => Some(err), + _ => None, } } } @@ -79,7 +81,7 @@ impl Store { /// Create a new key from seed. Do not place it into the store. pub fn generate_from_seed(&mut self, seed: &str) -> Result { let pair = Pair::from_string(seed, None) - .map_err(|_| Error::from(ErrorKind::InvalidSeed))?; + .ok().ok_or(Error::InvalidSeed)?; self.additional.insert(pair.public(), pair.clone()); Ok(pair) } @@ -94,9 +96,9 @@ impl Store { let phrase: String = ::serde_json::from_reader(&file)?; let pair = Pair::from_phrase(&phrase, Some(password)) - .map_err(|_| Error::from(ErrorKind::InvalidPhrase))?; + .ok().ok_or(Error::InvalidPhrase)?; if &pair.public() != public { - bail!(ErrorKind::InvalidPassword); + return Err(Error::InvalidPassword); } Ok(pair) } @@ -138,6 +140,7 @@ impl Store { mod tests { use super::*; use tempdir::TempDir; + use substrate_primitives::crypto::Ss58Codec; #[test] fn basic_store() { @@ -162,6 +165,6 @@ mod tests { let mut store = Store::open(temp_dir.path().to_owned()).unwrap(); let pair = store.generate_from_seed("0x3d97c819d68f9bafa7d6e79cb991eebcd77d966c5334c0b94d9e1fa7ad0869dc").unwrap(); - assert_eq!("5DKUrgFqCPV8iAXx9sjy1nyBygQCeiUYRFWurZGhnrn3HBL8", pair.public().to_ss58check()); + assert_eq!("5DKUrgFqCPV8iAXx9sjy1nyBygQCeiUYRFWurZGhnrn3HJCA", pair.public().to_ss58check()); } } diff --git a/core/network-libp2p/Cargo.toml b/core/network-libp2p/Cargo.toml index b6be5f1841d2d110eaee26d914e8047071414828..16978ed02c466a574da214898be0924c4ed96085 100644 --- a/core/network-libp2p/Cargo.toml +++ b/core/network-libp2p/Cargo.toml @@ -3,18 +3,17 @@ description = "libp2p implementation of the ethcore network library" homepage = "http://parity.io" license = "GPL-3.0" name = "substrate-network-libp2p" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] byteorder = "1.3" bytes = "0.4" -error-chain = { version = "0.12", default-features = false } fnv = "1.0" futures = "0.1" -libp2p = { version = "0.7.0", default-features = false, features = ["secio-secp256k1", "libp2p-websocket"] } -parking_lot = "0.7.1" +libp2p = { version = "0.9.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } +parking_lot = "0.8.0" lazy_static = "1.2" log = "0.4" rand = "0.6" @@ -22,11 +21,11 @@ serde = { version = "1.0.70", features = ["derive"] } serde_json = "1.0.24" smallvec = "0.6" substrate-peerset = { path = "../peerset" } -tokio = "0.1" tokio-io = "0.1" tokio-timer = "0.2" unsigned-varint = { version = "0.2.1", features = ["codec"] } void = "1.0" +zeroize = "0.6.0" slog = { version = "^2", features = ["nested-values"] } slog_derive = "0.1.1" @@ -34,4 +33,4 @@ erased-serde = "0.3.9" [dev-dependencies] tempdir = "0.3" - +tokio = "0.1" diff --git a/core/network-libp2p/src/behaviour.rs b/core/network-libp2p/src/behaviour.rs index cf9fc2c1c2c0711a77fd46f4c5e352b895408c30..379983a3fbc8753ced25275c960be7bc355a1c71 100644 --- a/core/network-libp2p/src/behaviour.rs +++ b/core/network-libp2p/src/behaviour.rs @@ -14,70 +14,71 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::custom_proto::{CustomProto, CustomProtoOut, RegisteredProtocol}; +use crate::DiscoveryNetBehaviour; use futures::prelude::*; use libp2p::NetworkBehaviour; -use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, PublicKey}; +use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, protocols_handler::IntoProtocolsHandler, PublicKey}; use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; use libp2p::core::swarm::{NetworkBehaviourEventProcess, PollParameters}; +#[cfg(not(target_os = "unknown"))] use libp2p::core::swarm::toggle::Toggle; -use libp2p::identify::{Identify, IdentifyEvent, protocol::IdentifyInfo}; use libp2p::kad::{Kademlia, KademliaOut}; +#[cfg(not(target_os = "unknown"))] use libp2p::mdns::{Mdns, MdnsEvent}; use libp2p::multiaddr::Protocol; -use libp2p::ping::{Ping, PingConfig, PingEvent, PingSuccess}; use log::{debug, info, trace, warn}; -use std::{cmp, io, fmt, time::Duration}; +use std::{cmp, iter, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; use tokio_timer::{Delay, clock::Clock}; use void; +mod debug_info; + /// General behaviour of the network. #[derive(NetworkBehaviour)] -#[behaviour(out_event = "BehaviourOut", poll_method = "poll")] -pub struct Behaviour { - /// Periodically ping nodes, and close the connection if it's unresponsive. - ping: Ping, - /// Custom protocols (dot, bbq, sub, etc.). - custom_protocols: CustomProto, +#[behaviour(out_event = "TBehaviourEv", poll_method = "poll")] +pub struct Behaviour { + /// Main protocol that handles everything except the discovery and the technicalities. + user_protocol: UserBehaviourWrap, + /// Periodically pings and identifies the nodes we are connected to, and store information in a + /// cache. + debug_info: debug_info::DebugInfoBehaviour, /// Discovers nodes of the network. Defined below. discovery: DiscoveryBehaviour, - /// Periodically identifies the remote and responds to incoming requests. - identify: Identify, /// Discovers nodes on the local network. + #[cfg(not(target_os = "unknown"))] mdns: Toggle>, /// Queue of events to produce for the outside. #[behaviour(ignore)] - events: Vec>, + events: Vec, } -impl Behaviour { +impl Behaviour { /// Builds a new `Behaviour`. pub fn new( + user_protocol: TBehaviour, user_agent: String, local_public_key: PublicKey, - protocol: RegisteredProtocol, known_addresses: Vec<(PeerId, Multiaddr)>, - peerset: substrate_peerset::Peerset, enable_mdns: bool, ) -> Self { - let identify = { - let proto_version = "/substrate/1.0".to_string(); - Identify::new(proto_version, user_agent, local_public_key.clone()) - }; - - let custom_protocols = CustomProto::new(protocol, peerset); + let debug_info = debug_info::DebugInfoBehaviour::new(user_agent, local_public_key.clone()); let mut kademlia = Kademlia::new(local_public_key.clone().into_peer_id()); for (peer_id, addr) in &known_addresses { - kademlia.add_connected_address(peer_id, addr.clone()); + kademlia.add_address(peer_id, addr.clone()); + } + + if enable_mdns { + #[cfg(target_os = "unknown")] + warn!(target: "sub-libp2p", "mDNS is not available on this platform"); } let clock = Clock::new(); Behaviour { - ping: Ping::new(PingConfig::new()), - custom_protocols, + user_protocol: UserBehaviourWrap(user_protocol), + debug_info, discovery: DiscoveryBehaviour { user_defined: known_addresses, kademlia, @@ -86,7 +87,7 @@ impl Behaviour { clock, local_peer_id: local_public_key.into_peer_id(), }, - identify, + #[cfg(not(target_os = "unknown"))] mdns: if enable_mdns { match Mdns::new() { Ok(mdns) => Some(mdns).into(), @@ -102,32 +103,11 @@ impl Behaviour { } } - /// Sends a message to a peer. - /// - /// Has no effect if the custom protocol is not open with the given peer. - /// - /// Also note that even we have a valid open substream, it may in fact be already closed - /// without us knowing, in which case the packet will not be received. - #[inline] - pub fn send_custom_message(&mut self, target: &PeerId, data: TMessage) { - self.custom_protocols.send_packet(target, data) - } - /// Returns the list of nodes that we know exist in the network. - pub fn known_peers(&self) -> impl Iterator { + pub fn known_peers(&mut self) -> impl Iterator { self.discovery.kademlia.kbuckets_entries() } - /// Returns true if we try to open protocols with the given peer. - pub fn is_enabled(&self, peer_id: &PeerId) -> bool { - self.custom_protocols.is_enabled(peer_id) - } - - /// Returns true if we have an open protocol with the given peer. - pub fn is_open(&self, peer_id: &PeerId) -> bool { - self.custom_protocols.is_open(peer_id) - } - /// Adds a hard-coded address for the given peer, that never expires. pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { if self.discovery.user_defined.iter().all(|(p, a)| *p != peer_id && *a != addr) { @@ -135,148 +115,70 @@ impl Behaviour { } } - /// Disconnects the custom protocols from a peer. - /// - /// The peer will still be able to use Kademlia or other protocols, but will get disconnected - /// after a few seconds of inactivity. - /// - /// This is asynchronous and does not instantly close the custom protocols. - /// Corresponding closing events will be generated once the closing actually happens. + /// Borrows `self` and returns a struct giving access to the information about a node. /// - /// Has no effect if we're not connected to the `PeerId`. - #[inline] - pub fn drop_node(&mut self, peer_id: &PeerId) { - self.custom_protocols.disconnect_peer(peer_id) + /// Returns `None` if we don't know anything about this node. Always returns `Some` for nodes + /// we're connected to, meaning that if `None` is returned then we're not connected to that + /// node. + pub fn node(&self, peer_id: &PeerId) -> Option { + self.debug_info.node(peer_id) } - /// Returns the state of the peerset manager, for debugging purposes. - pub fn peerset_debug_info(&self) -> serde_json::Value { - self.custom_protocols.peerset_debug_info() + /// Returns a shared reference to the user protocol. + pub fn user_protocol(&self) -> &TBehaviour { + &self.user_protocol.0 } -} - -/// Event that can be emitted by the behaviour. -#[derive(Debug)] -pub enum BehaviourOut { - /// Opened a custom protocol with the remote. - CustomProtocolOpen { - /// Version of the protocol that has been opened. - version: u8, - /// Id of the node we have opened a connection with. - peer_id: PeerId, - /// Endpoint used for this custom protocol. - endpoint: ConnectedPoint, - }, - - /// Closed a custom protocol with the remote. - CustomProtocolClosed { - /// Id of the peer we were connected to. - peer_id: PeerId, - /// Reason why the substream closed. If `Ok`, then it's a graceful exit (EOF). - result: io::Result<()>, - }, - - /// Receives a message on a custom protocol substream. - CustomMessage { - /// Id of the peer the message came from. - peer_id: PeerId, - /// Message that has been received. - message: TMessage, - }, - /// A substream with a remote is clogged. We should avoid sending more data to it if possible. - Clogged { - /// Id of the peer the message came from. - peer_id: PeerId, - /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, - }, - - /// We have obtained debug information from a peer. - Identified { - /// Id of the peer that has been identified. - peer_id: PeerId, - /// Information about the peer. - info: IdentifyInfo, - }, - - /// We have successfully pinged a peer. - PingSuccess { - /// Id of the peer that has been pinged. - peer_id: PeerId, - /// Time it took for the ping to come back. - ping_time: Duration, - }, -} - -impl From> for BehaviourOut { - fn from(other: CustomProtoOut) -> BehaviourOut { - match other { - CustomProtoOut::CustomProtocolOpen { version, peer_id, endpoint } => { - BehaviourOut::CustomProtocolOpen { version, peer_id, endpoint } - } - CustomProtoOut::CustomProtocolClosed { peer_id, result } => { - BehaviourOut::CustomProtocolClosed { peer_id, result } - } - CustomProtoOut::CustomMessage { peer_id, message } => { - BehaviourOut::CustomMessage { peer_id, message } - } - CustomProtoOut::Clogged { peer_id, messages } => { - BehaviourOut::Clogged { peer_id, messages } - } - } + /// Returns a mutable reference to the user protocol. + pub fn user_protocol_mut(&mut self) -> &mut TBehaviour { + &mut self.user_protocol.0 } } -impl NetworkBehaviourEventProcess for Behaviour { +impl NetworkBehaviourEventProcess for +Behaviour { fn inject_event(&mut self, event: void::Void) { void::unreachable(event) } } -impl NetworkBehaviourEventProcess> for Behaviour { - fn inject_event(&mut self, event: CustomProtoOut) { - self.events.push(event.into()); +impl NetworkBehaviourEventProcess> for +Behaviour { + fn inject_event(&mut self, event: UserEventWrap) { + self.events.push(event.0); } } -impl NetworkBehaviourEventProcess for Behaviour { - fn inject_event(&mut self, event: IdentifyEvent) { - match event { - IdentifyEvent::Identified { peer_id, mut info, .. } => { - trace!(target: "sub-libp2p", "Identified {:?} => {:?}", peer_id, info); - // TODO: ideally we would delay the first identification to when we open the custom - // protocol, so that we only report id info to the service about the nodes we - // care about (https://github.com/libp2p/rust-libp2p/issues/876) - if !info.protocol_version.contains("substrate") { - warn!(target: "sub-libp2p", "Connected to a non-Substrate node: {:?}", info); - } - if info.listen_addrs.len() > 30 { - warn!(target: "sub-libp2p", "Node {:?} id reported more than 30 addresses", - peer_id); - info.listen_addrs.truncate(30); - } - for addr in &info.listen_addrs { - self.discovery.kademlia.add_connected_address(&peer_id, addr.clone()); - } - self.custom_protocols.add_discovered_nodes(Some(peer_id.clone())); - self.events.push(BehaviourOut::Identified { peer_id, info }); - } - IdentifyEvent::Error { .. } => {} - IdentifyEvent::SendBack { result: Err(ref err), ref peer_id } => - debug!(target: "sub-libp2p", "Error when sending back identify info \ - to {:?} => {}", peer_id, err), - IdentifyEvent::SendBack { .. } => {} +impl NetworkBehaviourEventProcess + for Behaviour + where TBehaviour: DiscoveryNetBehaviour { + fn inject_event(&mut self, event: debug_info::DebugInfoEvent) { + let debug_info::DebugInfoEvent::Identified { peer_id, mut info } = event; + if !info.protocol_version.contains("substrate") { + warn!(target: "sub-libp2p", "Connected to a non-Substrate node: {:?}", info); + } + if info.listen_addrs.len() > 30 { + warn!(target: "sub-libp2p", "Node {:?} has reported more than 30 addresses; \ + it is identified by {:?} and {:?}", peer_id, info.protocol_version, + info.agent_version + ); + info.listen_addrs.truncate(30); } + for addr in &info.listen_addrs { + self.discovery.kademlia.add_address(&peer_id, addr.clone()); + } + self.user_protocol.0.add_discovered_nodes(iter::once(peer_id.clone())); } } -impl NetworkBehaviourEventProcess for Behaviour { +impl NetworkBehaviourEventProcess + for Behaviour + where TBehaviour: DiscoveryNetBehaviour { fn inject_event(&mut self, out: KademliaOut) { match out { KademliaOut::Discovered { .. } => {} KademliaOut::KBucketAdded { peer_id, .. } => { - self.custom_protocols.add_discovered_nodes(Some(peer_id)); + self.user_protocol.0.add_discovered_nodes(iter::once(peer_id)); } KademliaOut::FindNodeResult { key, closer_peers } => { trace!(target: "sub-libp2p", "Libp2p => Query for {:?} yielded {:?} results", @@ -286,37 +188,30 @@ impl NetworkBehaviourEventProcess for Behavio results"); } } - // We never start any GET_PROVIDERS query. - KademliaOut::GetProvidersResult { .. } => () + // We never start any other type of query. + KademliaOut::GetProvidersResult { .. } => {} + KademliaOut::GetValueResult(_) => {} + KademliaOut::PutValueResult(_) => {} } } } -impl NetworkBehaviourEventProcess for Behaviour { - fn inject_event(&mut self, event: PingEvent) { - match event { - PingEvent { peer, result: Ok(PingSuccess::Ping { rtt }) } => { - trace!(target: "sub-libp2p", "Ping time with {:?}: {:?}", peer, rtt); - self.events.push(BehaviourOut::PingSuccess { peer_id: peer, ping_time: rtt }); - } - _ => () - } - } -} - -impl NetworkBehaviourEventProcess for Behaviour { +#[cfg(not(target_os = "unknown"))] +impl NetworkBehaviourEventProcess for + Behaviour + where TBehaviour: DiscoveryNetBehaviour { fn inject_event(&mut self, event: MdnsEvent) { match event { MdnsEvent::Discovered(list) => { - self.custom_protocols.add_discovered_nodes(list.into_iter().map(|(peer_id, _)| peer_id)); + self.user_protocol.0.add_discovered_nodes(list.into_iter().map(|(peer_id, _)| peer_id)); }, MdnsEvent::Expired(_) => {} } } } -impl Behaviour { - fn poll(&mut self) -> Async>> { +impl Behaviour { + fn poll(&mut self) -> Async> { if !self.events.is_empty() { return Async::Ready(NetworkBehaviourAction::GenerateEvent(self.events.remove(0))) } @@ -325,6 +220,74 @@ impl Behaviour { } } +/// Because of limitations with the network behaviour custom derive and trait impl duplication, we +/// have to wrap the user protocol into a struct. +pub struct UserBehaviourWrap(TInner); +/// Event produced by `UserBehaviourWrap`. +pub struct UserEventWrap(TInner); +impl NetworkBehaviour for UserBehaviourWrap { + type ProtocolsHandler = TInner::ProtocolsHandler; + type OutEvent = UserEventWrap; + fn new_handler(&mut self) -> Self::ProtocolsHandler { self.0.new_handler() } + fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { + self.0.addresses_of_peer(peer_id) + } + fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { + self.0.inject_connected(peer_id, endpoint) + } + fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { + self.0.inject_disconnected(peer_id, endpoint) + } + fn inject_node_event( + &mut self, + peer_id: PeerId, + event: <::Handler as ProtocolsHandler>::OutEvent + ) { + self.0.inject_node_event(peer_id, event) + } + fn poll( + &mut self, + params: &mut PollParameters + ) -> Async< + NetworkBehaviourAction< + <::Handler as ProtocolsHandler>::InEvent, + Self::OutEvent + > + > { + match self.0.poll(params) { + Async::NotReady => Async::NotReady, + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => + Async::Ready(NetworkBehaviourAction::GenerateEvent(UserEventWrap(ev))), + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + } + fn inject_replaced(&mut self, peer_id: PeerId, closed_endpoint: ConnectedPoint, new_endpoint: ConnectedPoint) { + self.0.inject_replaced(peer_id, closed_endpoint, new_endpoint) + } + fn inject_addr_reach_failure(&mut self, peer_id: Option<&PeerId>, addr: &Multiaddr, error: &dyn std::error::Error) { + self.0.inject_addr_reach_failure(peer_id, addr, error) + } + fn inject_dial_failure(&mut self, peer_id: &PeerId) { + self.0.inject_dial_failure(peer_id) + } + fn inject_new_listen_addr(&mut self, addr: &Multiaddr) { + self.0.inject_new_listen_addr(addr) + } + fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { + self.0.inject_expired_listen_addr(addr) + } + fn inject_new_external_addr(&mut self, addr: &Multiaddr) { + self.0.inject_new_external_addr(addr) + } +} + /// Implementation of `NetworkBehaviour` that discovers the nodes on the network. pub struct DiscoveryBehaviour { /// User-defined list of nodes and their addresses. Typically includes bootstrap nodes and @@ -394,7 +357,7 @@ where fn inject_new_external_addr(&mut self, addr: &Multiaddr) { let new_addr = addr.clone() .with(Protocol::P2p(self.local_peer_id.clone().into())); - info!(target: "sub-libp2p", "Discovered external node address: {}", new_addr); + info!(target: "sub-libp2p", "Discovered new external address for our node: {}", new_addr); } fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { @@ -441,27 +404,3 @@ where Async::NotReady } } - -/// The severity of misbehaviour of a peer that is reported. -#[derive(Debug, PartialEq, Eq, Clone)] -pub enum Severity { - /// Peer is timing out. Could be bad connectivity of overload of work on either of our sides. - Timeout, - /// Peer has been notably useless. E.g. unable to answer a request that we might reasonably consider - /// it could answer. - Useless(String), - /// Peer has behaved in an invalid manner. This doesn't necessarily need to be Byzantine, but peer - /// must have taken concrete action in order to behave in such a way which is wantanly invalid. - Bad(String), -} - -impl fmt::Display for Severity { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - match self { - Severity::Timeout => write!(fmt, "Timeout"), - Severity::Useless(r) => write!(fmt, "Useless ({})", r), - Severity::Bad(r) => write!(fmt, "Bad ({})", r), - } - } -} - diff --git a/core/network-libp2p/src/behaviour/debug_info.rs b/core/network-libp2p/src/behaviour/debug_info.rs new file mode 100644 index 0000000000000000000000000000000000000000..46c7422fd7e693050ba7f897b0e5bd6d9712e77a --- /dev/null +++ b/core/network-libp2p/src/behaviour/debug_info.rs @@ -0,0 +1,329 @@ +// Copyright 2019 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 . + +use fnv::FnvHashMap; +use futures::prelude::*; +use libp2p::Multiaddr; +use libp2p::core::{either::EitherOutput, PeerId, PublicKey}; +use libp2p::core::protocols_handler::{IntoProtocolsHandler, IntoProtocolsHandlerSelect, ProtocolsHandler}; +use libp2p::core::nodes::ConnectedPoint; +use libp2p::core::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; +use libp2p::identify::{Identify, IdentifyEvent, protocol::IdentifyInfo}; +use libp2p::ping::{Ping, PingConfig, PingEvent, PingSuccess}; +use log::{debug, trace, error}; +use std::collections::hash_map::Entry; +use std::time::{Duration, Instant}; +use tokio_io::{AsyncRead, AsyncWrite}; +use tokio_timer::Interval; + +/// Time after we disconnect from a node before we purge its information from the cache. +const CACHE_EXPIRE: Duration = Duration::from_secs(10 * 60); +/// Interval at which we perform garbage collection on the node info. +const GARBAGE_COLLECT_INTERVAL: Duration = Duration::from_secs(2 * 60); + +/// Implementation of `NetworkBehaviour` that holds information about nodes in cache for diagnostic +/// purposes. +pub struct DebugInfoBehaviour { + /// Periodically ping nodes, and close the connection if it's unresponsive. + ping: Ping, + /// Periodically identifies the remote and responds to incoming requests. + identify: Identify, + /// Information that we know about all nodes. + nodes_info: FnvHashMap, + /// Interval at which we perform garbage collection in `nodes_info`. + garbage_collect: Interval, +} + +/// Information about a node we're connected to. +#[derive(Debug)] +struct NodeInfo { + /// When we will remove the entry about this node from the list, or `None` if we're connected + /// to the node. + info_expire: Option, + /// How we're connected to the node. + endpoint: ConnectedPoint, + /// Version reported by the remote, or `None` if unknown. + client_version: Option, + /// Latest ping time with this node. + latest_ping: Option, +} + +impl DebugInfoBehaviour { + /// Builds a new `DebugInfoBehaviour`. + pub fn new( + user_agent: String, + local_public_key: PublicKey, + ) -> Self { + let identify = { + let proto_version = "/substrate/1.0".to_string(); + Identify::new(proto_version, user_agent, local_public_key.clone()) + }; + + DebugInfoBehaviour { + ping: Ping::new(PingConfig::new()), + identify, + nodes_info: FnvHashMap::default(), + garbage_collect: Interval::new_interval(GARBAGE_COLLECT_INTERVAL), + } + } + + /// Borrows `self` and returns a struct giving access to the information about a node. + /// + /// Returns `None` if we don't know anything about this node. Always returns `Some` for nodes + /// we're connected to, meaning that if `None` is returned then we're not connected to that + /// node. + pub fn node(&self, peer_id: &PeerId) -> Option { + self.nodes_info.get(peer_id).map(Node) + } + + /// Inserts a ping time in the cache. Has no effect if we don't have any entry for that node, + /// which shouldn't happen. + fn handle_ping_report(&mut self, peer_id: &PeerId, ping_time: Duration) { + trace!(target: "sub-libp2p", "Ping time with {:?}: {:?}", peer_id, ping_time); + if let Some(entry) = self.nodes_info.get_mut(peer_id) { + entry.latest_ping = Some(ping_time); + } else { + error!(target: "sub-libp2p", + "Received ping from node we're not connected to {:?}", peer_id); + } + } + + /// Inserts an identify record in the cache. Has no effect if we don't have any entry for that + /// node, which shouldn't happen. + fn handle_identify_report(&mut self, peer_id: &PeerId, info: &IdentifyInfo) { + trace!(target: "sub-libp2p", "Identified {:?} => {:?}", peer_id, info); + if let Some(entry) = self.nodes_info.get_mut(peer_id) { + entry.client_version = Some(info.agent_version.clone()); + } else { + error!(target: "sub-libp2p", + "Received pong from node we're not connected to {:?}", peer_id); + } + } +} + +/// Gives access to the information about a node. +pub struct Node<'a>(&'a NodeInfo); + +impl<'a> Node<'a> { + /// Returns the endpoint we are connected to or were last connected to. + pub fn endpoint(&self) -> &'a ConnectedPoint { + &self.0.endpoint + } + + /// Returns the latest version information we know of. + pub fn client_version(&self) -> Option<&'a str> { + self.0.client_version.as_ref().map(|s| &s[..]) + } + + /// Returns the latest ping time we know of for this node. `None` if we never successfully + /// pinged this node. + pub fn latest_ping(&self) -> Option { + self.0.latest_ping + } + + /// Generates an arbitrary string containing debug information about the node. + pub fn debug_info(&self) -> String { + format!("(version: {:?}) through {:?}", self.0.client_version, self.0.endpoint) + } +} + +/// Event that can be emitted by the behaviour. +#[derive(Debug)] +pub enum DebugInfoEvent { + /// We have obtained debug information from a peer, including the addresses it is listening + /// on. + Identified { + /// Id of the peer that has been identified. + peer_id: PeerId, + /// Information about the peer. + info: IdentifyInfo, + }, +} + +impl NetworkBehaviour for DebugInfoBehaviour +where TSubstream: AsyncRead + AsyncWrite { + type ProtocolsHandler = IntoProtocolsHandlerSelect< + as NetworkBehaviour>::ProtocolsHandler, + as NetworkBehaviour>::ProtocolsHandler + >; + type OutEvent = DebugInfoEvent; + + fn new_handler(&mut self) -> Self::ProtocolsHandler { + IntoProtocolsHandler::select(self.ping.new_handler(), self.identify.new_handler()) + } + + fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { + let mut list = self.ping.addresses_of_peer(peer_id); + list.extend_from_slice(&self.identify.addresses_of_peer(peer_id)); + list + } + + fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { + self.ping.inject_connected(peer_id.clone(), endpoint.clone()); + self.identify.inject_connected(peer_id.clone(), endpoint.clone()); + + match self.nodes_info.entry(peer_id) { + Entry::Vacant(e) => { + e.insert(NodeInfo { + info_expire: None, + endpoint, + client_version: None, + latest_ping: None, + }); + } + Entry::Occupied(e) => { + let e = e.into_mut(); + if e.info_expire.as_ref().map(|exp| *exp < Instant::now()).unwrap_or(false) { + e.client_version = None; + e.latest_ping = None; + } + e.info_expire = None; + e.endpoint = endpoint; + } + } + } + + fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { + self.ping.inject_disconnected(peer_id, endpoint.clone()); + self.identify.inject_disconnected(peer_id, endpoint); + + if let Some(entry) = self.nodes_info.get_mut(peer_id) { + entry.info_expire = Some(Instant::now() + CACHE_EXPIRE); + } else { + error!(target: "sub-libp2p", + "Disconnected from node we were not connected to {:?}", peer_id); + } + } + + fn inject_node_event( + &mut self, + peer_id: PeerId, + event: <::Handler as ProtocolsHandler>::OutEvent + ) { + match event { + EitherOutput::First(event) => self.ping.inject_node_event(peer_id, event), + EitherOutput::Second(event) => self.identify.inject_node_event(peer_id, event), + } + } + + fn inject_replaced(&mut self, peer_id: PeerId, closed_endpoint: ConnectedPoint, new_endpoint: ConnectedPoint) { + self.ping.inject_replaced(peer_id.clone(), closed_endpoint.clone(), new_endpoint.clone()); + self.identify.inject_replaced(peer_id.clone(), closed_endpoint, new_endpoint.clone()); + + if let Some(entry) = self.nodes_info.get_mut(&peer_id) { + entry.endpoint = new_endpoint; + } else { + error!(target: "sub-libp2p", + "Disconnected from node we were not connected to {:?}", peer_id); + } + } + + fn inject_addr_reach_failure(&mut self, peer_id: Option<&PeerId>, addr: &Multiaddr, error: &dyn std::error::Error) { + self.ping.inject_addr_reach_failure(peer_id, addr, error); + self.identify.inject_addr_reach_failure(peer_id, addr, error); + } + + fn inject_dial_failure(&mut self, peer_id: &PeerId) { + self.ping.inject_dial_failure(peer_id); + self.identify.inject_dial_failure(peer_id); + } + + fn inject_new_listen_addr(&mut self, addr: &Multiaddr) { + self.ping.inject_new_listen_addr(addr); + self.identify.inject_new_listen_addr(addr); + } + + fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { + self.ping.inject_expired_listen_addr(addr); + self.identify.inject_expired_listen_addr(addr); + } + + fn inject_new_external_addr(&mut self, addr: &Multiaddr) { + self.ping.inject_new_external_addr(addr); + self.identify.inject_new_external_addr(addr); + } + + fn poll( + &mut self, + params: &mut PollParameters + ) -> Async< + NetworkBehaviourAction< + <::Handler as ProtocolsHandler>::InEvent, + Self::OutEvent + > + > { + loop { + match self.ping.poll(params) { + Async::NotReady => break, + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => { + if let PingEvent { peer, result: Ok(PingSuccess::Ping { rtt }) } = ev { + self.handle_ping_report(&peer, rtt) + } + }, + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Async::Ready(NetworkBehaviourAction::SendEvent { + peer_id, + event: EitherOutput::First(event) + }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + } + + loop { + match self.identify.poll(params) { + Async::NotReady => break, + Async::Ready(NetworkBehaviourAction::GenerateEvent(event)) => { + match event { + IdentifyEvent::Identified { peer_id, info, .. } => { + self.handle_identify_report(&peer_id, &info); + let event = DebugInfoEvent::Identified { peer_id, info }; + return Async::Ready(NetworkBehaviourAction::GenerateEvent(event)); + } + IdentifyEvent::Error { .. } => {} + IdentifyEvent::SendBack { result: Err(ref err), ref peer_id } => + debug!(target: "sub-libp2p", "Error when sending back identify info \ + to {:?} => {}", peer_id, err), + IdentifyEvent::SendBack { .. } => {} + } + }, + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Async::Ready(NetworkBehaviourAction::SendEvent { + peer_id, + event: EitherOutput::Second(event) + }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + } + + while let Ok(Async::Ready(Some(_))) = self.garbage_collect.poll() { + self.nodes_info.retain(|_, node| { + node.info_expire.as_ref().map(|exp| *exp >= Instant::now()).unwrap_or(true) + }); + } + + Async::NotReady + } +} diff --git a/core/network-libp2p/src/config.rs b/core/network-libp2p/src/config.rs index 9d74cd73e234308927d3c25a59436ec230f10b8e..b9ccbb642802d6ed734c397ab8eca356ef765a73 100644 --- a/core/network-libp2p/src/config.rs +++ b/core/network-libp2p/src/config.rs @@ -17,9 +17,11 @@ //! Libp2p network configuration. use libp2p::identity::{Keypair, secp256k1, ed25519}; +use libp2p::wasm_ext; use libp2p::{Multiaddr, multiaddr::Protocol}; use std::error::Error; use std::{io::{self, Write}, iter, fs, net::Ipv4Addr, path::{Path, PathBuf}}; +use zeroize::Zeroize; /// Network service configuration. #[derive(Clone)] @@ -51,6 +53,13 @@ pub struct NetworkConfiguration { /// If true, the network will use mDNS to discover other libp2p nodes on the local network /// and connect to them if they support the same chain. pub enable_mdns: bool, + /// Optional external implementation of a libp2p transport. Used in WASM contexts where we need + /// some binding between the networking provided by the operating system or environment and + /// libp2p. + /// + /// This parameter exists whatever the target platform is, but it is expected to be set to + /// `Some` only when compiling for WASM. + pub wasm_external_transport: Option, } impl Default for NetworkConfiguration { @@ -69,6 +78,7 @@ impl Default for NetworkConfiguration { client_version: "unknown".into(), node_name: "unknown".into(), enable_mdns: false, + wasm_external_transport: None, } } } @@ -167,7 +177,8 @@ impl NodeKeyConfig { Secp256k1(Secret::File(f)) => get_secret(f, |mut b| secp256k1::SecretKey::from_bytes(&mut b), - secp256k1::SecretKey::generate) + secp256k1::SecretKey::generate, + |b| b.to_bytes().to_vec()) .map(secp256k1::Keypair::from) .map(Keypair::Secp256k1), @@ -180,7 +191,8 @@ impl NodeKeyConfig { Ed25519(Secret::File(f)) => get_secret(f, |mut b| ed25519::SecretKey::from_bytes(&mut b), - ed25519::SecretKey::generate) + ed25519::SecretKey::generate, + |b| b.as_ref().to_vec()) .map(ed25519::Keypair::from) .map(Keypair::Ed25519), } @@ -190,13 +202,13 @@ impl NodeKeyConfig { /// Load a secret key from a file, if it exists, or generate a /// new secret key and write it to that file. In either case, /// the secret key is returned. -fn get_secret(file: P, parse: F, generate: G) -> io::Result +fn get_secret(file: P, parse: F, generate: G, serialize: W) -> io::Result where P: AsRef, F: for<'r> FnOnce(&'r mut [u8]) -> Result, G: FnOnce() -> K, E: Error + Send + Sync + 'static, - K: AsRef<[u8]> + W: Fn(&K) -> Vec, { std::fs::read(&file) .and_then(|mut sk_bytes| @@ -206,7 +218,9 @@ where if e.kind() == io::ErrorKind::NotFound { file.as_ref().parent().map_or(Ok(()), fs::create_dir_all)?; let sk = generate(); - write_secret_file(file, sk.as_ref())?; + let mut sk_vec = serialize(&sk); + write_secret_file(file, &sk_vec)?; + sk_vec.zeroize(); Ok(sk) } else { Err(e) @@ -257,7 +271,7 @@ mod tests { fn secret_bytes(kp: &Keypair) -> Vec { match kp { Keypair::Ed25519(p) => p.secret().as_ref().iter().cloned().collect(), - Keypair::Secp256k1(p) => p.secret().as_ref().iter().cloned().collect(), + Keypair::Secp256k1(p) => p.secret().to_bytes().to_vec(), _ => panic!("Unexpected keypair.") } } diff --git a/core/network-libp2p/src/custom_proto/behaviour.rs b/core/network-libp2p/src/custom_proto/behaviour.rs index ca1363fab15adb8e26997d538d341d65624896b9..41b3b32218b400d32d231ff33eb2f6389e299417 100644 --- a/core/network-libp2p/src/custom_proto/behaviour.rs +++ b/core/network-libp2p/src/custom_proto/behaviour.rs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +use crate::DiscoveryNetBehaviour; use crate::custom_proto::handler::{CustomProtoHandlerProto, CustomProtoHandlerOut, CustomProtoHandlerIn}; use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; use fnv::FnvHashMap; @@ -22,7 +23,7 @@ use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourActi use libp2p::core::{Multiaddr, PeerId}; use log::{debug, error, trace, warn}; use smallvec::SmallVec; -use std::{collections::hash_map::Entry, cmp, error, io, marker::PhantomData, mem, time::Duration, time::Instant}; +use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, time::Duration, time::Instant}; use tokio_io::{AsyncRead, AsyncWrite}; use tokio_timer::clock::Clock; @@ -153,6 +154,22 @@ enum PeerState { }, } +impl PeerState { + /// True if we have an open channel with that node. + fn is_open(&self) -> bool { + match self { + PeerState::Poisoned => false, + PeerState::Banned { .. } => false, + PeerState::PendingRequest { .. } => false, + PeerState::Requested => false, + PeerState::Disabled { open, .. } => *open, + PeerState::DisabledPendingEnable { open, .. } => *open, + PeerState::Enabled { open, .. } => *open, + PeerState::Incoming { .. } => false, + } + } +} + /// State of an "incoming" message sent to the peer set manager. #[derive(Debug)] struct IncomingPeer { @@ -182,8 +199,8 @@ pub enum CustomProtoOut { CustomProtocolClosed { /// Id of the peer we were connected to. peer_id: PeerId, - /// Reason why the substream closed. If `Ok`, then it's a graceful exit (EOF). - result: io::Result<()>, + /// Reason why the substream closed, for debugging purposes. + reason: Cow<'static, str>, }, /// Receives a message on a custom protocol substream. @@ -222,6 +239,16 @@ impl CustomProto { } } + /// Returns the list of all the peers we have an open channel to. + pub fn open_peers<'a>(&'a self) -> impl Iterator + 'a { + self.peers.iter().filter(|(_, state)| state.is_open()).map(|(id, _)| id) + } + + /// Returns true if we have a channel open with this node. + pub fn is_open(&self, peer_id: &PeerId) -> bool { + self.peers.get(peer_id).map(|p| p.is_open()).unwrap_or(false) + } + /// Disconnects the given peer if we are connected to it. pub fn disconnect_peer(&mut self, peer_id: &PeerId) { debug!(target: "sub-libp2p", "External API => Disconnect {:?}", peer_id); @@ -312,21 +339,6 @@ impl CustomProto { } } - /// Returns true if we have opened a protocol with the given peer. - pub fn is_open(&self, peer_id: &PeerId) -> bool { - match self.peers.get(peer_id) { - None => false, - Some(PeerState::Disabled { open, .. }) => *open, - Some(PeerState::DisabledPendingEnable { open, .. }) => *open, - Some(PeerState::Enabled { open, .. }) => *open, - Some(PeerState::Incoming { .. }) => false, - Some(PeerState::Requested) => false, - Some(PeerState::PendingRequest { .. }) => false, - Some(PeerState::Banned { .. }) => false, - Some(PeerState::Poisoned) => false, - } - } - /// Sends a message to a peer. /// /// Has no effect if the custom protocol is not open with the given peer. @@ -348,16 +360,8 @@ impl CustomProto { }); } - /// Indicates to the peerset that we have discovered new addresses for a given node. - pub fn add_discovered_nodes>(&mut self, peer_ids: I) { - self.peerset.discovered(peer_ids.into_iter().map(|peer_id| { - debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); - peer_id - })); - } - /// Returns the state of the peerset manager, for debugging purposes. - pub fn peerset_debug_info(&self) -> serde_json::Value { + pub fn peerset_debug_info(&mut self) -> serde_json::Value { self.peerset.debug_info() } @@ -408,7 +412,7 @@ impl CustomProto { debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", occ_entry.key()); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: occ_entry.key().clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *occ_entry.into_mut() = PeerState::Enabled { connected_point, open }; }, @@ -426,7 +430,7 @@ impl CustomProto { debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", occ_entry.key()); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: occ_entry.key().clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *occ_entry.into_mut() = PeerState::Enabled { connected_point, open: false }; }, @@ -547,7 +551,7 @@ impl CustomProto { debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", incoming.peer_id); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: incoming.peer_id, - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *state = PeerState::Enabled { open: false, connected_point }; @@ -595,6 +599,15 @@ impl CustomProto { } } +impl DiscoveryNetBehaviour for CustomProto { + fn add_discovered_nodes(&mut self, peer_ids: impl Iterator) { + self.peerset.discovered(peer_ids.into_iter().map(|peer_id| { + debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); + peer_id + })); + } +} + impl NetworkBehaviour for CustomProto where TSubstream: AsyncRead + AsyncWrite, @@ -612,31 +625,25 @@ where } fn inject_connected(&mut self, peer_id: PeerId, connected_point: ConnectedPoint) { - match (self.peers.entry(peer_id), connected_point) { - (Entry::Occupied(mut entry), connected_point) => { - match mem::replace(entry.get_mut(), PeerState::Poisoned) { - PeerState::Requested | PeerState::PendingRequest { .. } | - PeerState::Banned { .. } => { - debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Connection \ - requested by PSM (through {:?})", entry.key(), connected_point); - debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", entry.key()); - self.events.push(NetworkBehaviourAction::SendEvent { - peer_id: entry.key().clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), - }); - *entry.into_mut() = PeerState::Enabled { open: false, connected_point }; - } - st @ _ => { - // This is a serious bug either in this state machine or in libp2p. - error!(target: "sub-libp2p", "Received inject_connected for \ - already-connected node; state is {:?}", st); - *entry.into_mut() = st; - return - } - } + match (self.peers.entry(peer_id.clone()).or_insert(PeerState::Poisoned), connected_point) { + (st @ &mut PeerState::Requested, connected_point) | + (st @ &mut PeerState::PendingRequest { .. }, connected_point) => { + debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Connection \ + requested by PSM (through {:?})", peer_id, connected_point + ); + debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", peer_id); + self.events.push(NetworkBehaviourAction::SendEvent { + peer_id: peer_id.clone(), + event: CustomProtoHandlerIn::Enable, + }); + *st = PeerState::Enabled { open: false, connected_point }; } - (Entry::Vacant(entry), connected_point @ ConnectedPoint::Listener { .. }) => { + // Note: it may seem weird that "Banned" nodes get treated as if there were absent. + // This is because the word "Banned" means "temporarily prevent outgoing connections to + // this node", and not "banned" in the sense that we would refuse the node altogether. + (st @ &mut PeerState::Poisoned, connected_point @ ConnectedPoint::Listener { .. }) | + (st @ &mut PeerState::Banned { .. }, connected_point @ ConnectedPoint::Listener { .. }) => { let incoming_id = self.next_incoming_index.clone(); self.next_incoming_index.0 = match self.next_incoming_index.0.checked_add(1) { Some(v) => v, @@ -646,27 +653,40 @@ where } }; debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Incoming connection", - entry.key()); + peer_id); debug!(target: "sub-libp2p", "PSM <= Incoming({:?}, {:?}): Through {:?}", - incoming_id, entry.key(), connected_point); - self.peerset.incoming(entry.key().clone(), incoming_id); + incoming_id, peer_id, connected_point); + self.peerset.incoming(peer_id.clone(), incoming_id); self.incoming.push(IncomingPeer { - peer_id: entry.key().clone(), + peer_id: peer_id.clone(), alive: true, incoming_id, }); - entry.insert(PeerState::Incoming { connected_point }); + *st = PeerState::Incoming { connected_point }; } - (Entry::Vacant(entry), connected_point) => { + (st @ &mut PeerState::Poisoned, connected_point) | + (st @ &mut PeerState::Banned { .. }, connected_point) => { + let banned_until = if let PeerState::Banned { until } = st { + Some(*until) + } else { + None + }; debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Requested by something \ - else than PSM, disabling", entry.key()); - debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", entry.key()); + else than PSM, disabling", peer_id); + debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", peer_id); self.events.push(NetworkBehaviourAction::SendEvent { - peer_id: entry.key().clone(), + peer_id: peer_id.clone(), event: CustomProtoHandlerIn::Disable, }); - entry.insert(PeerState::Disabled { open: false, connected_point, banned_until: None }); + *st = PeerState::Disabled { open: false, connected_point, banned_until }; + } + + st => { + // This is a serious bug either in this state machine or in libp2p. + error!(target: "sub-libp2p", "Received inject_connected for \ + already-connected node; state is {:?}", st + ); } } } @@ -689,7 +709,7 @@ where debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); let event = CustomProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), - result: Ok(()), + reason: "Disconnected by libp2p".into(), }; self.events.push(NetworkBehaviourAction::GenerateEvent(event)); @@ -706,7 +726,7 @@ where debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); let event = CustomProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), - result: Ok(()), + reason: "Disconnected by libp2p".into(), }; self.events.push(NetworkBehaviourAction::GenerateEvent(event)); @@ -723,7 +743,7 @@ where debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); let event = CustomProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), - result: Ok(()), + reason: "Disconnected by libp2p".into(), }; self.events.push(NetworkBehaviourAction::GenerateEvent(event)); @@ -795,8 +815,8 @@ where event: CustomProtoHandlerOut, ) { match event { - CustomProtoHandlerOut::CustomProtocolClosed { result } => { - debug!(target: "sub-libp2p", "Handler({:?}) => Closed({:?})", source, result); + CustomProtoHandlerOut::CustomProtocolClosed { reason } => { + debug!(target: "sub-libp2p", "Handler({:?}) => Closed: {}", source, reason); let mut entry = if let Entry::Occupied(entry) = self.peers.entry(source.clone()) { entry @@ -807,7 +827,7 @@ where debug!(target: "sub-libp2p", "External API <= Closed({:?})", source); let event = CustomProtoOut::CustomProtocolClosed { - result, + reason, peer_id: source.clone(), }; self.events.push(NetworkBehaviourAction::GenerateEvent(event)); @@ -965,7 +985,7 @@ where debug!(target: "sub-libp2p", "Handler({:?}) <= Enable now that ban has expired", peer_id); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: peer_id.clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *peer_state = PeerState::Enabled { connected_point, open }; } diff --git a/core/network-libp2p/src/custom_proto/handler.rs b/core/network-libp2p/src/custom_proto/handler.rs index d464ed37a9f55e685863d4fac557d050024e9a94..0400c27f827a8a43532a430f383186cc798576b5 100644 --- a/core/network-libp2p/src/custom_proto/handler.rs +++ b/core/network-libp2p/src/custom_proto/handler.rs @@ -14,23 +14,22 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::custom_proto::upgrade::{CustomMessage, CustomMessageId, RegisteredProtocol}; +use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; use crate::custom_proto::upgrade::{RegisteredProtocolEvent, RegisteredProtocolSubstream}; use futures::prelude::*; use libp2p::core::{ - PeerId, Endpoint, ProtocolsHandler, ProtocolsHandlerEvent, + ConnectedPoint, PeerId, Endpoint, ProtocolsHandler, ProtocolsHandlerEvent, protocols_handler::IntoProtocolsHandler, protocols_handler::KeepAlive, protocols_handler::ProtocolsHandlerUpgrErr, protocols_handler::SubstreamProtocol, upgrade::{InboundUpgrade, OutboundUpgrade} }; -use log::{debug, error, warn}; +use log::{debug, error}; use smallvec::{smallvec, SmallVec}; -use std::{error, fmt, io, marker::PhantomData, mem, time::Duration, time::Instant}; +use std::{borrow::Cow, error, fmt, io, marker::PhantomData, mem, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; use tokio_timer::{Delay, clock::Clock}; -use void::Void; /// Implements the `IntoProtocolsHandler` trait of libp2p. /// @@ -69,26 +68,22 @@ use void::Void; /// /// ## How it works /// -/// For backwards compatibility reasons, the behaviour of the handler is quite complicated. After -/// enough nodes have upgraded, it should be simplified by using helpers provided by libp2p. -/// /// When the handler is created, it is initially in the `Init` state and waits for either a /// `Disable` or an `Enable` message from the outer layer. At any time, the outer layer is free to /// toggle the handler between the disabled and enabled states. /// -/// When the handler is enabled for the first time, if it is the dialer of the connection, it tries -/// to open a substream. The substream negotiates either a protocol named `/substrate/xxx` or a -/// protocol named `/substrate/multi/xxx`. If it is the former, then we are in -/// "backwards-compatibility mode". If it is the latter, we are in normal operation mode. +/// When the handler switches to "enabled", it opens a substream and negotiates the protocol named +/// `/substrate/xxx`, where `xxx` is chosen by the user and depends on the chain. +/// +/// For backwards compatibility reasons, when we switch to "enabled" for the first time (while we +/// are still in "init" mode) and we are the connection listener, we don't open a substream. /// -/// In "backwards-compatibility mode", we have one unique substream where bidirectional -/// communications happen. If the remote closes the substream, we consider that we are now -/// disconnected. Re-enabling is performed by re-opening the substream. +/// In order the handle the situation where both the remote and us get enabled at the same time, +/// we tolerate multiple substreams open at the same time. Messages are transmitted on an arbitrary +/// substream. The endpoints don't try to agree on a single substream. /// -/// In normal operation mode, each request gets sent over a different substream where the response -/// is then sent back. If the remote refuses one of our substream open request, or if an error -/// happens on one substream, we consider that we are disconnected. Re-enabling is performed by -/// opening an outbound substream. +/// We consider that we are now "closed" if the remote closes all the existing substreams. +/// Re-opening it can then be performed by closing all active substream and re-opening one. /// pub struct CustomProtoHandlerProto { /// Configuration for the protocol upgrade to negotiate. @@ -119,17 +114,21 @@ where { type Handler = CustomProtoHandler; - fn into_handler(self, remote_peer_id: &PeerId) -> Self::Handler { + fn inbound_protocol(&self) -> RegisteredProtocol { + self.protocol.clone() + } + + fn into_handler(self, remote_peer_id: &PeerId, connected_point: &ConnectedPoint) -> Self::Handler { let clock = Clock::new(); CustomProtoHandler { protocol: self.protocol, + endpoint: connected_point.to_endpoint(), remote_peer_id: remote_peer_id.clone(), state: ProtocolState::Init { substreams: SmallVec::new(), init_deadline: Delay::new(clock.now() + Duration::from_secs(5)) }, events_queue: SmallVec::new(), - warm_up_end: clock.now() + Duration::from_secs(5), clock, } } @@ -147,19 +146,18 @@ pub struct CustomProtoHandler { /// any influence on the behaviour. remote_peer_id: PeerId, + /// Whether we are the connection dialer or listener. Used to determine who, between the local + /// node and the remote node, has priority. + endpoint: Endpoint, + /// Queue of events to send to the outside. /// /// This queue must only ever be modified to insert elements at the back, or remove the first /// element. events_queue: SmallVec<[ProtocolsHandlerEvent, (), CustomProtoHandlerOut>; 16]>, - /// We have a warm-up period after creating the handler during which we don't shut down the - /// connection. - warm_up_end: Instant, - /// `Clock` instance that uses the current execution context's source of time. clock: Clock, - } /// State of the handler. @@ -179,19 +177,15 @@ enum ProtocolState { deadline: Delay, }, - /// Backwards-compatible mode. Contains the unique substream that is open. + /// Normal operating mode. Contains the substreams that are open. /// If we are in this state, we have sent a `CustomProtocolOpen` message to the outside. - BackCompat { - /// The unique substream where bidirectional communications happen. - substream: RegisteredProtocolSubstream, + Normal { + /// The substreams where bidirectional communications happen. + substreams: SmallVec<[RegisteredProtocolSubstream; 4]>, /// Contains substreams which are being shut down. shutdown: SmallVec<[RegisteredProtocolSubstream; 4]>, }, - /// Normal functionning. Contains the substreams that are open. - /// If we are in this state, we have sent a `CustomProtocolOpen` message to the outside. - Normal(PerProtocolNormalState), - /// We are disabled. Contains substreams that are being closed. /// If we are in this state, either we have sent a `CustomProtocolClosed` message to the /// outside or we have never sent any `CustomProtocolOpen` in the first place. @@ -207,139 +201,20 @@ enum ProtocolState { reenable: bool, }, + /// In this state, we don't care about anything anymore and need to kill the connection as soon + /// as possible. + KillAsap, + /// We sometimes temporarily switch to this state during processing. If we are in this state - /// at the beginning of a method, that means something bad happend in the source code. + /// at the beginning of a method, that means something bad happened in the source code. Poisoned, } -/// Normal functionning mode for a protocol. -struct PerProtocolNormalState { - /// Optional substream that we opened. - outgoing_substream: Option>, - - /// Substreams that have been opened by the remote. We are waiting for a packet from it. - incoming_substreams: SmallVec<[RegisteredProtocolSubstream; 4]>, - - /// For each request that has been sent to the remote, contains the substream where we - /// expect a response. - pending_response: SmallVec<[(u64, RegisteredProtocolSubstream); 4]>, - - /// For each request received by the remote, contains the substream where to send back our - /// response. Once a response has been sent, the substream closes. - pending_send_back: SmallVec<[(u64, RegisteredProtocolSubstream); 4]>, - - /// List of messages waiting for a substream to open in order to be sent. - pending_messages: SmallVec<[TMessage; 6]>, - - /// Contains substreams which are being shut down. - shutdown: SmallVec<[RegisteredProtocolSubstream; 4]>, -} - -impl PerProtocolNormalState -where TMessage: CustomMessage, TSubstream: AsyncRead + AsyncWrite { - /// Polls for things that are new. Same API constraints as `Future::poll()`. - /// Optionally returns the event to produce. - /// You must pass the `protocol_id` as we need have to inject it in the returned event. - /// API note: Ideally we wouldn't need to be passed a `ProtocolId`, and we would return a - /// different enum that doesn't contain any `protocol_id`, and the caller would inject - /// the ID itself, but that's a ton of code for not much gain. - fn poll(&mut self) -> Option> { - for n in (0..self.pending_response.len()).rev() { - let (request_id, mut substream) = self.pending_response.swap_remove(n); - match substream.poll() { - Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) => { - if message.request_id() == CustomMessageId::Response(request_id) { - let event = CustomProtoHandlerOut::CustomMessage { - message - }; - self.shutdown.push(substream); - return Some(event); - } else { - self.shutdown.push(substream); - let event = CustomProtoHandlerOut::ProtocolError { - is_severe: true, - error: format!("Request ID doesn't match substream: expected {:?}, \ - got {:?}", request_id, message.request_id()).into(), - }; - return Some(event); - } - }, - Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { .. }))) => - unreachable!("Cannot receive Clogged message with new protocol version; QED"), - Ok(Async::NotReady) => - self.pending_response.push((request_id, substream)), - Ok(Async::Ready(None)) => { - self.shutdown.push(substream); - let event = CustomProtoHandlerOut::ProtocolError { - is_severe: false, - error: format!("Request ID {:?} didn't receive an answer", request_id).into(), - }; - return Some(event); - } - Err(err) => { - self.shutdown.push(substream); - let event = CustomProtoHandlerOut::ProtocolError { - is_severe: false, - error: format!("Error while waiting for an answer for {:?}: {}", - request_id, err).into(), - }; - return Some(event); - } - } - } - - for n in (0..self.incoming_substreams.len()).rev() { - let mut substream = self.incoming_substreams.swap_remove(n); - match substream.poll() { - Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) => { - return match message.request_id() { - CustomMessageId::Request(id) => { - self.pending_send_back.push((id, substream)); - Some(CustomProtoHandlerOut::CustomMessage { - message - }) - } - CustomMessageId::OneWay => { - self.shutdown.push(substream); - Some(CustomProtoHandlerOut::CustomMessage { - message - }) - } - _ => { - self.shutdown.push(substream); - Some(CustomProtoHandlerOut::ProtocolError { - is_severe: true, - error: format!("Received response in new substream").into(), - }) - } - } - }, - Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { .. }))) => - unreachable!("Cannot receive Clogged message with new protocol version; QED"), - Ok(Async::NotReady) => - self.incoming_substreams.push(substream), - Ok(Async::Ready(None)) => {} - Err(err) => { - self.shutdown.push(substream); - return Some(CustomProtoHandlerOut::ProtocolError { - is_severe: false, - error: format!("Error in incoming substream: {}", err).into(), - }); - } - } - } - - shutdown_list(&mut self.shutdown); - None - } -} - /// Event that can be received by a `CustomProtoHandler`. #[derive(Debug)] pub enum CustomProtoHandlerIn { - /// The node should start using custom protocols. Contains whether we are the dialer or the - /// listener of the connection. - Enable(Endpoint), + /// The node should start using custom protocols. + Enable, /// The node should stop using custom protocols. Disable, @@ -362,8 +237,8 @@ pub enum CustomProtoHandlerOut { /// Closed a custom protocol with the remote. CustomProtocolClosed { - /// Reason why the substream closed. If `Ok`, then it's a graceful exit (EOF). - result: io::Result<()>, + /// Reason why the substream closed, for diagnostic purposes. + reason: Cow<'static, str>, }, /// Receives a message on a custom protocol substream. @@ -394,7 +269,7 @@ where TMessage: CustomMessage, { /// Enables the handler. - fn enable(&mut self, endpoint: Endpoint) { + fn enable(&mut self) { self.state = match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { error!(target: "sub-libp2p", "Handler with {:?} is in poisoned state", @@ -404,7 +279,7 @@ where ProtocolState::Init { substreams: incoming, .. } => { if incoming.is_empty() { - if let Endpoint::Dialer = endpoint { + if let Endpoint::Dialer = self.endpoint { self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(self.protocol.clone()), info: (), @@ -414,35 +289,20 @@ where deadline: Delay::new(self.clock.now() + Duration::from_secs(60)) } - } else if incoming.iter().any(|s| s.is_multiplex()) { - let event = CustomProtoHandlerOut::CustomProtocolOpen { - version: incoming[0].protocol_version() - }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Normal(PerProtocolNormalState { - outgoing_substream: None, - incoming_substreams: incoming.into_iter().collect(), - pending_response: SmallVec::new(), - pending_send_back: SmallVec::new(), - pending_messages: SmallVec::new(), - shutdown: SmallVec::new(), - }) - } else { let event = CustomProtoHandlerOut::CustomProtocolOpen { version: incoming[0].protocol_version() }; self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::BackCompat { - substream: incoming.into_iter().next() - .expect("We have a check above that incoming isn't empty; QED"), + ProtocolState::Normal { + substreams: incoming.into_iter().collect(), shutdown: SmallVec::new() } } } + st @ ProtocolState::KillAsap => st, st @ ProtocolState::Opening { .. } => st, - st @ ProtocolState::BackCompat { .. } => st, st @ ProtocolState::Normal { .. } => st, ProtocolState::Disabled { shutdown, .. } => { ProtocolState::Disabled { shutdown, reenable: true } @@ -466,42 +326,18 @@ where ProtocolState::Disabled { shutdown, reenable: false } } - ProtocolState::Opening { .. } => { - ProtocolState::Disabled { shutdown: SmallVec::new(), reenable: false } - } - - ProtocolState::BackCompat { mut substream, mut shutdown } => { - substream.shutdown(); - shutdown.push(substream); - let event = CustomProtoHandlerOut::CustomProtocolClosed { - result: Ok(()) - }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Disabled { - shutdown: shutdown.into_iter().collect(), - reenable: false - } - } - - ProtocolState::Normal(state) => { - let mut out: SmallVec<[_; 6]> = SmallVec::new(); - out.extend(state.outgoing_substream.into_iter()); - out.extend(state.incoming_substreams.into_iter()); - out.extend(state.pending_response.into_iter().map(|(_, s)| s)); - out.extend(state.pending_send_back.into_iter().map(|(_, s)| s)); - for s in &mut out { - s.shutdown(); - } - out.extend(state.shutdown.into_iter()); - let event = CustomProtoHandlerOut::CustomProtocolClosed { - result: Ok(()) - }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Disabled { shutdown: out, reenable: false } - } + ProtocolState::Opening { .. } | ProtocolState::Normal { .. } => + // At the moment, if we get disabled while things were working, we kill the entire + // connection in order to force a reset of the state. + // This is obviously an extremely shameful way to do things, but at the time of + // the writing of this comment, the networking works very poorly and a solution + // needs to be found. + ProtocolState::KillAsap, ProtocolState::Disabled { shutdown, .. } => ProtocolState::Disabled { shutdown, reenable: false }, + + ProtocolState::KillAsap => ProtocolState::KillAsap, }; } @@ -509,13 +345,12 @@ where #[must_use] fn poll_state(&mut self) -> Option, (), CustomProtoHandlerOut>> { - let return_value; - self.state = match mem::replace(&mut self.state, ProtocolState::Poisoned) { + match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { error!(target: "sub-libp2p", "Handler with {:?} is in poisoned state", self.remote_peer_id); - return_value = None; - ProtocolState::Poisoned + self.state = ProtocolState::Poisoned; + None } ProtocolState::Init { substreams, mut init_deadline } => { @@ -529,8 +364,8 @@ where Err(_) => error!(target: "sub-libp2p", "Tokio timer has errored") } - return_value = None; - ProtocolState::Init { substreams, init_deadline } + self.state = ProtocolState::Init { substreams, init_deadline }; + None } ProtocolState::Opening { mut deadline } => { @@ -541,73 +376,76 @@ where is_severe: true, error: "Timeout when opening protocol".to_string().into(), }; - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Opening { deadline } + self.state = ProtocolState::Opening { deadline }; + Some(ProtocolsHandlerEvent::Custom(event)) }, Ok(Async::NotReady) => { - return_value = None; - ProtocolState::Opening { deadline } + self.state = ProtocolState::Opening { deadline }; + None }, Err(_) => { error!(target: "sub-libp2p", "Tokio timer has errored"); deadline.reset(self.clock.now() + Duration::from_secs(60)); - return_value = None; - ProtocolState::Opening { deadline } + self.state = ProtocolState::Opening { deadline }; + None }, } } - ProtocolState::BackCompat { mut substream, shutdown } => { - match substream.poll() { - Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) => { - let event = CustomProtoHandlerOut::CustomMessage { - message - }; - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::BackCompat { substream, shutdown } - }, - Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { messages }))) => { - let event = CustomProtoHandlerOut::Clogged { - messages, - }; - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::BackCompat { substream, shutdown } - } - Ok(Async::NotReady) => { - return_value = None; - ProtocolState::BackCompat { substream, shutdown } - } - Ok(Async::Ready(None)) => { - let event = CustomProtoHandlerOut::CustomProtocolClosed { - result: Ok(()) - }; - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Disabled { - shutdown: shutdown.into_iter().collect(), - reenable: true + ProtocolState::Normal { mut substreams, mut shutdown } => { + for n in (0..substreams.len()).rev() { + let mut substream = substreams.swap_remove(n); + match substream.poll() { + Ok(Async::NotReady) => substreams.push(substream), + Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) => { + let event = CustomProtoHandlerOut::CustomMessage { + message + }; + substreams.push(substream); + self.state = ProtocolState::Normal { substreams, shutdown }; + return Some(ProtocolsHandlerEvent::Custom(event)); + }, + Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { messages }))) => { + let event = CustomProtoHandlerOut::Clogged { + messages, + }; + substreams.push(substream); + self.state = ProtocolState::Normal { substreams, shutdown }; + return Some(ProtocolsHandlerEvent::Custom(event)); } - } - Err(err) => { - let event = CustomProtoHandlerOut::CustomProtocolClosed { - result: Err(err), - }; - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Disabled { - shutdown: shutdown.into_iter().collect(), - reenable: true + Ok(Async::Ready(None)) => { + shutdown.push(substream); + if substreams.is_empty() { + let event = CustomProtoHandlerOut::CustomProtocolClosed { + reason: "All substreams have been closed by the remote".into(), + }; + self.state = ProtocolState::Disabled { + shutdown: shutdown.into_iter().collect(), + reenable: true + }; + return Some(ProtocolsHandlerEvent::Custom(event)); + } + } + Err(err) => { + if substreams.is_empty() { + let event = CustomProtoHandlerOut::CustomProtocolClosed { + reason: format!("Error on the last substream: {:?}", err).into(), + }; + self.state = ProtocolState::Disabled { + shutdown: shutdown.into_iter().collect(), + reenable: true + }; + return Some(ProtocolsHandlerEvent::Custom(event)); + } else { + debug!(target: "sub-libp2p", "Error on extra substream: {:?}", err); + } } } } - } - - ProtocolState::Normal(mut norm_state) => { - if let Some(event) = norm_state.poll() { - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - } else { - return_value = None; - } - ProtocolState::Normal(norm_state) + // This code is reached is none if and only if none of the substreams are in a ready state. + self.state = ProtocolState::Normal { substreams, shutdown }; + None } ProtocolState::Disabled { mut shutdown, reenable } => { @@ -615,21 +453,21 @@ where // If `reenable` is `true`, that means we should open the substreams system again // after all the substreams are closed. if reenable && shutdown.is_empty() { - return_value = Some(ProtocolsHandlerEvent::OutboundSubstreamRequest { + self.state = ProtocolState::Opening { + deadline: Delay::new(self.clock.now() + Duration::from_secs(60)) + }; + Some(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(self.protocol.clone()), info: (), - }); - ProtocolState::Opening { - deadline: Delay::new(self.clock.now() + Duration::from_secs(60)) - } + }) } else { - return_value = None; - ProtocolState::Disabled { shutdown, reenable } + self.state = ProtocolState::Disabled { shutdown, reenable }; + None } } - }; - return_value + ProtocolState::KillAsap => None, + } } /// Called by `inject_fully_negotiated_inbound` and `inject_fully_negotiated_outbound`. @@ -658,65 +496,15 @@ where version: substream.protocol_version() }; self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - - match (substream.endpoint(), substream.is_multiplex()) { - (Endpoint::Dialer, true) => { - ProtocolState::Normal(PerProtocolNormalState { - outgoing_substream: Some(substream), - incoming_substreams: SmallVec::new(), - pending_response: SmallVec::new(), - pending_send_back: SmallVec::new(), - pending_messages: SmallVec::new(), - shutdown: SmallVec::new(), - }) - }, - (Endpoint::Listener, true) => { - ProtocolState::Normal(PerProtocolNormalState { - outgoing_substream: None, - incoming_substreams: smallvec![substream], - pending_response: SmallVec::new(), - pending_send_back: SmallVec::new(), - pending_messages: SmallVec::new(), - shutdown: SmallVec::new(), - }) - }, - (_, false) => { - ProtocolState::BackCompat { - substream, - shutdown: SmallVec::new() - } - }, + ProtocolState::Normal { + substreams: smallvec![substream], + shutdown: SmallVec::new() } } - ProtocolState::BackCompat { substream: existing, mut shutdown } => { - warn!(target: "sub-libp2p", "Received extra substream after having already one \ - open in backwards-compatibility mode with {:?}", self.remote_peer_id); - substream.shutdown(); - shutdown.push(substream); - ProtocolState::BackCompat { substream: existing, shutdown } - } - - ProtocolState::Normal(mut state) => { - if substream.endpoint() == Endpoint::Listener { - state.incoming_substreams.push(substream); - } else if !state.pending_messages.is_empty() { - let message = state.pending_messages.remove(0); - let request_id = message.request_id(); - substream.send_message(message); - if let CustomMessageId::Request(request_id) = request_id { - state.pending_response.push((request_id, substream)); - } else { - state.shutdown.push(substream); - } - } else { - debug!(target: "sub-libp2p", "Opened spurious outbound substream with {:?}", - self.remote_peer_id); - substream.shutdown(); - state.shutdown.push(substream); - } - - ProtocolState::Normal(state) + ProtocolState::Normal { substreams: mut existing, shutdown } => { + existing.push(substream); + ProtocolState::Normal { substreams: existing, shutdown } } ProtocolState::Disabled { mut shutdown, .. } => { @@ -724,59 +512,16 @@ where shutdown.push(substream); ProtocolState::Disabled { shutdown, reenable: false } } + + ProtocolState::KillAsap => ProtocolState::KillAsap, }; } /// Sends a message to the remote. fn send_message(&mut self, message: TMessage) { match self.state { - ProtocolState::BackCompat { ref mut substream, .. } => - substream.send_message(message), - - ProtocolState::Normal(ref mut state) => { - if let CustomMessageId::Request(request_id) = message.request_id() { - if let Some(mut outgoing_substream) = state.outgoing_substream.take() { - outgoing_substream.send_message(message); - state.pending_response.push((request_id, outgoing_substream)); - } else { - if state.pending_messages.len() >= 2048 { - let event = CustomProtoHandlerOut::Clogged { - messages: Vec::new(), - }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - } - state.pending_messages.push(message); - self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { - protocol: SubstreamProtocol::new(self.protocol.clone()), - info: () - }); - } - } else if let CustomMessageId::Response(request_id) = message.request_id() { - if let Some(pos) = state.pending_send_back.iter().position(|(id, _)| *id == request_id) { - let (_, mut substream) = state.pending_send_back.remove(pos); - substream.send_message(message); - state.shutdown.push(substream); - } else { - warn!(target: "sub-libp2p", "Libp2p layer received response to a \ - non-existing request ID {:?} with {:?}", request_id, self.remote_peer_id); - } - } else if let Some(mut outgoing_substream) = state.outgoing_substream.take() { - outgoing_substream.send_message(message); - state.shutdown.push(outgoing_substream); - } else { - if state.pending_messages.len() >= 2048 { - let event = CustomProtoHandlerOut::Clogged { - messages: Vec::new(), - }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - } - state.pending_messages.push(message); - self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { - protocol: SubstreamProtocol::new(self.protocol.clone()), - info: () - }); - } - } + ProtocolState::Normal { ref mut substreams, .. } => + substreams[0].send_message(message), _ => debug!(target: "sub-libp2p", "Tried to send message over closed protocol \ with {:?}", self.remote_peer_id) @@ -789,7 +534,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { type InEvent = CustomProtoHandlerIn; type OutEvent = CustomProtoHandlerOut; type Substream = TSubstream; - type Error = Void; + type Error = ConnectionKillError; type InboundProtocol = RegisteredProtocol; type OutboundProtocol = RegisteredProtocol; type OutboundOpenInfo = (); @@ -816,7 +561,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { fn inject_event(&mut self, message: CustomProtoHandlerIn) { match message { CustomProtoHandlerIn::Disable => self.disable(), - CustomProtoHandlerIn::Enable(endpoint) => self.enable(endpoint), + CustomProtoHandlerIn::Enable => self.enable(), CustomProtoHandlerIn::SendCustomMessage { message } => self.send_message(message), } @@ -836,23 +581,11 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { } fn connection_keep_alive(&self) -> KeepAlive { - if self.warm_up_end >= self.clock.now() { - return KeepAlive::Until(self.warm_up_end) - } - - let mut keep_forever = false; - match self.state { - ProtocolState::Init { .. } | ProtocolState::Opening { .. } => {} - ProtocolState::BackCompat { .. } | ProtocolState::Normal { .. } => - keep_forever = true, - ProtocolState::Disabled { .. } | ProtocolState::Poisoned => return KeepAlive::No, - } - - if keep_forever { - KeepAlive::Yes - } else { - KeepAlive::No + ProtocolState::Init { .. } | ProtocolState::Opening { .. } | + ProtocolState::Normal { .. } => KeepAlive::Yes, + ProtocolState::Disabled { .. } | ProtocolState::Poisoned | + ProtocolState::KillAsap => KeepAlive::No, } } @@ -868,6 +601,11 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { return Ok(Async::Ready(event)) } + // Kill the connection if needed. + if let ProtocolState::KillAsap = self.state { + return Err(ConnectionKillError); + } + // Process all the substreams. if let Some(event) = self.poll_state() { return Ok(Async::Ready(event)) @@ -904,3 +642,16 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { list.push(substream); } } + +/// Error returned when switching from normal to disabled. +#[derive(Debug)] +pub struct ConnectionKillError; + +impl error::Error for ConnectionKillError { +} + +impl fmt::Display for ConnectionKillError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "Connection kill when switching from normal to disabled") + } +} diff --git a/core/network-libp2p/src/custom_proto/mod.rs b/core/network-libp2p/src/custom_proto/mod.rs index cf2bf57153cc3ec0dfec5ffa2df713907b071a55..261f710d8d46b47497b32b1410211f2e1de366f0 100644 --- a/core/network-libp2p/src/custom_proto/mod.rs +++ b/core/network-libp2p/src/custom_proto/mod.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . pub use self::behaviour::{CustomProto, CustomProtoOut}; -pub use self::upgrade::{CustomMessage, CustomMessageId, RegisteredProtocol}; +pub use self::upgrade::{CustomMessage, RegisteredProtocol}; mod behaviour; mod handler; diff --git a/core/network-libp2p/src/custom_proto/upgrade.rs b/core/network-libp2p/src/custom_proto/upgrade.rs index 00c3fc999d20cb8b39055f150b683c0d8f2ded24..bc61ff74e89f826b0fed41cc99a8c4ef7ac0ce0a 100644 --- a/core/network-libp2p/src/custom_proto/upgrade.rs +++ b/core/network-libp2p/src/custom_proto/upgrade.rs @@ -19,7 +19,7 @@ use bytes::Bytes; use libp2p::core::{Negotiated, Endpoint, UpgradeInfo, InboundUpgrade, OutboundUpgrade, upgrade::ProtocolName}; use libp2p::tokio_codec::Framed; use log::warn; -use std::{collections::VecDeque, io, iter, marker::PhantomData, vec::IntoIter as VecIntoIter}; +use std::{collections::VecDeque, io, marker::PhantomData, vec::IntoIter as VecIntoIter}; use futures::{prelude::*, future, stream}; use tokio_io::{AsyncRead, AsyncWrite}; use unsigned_varint::codec::UviBytes; @@ -100,9 +100,6 @@ pub struct RegisteredProtocolSubstream { /// If true, we have sent a "remote is clogged" event recently and shouldn't send another one /// unless the buffer empties then fills itself again. clogged_fuse: bool, - /// If true, then this substream uses the "/multi/" version of the protocol. This is a hint - /// that the handler can behave differently. - is_multiplex: bool, /// Marker to pin the generic. marker: PhantomData, } @@ -126,12 +123,6 @@ impl RegisteredProtocolSubstream { self.endpoint } - /// Returns true if we negotiated the "multiplexed" version. This means that the handler can - /// open multiple substreams instead of just one. - pub fn is_multiplex(&self) -> bool { - self.is_multiplex - } - /// Starts a graceful shutdown process on this substream. /// /// Note that "graceful" means that we sent a closing message. We don't wait for any @@ -162,31 +153,9 @@ pub trait CustomMessage { /// Tries to parse `bytes` received from the network into a message. fn from_bytes(bytes: &[u8]) -> Result where Self: Sized; - - /// Returns a unique ID that is used to match request and responses. - /// - /// The networking layer employs multiplexing in order to have multiple parallel data streams. - /// Transmitting messages over the network uses two kinds of substreams: - /// - /// - Undirectional substreams, where we send a single message then close the substream. - /// - Bidirectional substreams, where we send a message then wait for a response. Once the - /// response has arrived, we close the substream. - /// - /// If `request_id()` returns `OneWay`, then this message will be sent or received over a - /// unidirectional substream. If instead it returns `Request` or `Response`, then we use the - /// value to match a request with its response. - fn request_id(&self) -> CustomMessageId; } -/// See the documentation of `CustomMessage::request_id`. -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -pub enum CustomMessageId { - OneWay, - Request(u64), - Response(u64), -} - -// These trait implementations exist mostly for testing convenience. This should eventually be +// This trait implementation exist mostly for testing convenience. This should eventually be // removed. impl CustomMessage for Vec { @@ -197,45 +166,6 @@ impl CustomMessage for Vec { fn from_bytes(bytes: &[u8]) -> Result { Ok(bytes.to_vec()) } - - fn request_id(&self) -> CustomMessageId { - CustomMessageId::OneWay - } -} - -impl CustomMessage for (Option, Vec) { - fn into_bytes(self) -> Vec { - use byteorder::WriteBytesExt; - use std::io::Write; - let mut out = Vec::new(); - out.write_u64::(self.0.unwrap_or(u64::max_value())) - .expect("Writing to a Vec can never fail"); - out.write_all(&self.1).expect("Writing to a Vec can never fail"); - out - } - - fn from_bytes(bytes: &[u8]) -> Result { - use byteorder::ReadBytesExt; - use std::io::Read; - let mut rdr = std::io::Cursor::new(bytes); - let id = rdr.read_u64::().map_err(|_| ())?; - let mut out = Vec::new(); - rdr.read_to_end(&mut out).map_err(|_| ())?; - let id = if id == u64::max_value() { - None - } else { - Some(id) - }; - Ok((id, out)) - } - - fn request_id(&self) -> CustomMessageId { - if let Some(id) = self.0 { - CustomMessageId::Request(id) - } else { - CustomMessageId::OneWay - } - } } /// Event produced by the `RegisteredProtocolSubstream`. @@ -328,33 +258,15 @@ impl UpgradeInfo for RegisteredProtocol { #[inline] fn protocol_info(&self) -> Self::InfoIter { // Report each version as an individual protocol. - self.supported_versions.iter().flat_map(|&version| { + self.supported_versions.iter().map(|&version| { let num = version.to_string(); - // Note that `name1` is the multiplex version, as we priviledge it over the old one. - let mut name1 = self.base_name.clone(); - name1.extend_from_slice(b"multi/"); - name1.extend_from_slice(num.as_bytes()); - let proto1 = RegisteredProtocolName { - name: name1, + let mut name = self.base_name.clone(); + name.extend_from_slice(num.as_bytes()); + RegisteredProtocolName { + name, version, - is_multiplex: true, - }; - - let mut name2 = self.base_name.clone(); - name2.extend_from_slice(num.as_bytes()); - let proto2 = RegisteredProtocolName { - name: name2, - version, - is_multiplex: false, - }; - - // Important note: we prioritize the backwards compatible mode for now. - // After some intensive testing has been done, we should switch to the new mode by - // default. - // Then finally we can remove the old mode after everyone has switched. - // See https://github.com/paritytech/substrate/issues/1692 - iter::once(proto2).chain(iter::once(proto1)) + } }).collect::>().into_iter() } } @@ -366,8 +278,6 @@ pub struct RegisteredProtocolName { name: Bytes, /// Version number. Stored in string form in `name`, but duplicated here for easier retrieval. version: u8, - /// If true, then this version is the one with the multiplexing. - is_multiplex: bool, } impl ProtocolName for RegisteredProtocolName { @@ -403,7 +313,6 @@ where TSubstream: AsyncRead + AsyncWrite, protocol_id: self.id, protocol_version: info.version, clogged_fuse: false, - is_multiplex: info.is_multiplex, marker: PhantomData, }) } @@ -432,7 +341,6 @@ where TSubstream: AsyncRead + AsyncWrite, protocol_id: self.id, protocol_version: info.version, clogged_fuse: false, - is_multiplex: info.is_multiplex, marker: PhantomData, }) } diff --git a/core/network-libp2p/src/lib.rs b/core/network-libp2p/src/lib.rs index 8c8b471931e903edc8f69168368cda20104eeeb3..540d8d7f0b17e841b11ab66009f768126a3895d3 100644 --- a/core/network-libp2p/src/lib.rs +++ b/core/network-libp2p/src/lib.rs @@ -15,8 +15,90 @@ // along with Substrate. If not, see . //! Networking layer of Substrate. -//! -//! **Important**: This crate is unstable and the API and usage may change. +//! +//! # Overview +//! +//! This crate handles the following network mechanisms: +//! +//! - Discovering nodes that are part of the network. +//! - Connecting to said nodes and accepting incoming connections. +//! - Encrypting communications between nodes. +//! - Ensure that nodes are really the `PeerId` that they pretend to be. +//! - Ensuring that the nodes belong to the same chain as us before reporting a new connection. +//! +//! From the point of view of our node, each other node on the network has a reputation value in +//! the form of an `i32`. We try to establish connections towards nodes with a higher reputation +//! over nodes with a lower reputation. +//! +//! Establishing connections to other nodes is automatically performed by this crate, and there is +//! no way to influence this, except by adjusting reputations. +//! +//! ## About the term "connecting" +//! +//! The documentation of this crate uses the words "connected" and "disconnected". It is important +//! to note that this doesn't correspond to actual TCP/IP connections and disconnections. Libp2p +//! will maintain connections that aren't reported by the API of this crate, and TCP/IP connections +//! can be kept alive even after we have reported a disconnect in order to potentially reuse them. +//! +//! # Usage +//! +//! > **Important**: This crate is unstable and the API and usage may change. +//! +//! The first step is to crate a [`RegisteredProtocol`] describing the protocol, and a +//! [`NetworkConfiguration`] describing the network. Then call [`start_service`] with them, which +//! returns a [`Service`] object and a [`substrate_peerset::PeersetHandle`]. +//! +//! The former allows you to know what happens on the network and to send messages, while the +//! latter can be used to adjust the reputations of nodes. +//! +//! You must call the `poll` method of [`Service`] in order to make the network progress and in +//! order to update the internal state of the [`Service`]. Calling `poll` will produce +//! [`ServiceEvent`]s, which inform you of what happened on the network. +//! +//! Please keep in mind that the state of the [`Service`] only updates itself in a way +//! corresponding to the [`ServiceEvent`] that `poll` returns. +//! +//! Illustration: +//! +//! - You call [`Service::connected_peers`] to get the list of nodes we are connected to. +//! - If you then call [`Service::connected_peers`] again, the returned list will always be the +//! same, no matter what happened on the wire. +//! - If you then call [`Service::poll`] and a [`ServiceEvent::OpenedCustomProtocol`] event is +//! returned, then the concerned node, and only the concerned node, will be added to the list of +//! nodes we are connected to. +//! - Similarly, if [`Service::poll`] produces a [`ServiceEvent::ClosedCustomProtocol`] event, then +//! only the concerned node will disappear from the list. +//! - And if [`Service::poll`] returns neither [`ServiceEvent::OpenedCustomProtocol`] nor +//! [`ServiceEvent::ClosedCustomProtocol`], then the list of connected nodes doesn't change. +//! +//! ## Example +//! +//! ```no_run +//! # use futures::prelude::*; +//! use substrate_network_libp2p::ServiceEvent; +//! +//! let proto = substrate_network_libp2p::RegisteredProtocol::new(&b"hello"[..], &[0]); +//! let config = substrate_network_libp2p::NetworkConfiguration::default(); +//! let (mut service, _peerset) = substrate_network_libp2p::start_service(config, proto).unwrap(); +//! +//! tokio::run(futures::future::poll_fn(move || { +//! loop { +//! match service.poll().unwrap() { +//! Async::NotReady => return Ok(Async::NotReady), +//! Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { peer_id, .. })) => { +//! println!("now connected to {:?}", peer_id); +//! service.send_custom_message(&peer_id, b"hello world!".to_vec()); +//! } +//! Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { peer_id, .. })) => +//! println!("now disconnected from {:?}", peer_id), +//! Async::Ready(Some(ServiceEvent::CustomMessage { peer_id, message })) => +//! println!("received message from {:?}: {:?}", peer_id, message), +//! Async::Ready(None) => return Ok(Async::Ready(())), +//! _ => {} +//! } +//! } +//! })); +//! ``` //! mod behaviour; @@ -25,9 +107,8 @@ mod custom_proto; mod service_task; mod transport; -pub use crate::behaviour::Severity; pub use crate::config::*; -pub use crate::custom_proto::{CustomMessage, CustomMessageId, RegisteredProtocol}; +pub use crate::custom_proto::{CustomMessage, RegisteredProtocol}; pub use crate::config::{NetworkConfiguration, NodeKeyConfig, Secret, NonReservedPeerMode}; pub use crate::service_task::{start_service, Service, ServiceEvent}; pub use libp2p::{Multiaddr, multiaddr, build_multiaddr}; @@ -38,6 +119,17 @@ use serde::{Deserialize, Serialize}; use slog_derive::SerdeValue; use std::{collections::{HashMap, HashSet}, error, fmt, time::Duration}; +/// Extension trait for `NetworkBehaviour` that also accepts discovering nodes. +pub trait DiscoveryNetBehaviour { + /// Notify the protocol that we have learned about the existence of nodes. + /// + /// Can (or most likely will) be called multiple times with the same `PeerId`s. + /// + /// Also note that there is no notification for expired nodes. The implementer must add a TTL + /// system, or remove nodes that will fail to reach. + fn add_discovered_nodes(&mut self, nodes: impl Iterator); +} + /// Name of a protocol, transmitted on the wire. Should be unique for each chain. #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ProtocolId(smallvec::SmallVec<[u8; 6]>); @@ -155,6 +247,10 @@ pub struct NetworkStatePeer { pub struct NetworkStateNotConnectedPeer { /// List of addresses known for this node. pub known_addresses: HashSet, + /// Node information, as provided by the node itself, if we were ever connected to this node. + pub version_string: Option, + /// Latest ping duration with this node, if we were ever connected to this node. + pub latest_ping_time: Option, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] @@ -178,8 +274,8 @@ impl From for NetworkStatePeerEndpoint { NetworkStatePeerEndpoint::Dialing(address), ConnectedPoint::Listener { listen_addr, send_back_addr } => NetworkStatePeerEndpoint::Listening { - listen_addr: listen_addr, - send_back_addr: send_back_addr + listen_addr, + send_back_addr } } } diff --git a/core/network-libp2p/src/service_task.rs b/core/network-libp2p/src/service_task.rs index af05d92092bed42d8070e3e9d29ad3961067cd20..e74757e0b1b5aa269b8efc555f7887b2edf4f9d1 100644 --- a/core/network-libp2p/src/service_task.rs +++ b/core/network-libp2p/src/service_task.rs @@ -15,22 +15,21 @@ // along with Substrate. If not, see . use crate::{ - behaviour::Behaviour, behaviour::BehaviourOut, + behaviour::Behaviour, + config::NodeKeyConfig, transport, NetworkState, NetworkStatePeer, NetworkStateNotConnectedPeer }; -use crate::custom_proto::{CustomMessage, RegisteredProtocol}; +use crate::custom_proto::{CustomProto, CustomProtoOut, CustomMessage, RegisteredProtocol}; use crate::{NetworkConfiguration, NonReservedPeerMode, parse_str_addr}; -use fnv::FnvHashMap; use futures::{prelude::*, Stream}; use libp2p::{Multiaddr, core::swarm::NetworkBehaviour, PeerId}; use libp2p::core::{Swarm, nodes::Substream, transport::boxed::Boxed, muxing::StreamMuxerBox}; use libp2p::core::nodes::ConnectedPoint; -use log::{debug, info, warn}; +use log::{info, error, warn}; use std::fs; use std::io::Error as IoError; use std::path::Path; use std::sync::Arc; -use std::time::Duration; /// Starts the substrate libp2p service. /// @@ -81,6 +80,9 @@ where TMessage: CustomMessage + Send + 'static { }); // Private and public keys configuration. + if let NodeKeyConfig::Secp256k1(_) = config.node_key { + warn!(target: "sub-libp2p", "Secp256k1 keys are deprecated in favour of ed25519"); + } let local_identity = config.node_key.clone().into_keypair()?; let local_public = local_identity.public(); let local_peer_id = local_public.clone().into_peer_id(); @@ -89,8 +91,12 @@ where TMessage: CustomMessage + Send + 'static { // Build the swarm. let (mut swarm, bandwidth) = { let user_agent = format!("{} ({})", config.client_version, config.node_name); - let behaviour = Behaviour::new(user_agent, local_public, registered_custom, known_addresses, peerset, config.enable_mdns); - let (transport, bandwidth) = transport::build_transport(local_identity); + let proto = CustomProto::new(registered_custom, peerset); + let behaviour = Behaviour::new(proto, user_agent, local_public, known_addresses, config.enable_mdns); + let (transport, bandwidth) = transport::build_transport( + local_identity, + config.wasm_external_transport + ); (Swarm::new(transport, behaviour, local_peer_id.clone()), bandwidth) }; @@ -109,7 +115,6 @@ where TMessage: CustomMessage + Send + 'static { let service = Service { swarm, bandwidth, - nodes_info: Default::default(), injected_events: Vec::new(), }; @@ -157,57 +162,57 @@ pub enum ServiceEvent { /// Network service. Must be polled regularly in order for the networking to work. pub struct Service where TMessage: CustomMessage { /// Stream of events of the swarm. - swarm: Swarm, Behaviour>>, + swarm: Swarm< + Boxed<(PeerId, StreamMuxerBox), IoError>, + Behaviour>, CustomProtoOut, Substream> + >, /// Bandwidth logging system. Can be queried to know the average bandwidth consumed. bandwidth: Arc, - /// Information about all the nodes we're connected to. - nodes_info: FnvHashMap, - /// Events to produce on the Stream. injected_events: Vec>, } -/// Information about a node we're connected to. -#[derive(Debug)] -struct NodeInfo { - /// How we're connected to the node. - endpoint: ConnectedPoint, - /// Version reported by the remote, or `None` if unknown. - client_version: Option, - /// Latest ping time with this node. - latest_ping: Option, -} - impl Service where TMessage: CustomMessage + Send + 'static { /// Returns a struct containing tons of useful information about the network. pub fn state(&mut self) -> NetworkState { + let open = self.swarm.user_protocol().open_peers().cloned().collect::>(); + let connected_peers = { let swarm = &mut self.swarm; - self.nodes_info.iter().map(move |(peer_id, info)| { + open.iter().filter_map(move |peer_id| { let known_addresses = NetworkBehaviour::addresses_of_peer(&mut **swarm, peer_id) .into_iter().collect(); - (peer_id.to_base58(), NetworkStatePeer { - endpoint: info.endpoint.clone().into(), - version_string: info.client_version.clone(), - latest_ping_time: info.latest_ping, - enabled: swarm.is_enabled(&peer_id), - open: swarm.is_open(&peer_id), + let endpoint = if let Some(e) = swarm.node(peer_id).map(|i| i.endpoint()) { + e.clone().into() + } else { + error!(target: "sub-libp2p", "Found state inconsistency between custom protocol \ + and debug information about {:?}", peer_id); + return None + }; + + Some((peer_id.to_base58(), NetworkStatePeer { + endpoint, + version_string: swarm.node(peer_id).and_then(|i| i.client_version().map(|s| s.to_owned())).clone(), + latest_ping_time: swarm.node(peer_id).and_then(|i| i.latest_ping()), + enabled: swarm.user_protocol().is_enabled(&peer_id), + open: swarm.user_protocol().is_open(&peer_id), known_addresses, - }) + })) }).collect() }; let not_connected_peers = { let swarm = &mut self.swarm; - let nodes_info = &self.nodes_info; - let list = swarm.known_peers().filter(|p| !nodes_info.contains_key(p)) + let list = swarm.known_peers().filter(|p| open.iter().all(|n| n != *p)) .cloned().collect::>(); list.into_iter().map(move |peer_id| { (peer_id.to_base58(), NetworkStateNotConnectedPeer { + version_string: swarm.node(&peer_id).and_then(|i| i.client_version().map(|s| s.to_owned())).clone(), + latest_ping_time: swarm.node(&peer_id).and_then(|i| i.latest_ping()), known_addresses: NetworkBehaviour::addresses_of_peer(&mut **swarm, &peer_id) .into_iter().collect(), }) @@ -222,7 +227,7 @@ where TMessage: CustomMessage + Send + 'static { average_upload_per_sec: self.bandwidth.average_upload_per_sec(), connected_peers, not_connected_peers, - peerset: self.swarm.peerset_debug_info(), + peerset: self.swarm.user_protocol_mut().peerset_debug_info(), } } @@ -245,27 +250,28 @@ where TMessage: CustomMessage + Send + 'static { } /// Returns the peer id of the local node. - #[inline] pub fn peer_id(&self) -> &PeerId { Swarm::local_peer_id(&self.swarm) } /// Returns the list of all the peers we are connected to. - #[inline] pub fn connected_peers<'a>(&'a self) -> impl Iterator + 'a { - self.nodes_info.keys() + self.swarm.user_protocol().open_peers() } - /// Returns the way we are connected to a node. - #[inline] + /// Returns the way we are connected to a node. Returns `None` if we are not connected to it. pub fn node_endpoint(&self, peer_id: &PeerId) -> Option<&ConnectedPoint> { - self.nodes_info.get(peer_id).map(|info| &info.endpoint) + if self.swarm.user_protocol().is_open(peer_id) { + self.swarm.node(peer_id).map(|n| n.endpoint()) + } else { + None + } } - /// Returns the client version reported by a node. + /// Returns the latest client version reported by a node. Can return `Some` even for nodes + /// we're not connected to. pub fn node_client_version(&self, peer_id: &PeerId) -> Option<&str> { - self.nodes_info.get(peer_id) - .and_then(|info| info.client_version.as_ref().map(|s| &s[..])) + self.swarm.node(peer_id).and_then(|n| n.client_version()) } /// Sends a message to a peer using the custom protocol. @@ -277,7 +283,7 @@ where TMessage: CustomMessage + Send + 'static { peer_id: &PeerId, message: TMessage ) { - self.swarm.send_custom_message(peer_id, message); + self.swarm.user_protocol_mut().send_packet(peer_id, message); } /// Disconnects a peer. @@ -285,11 +291,7 @@ where TMessage: CustomMessage + Send + 'static { /// This is asynchronous and will not immediately close the peer. /// Corresponding closing events will be generated once the closing actually happens. pub fn drop_node(&mut self, peer_id: &PeerId) { - if let Some(info) = self.nodes_info.get(peer_id) { - debug!(target: "sub-libp2p", "Dropping {:?} on purpose ({:?}, {:?})", - peer_id, info.endpoint, info.client_version); - self.swarm.drop_node(peer_id); - } + self.swarm.user_protocol_mut().disconnect_peer(peer_id); } /// Adds a hard-coded address for the given peer, that never expires. @@ -299,10 +301,10 @@ where TMessage: CustomMessage + Send + 'static { /// Get debug info for a given peer. pub fn peer_debug_info(&self, who: &PeerId) -> String { - if let Some(info) = self.nodes_info.get(who) { - format!("{:?} (version: {:?}) through {:?}", who, info.client_version, info.endpoint) + if let Some(node) = self.swarm.node(who) { + format!("{:?} {}", who, node.debug_info()) } else { - "unknown".to_string() + format!("{:?} (unknown)", who) } } @@ -310,12 +312,7 @@ where TMessage: CustomMessage + Send + 'static { fn poll_swarm(&mut self) -> Poll>, IoError> { loop { match self.swarm.poll() { - Ok(Async::Ready(Some(BehaviourOut::CustomProtocolOpen { peer_id, version, endpoint }))) => { - self.nodes_info.insert(peer_id.clone(), NodeInfo { - endpoint, - client_version: None, - latest_ping: None, - }); + Ok(Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { peer_id, version, .. }))) => { let debug_info = self.peer_debug_info(&peer_id); break Ok(Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { peer_id, @@ -323,42 +320,25 @@ where TMessage: CustomMessage + Send + 'static { debug_info, }))) } - Ok(Async::Ready(Some(BehaviourOut::CustomProtocolClosed { peer_id, .. }))) => { + Ok(Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { peer_id, .. }))) => { let debug_info = self.peer_debug_info(&peer_id); - self.nodes_info.remove(&peer_id); break Ok(Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { peer_id, debug_info, }))) } - Ok(Async::Ready(Some(BehaviourOut::CustomMessage { peer_id, message }))) => { + Ok(Async::Ready(Some(CustomProtoOut::CustomMessage { peer_id, message }))) => { break Ok(Async::Ready(Some(ServiceEvent::CustomMessage { peer_id, message, }))) } - Ok(Async::Ready(Some(BehaviourOut::Clogged { peer_id, messages }))) => { + Ok(Async::Ready(Some(CustomProtoOut::Clogged { peer_id, messages }))) => { break Ok(Async::Ready(Some(ServiceEvent::Clogged { peer_id, messages, }))) } - Ok(Async::Ready(Some(BehaviourOut::Identified { peer_id, info }))) => { - // Contrary to the other events, this one can happen even on nodes which don't - // have any open custom protocol slot. Therefore it is not necessarily in the - // list. - if let Some(n) = self.nodes_info.get_mut(&peer_id) { - n.client_version = Some(info.agent_version); - } - } - Ok(Async::Ready(Some(BehaviourOut::PingSuccess { peer_id, ping_time }))) => { - // Contrary to the other events, this one can happen even on nodes which don't - // have any open custom protocol slot. Therefore it is not necessarily in the - // list. - if let Some(n) = self.nodes_info.get_mut(&peer_id) { - n.latest_ping = Some(ping_time); - } - } Ok(Async::NotReady) => break Ok(Async::NotReady), Ok(Async::Ready(None)) => unreachable!("The Swarm stream never ends"), Err(_) => unreachable!("The Swarm never errors"), diff --git a/core/network-libp2p/src/transport.rs b/core/network-libp2p/src/transport.rs index 404fdb6bdaad8d9244ee1dca62ac8e2aa70863d3..f6790c98f431dd18669771835555cd41af87c0b8 100644 --- a/core/network-libp2p/src/transport.rs +++ b/core/network-libp2p/src/transport.rs @@ -17,9 +17,11 @@ use futures::prelude::*; use libp2p::{ InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, - mplex, identity, secio, yamux, tcp, dns, websocket, bandwidth + mplex, identity, secio, yamux, bandwidth, wasm_ext }; -use libp2p::core::{self, transport::boxed::Boxed, muxing::StreamMuxerBox}; +#[cfg(not(target_os = "unknown"))] +use libp2p::{tcp, dns, websocket}; +use libp2p::core::{self, transport::boxed::Boxed, transport::OptionalTransport, muxing::StreamMuxerBox}; use std::{io, sync::Arc, time::Duration, usize}; pub use self::bandwidth::BandwidthSinks; @@ -29,15 +31,27 @@ pub use self::bandwidth::BandwidthSinks; /// Returns a `BandwidthSinks` object that allows querying the average bandwidth produced by all /// the connections spawned with this transport. pub fn build_transport( - keypair: identity::Keypair + keypair: identity::Keypair, + wasm_external_transport: Option ) -> (Boxed<(PeerId, StreamMuxerBox), io::Error>, Arc) { let mut mplex_config = mplex::MplexConfig::new(); mplex_config.max_buffer_len_behaviour(mplex::MaxBufferBehaviour::Block); mplex_config.max_buffer_len(usize::MAX); - let transport = tcp::TcpConfig::new(); - let transport = websocket::WsConfig::new(transport.clone()).or_transport(transport); - let transport = dns::DnsConfig::new(transport); + let transport = if let Some(t) = wasm_external_transport { + OptionalTransport::some(t) + } else { + OptionalTransport::none() + }; + + #[cfg(not(target_os = "unknown"))] + let transport = { + let desktop_trans = tcp::TcpConfig::new(); + let desktop_trans = websocket::WsConfig::new(desktop_trans.clone()) + .or_transport(desktop_trans); + transport.or_transport(dns::DnsConfig::new(desktop_trans)) + }; + let (transport, sinks) = bandwidth::BandwidthLogging::new(transport, Duration::from_secs(5)); // TODO: rework the transport creation (https://github.com/libp2p/rust-libp2p/issues/783) diff --git a/core/network-libp2p/tests/test.rs b/core/network-libp2p/tests/test.rs index b335b7c46b98c5ccb9759e40247b16ed66c929d1..36e00e13189ac6082eb9ee5699902d5304402989 100644 --- a/core/network-libp2p/tests/test.rs +++ b/core/network-libp2p/tests/test.rs @@ -16,7 +16,7 @@ use futures::{future, stream, prelude::*, try_ready}; use rand::seq::SliceRandom; -use std::io; +use std::{io, time::Duration, time::Instant}; use substrate_network_libp2p::{CustomMessage, Multiaddr, multiaddr::Protocol, ServiceEvent, build_multiaddr}; /// Builds two services. The second one and further have the first one as its bootstrap node. @@ -150,7 +150,7 @@ fn many_nodes_connectivity() { let mut num_connecs = 0; stream::poll_fn(move || -> io::Result<_> { loop { - const MAX_BANDWIDTH: u64 = NUM_NODES as u64 * 1024; // 1kiB/s/node + const MAX_BANDWIDTH: u64 = NUM_NODES as u64 * 2048; // 2kiB/s/node assert!(node.average_download_per_sec() < MAX_BANDWIDTH); assert!(node.average_upload_per_sec() < MAX_BANDWIDTH); @@ -200,7 +200,7 @@ fn many_nodes_connectivity() { #[test] fn basic_two_nodes_requests_in_parallel() { let (mut service1, mut service2) = { - let mut l = build_nodes::<(Option, Vec)>(2, 50550).into_iter(); + let mut l = build_nodes::>(2, 50550).into_iter(); let a = l.next().unwrap(); let b = l.next().unwrap(); (a, b) @@ -209,17 +209,8 @@ fn basic_two_nodes_requests_in_parallel() { // Generate random messages with or without a request id. let mut to_send = { let mut to_send = Vec::new(); - let mut next_id = 0; for _ in 0..200 { // Note: don't make that number too high or the CPU usage will explode. - let id = if rand::random::() % 4 != 0 { - let i = next_id; - next_id += 1; - Some(i) - } else { - None - }; - - let msg = (id, (0..10).map(|_| rand::random::()).collect::>()); + let msg = (0..10).map(|_| rand::random::()).collect::>(); to_send.push(msg); } to_send @@ -262,3 +253,107 @@ fn basic_two_nodes_requests_in_parallel() { let combined = fut1.select(fut2).map_err(|(err, _)| err); tokio::runtime::Runtime::new().unwrap().block_on_all(combined).unwrap(); } + +#[test] +fn reconnect_after_disconnect() { + // We connect two nodes together, then force a disconnect (through the API of the `Service`), + // check that the disconnect worked, and finally check whether they successfully reconnect. + + let (mut service1, mut service2) = { + let mut l = build_nodes::>(2, 50350).into_iter(); + let a = l.next().unwrap(); + let b = l.next().unwrap(); + (a, b) + }; + + // We use the `current_thread` runtime because it doesn't require us to have `'static` futures. + let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); + + // For this test, the services can be in the following states. + #[derive(Debug, Copy, Clone, PartialEq, Eq)] + enum ServiceState { NotConnected, FirstConnec, Disconnected, ConnectedAgain } + let mut service1_state = ServiceState::NotConnected; + let mut service2_state = ServiceState::NotConnected; + + // Run the events loops. + runtime.block_on(future::poll_fn(|| -> Result<_, io::Error> { + loop { + let mut service1_not_ready = false; + + match service1.poll().unwrap() { + Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { .. })) => { + match service1_state { + ServiceState::NotConnected => { + service1_state = ServiceState::FirstConnec; + if service2_state == ServiceState::FirstConnec { + service1.drop_node(service2.peer_id()); + } + }, + ServiceState::Disconnected => service1_state = ServiceState::ConnectedAgain, + ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), + } + }, + Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { .. })) => { + match service1_state { + ServiceState::FirstConnec => service1_state = ServiceState::Disconnected, + ServiceState::ConnectedAgain| ServiceState::NotConnected | + ServiceState::Disconnected => panic!(), + } + }, + Async::NotReady => service1_not_ready = true, + _ => panic!() + } + + match service2.poll().unwrap() { + Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { .. })) => { + match service2_state { + ServiceState::NotConnected => { + service2_state = ServiceState::FirstConnec; + if service1_state == ServiceState::FirstConnec { + service1.drop_node(service2.peer_id()); + } + }, + ServiceState::Disconnected => service2_state = ServiceState::ConnectedAgain, + ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), + } + }, + Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { .. })) => { + match service2_state { + ServiceState::FirstConnec => service2_state = ServiceState::Disconnected, + ServiceState::ConnectedAgain| ServiceState::NotConnected | + ServiceState::Disconnected => panic!(), + } + }, + Async::NotReady if service1_not_ready => break, + Async::NotReady => {} + _ => panic!() + } + } + + if service1_state == ServiceState::ConnectedAgain && service2_state == ServiceState::ConnectedAgain { + Ok(Async::Ready(())) + } else { + Ok(Async::NotReady) + } + })).unwrap(); + + // Do a second 3-seconds run to make sure we don't get disconnected immediately again. + let mut delay = tokio::timer::Delay::new(Instant::now() + Duration::from_secs(3)); + runtime.block_on(future::poll_fn(|| -> Result<_, io::Error> { + match service1.poll().unwrap() { + Async::NotReady => {}, + _ => panic!() + } + + match service2.poll().unwrap() { + Async::NotReady => {}, + _ => panic!() + } + + if let Async::Ready(()) = delay.poll().unwrap() { + Ok(Async::Ready(())) + } else { + Ok(Async::NotReady) + } + })).unwrap(); +} diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index 6899243eea2cdb9bc3733bad5067706a8350ab0b..8fbf7daa9c339d867139398d65f61648cac4e839 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate network protocol" name = "substrate-network" -version = "0.1.0" +version = "2.0.0" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" @@ -9,10 +9,9 @@ edition = "2018" [lib] [dependencies] -crossbeam-channel = "0.3.6" +derive_more = "0.14.0" log = "0.4" -parking_lot = "0.7.1" -error-chain = "0.12" +parking_lot = "0.8.0" bitflags = "1.0" futures = "0.1.17" linked-hash-map = "0.5" @@ -28,16 +27,19 @@ runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitiv parity-codec = { version = "3.3", features = ["derive"] } network_libp2p = { package = "substrate-network-libp2p", path = "../../core/network-libp2p" } peerset = { package = "substrate-peerset", path = "../../core/peerset" } -tokio = "0.1.11" +tokio-timer = "0.2.11" +tokio = { version = "0.1.11", optional = true } keyring = { package = "substrate-keyring", path = "../../core/keyring", optional = true } test_client = { package = "substrate-test-client", path = "../../core/test-client", optional = true } +void = "1.0" [dev-dependencies] env_logger = { version = "0.6" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } test_client = { package = "substrate-test-client", path = "../../core/test-client" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common", features = ["test-helpers"] } +tokio = "0.1.11" [features] default = [] -test-helpers = ["keyring", "test_client"] +test-helpers = ["keyring", "test_client", "consensus/test-helpers", "tokio"] diff --git a/core/network/src/chain.rs b/core/network/src/chain.rs index 92236e7c6384860a58ff93751b1483b306f979cf..76096a44aae6139f08c1489eddf88f9dc338e293 100644 --- a/core/network/src/chain.rs +++ b/core/network/src/chain.rs @@ -28,7 +28,7 @@ use primitives::{H256, Blake2Hasher, storage::StorageKey}; /// Local client abstraction for the network. pub trait Client: Send + Sync { /// Get blockchain info. - fn info(&self) -> Result, Error>; + fn info(&self) -> ClientInfo; /// Get block status. fn block_status(&self, id: &BlockId) -> Result; @@ -68,6 +68,12 @@ pub trait Client: Send + Sync { fn is_descendent_of(&self, base: &Block::Hash, block: &Block::Hash) -> Result; } +/// Finality proof provider. +pub trait FinalityProofProvider: Send + Sync { + /// Prove finality of the block. + fn prove_finality(&self, for_block: Block::Hash, request: &[u8]) -> Result>, Error>; +} + impl Client for SubstrateClient where B: client::backend::Backend + Send + Sync + 'static, E: CallExecutor + Send + Sync + 'static, @@ -75,7 +81,7 @@ impl Client for SubstrateClient where Block: BlockT, RA: Send + Sync { - fn info(&self) -> Result, Error> { + fn info(&self) -> ClientInfo { (self as &SubstrateClient).info() } @@ -128,6 +134,7 @@ impl Client for SubstrateClient where } let tree_route = ::client::blockchain::tree_route( + #[allow(deprecated)] self.backend().blockchain(), BlockId::Hash(*block), BlockId::Hash(*base), diff --git a/core/network/src/config.rs b/core/network/src/config.rs index 2491fc21c4c0746747a6a49d8341a3393a886c88..d8fd0f68c705ac5b3d391ce5ecc9c0b828c795de 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -16,47 +16,40 @@ //! Configuration for the networking layer of Substrate. -pub use network_libp2p::{NonReservedPeerMode, NetworkConfiguration, NodeKeyConfig, Secret}; +pub use crate::protocol::ProtocolConfig; +pub use network_libp2p::{NonReservedPeerMode, NetworkConfiguration, NodeKeyConfig, ProtocolId, Secret}; use bitflags::bitflags; -use crate::chain::Client; +use consensus::import_queue::ImportQueue; +use crate::chain::{Client, FinalityProofProvider}; use parity_codec; -use crate::on_demand::OnDemandService; +use crate::on_demand_layer::OnDemand; use runtime_primitives::traits::{Block as BlockT}; use crate::service::{ExHashT, TransactionPool}; use std::sync::Arc; /// Service initialization parameters. pub struct Params { - /// Configuration. - pub config: ProtocolConfig, + /// Assigned roles for our node. + pub roles: Roles, /// Network layer configuration. pub network_config: NetworkConfiguration, /// Substrate relay chain access point. - pub chain: Arc>, + pub chain: Arc>, + /// Finality proof provider. + pub finality_proof_provider: Option>>, /// On-demand service reference. - pub on_demand: Option>>, + pub on_demand: Option>>, /// Transaction pool. - pub transaction_pool: Arc>, + pub transaction_pool: Arc>, + /// Name of the protocol to use on the wire. Should be different for each chain. + pub protocol_id: ProtocolId, + /// Import queue to use. + pub import_queue: Box>, /// Protocol specialization. pub specialization: S, } -/// Configuration for the Substrate-specific part of the networking layer. -#[derive(Clone)] -pub struct ProtocolConfig { - /// Assigned roles. - pub roles: Roles, -} - -impl Default for ProtocolConfig { - fn default() -> ProtocolConfig { - ProtocolConfig { - roles: Roles::FULL, - } - } -} - bitflags! { /// Bitmask of the roles that a node fulfills. pub struct Roles: u8 { @@ -71,6 +64,18 @@ bitflags! { } } +impl Roles { + /// Does this role represents a client that holds full chain data locally? + pub fn is_full(&self) -> bool { + self.intersects(Roles::FULL | Roles::AUTHORITY) + } + + /// Does this role represents a client that does not hold full chain data locally? + pub fn is_light(&self) -> bool { + !self.is_full() + } +} + impl parity_codec::Encode for Roles { fn encode_to(&self, dest: &mut T) { dest.push_byte(self.bits()) diff --git a/core/network/src/error.rs b/core/network/src/error.rs index 87b967765cf226bc9ee1d1131d51173f44c04ee9..95a1dc5abe76b42b450835212ba9b823a2020101 100644 --- a/core/network/src/error.rs +++ b/core/network/src/error.rs @@ -14,22 +14,27 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Substrate service possible errors. +//! Substrate network possible errors. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - -use error_chain::*; -use std::io::Error as IoError; use client; -error_chain! { - foreign_links { - Io(IoError) #[doc = "IO error."]; - Client(client::error::Error) #[doc="Client error"]; - } +/// Result type alias for the network. +pub type Result = std::result::Result; + +/// Error type for the network. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Io error + Io(std::io::Error), + /// Client error + Client(client::error::Error), +} - errors { +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(ref err) => Some(err), + Error::Client(ref err) => Some(err), + } } } diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 1e3a7f1552b21de1bbf651d06c85af43265a323f..a65df59fd8c544586912809c8961096edc07bd5d 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -19,43 +19,38 @@ //! Substrate-specific P2P networking: synchronizing blocks, propagating BFT messages. //! Allows attachment of an optional subprotocol for chain-specific requests. -//! +//! //! **Important**: This crate is unstable and the API and usage may change. //! mod service; -mod sync; #[macro_use] mod protocol; mod chain; -mod blocks; -mod on_demand; -mod util; +mod on_demand_layer; pub mod config; -pub mod consensus_gossip; pub mod error; -pub mod message; -pub mod specialization; #[cfg(any(test, feature = "test-helpers"))] pub mod test; -pub use chain::Client as ClientHandle; +pub use chain::{Client as ClientHandle, FinalityProofProvider}; pub use service::{ - Service, FetchFuture, TransactionPool, ManageNetwork, NetworkMsg, - SyncProvider, ExHashT, ReportHandle, + NetworkService, NetworkWorker, FetchFuture, TransactionPool, ManageNetwork, + NetworkMsg, SyncProvider, ExHashT, ReportHandle, }; -pub use protocol::{ProtocolStatus, PeerInfo, Context}; -pub use sync::{Status as SyncStatus, SyncState}; +pub use protocol::{ProtocolStatus, PeerInfo, Context, consensus_gossip, message, specialization}; +pub use protocol::sync::{Status as SyncStatus, SyncState}; pub use network_libp2p::{ identity, multiaddr, - ProtocolId, Severity, Multiaddr, + ProtocolId, Multiaddr, NetworkState, NetworkStatePeer, NetworkStateNotConnectedPeer, NetworkStatePeerEndpoint, NodeKeyConfig, Secret, Secp256k1Secret, Ed25519Secret, build_multiaddr, PeerId, PublicKey }; pub use message::{generic as generic_message, RequestId, Status as StatusMessage}; pub use error::Error; -pub use on_demand::{OnDemand, OnDemandService, RemoteResponse}; +pub use protocol::on_demand::AlwaysBadChecker; +pub use on_demand_layer::{OnDemand, RemoteResponse}; #[doc(hidden)] pub use runtime_primitives::traits::Block as BlockT; diff --git a/core/network/src/on_demand.rs b/core/network/src/on_demand.rs deleted file mode 100644 index ca2d04a662ab26b9a44a2ee61d1b8be100bda1ac..0000000000000000000000000000000000000000 --- a/core/network/src/on_demand.rs +++ /dev/null @@ -1,1021 +0,0 @@ -// Copyright 2017-2019 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 . - -//! On-demand requests service. - -use std::collections::{HashMap, VecDeque}; -use std::sync::Arc; -use std::time::{Instant, Duration}; -use log::trace; -use futures::{Async, Future, Poll}; -use futures::sync::oneshot::{channel, Receiver, Sender as OneShotSender}; -use linked_hash_map::LinkedHashMap; -use linked_hash_map::Entry; -use parking_lot::Mutex; -use client::error::Error as ClientError; -use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, - RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof}; -use crate::message; -use network_libp2p::{Severity, PeerId}; -use crate::config::Roles; -use crate::service::{NetworkChan, NetworkMsg}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; - -/// Remote request timeout. -const REQUEST_TIMEOUT: Duration = Duration::from_secs(15); -/// Default request retry count. -const RETRY_COUNT: usize = 1; - -/// On-demand service API. -pub trait OnDemandService: Send + Sync { - /// When new node is connected. - fn on_connect(&self, peer: PeerId, role: Roles, best_number: NumberFor); - - /// When block is announced by the peer. - fn on_block_announce(&self, peer: PeerId, best_number: NumberFor); - - /// When node is disconnected. - fn on_disconnect(&self, peer: PeerId); - - /// Maintain peers requests. - fn maintain_peers(&self); - - /// When header response is received from remote node. - fn on_remote_header_response( - &self, - peer: PeerId, - response: message::RemoteHeaderResponse - ); - - /// When read response is received from remote node. - fn on_remote_read_response(&self, peer: PeerId, response: message::RemoteReadResponse); - - /// When call response is received from remote node. - fn on_remote_call_response(&self, peer: PeerId, response: message::RemoteCallResponse); - - /// When changes response is received from remote node. - fn on_remote_changes_response( - &self, - peer: PeerId, - response: message::RemoteChangesResponse, Block::Hash> - ); -} - -/// On-demand requests service. Dispatches requests to appropriate peers. -pub struct OnDemand { - core: Mutex>, - checker: Arc>, - network_sender: Mutex>>, -} - -/// On-demand remote call response. -pub struct RemoteResponse { - receiver: Receiver>, -} - -#[derive(Default)] -struct OnDemandCore { - next_request_id: u64, - pending_requests: VecDeque>, - active_peers: LinkedHashMap>, - idle_peers: VecDeque, - best_blocks: HashMap>, -} - -struct Request { - id: u64, - timestamp: Instant, - retry_count: usize, - data: RequestData, -} - -enum RequestData { - RemoteHeader(RemoteHeaderRequest, OneShotSender>), - RemoteRead(RemoteReadRequest, OneShotSender>, ClientError>>), - RemoteCall(RemoteCallRequest, OneShotSender, ClientError>>), - RemoteChanges(RemoteChangesRequest, OneShotSender, u32)>, ClientError>>), -} - -enum Accept { - Ok, - CheckFailed(ClientError, RequestData), - Unexpected(RequestData), -} - -impl Future for RemoteResponse { - type Item = T; - type Error = ClientError; - - fn poll(&mut self) -> Poll { - self.receiver.poll() - .map_err(|_| ClientError::RemoteFetchCancelled.into()) - .and_then(|r| match r { - Async::Ready(Ok(ready)) => Ok(Async::Ready(ready)), - Async::Ready(Err(error)) => Err(error), - Async::NotReady => Ok(Async::NotReady), - }) - } -} - -impl OnDemand where - B::Header: HeaderT, -{ - /// Creates new on-demand service. - pub fn new(checker: Arc>) -> Self { - OnDemand { - checker, - network_sender: Mutex::new(None), - core: Mutex::new(OnDemandCore { - next_request_id: 0, - pending_requests: VecDeque::new(), - active_peers: LinkedHashMap::new(), - idle_peers: VecDeque::new(), - best_blocks: HashMap::new(), - }) - } - } - - /// Sets weak reference to network service. - pub fn set_network_sender(&self, network_sender: NetworkChan) { - self.network_sender.lock().replace(network_sender); - } - - fn send(&self, msg: NetworkMsg) { - let _ = self.network_sender - .lock() - .as_ref() - .expect("1. OnDemand is passed a network sender upon initialization of the service, 2. it should bet set by now") - .send(msg); - } - - /// Schedule && dispatch all scheduled requests. - fn schedule_request(&self, retry_count: Option, data: RequestData, result: R) -> R { - let mut core = self.core.lock(); - core.insert(retry_count.unwrap_or(RETRY_COUNT), data); - core.dispatch(self); - result - } - - /// Try to accept response from given peer. - fn accept_response) -> Accept>(&self, rtype: &str, peer: PeerId, request_id: u64, try_accept: F) { - let mut core = self.core.lock(); - let request = match core.remove(peer.clone(), request_id) { - Some(request) => request, - None => { - let reason = format!("Invalid remote {} response from peer", rtype); - self.send(NetworkMsg::ReportPeer(peer.clone(), Severity::Bad(reason))); - core.remove_peer(peer); - return; - }, - }; - - let retry_count = request.retry_count; - let (retry_count, retry_request_data) = match try_accept(request) { - Accept::Ok => (retry_count, None), - Accept::CheckFailed(error, retry_request_data) => { - let reason = format!("Failed to check remote {} response from peer: {}", rtype, error); - self.send(NetworkMsg::ReportPeer(peer.clone(), Severity::Bad(reason))); - core.remove_peer(peer); - - if retry_count > 0 { - (retry_count - 1, Some(retry_request_data)) - } else { - trace!(target: "sync", "Failed to get remote {} response for given number of retries", rtype); - retry_request_data.fail(ClientError::RemoteFetchFailed.into()); - (0, None) - } - }, - Accept::Unexpected(retry_request_data) => { - let reason = format!("Unexpected response to remote {} from peer", rtype); - self.send(NetworkMsg::ReportPeer(peer.clone(), Severity::Bad(reason))); - core.remove_peer(peer); - - (retry_count, Some(retry_request_data)) - }, - }; - - if let Some(request_data) = retry_request_data { - core.insert(retry_count, request_data); - } - - core.dispatch(self); - } -} - -impl OnDemandService for OnDemand where - B: BlockT, - B::Header: HeaderT, -{ - fn on_connect(&self, peer: PeerId, role: Roles, best_number: NumberFor) { - if !role.intersects(Roles::FULL | Roles::AUTHORITY) { - return; - } - - let mut core = self.core.lock(); - core.add_peer(peer, best_number); - core.dispatch(self); - } - - fn on_block_announce(&self, peer: PeerId, best_number: NumberFor) { - let mut core = self.core.lock(); - core.update_peer(peer, best_number); - core.dispatch(self); - } - - fn on_disconnect(&self, peer: PeerId) { - let mut core = self.core.lock(); - core.remove_peer(peer); - core.dispatch(self); - } - - fn maintain_peers(&self) { - let mut core = self.core.lock(); - for bad_peer in core.maintain_peers() { - self.send(NetworkMsg::ReportPeer(bad_peer, Severity::Timeout)); - } - core.dispatch(self); - } - - fn on_remote_header_response(&self, peer: PeerId, response: message::RemoteHeaderResponse) { - self.accept_response("header", peer, response.id, |request| match request.data { - RequestData::RemoteHeader(request, sender) => match self.checker.check_header_proof(&request, response.header, response.proof) { - Ok(response) => { - // we do not bother if receiver has been dropped already - let _ = sender.send(Ok(response)); - Accept::Ok - }, - Err(error) => Accept::CheckFailed(error, RequestData::RemoteHeader(request, sender)), - }, - data => Accept::Unexpected(data), - }) - } - - fn on_remote_read_response(&self, peer: PeerId, response: message::RemoteReadResponse) { - self.accept_response("read", peer, response.id, |request| match request.data { - RequestData::RemoteRead(request, sender) => match self.checker.check_read_proof(&request, response.proof) { - Ok(response) => { - // we do not bother if receiver has been dropped already - let _ = sender.send(Ok(response)); - Accept::Ok - }, - Err(error) => Accept::CheckFailed(error, RequestData::RemoteRead(request, sender)), - }, - data => Accept::Unexpected(data), - }) - } - - fn on_remote_call_response(&self, peer: PeerId, response: message::RemoteCallResponse) { - self.accept_response("call", peer, response.id, |request| match request.data { - RequestData::RemoteCall(request, sender) => match self.checker.check_execution_proof(&request, response.proof) { - Ok(response) => { - // we do not bother if receiver has been dropped already - let _ = sender.send(Ok(response)); - Accept::Ok - }, - Err(error) => Accept::CheckFailed(error, RequestData::RemoteCall(request, sender)), - }, - data => Accept::Unexpected(data), - }) - } - - fn on_remote_changes_response(&self, peer: PeerId, response: message::RemoteChangesResponse, B::Hash>) { - self.accept_response("changes", peer, response.id, |request| match request.data { - RequestData::RemoteChanges(request, sender) => match self.checker.check_changes_proof( - &request, ChangesProof { - max_block: response.max, - proof: response.proof, - roots: response.roots.into_iter().collect(), - roots_proof: response.roots_proof, - }) { - Ok(response) => { - // we do not bother if receiver has been dropped already - let _ = sender.send(Ok(response)); - Accept::Ok - }, - Err(error) => Accept::CheckFailed(error, RequestData::RemoteChanges(request, sender)), - }, - data => Accept::Unexpected(data), - }) - } -} - -impl Fetcher for OnDemand where - B: BlockT, - B::Header: HeaderT, -{ - type RemoteHeaderResult = RemoteResponse; - type RemoteReadResult = RemoteResponse>>; - type RemoteCallResult = RemoteResponse>; - type RemoteChangesResult = RemoteResponse, u32)>>; - - fn remote_header(&self, request: RemoteHeaderRequest) -> Self::RemoteHeaderResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteHeader(request, sender), - RemoteResponse { receiver }) - } - - fn remote_read(&self, request: RemoteReadRequest) -> Self::RemoteReadResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteRead(request, sender), - RemoteResponse { receiver }) - } - - fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteCall(request, sender), - RemoteResponse { receiver }) - } - - fn remote_changes(&self, request: RemoteChangesRequest) -> Self::RemoteChangesResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteChanges(request, sender), - RemoteResponse { receiver }) - } -} - -impl OnDemandCore where - B: BlockT, - B::Header: HeaderT, -{ - pub fn add_peer(&mut self, peer: PeerId, best_number: NumberFor) { - self.idle_peers.push_back(peer.clone()); - self.best_blocks.insert(peer, best_number); - } - - pub fn update_peer(&mut self, peer: PeerId, best_number: NumberFor) { - self.best_blocks.insert(peer, best_number); - } - - pub fn remove_peer(&mut self, peer: PeerId) { - self.best_blocks.remove(&peer); - - if let Some(request) = self.active_peers.remove(&peer) { - self.pending_requests.push_front(request); - return; - } - - if let Some(idle_index) = self.idle_peers.iter().position(|i| *i == peer) { - self.idle_peers.swap_remove_back(idle_index); - } - } - - pub fn maintain_peers(&mut self) -> Vec { - let now = Instant::now(); - let mut bad_peers = Vec::new(); - loop { - match self.active_peers.front() { - Some((_, request)) if now - request.timestamp >= REQUEST_TIMEOUT => (), - _ => return bad_peers, - } - - let (bad_peer, request) = self.active_peers.pop_front().expect("front() is Some as checked above"); - self.pending_requests.push_front(request); - bad_peers.push(bad_peer); - } - } - - pub fn insert(&mut self, retry_count: usize, data: RequestData) { - let request_id = self.next_request_id; - self.next_request_id += 1; - - self.pending_requests.push_back(Request { - id: request_id, - timestamp: Instant::now(), - retry_count, - data, - }); - } - - pub fn remove(&mut self, peer: PeerId, id: u64) -> Option> { - match self.active_peers.entry(peer.clone()) { - Entry::Occupied(entry) => match entry.get().id == id { - true => { - self.idle_peers.push_back(peer); - Some(entry.remove()) - }, - false => None, - }, - Entry::Vacant(_) => None, - } - } - - pub fn dispatch(&mut self, on_demand: &OnDemand) { - - let mut last_peer = self.idle_peers.back().cloned(); - let mut unhandled_requests = VecDeque::new(); - - loop { - let peer = match self.idle_peers.pop_front() { - Some(peer) => peer, - None => break, - }; - - // check if request can (optimistically) be processed by the peer - let can_be_processed_by_peer = { - let request = match self.pending_requests.front() { - Some(r) => r, - None => { - self.idle_peers.push_front(peer); - break; - }, - }; - let peer_best_block = self.best_blocks.get(&peer) - .expect("entries are inserted into best_blocks when peer is connected; - entries are removed from best_blocks when peer is disconnected; - peer is in idle_peers and thus connected; qed"); - request.required_block() <= *peer_best_block - }; - - if !can_be_processed_by_peer { - // return peer to the back of the queue - self.idle_peers.push_back(peer.clone()); - - // we have enumerated all peers and noone can handle request - if Some(peer) == last_peer { - let request = self.pending_requests.pop_front().expect("checked in loop condition; qed"); - unhandled_requests.push_back(request); - last_peer = self.idle_peers.back().cloned(); - } - - continue; - } - - last_peer = self.idle_peers.back().cloned(); - - let mut request = self.pending_requests.pop_front().expect("checked in loop condition; qed"); - request.timestamp = Instant::now(); - trace!(target: "sync", "Dispatching remote request {} to peer {}", request.id, peer); - on_demand.send(NetworkMsg::Outgoing(peer.clone(), request.message())); - self.active_peers.insert(peer, request); - } - - self.pending_requests.append(&mut unhandled_requests); - } -} - -impl Request { - pub fn required_block(&self) -> NumberFor { - match self.data { - RequestData::RemoteHeader(ref data, _) => data.block, - RequestData::RemoteRead(ref data, _) => *data.header.number(), - RequestData::RemoteCall(ref data, _) => *data.header.number(), - RequestData::RemoteChanges(ref data, _) => data.max_block.0, - } - } - - pub fn message(&self) -> message::Message { - match self.data { - RequestData::RemoteHeader(ref data, _) => - message::generic::Message::RemoteHeaderRequest(message::RemoteHeaderRequest { - id: self.id, - block: data.block, - }), - RequestData::RemoteRead(ref data, _) => - message::generic::Message::RemoteReadRequest(message::RemoteReadRequest { - id: self.id, - block: data.block, - key: data.key.clone(), - }), - RequestData::RemoteCall(ref data, _) => - message::generic::Message::RemoteCallRequest(message::RemoteCallRequest { - id: self.id, - block: data.block, - method: data.method.clone(), - data: data.call_data.clone(), - }), - RequestData::RemoteChanges(ref data, _) => - message::generic::Message::RemoteChangesRequest(message::RemoteChangesRequest { - id: self.id, - first: data.first_block.1.clone(), - last: data.last_block.1.clone(), - min: data.tries_roots.1.clone(), - max: data.max_block.1.clone(), - key: data.key.clone(), - }), - } - } -} - -impl RequestData { - pub fn fail(self, error: ClientError) { - // don't care if anyone is listening - match self { - RequestData::RemoteHeader(_, sender) => { let _ = sender.send(Err(error)); }, - RequestData::RemoteCall(_, sender) => { let _ = sender.send(Err(error)); }, - RequestData::RemoteRead(_, sender) => { let _ = sender.send(Err(error)); }, - RequestData::RemoteChanges(_, sender) => { let _ = sender.send(Err(error)); }, - } - } -} - -#[cfg(test)] -pub mod tests { - use std::sync::Arc; - use std::time::Instant; - use futures::Future; - use runtime_primitives::traits::NumberFor; - use client::{error::{Error as ClientError, Result as ClientResult}}; - use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, - RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof}; - use crate::config::Roles; - use crate::message; - use network_libp2p::{PeerId, Severity}; - use crate::service::{network_channel, NetworkPort, NetworkMsg}; - use super::{REQUEST_TIMEOUT, OnDemand, OnDemandService}; - use test_client::runtime::{changes_trie_config, Block, Header}; - - pub struct DummyExecutor; - struct DummyFetchChecker { ok: bool } - - impl FetchChecker for DummyFetchChecker { - fn check_header_proof( - &self, - _request: &RemoteHeaderRequest
, - header: Option
, - _remote_proof: Vec> - ) -> ClientResult
{ - match self.ok { - true if header.is_some() => Ok(header.unwrap()), - _ => Err(ClientError::Backend("Test error".into())), - } - } - - fn check_read_proof(&self, _: &RemoteReadRequest
, _: Vec>) -> ClientResult>> { - match self.ok { - true => Ok(Some(vec![42])), - false => Err(ClientError::Backend("Test error".into())), - } - } - - fn check_execution_proof(&self, _: &RemoteCallRequest
, _: Vec>) -> ClientResult> { - match self.ok { - true => Ok(vec![42]), - false => Err(ClientError::Backend("Test error".into())), - } - } - - fn check_changes_proof(&self, _: &RemoteChangesRequest
, _: ChangesProof
) -> ClientResult, u32)>> { - match self.ok { - true => Ok(vec![(100, 2)]), - false => Err(ClientError::Backend("Test error".into())), - } - } - } - - fn dummy(ok: bool) -> (Arc, Arc>) { - let executor = Arc::new(DummyExecutor); - let service = Arc::new(OnDemand::new(Arc::new(DummyFetchChecker { ok }))); - (executor, service) - } - - fn total_peers(on_demand: &OnDemand) -> usize { - let core = on_demand.core.lock(); - core.idle_peers.len() + core.active_peers.len() - } - - fn receive_call_response(on_demand: &OnDemand, peer: PeerId, id: message::RequestId) { - on_demand.on_remote_call_response(peer, message::RemoteCallResponse { - id: id, - proof: vec![vec![2]], - }); - } - - fn dummy_header() -> Header { - Header { - parent_hash: Default::default(), - number: 0, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - } - } - - fn assert_disconnected_peer(network_port: NetworkPort, expected_severity: Severity) { - let mut disconnect_count = 0; - while let Ok(msg) = network_port.receiver().try_recv() { - match msg { - NetworkMsg::ReportPeer(_, severity) => { - if severity == expected_severity { - disconnect_count = disconnect_count + 1; - } - }, - _ => {}, - } - } - assert_eq!(disconnect_count, 1); - } - - #[test] - fn knows_about_peers_roles() { - let (_, on_demand) = dummy(true); - let peer0 = PeerId::random(); - let peer1 = PeerId::random(); - let peer2 = PeerId::random(); - on_demand.on_connect(peer0, Roles::LIGHT, 1000); - on_demand.on_connect(peer1.clone(), Roles::FULL, 2000); - on_demand.on_connect(peer2.clone(), Roles::AUTHORITY, 3000); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().best_blocks.get(&peer1), Some(&2000)); - assert_eq!(on_demand.core.lock().best_blocks.get(&peer2), Some(&3000)); - } - - #[test] - fn disconnects_from_idle_peer() { - let peer0 = PeerId::random(); - - let (_, on_demand) = dummy(true); - on_demand.on_connect(peer0.clone(), Roles::FULL, 100); - assert_eq!(1, total_peers(&*on_demand)); - assert!(!on_demand.core.lock().best_blocks.is_empty()); - - on_demand.on_disconnect(peer0); - assert_eq!(0, total_peers(&*on_demand)); - assert!(on_demand.core.lock().best_blocks.is_empty()); - } - - #[test] - fn disconnects_from_timeouted_peer() { - let (_x, on_demand) = dummy(true); - let (network_sender, network_port) = network_channel(); - let peer0 = PeerId::random(); - let peer1 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - on_demand.on_connect(peer1.clone(), Roles::FULL, 1000); - assert_eq!(vec![peer0.clone(), peer1.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert!(on_demand.core.lock().active_peers.is_empty()); - - on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: None, - }); - assert_eq!(vec![peer1.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(vec![peer0.clone()], on_demand.core.lock().active_peers.keys().cloned().collect::>()); - - on_demand.core.lock().active_peers[&peer0].timestamp = Instant::now() - REQUEST_TIMEOUT - REQUEST_TIMEOUT; - on_demand.maintain_peers(); - assert!(on_demand.core.lock().idle_peers.is_empty()); - assert_eq!(vec![peer1.clone()], on_demand.core.lock().active_peers.keys().cloned().collect::>()); - assert_disconnected_peer(network_port, Severity::Timeout); - } - - #[test] - fn disconnects_from_peer_on_response_with_wrong_id() { - let (_x, on_demand) = dummy(true); - let peer0 = PeerId::random(); - let (network_sender, network_port) = network_channel(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: None, - }); - receive_call_response(&*on_demand, peer0, 1); - assert_disconnected_peer(network_port, Severity::Bad("Invalid remote call response from peer".to_string())); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - } - - #[test] - fn disconnects_from_peer_on_incorrect_response() { - let (_x, on_demand) = dummy(false); - let (network_sender, network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: Some(1), - }); - - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - receive_call_response(&*on_demand, peer0.clone(), 0); - assert_disconnected_peer(network_port, Severity::Bad("Failed to check remote call response from peer: Backend error: Test error".to_string())); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - } - - #[test] - fn disconnects_from_peer_on_unexpected_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - receive_call_response(&*on_demand, peer0, 0); - assert_disconnected_peer(network_port, Severity::Bad("Invalid remote call response from peer".to_string())); - } - - #[test] - fn disconnects_from_peer_on_wrong_response_type() { - let (_x, on_demand) = dummy(false); - let peer0 = PeerId::random(); - let (network_sender, network_port) = network_channel(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: Some(1), - }); - - on_demand.on_remote_read_response(peer0.clone(), message::RemoteReadResponse { - id: 0, - proof: vec![vec![2]], - }); - assert_disconnected_peer(network_port, Severity::Bad("Unexpected response to remote read from peer".to_string())); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - } - - #[test] - fn receives_remote_failure_after_retry_count_failures() { - use parking_lot::{Condvar, Mutex}; - - let retry_count = 2; - let peer_ids = (0 .. retry_count + 1).map(|_| PeerId::random()).collect::>(); - let (_x, on_demand) = dummy(false); - let (network_sender, _network_port) = network_channel(); - on_demand.set_network_sender(network_sender.clone()); - for i in 0..retry_count+1 { - on_demand.on_connect(peer_ids[i].clone(), Roles::FULL, 1000); - } - - let sync = Arc::new((Mutex::new(0), Mutex::new(0), Condvar::new())); - let thread_sync = sync.clone(); - - let response = on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: Some(retry_count) - }); - let thread = ::std::thread::spawn(move || { - let &(ref current, ref finished_at, ref finished) = &*thread_sync; - let _ = response.wait().unwrap_err(); - *finished_at.lock() = *current.lock(); - finished.notify_one(); - }); - - let &(ref current, ref finished_at, ref finished) = &*sync; - for i in 0..retry_count+1 { - let mut current = current.lock(); - *current = *current + 1; - receive_call_response(&*on_demand, peer_ids[i].clone(), i as u64); - } - - let mut finished_at = finished_at.lock(); - assert!(!finished.wait_for(&mut finished_at, ::std::time::Duration::from_millis(1000)).timed_out()); - assert_eq!(*finished_at, retry_count + 1); - - thread.join().unwrap(); - } - - #[test] - fn receives_remote_call_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - let response = on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: None, - }); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); - assert_eq!(result, vec![42]); - }); - - receive_call_response(&*on_demand, peer0.clone(), 0); - thread.join().unwrap(); - } - - #[test] - fn receives_remote_read_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - let response = on_demand.remote_read(RemoteReadRequest { - header: dummy_header(), - block: Default::default(), - key: b":key".to_vec(), - retry_count: None, - }); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); - assert_eq!(result, Some(vec![42])); - }); - - on_demand.on_remote_read_response(peer0.clone(), message::RemoteReadResponse { - id: 0, - proof: vec![vec![2]], - }); - thread.join().unwrap(); - } - - #[test] - fn receives_remote_header_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - let response = on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 1, - retry_count: None, - }); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); - assert_eq!( - result.hash(), - "6443a0b46e0412e626363028115a9f2c\ - f963eeed526b8b33e5316f08b50d0dc3".parse().unwrap() - ); - }); - - on_demand.on_remote_header_response(peer0.clone(), message::RemoteHeaderResponse { - id: 0, - header: Some(Header { - parent_hash: Default::default(), - number: 1, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - }), - proof: vec![vec![2]], - }); - thread.join().unwrap(); - } - - #[test] - fn receives_remote_changes_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - let response = on_demand.remote_changes(RemoteChangesRequest { - changes_trie_config: changes_trie_config(), - first_block: (1, Default::default()), - last_block: (100, Default::default()), - max_block: (100, Default::default()), - tries_roots: (1, Default::default(), vec![]), - key: vec![], - retry_count: None, - }); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); - assert_eq!(result, vec![(100, 2)]); - }); - - on_demand.on_remote_changes_response(peer0.clone(), message::RemoteChangesResponse { - id: 0, - max: 1000, - proof: vec![vec![2]], - roots: vec![], - roots_proof: vec![], - }); - thread.join().unwrap(); - } - - #[test] - fn does_not_sends_request_to_peer_who_has_no_required_block() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer1 = PeerId::random(); - let peer2 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - - on_demand.on_connect(peer1.clone(), Roles::FULL, 100); - - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 200, - retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 250, - retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 250, - retry_count: None, - }); - - on_demand.on_connect(peer2.clone(), Roles::FULL, 150); - - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 3); - - on_demand.on_block_announce(peer1.clone(), 250); - - assert_eq!(vec![peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 2); - - on_demand.on_block_announce(peer2.clone(), 250); - - assert!(!on_demand.core.lock().idle_peers.iter().any(|_| true)); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - - on_demand.on_remote_header_response(peer1.clone(), message::RemoteHeaderResponse { - id: 0, - header: Some(dummy_header()), - proof: vec![], - }); - - assert!(!on_demand.core.lock().idle_peers.iter().any(|_| true)); - assert_eq!(on_demand.core.lock().pending_requests.len(), 0); - } - - #[test] - fn does_not_loop_forever_after_dispatching_request_to_last_peer() { - // this test is a regression for a bug where the dispatch function would - // loop forever after dispatching a request to the last peer, since the - // last peer was not updated - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer1 = PeerId::random(); - let peer2 = PeerId::random(); - let peer3 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 250, - retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 250, - retry_count: None, - }); - - on_demand.on_connect(peer1.clone(), Roles::FULL, 200); - on_demand.on_connect(peer2.clone(), Roles::FULL, 200); - on_demand.on_connect(peer3.clone(), Roles::FULL, 250); - - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - } - - #[test] - fn tries_to_send_all_pending_requests() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer1 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 300, - retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 250, - retry_count: None, - }); - - on_demand.on_connect(peer1.clone(), Roles::FULL, 250); - - assert!(on_demand.core.lock().idle_peers.iter().cloned().collect::>().is_empty()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - } -} diff --git a/core/network/src/on_demand_layer.rs b/core/network/src/on_demand_layer.rs new file mode 100644 index 0000000000000000000000000000000000000000..86b3d6b7f4a12a304420db5f685539a3cb3b0ce4 --- /dev/null +++ b/core/network/src/on_demand_layer.rs @@ -0,0 +1,149 @@ +// Copyright 2017-2019 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 . + +//! On-demand requests service. + +use crate::protocol::on_demand::RequestData; +use std::sync::Arc; +use futures::{prelude::*, sync::mpsc, sync::oneshot}; +use parking_lot::Mutex; +use client::error::Error as ClientError; +use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, + RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, + RemoteReadChildRequest, RemoteBodyRequest}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; + +/// Implements the `Fetcher` trait of the client. Makes it possible for the light client to perform +/// network requests for some state. +/// +/// This implementation stores all the requests in a queue. The network, in parallel, is then +/// responsible for pulling elements out of that queue and fulfilling them. +pub struct OnDemand { + /// Objects that checks whether what has been retrieved is correct. + checker: Arc>, + + /// Queue of requests. Set to `Some` at initialization, then extracted by the network. + /// + /// Note that a better alternative would be to use a MPMC queue here, and add a `poll` method + /// from the `OnDemand`. However there exists no popular implementation of MPMC channels in + /// asynchronous Rust at the moment + requests_queue: Mutex>>>, + + /// Sending side of `requests_queue`. + requests_send: mpsc::UnboundedSender>, +} + +impl OnDemand where + B::Header: HeaderT, +{ + /// Creates new on-demand service. + pub fn new(checker: Arc>) -> Self { + let (requests_send, requests_queue) = mpsc::unbounded(); + let requests_queue = Mutex::new(Some(requests_queue)); + + OnDemand { + checker, + requests_queue, + requests_send, + } + } + + /// Get checker reference. + pub fn checker(&self) -> &Arc> { + &self.checker + } + + /// Extracts the queue of requests. + /// + /// Whenever one of the methods of the `Fetcher` trait is called, an element is pushed on this + /// channel. + /// + /// If this function returns `None`, that means that the receiver has already been extracted in + /// the past, and therefore that something already handles the requests. + pub(crate) fn extract_receiver(&self) -> Option>> { + self.requests_queue.lock().take() + } +} + +impl Fetcher for OnDemand where + B: BlockT, + B::Header: HeaderT, +{ + type RemoteHeaderResult = RemoteResponse; + type RemoteReadResult = RemoteResponse>>; + type RemoteCallResult = RemoteResponse>; + type RemoteChangesResult = RemoteResponse, u32)>>; + type RemoteBodyResult = RemoteResponse>; + + fn remote_header(&self, request: RemoteHeaderRequest) -> Self::RemoteHeaderResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteHeader(request, sender)); + RemoteResponse { receiver } + } + + fn remote_read(&self, request: RemoteReadRequest) -> Self::RemoteReadResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteRead(request, sender)); + RemoteResponse { receiver } + } + + fn remote_read_child( + &self, + request: RemoteReadChildRequest + ) -> Self::RemoteReadResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteReadChild(request, sender)); + RemoteResponse { receiver } + } + + fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteCall(request, sender)); + RemoteResponse { receiver } + } + + fn remote_changes(&self, request: RemoteChangesRequest) -> Self::RemoteChangesResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteChanges(request, sender)); + RemoteResponse { receiver } + } + + fn remote_body(&self, request: RemoteBodyRequest) -> Self::RemoteBodyResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteBody(request, sender)); + RemoteResponse { receiver } + } +} + +/// Future for an on-demand remote call response. +pub struct RemoteResponse { + receiver: oneshot::Receiver>, +} + +impl Future for RemoteResponse { + type Item = T; + type Error = ClientError; + + fn poll(&mut self) -> Poll { + self.receiver.poll() + .map_err(|_| ClientError::RemoteFetchCancelled.into()) + .and_then(|r| match r { + Async::Ready(Ok(ready)) => Ok(Async::Ready(ready)), + Async::Ready(Err(error)) => Err(error), + Async::NotReady => Ok(Async::NotReady), + }) + } +} diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index b82088c69550e33f3856412aca4dba889fc7fa94..576d37a82fac36a8a20f7ccf70d713873a537495 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -14,40 +14,50 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crossbeam_channel::{self as channel, Receiver, Sender, select}; -use futures::sync::mpsc; -use parking_lot::Mutex; -use network_libp2p::{PeerId, Severity}; +use futures::prelude::*; +use network_libp2p::PeerId; use primitives::storage::StorageKey; -use runtime_primitives::{generic::BlockId, ConsensusEngineId}; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, NumberFor, Zero}; -use consensus::import_queue::ImportQueue; -use crate::message::{self, Message}; -use crate::message::generic::{Message as GenericMessage, ConsensusMessage}; -use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; -use crate::on_demand::OnDemandService; -use crate::specialization::NetworkSpecialization; -use crate::sync::{ChainSync, Status as SyncStatus, SyncState}; -use crate::service::{NetworkChan, NetworkMsg, TransactionPool, ExHashT}; -use crate::config::{ProtocolConfig, Roles}; -use parking_lot::RwLock; +use consensus::{import_queue::IncomingBlock, import_queue::Origin, BlockOrigin}; +use runtime_primitives::{generic::BlockId, ConsensusEngineId, Justification}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, NumberFor, One, Zero, + CheckedSub, SaturatedConversion +}; +use consensus::import_queue::SharedFinalityProofRequestBuilder; +use message::{ + BlockRequest as BlockRequestMessage, + FinalityProofRequest as FinalityProofRequestMessage, Message, +}; +use message::{BlockAttributes, Direction, FromBlock, RequestId}; +use message::generic::{Message as GenericMessage, ConsensusMessage}; +use consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; +use on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; +use specialization::NetworkSpecialization; +use sync::{ChainSync, Context as SyncContext, Status as SyncStatus, SyncState}; +use crate::service::{TransactionPool, ExHashT}; +use crate::config::Roles; use rustc_hex::ToHex; use std::collections::{BTreeMap, HashMap}; use std::sync::Arc; -use std::sync::atomic::AtomicBool; -use std::{cmp, num::NonZeroUsize, thread, time}; -use log::{trace, debug, warn}; -use crate::chain::Client; -use client::light::fetcher::ChangesProof; -use crate::{error, util::LruHashSet}; +use std::{cmp, num::NonZeroUsize, time}; +use log::{trace, debug, warn, error}; +use crate::chain::{Client, FinalityProofProvider}; +use client::light::fetcher::{FetchChecker, ChangesProof}; +use crate::error; +use util::LruHashSet; + +mod util; +pub mod consensus_gossip; +pub mod message; +pub mod on_demand; +pub mod specialization; +pub mod sync; const REQUEST_TIMEOUT_SEC: u64 = 40; /// Interval at which we perform time based maintenance const TICK_TIMEOUT: time::Duration = time::Duration::from_millis(1100); /// Interval at which we propagate exstrinsics; const PROPAGATE_TIMEOUT: time::Duration = time::Duration::from_millis(2900); -/// Interval at which we send status updates on the SyncProvider status stream. -const STATUS_INTERVAL: time::Duration = time::Duration::from_millis(5000); /// Current protocol version. pub(crate) const CURRENT_VERSION: u32 = 3; @@ -61,14 +71,29 @@ const MAX_BLOCK_DATA_RESPONSE: u32 = 128; /// and disconnect to free connection slot. const LIGHT_MAXIMAL_BLOCKS_DIFFERENCE: u64 = 8192; +/// Reputation change when a peer is "clogged", meaning that it's not fast enough to process our +/// messages. +const CLOGGED_PEER_REPUTATION_CHANGE: i32 = -(1 << 12); +/// Reputation change when a peer doesn't respond in time to our messages. +const TIMEOUT_REPUTATION_CHANGE: i32 = -(1 << 10); +/// Reputation change when a peer sends us a status message while we already received one. +const UNEXPECTED_STATUS_REPUTATION_CHANGE: i32 = -(1 << 20); +/// Reputation change when we are a light client and a peer is behind us. +const PEER_BEHIND_US_LIGHT_REPUTATION_CHANGE: i32 = -(1 << 8); +/// Reputation change when a peer sends us an extrinsic that we didn't know about. +const NEW_EXTRINSIC_REPUTATION_CHANGE: i32 = 1 << 7; +/// We sent an RPC query to the given node, but it failed. +const RPC_FAILED_REPUTATION_CHANGE: i32 = -(1 << 12); + // Lock must always be taken in order declared here. pub struct Protocol, H: ExHashT> { - status_sinks: Arc>>>>, - network_chan: NetworkChan, - port: Receiver>, - from_network_port: Receiver>, + /// Interval at which we call `tick`. + tick_timeout: tokio_timer::Interval, + /// Interval at which we call `propagate_extrinsics`. + propagate_timeout: tokio_timer::Interval, config: ProtocolConfig, - on_demand: Option>>, + /// Handler for on-demand requests. + on_demand_core: OnDemandCore, genesis_hash: B::Hash, sync: ChainSync, specialization: S, @@ -76,10 +101,6 @@ pub struct Protocol, H: ExHashT> { context_data: ContextData, // Connected peers pending Status message. handshaking_peers: HashMap, - // Connected peers from whom we received a Status message, - // similar to context_data.peers but shared with the SyncProvider. - connected_peers: Arc>>>, - transaction_pool: Arc>, } /// A peer from whom we have received a Status message. @@ -106,7 +127,7 @@ pub struct ProtocolStatus { } /// Peer information -#[derive(Debug)] +#[derive(Debug, Clone)] struct Peer { info: PeerInfo, /// Current block request, if any. @@ -134,310 +155,324 @@ pub struct PeerInfo { pub best_number: ::Number, } +/// Context passed as input to the methods of `protocol.rs` and that is used to communicate back +/// with the network. +pub trait NetworkOut { + /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or + /// irresponsible or appeared lazy. + fn report_peer(&mut self, who: PeerId, reputation: i32); + + /// Force disconnecting from a peer. + fn disconnect_peer(&mut self, who: PeerId); + + /// Send a message to a peer. + fn send_message(&mut self, who: PeerId, message: Message); +} + +impl<'a, 'b, B: BlockT> OnDemandNetwork for &'a mut &'b mut dyn NetworkOut { + fn report_peer(&mut self, who: &PeerId, reputation: i32) { + NetworkOut::report_peer(**self, who.clone(), reputation) + } + + fn disconnect_peer(&mut self, who: &PeerId) { + NetworkOut::disconnect_peer(**self, who.clone()) + } + + fn send_header_request(&mut self, who: &PeerId, id: RequestId, block: <::Header as HeaderT>::Number) { + let message = message::generic::Message::RemoteHeaderRequest(message::RemoteHeaderRequest { + id, + block, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_read_request(&mut self, who: &PeerId, id: RequestId, block: ::Hash, key: Vec) { + let message = message::generic::Message::RemoteReadRequest(message::RemoteReadRequest { + id, + block, + key, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_read_child_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + storage_key: Vec, + key: Vec + ) { + let message = message::generic::Message::RemoteReadChildRequest(message::RemoteReadChildRequest { + id, + block, + storage_key, + key, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_call_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + method: String, + data: Vec + ) { + let message = message::generic::Message::RemoteCallRequest(message::RemoteCallRequest { + id, + block, + method, + data, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_changes_request( + &mut self, + who: &PeerId, + id: RequestId, + first: ::Hash, + last: ::Hash, + min: ::Hash, + max: ::Hash, + key: Vec + ) { + let message = message::generic::Message::RemoteChangesRequest(message::RemoteChangesRequest { + id, + first, + last, + min, + max, + key, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_body_request( + &mut self, + who: &PeerId, + id: RequestId, + fields: BlockAttributes, + from: FromBlock<::Hash, <::Header as HeaderT>::Number>, + to: Option<::Hash>, + direction: Direction, + max: Option + ) { + let message = message::generic::Message::BlockRequest(message::BlockRequest:: { + id, + fields, + from, + to, + direction, + max, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } +} + /// Context for a network-specific handler. pub trait Context { - /// Get a reference to the client. - fn client(&self) -> &crate::chain::Client; + /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or + /// irresponsible or appeared lazy. + fn report_peer(&mut self, who: PeerId, reputation: i32); - /// Point out that a peer has been malign or irresponsible or appeared lazy. - fn report_peer(&mut self, who: PeerId, reason: Severity); + /// Force disconnecting from a peer. Use this when a peer misbehaved. + fn disconnect_peer(&mut self, who: PeerId); - /// Get peer info. - fn peer_info(&self, peer: &PeerId) -> Option>; + /// Send a consensus message to a peer. + fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage); - /// Send a message to a peer. - fn send_message(&mut self, who: PeerId, data: crate::message::Message); + /// Send a chain-specific message to a peer. + fn send_chain_specific(&mut self, who: PeerId, message: Vec); } /// Protocol context. struct ProtocolContext<'a, B: 'a + BlockT, H: 'a + ExHashT> { - network_chan: &'a NetworkChan, + network_out: &'a mut dyn NetworkOut, context_data: &'a mut ContextData, } impl<'a, B: BlockT + 'a, H: 'a + ExHashT> ProtocolContext<'a, B, H> { - fn new(context_data: &'a mut ContextData, network_chan: &'a NetworkChan) -> Self { - ProtocolContext { network_chan, context_data } + fn new(context_data: &'a mut ContextData, network_out: &'a mut dyn NetworkOut) -> Self { + ProtocolContext { network_out, context_data } } } impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, H> { - fn send_message(&mut self, who: PeerId, message: Message) { - send_message(&mut self.context_data.peers, &self.network_chan, who, message) + fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.network_out.report_peer(who, reputation) } - fn report_peer(&mut self, who: PeerId, reason: Severity) { - self.network_chan.send(NetworkMsg::ReportPeer(who, reason)) + fn disconnect_peer(&mut self, who: PeerId) { + self.network_out.disconnect_peer(who) } - fn peer_info(&self, who: &PeerId) -> Option> { - self.context_data.peers.get(who).map(|p| p.info.clone()) + fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::Consensus(consensus) + ) } - fn client(&self) -> &Client { - &*self.context_data.chain + fn send_chain_specific(&mut self, who: PeerId, message: Vec) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::ChainSpecific(message) + ) } } -/// Data necessary to create a context. -struct ContextData { - // All connected peers - peers: HashMap>, - pub chain: Arc>, -} +impl<'a, B: BlockT + 'a, H: ExHashT + 'a> SyncContext for ProtocolContext<'a, B, H> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.network_out.report_peer(who, reputation) + } -/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. -pub trait SpecTask> { - fn call_box(self: Box, spec: &mut S, context: &mut Context); -} + fn disconnect_peer(&mut self, who: PeerId) { + self.network_out.disconnect_peer(who) + } -impl, F: FnOnce(&mut S, &mut Context)> SpecTask for F { - fn call_box(self: Box, spec: &mut S, context: &mut Context) { - (*self)(spec, context) + fn client(&self) -> &dyn Client { + &*self.context_data.chain } -} -/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. -pub trait GossipTask { - fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut Context); -} + fn send_finality_proof_request(&mut self, who: PeerId, request: FinalityProofRequestMessage) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::FinalityProofRequest(request) + ) + } -impl, &mut Context)> GossipTask for F { - fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut Context) { - (*self)(gossip, context) + fn send_block_request(&mut self, who: PeerId, request: BlockRequestMessage) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::BlockRequest(request) + ) } } -/// Messages sent to Protocol from elsewhere inside the system. -pub enum ProtocolMsg> { - /// A batch of blocks has been processed, with or without errors. - BlocksProcessed(Vec, bool), - /// Tell protocol to restart sync. - RestartSync, - /// Propagate status updates. - Status, - /// Tell protocol to propagate extrinsics. - PropagateExtrinsics, - /// Tell protocol that a block was imported (sent by the import-queue). - BlockImportedSync(B::Hash, NumberFor), - /// Tell protocol to clear all pending justification requests. - ClearJustificationRequests, - /// Tell protocol to request justification for a block. - RequestJustification(B::Hash, NumberFor), - /// Inform protocol whether a justification was successfully imported. - JustificationImportResult(B::Hash, NumberFor, bool), - /// Propagate a block to peers. - AnnounceBlock(B::Hash), - /// A block has been imported (sent by the client). - BlockImported(B::Hash, B::Header), - /// A block has been finalized (sent by the client). - BlockFinalized(B::Hash, B::Header), - /// Execute a closure with the chain-specific network specialization. - ExecuteWithSpec(Box + Send + 'static>), - /// Execute a closure with the consensus gossip. - ExecuteWithGossip(Box + Send + 'static>), - /// Incoming gossip consensus message. - GossipConsensusMessage(B::Hash, ConsensusEngineId, Vec, GossipMessageRecipient), - /// Tell protocol to abort sync (does not stop protocol). - /// Only used in tests. - #[cfg(any(test, feature = "test-helpers"))] - Abort, - /// Tell protocol to abort sync and stop. - Stop, - /// Tell protocol to perform regular maintenance. - Tick, - /// Synchronization request. - #[cfg(any(test, feature = "test-helpers"))] - Synchronize, +/// Data necessary to create a context. +struct ContextData { + // All connected peers + peers: HashMap>, + pub chain: Arc>, } -/// Messages sent to Protocol from Network-libp2p. -pub enum FromNetworkMsg { - /// A peer connected, with debug info. - PeerConnected(PeerId, String), - /// A peer disconnected, with debug info. - PeerDisconnected(PeerId, String), - /// A custom message from another peer. - CustomMessage(PeerId, Message), - /// Let protocol know a peer is currenlty clogged. - PeerClogged(PeerId, Option>), - /// Synchronization request. - #[cfg(any(test, feature = "test-helpers"))] - Synchronize, +/// Configuration for the Substrate-specific part of the networking layer. +#[derive(Clone)] +pub struct ProtocolConfig { + /// Assigned roles. + pub roles: Roles, } -enum Incoming> { - FromNetwork(FromNetworkMsg), - FromClient(ProtocolMsg) +impl Default for ProtocolConfig { + fn default() -> ProtocolConfig { + ProtocolConfig { + roles: Roles::FULL, + } + } } impl, H: ExHashT> Protocol { /// Create a new instance. pub fn new( - status_sinks: Arc>>>>, - is_offline: Arc, - is_major_syncing: Arc, - connected_peers: Arc>>>, - network_chan: NetworkChan, config: ProtocolConfig, - chain: Arc>, - import_queue: Box>, - on_demand: Option>>, - transaction_pool: Arc>, + chain: Arc>, + checker: Arc>, specialization: S, - ) -> error::Result<(Sender>, Sender>)> { - let (protocol_sender, port) = channel::unbounded(); - let (from_network_sender, from_network_port) = channel::bounded(4); - let info = chain.info()?; - let sync = ChainSync::new(is_offline, is_major_syncing, config.roles, &info, import_queue); - let _ = thread::Builder::new() - .name("Protocol".into()) - .spawn(move || { - let mut protocol = Protocol { - status_sinks, - network_chan, - from_network_port, - port, - config: config, - context_data: ContextData { - peers: HashMap::new(), - chain, - }, - on_demand, - genesis_hash: info.chain.genesis_hash, - sync, - specialization: specialization, - consensus_gossip: ConsensusGossip::new(), - handshaking_peers: HashMap::new(), - connected_peers, - transaction_pool: transaction_pool, - }; - let tick_timeout = channel::tick(TICK_TIMEOUT); - let propagate_timeout = channel::tick(PROPAGATE_TIMEOUT); - let status_interval = channel::tick(STATUS_INTERVAL); - while protocol.run(&tick_timeout, &propagate_timeout, &status_interval) { - // Running until all senders have been dropped... - } - }) - .expect("Protocol thread spawning failed"); - Ok((protocol_sender, from_network_sender)) - } - - fn run( - &mut self, - tick_timeout: &Receiver, - propagate_timeout: &Receiver, - status_interval: &Receiver, - ) -> bool { - let msg = select! { - recv(self.port) -> event => { - match event { - Ok(msg) => Incoming::FromClient(msg), - // Our sender has been dropped, quit. - Err(_) => { - Incoming::FromClient(ProtocolMsg::Stop) - }, - } - }, - recv(self.from_network_port) -> event => { - match event { - Ok(msg) => Incoming::FromNetwork(msg), - // Our sender has been dropped, quit. - Err(_) => { - Incoming::FromClient(ProtocolMsg::Stop) - }, - } + ) -> error::Result> { + let info = chain.info(); + let sync = ChainSync::new(config.roles, &info); + Ok(Protocol { + tick_timeout: tokio_timer::Interval::new_interval(TICK_TIMEOUT), + propagate_timeout: tokio_timer::Interval::new_interval(PROPAGATE_TIMEOUT), + config: config, + context_data: ContextData { + peers: HashMap::new(), + chain, }, - recv(tick_timeout) -> _ => { - Incoming::FromClient(ProtocolMsg::Tick) - }, - recv(propagate_timeout) -> _ => { - Incoming::FromClient(ProtocolMsg::PropagateExtrinsics) - }, - recv(status_interval) -> _ => { - Incoming::FromClient(ProtocolMsg::Status) - }, - }; - self.handle_msg(msg) + on_demand_core: OnDemandCore::new(checker), + genesis_hash: info.chain.genesis_hash, + sync, + specialization: specialization, + consensus_gossip: ConsensusGossip::new(), + handshaking_peers: HashMap::new(), + }) } - fn handle_msg(&mut self, msg: Incoming) -> bool { - match msg { - Incoming::FromNetwork(msg) => self.handle_network_msg(msg), - Incoming::FromClient(msg) => self.handle_client_msg(msg), + /// Returns an object representing the status of the protocol. + pub fn status(&self) -> ProtocolStatus { + ProtocolStatus { + sync: self.sync.status(), + num_peers: self.context_data.peers.values().count(), + num_active_peers: self + .context_data + .peers + .values() + .filter(|p| p.block_request.is_some()) + .count(), } } - fn handle_client_msg(&mut self, msg: ProtocolMsg) -> bool { - match msg { - ProtocolMsg::Status => self.on_status(), - ProtocolMsg::BlockImported(hash, header) => self.on_block_imported(hash, &header), - ProtocolMsg::BlockFinalized(hash, header) => self.on_block_finalized(hash, &header), - ProtocolMsg::ExecuteWithSpec(task) => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - task.call_box(&mut self.specialization, &mut context); - }, - ProtocolMsg::ExecuteWithGossip(task) => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - task.call_box(&mut self.consensus_gossip, &mut context); - } - ProtocolMsg::GossipConsensusMessage(topic, engine_id, message, recipient) => { - self.gossip_consensus_message(topic, engine_id, message, recipient) - } - ProtocolMsg::BlocksProcessed(hashes, has_error) => { - self.sync.blocks_processed(hashes, has_error); - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.sync.maintain_sync(&mut context); - }, - ProtocolMsg::RestartSync => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.sync.restart(&mut context); - } - ProtocolMsg::AnnounceBlock(hash) => self.announce_block(hash), - ProtocolMsg::BlockImportedSync(hash, number) => self.sync.block_imported(&hash, number), - ProtocolMsg::ClearJustificationRequests => self.sync.clear_justification_requests(), - ProtocolMsg::RequestJustification(hash, number) => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.sync.request_justification(&hash, number, &mut context); - }, - ProtocolMsg::JustificationImportResult(hash, number, success) => self.sync.justification_import_result(hash, number, success), - ProtocolMsg::PropagateExtrinsics => self.propagate_extrinsics(), - ProtocolMsg::Tick => self.tick(), - #[cfg(any(test, feature = "test-helpers"))] - ProtocolMsg::Abort => self.abort(), - ProtocolMsg::Stop => { - self.stop(); - return false; - }, - #[cfg(any(test, feature = "test-helpers"))] - ProtocolMsg::Synchronize => self.network_chan.send(NetworkMsg::Synchronized), - } - true + pub fn is_major_syncing(&self) -> bool { + self.sync.status().is_major_syncing() } - fn handle_network_msg(&mut self, msg: FromNetworkMsg) -> bool { - match msg { - FromNetworkMsg::PeerDisconnected(who, debug_info) => self.on_peer_disconnected(who, debug_info), - FromNetworkMsg::PeerConnected(who, debug_info) => self.on_peer_connected(who, debug_info), - FromNetworkMsg::PeerClogged(who, message) => self.on_clogged_peer(who, message), - FromNetworkMsg::CustomMessage(who, message) => { - self.on_custom_message(who, message) - }, - #[cfg(any(test, feature = "test-helpers"))] - FromNetworkMsg::Synchronize => self.network_chan.send(NetworkMsg::Synchronized), + pub fn is_offline(&self) -> bool { + self.sync.status().is_offline() + } + + /// Starts a new data demand request. + /// + /// The parameter contains a `Sender` where the result, once received, must be sent. + pub(crate) fn add_on_demand_request(&mut self, mut network_out: &mut dyn NetworkOut, rq: RequestData) { + self.on_demand_core.add_request(&mut network_out, rq); + } + + pub fn poll( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized) + ) -> Poll { + while let Ok(Async::Ready(_)) = self.tick_timeout.poll() { + self.tick(network_out); + } + + while let Ok(Async::Ready(_)) = self.propagate_timeout.poll() { + self.propagate_extrinsics(network_out, transaction_pool); } - true + + Ok(Async::NotReady) } - fn handle_response(&mut self, who: PeerId, response: &message::BlockResponse) -> Option> { + fn is_on_demand_response(&self, who: &PeerId, response_id: message::RequestId) -> bool { + self.on_demand_core.is_on_demand_response(&who, response_id) + } + + fn handle_response( + &mut self, + network_out: &mut dyn NetworkOut, + who: PeerId, + response: &message::BlockResponse + ) -> Option> { if let Some(ref mut peer) = self.context_data.peers.get_mut(&who) { if let Some(_) = peer.obsolete_requests.remove(&response.id) { - trace!(target: "sync", "Ignoring obsolete block response packet from {} ({})", who, response.id,); + trace!(target: "sync", "Ignoring obsolete block response packet from {} ({})", who, response.id); return None; } // Clear the request. If the response is invalid peer will be disconnected anyway. @@ -445,9 +480,9 @@ impl, H: ExHashT> Protocol { if request.as_ref().map_or(false, |(_, r)| r.id == response.id) { return request.map(|(_, r)| r) } - trace!(target: "sync", "Unexpected response packet from {} ({})", who, response.id,); - let severity = Severity::Bad("Unexpected response packet received from peer".to_string()); - self.network_chan.send(NetworkMsg::ReportPeer(who, severity)) + trace!(target: "sync", "Unexpected response packet from {} ({})", who, response.id); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); } None } @@ -458,86 +493,119 @@ impl, H: ExHashT> Protocol { peer.info.best_hash = info.best_hash; peer.info.best_number = info.best_number; } - let mut peers = self.connected_peers.write(); - if let Some(ref mut peer) = peers.get_mut(who) { - peer.peer_info.best_hash = info.best_hash; - peer.peer_info.best_number = info.best_number; - } } } - /// Propagates protocol statuses. - fn on_status(&mut self) { - let status = ProtocolStatus { - sync: self.sync.status(), - num_peers: self.context_data.peers.values().count(), - num_active_peers: self - .context_data - .peers - .values() - .filter(|p| p.block_request.is_some()) - .count(), - }; - self.status_sinks.lock().retain(|sink| sink.unbounded_send(status.clone()).is_ok()); + /// Returns information about all the peers we are connected to after the handshake message. + pub fn peers_info(&self) -> impl Iterator)> { + self.context_data.peers.iter().map(|(id, peer)| (id, &peer.info)) } - fn on_custom_message(&mut self, who: PeerId, message: Message) { + pub fn on_custom_message( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized), + who: PeerId, + message: Message, + finality_proof_provider: Option<&dyn FinalityProofProvider> + ) -> CustomMessageOutcome { match message { - GenericMessage::Status(s) => self.on_status_message(who, s), - GenericMessage::BlockRequest(r) => self.on_block_request(who, r), + GenericMessage::Status(s) => self.on_status_message(network_out, who, s), + GenericMessage::BlockRequest(r) => self.on_block_request(network_out, who, r), GenericMessage::BlockResponse(r) => { - if let Some(request) = self.handle_response(who.clone(), &r) { - self.on_block_response(who.clone(), request, r); - self.update_peer_info(&who); + // Note, this is safe because only `ordinary bodies` and `remote bodies` are received in this matter. + if self.is_on_demand_response(&who, r.id) { + self.on_remote_body_response(network_out, who, r); + } else { + if let Some(request) = self.handle_response(network_out, who.clone(), &r) { + let outcome = self.on_block_response(network_out, who.clone(), request, r); + self.update_peer_info(&who); + return outcome + } } }, GenericMessage::BlockAnnounce(announce) => { - self.on_block_announce(who.clone(), announce); + let outcome = self.on_block_announce(network_out, who.clone(), announce); self.update_peer_info(&who); + return outcome; }, - GenericMessage::Transactions(m) => self.on_extrinsics(who, m), - GenericMessage::RemoteCallRequest(request) => self.on_remote_call_request(who, request), - GenericMessage::RemoteCallResponse(response) => self.on_remote_call_response(who, response), - GenericMessage::RemoteReadRequest(request) => self.on_remote_read_request(who, request), - GenericMessage::RemoteReadResponse(response) => self.on_remote_read_response(who, response), - GenericMessage::RemoteHeaderRequest(request) => self.on_remote_header_request(who, request), - GenericMessage::RemoteHeaderResponse(response) => self.on_remote_header_response(who, response), - GenericMessage::RemoteChangesRequest(request) => self.on_remote_changes_request(who, request), - GenericMessage::RemoteChangesResponse(response) => self.on_remote_changes_response(who, response), + GenericMessage::Transactions(m) => + self.on_extrinsics(network_out, transaction_pool, who, m), + GenericMessage::RemoteCallRequest(request) => self.on_remote_call_request(network_out, who, request), + GenericMessage::RemoteCallResponse(response) => + self.on_remote_call_response(network_out, who, response), + GenericMessage::RemoteReadRequest(request) => + self.on_remote_read_request(network_out, who, request), + GenericMessage::RemoteReadResponse(response) => + self.on_remote_read_response(network_out, who, response), + GenericMessage::RemoteHeaderRequest(request) => + self.on_remote_header_request(network_out, who, request), + GenericMessage::RemoteHeaderResponse(response) => + self.on_remote_header_response(network_out, who, response), + GenericMessage::RemoteChangesRequest(request) => + self.on_remote_changes_request(network_out, who, request), + GenericMessage::RemoteChangesResponse(response) => + self.on_remote_changes_response(network_out, who, response), + GenericMessage::FinalityProofRequest(request) => + self.on_finality_proof_request(network_out, who, request, finality_proof_provider), + GenericMessage::FinalityProofResponse(response) => + return self.on_finality_proof_response(network_out, who, response), GenericMessage::Consensus(msg) => { if self.context_data.peers.get(&who).map_or(false, |peer| peer.info.protocol_version > 2) { self.consensus_gossip.on_incoming( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), who, msg, ); } } other => self.specialization.on_message( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), who, &mut Some(other), ), } + + CustomMessageOutcome::None } - fn send_message(&mut self, who: PeerId, message: Message) { + fn send_message(&mut self, network_out: &mut dyn NetworkOut, who: PeerId, message: Message) { send_message::( &mut self.context_data.peers, - &self.network_chan, + network_out, who, message, ); } - fn gossip_consensus_message( + /// Locks `self` and returns a context plus the `ConsensusGossip` struct. + pub fn consensus_gossip_lock<'a>( + &'a mut self, + network_out: &'a mut dyn NetworkOut + ) -> (impl Context + 'a, &'a mut ConsensusGossip) { + let context = ProtocolContext::new(&mut self.context_data, network_out); + (context, &mut self.consensus_gossip) + } + + /// Locks `self` and returns a context plus the network specialization. + pub fn specialization_lock<'a>( + &'a mut self, + network_out: &'a mut dyn NetworkOut + ) -> (impl Context + 'a, &'a mut S) { + let context = ProtocolContext::new(&mut self.context_data, network_out); + (context, &mut self.specialization) + } + + /// Gossip a consensus message to the network. + pub fn gossip_consensus_message( &mut self, + network_out: &mut dyn NetworkOut, topic: B::Hash, engine_id: ConsensusEngineId, message: Vec, recipient: GossipMessageRecipient, ) { - let mut context = ProtocolContext::new(&mut self.context_data, &self.network_chan); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); let message = ConsensusMessage { data: message, engine_id }; match recipient { GossipMessageRecipient::BroadcastToAll => @@ -545,41 +613,42 @@ impl, H: ExHashT> Protocol { GossipMessageRecipient::BroadcastNew => self.consensus_gossip.multicast(&mut context, topic, message, false), GossipMessageRecipient::Peer(who) => - self.send_message(who, GenericMessage::Consensus(message)), + self.send_message(network_out, who, GenericMessage::Consensus(message)), } } /// Called when a new peer is connected - fn on_peer_connected(&mut self, who: PeerId, debug_info: String) { + pub fn on_peer_connected(&mut self, network_out: &mut dyn NetworkOut, who: PeerId, debug_info: String) { trace!(target: "sync", "Connecting {}: {}", who, debug_info); self.handshaking_peers.insert(who.clone(), HandshakingPeer { timestamp: time::Instant::now() }); - self.send_status(who); + self.send_status(network_out, who); } /// Called by peer when it is disconnecting - fn on_peer_disconnected(&mut self, peer: PeerId, debug_info: String) { + pub fn on_peer_disconnected(&mut self, mut network_out: &mut dyn NetworkOut, peer: PeerId, debug_info: String) { trace!(target: "sync", "Disconnecting {}: {}", peer, debug_info); // lock all the the peer lists so that add/remove peer events are in order let removed = { self.handshaking_peers.remove(&peer); - self.connected_peers.write().remove(&peer); self.context_data.peers.remove(&peer) }; if let Some(peer_data) = removed { - let mut context = ProtocolContext::new(&mut self.context_data, &self.network_chan); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); if peer_data.info.protocol_version > 2 { self.consensus_gossip.peer_disconnected(&mut context, peer.clone()); } self.sync.peer_disconnected(&mut context, peer.clone()); self.specialization.on_disconnect(&mut context, peer.clone()); - self.on_demand.as_ref().map(|s| s.on_disconnect(peer)); + self.on_demand_core.on_disconnect(&mut network_out, peer); } } /// Called as a back-pressure mechanism if the networking detects that the peer cannot process /// our messaging rate fast enough. - pub fn on_clogged_peer(&self, who: PeerId, _msg: Option>) { - // We don't do anything but print some diagnostics for now. + pub fn on_clogged_peer(&self, network_out: &mut dyn NetworkOut, who: PeerId, _msg: Option>) { + network_out.report_peer(who.clone(), CLOGGED_PEER_REPUTATION_CHANGE); + + // Print some diagnostics. if let Some(peer) = self.context_data.peers.get(&who) { debug!(target: "sync", "Clogged peer {} (protocol_version: {:?}; roles: {:?}; \ known_extrinsics: {:?}; known_blocks: {:?}; best_hash: {:?}; best_number: {:?})", @@ -590,13 +659,27 @@ impl, H: ExHashT> Protocol { } } - fn on_block_request(&mut self, peer: PeerId, request: message::BlockRequest) { + fn on_block_request( + &mut self, + network_out: &mut dyn NetworkOut, + peer: PeerId, + request: message::BlockRequest + ) { trace!(target: "sync", "BlockRequest {} from {}: from {:?} to {:?} max {:?}", request.id, peer, request.from, request.to, request.max); + + // sending block requests to the node that is unable to serve it is considered a bad behavior + if !self.config.roles.is_full() { + trace!(target: "sync", "Peer {} is trying to sync from the light node", peer); + network_out.disconnect_peer(peer.clone()); + network_out.report_peer(peer, i32::min_value()); + return; + } + let mut blocks = Vec::new(); let mut id = match request.from { message::FromBlock::Hash(h) => BlockId::Hash(h), @@ -637,9 +720,9 @@ impl, H: ExHashT> Protocol { }; blocks.push(block_data); match request.direction { - message::Direction::Ascending => id = BlockId::Number(number + As::sa(1)), + message::Direction::Ascending => id = BlockId::Number(number + One::one()), message::Direction::Descending => { - if number == As::sa(0) { + if number.is_zero() { break; } id = BlockId::Hash(parent_hash) @@ -651,124 +734,149 @@ impl, H: ExHashT> Protocol { blocks: blocks, }; trace!(target: "sync", "Sending BlockResponse with {} blocks", response.blocks.len()); - self.send_message(peer, GenericMessage::BlockResponse(response)) + self.send_message(network_out, peer, GenericMessage::BlockResponse(response)) } fn on_block_response( &mut self, + network_out: &mut dyn NetworkOut, peer: PeerId, request: message::BlockRequest, response: message::BlockResponse, - ) { + ) -> CustomMessageOutcome { let blocks_range = match ( - response.blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), - response.blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), - ) { - (Some(first), Some(last)) if first != last => format!(" ({}..{})", first, last), - (Some(first), Some(_)) => format!(" ({})", first), - _ => Default::default(), - }; + response.blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), + response.blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), + ) { + (Some(first), Some(last)) if first != last => format!(" ({}..{})", first, last), + (Some(first), Some(_)) => format!(" ({})", first), + _ => Default::default(), + }; trace!(target: "sync", "BlockResponse {} from {} with {} blocks {}", - response.id, peer, response.blocks.len(), blocks_range); + response.id, + peer, + response.blocks.len(), + blocks_range + ); // TODO [andre]: move this logic to the import queue so that // justifications are imported asynchronously (#1482) if request.fields == message::BlockAttributes::JUSTIFICATION { - self.sync.on_block_justification_data( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + let outcome = self.sync.on_block_justification_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), peer, request, response, ); + + if let Some((origin, hash, nb, just)) = outcome { + CustomMessageOutcome::JustificationImport(origin, hash, nb, just) + } else { + CustomMessageOutcome::None + } + } else { - self.sync.on_block_data(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan), peer, request, response); + let outcome = self.sync.on_block_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), + peer, + request, + response + ); + if let Some((origin, blocks)) = outcome { + CustomMessageOutcome::BlockImport(origin, blocks) + } else { + CustomMessageOutcome::None + } } } /// Perform time based maintenance. - fn tick(&mut self) { - self.consensus_gossip.tick(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan)); - self.maintain_peers(); - self.sync.tick(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan)); - self.on_demand - .as_ref() - .map(|s| s.maintain_peers()); + /// + /// > **Note**: This method normally doesn't have to be called except for testing purposes. + pub fn tick(&mut self, mut network_out: &mut dyn NetworkOut) { + self.consensus_gossip.tick(&mut ProtocolContext::new(&mut self.context_data, network_out)); + self.maintain_peers(network_out); + self.sync.tick(&mut ProtocolContext::new(&mut self.context_data, network_out)); + self.on_demand_core.maintain_peers(&mut network_out); } - fn maintain_peers(&mut self) { + fn maintain_peers(&mut self, network_out: &mut dyn NetworkOut) { let tick = time::Instant::now(); let mut aborting = Vec::new(); { for (who, peer) in self.context_data.peers.iter() { if peer.block_request.as_ref().map_or(false, |(t, _)| (tick - *t).as_secs() > REQUEST_TIMEOUT_SEC) { - trace!(target: "sync", "Reqeust timeout {}", who); + trace!(target: "sync", "Request timeout {}", who); aborting.push(who.clone()); } else if peer.obsolete_requests.values().any(|t| (tick - *t).as_secs() > REQUEST_TIMEOUT_SEC) { trace!(target: "sync", "Obsolete timeout {}", who); aborting.push(who.clone()); } } - for (who, _) in self.handshaking_peers.iter().filter(|(_, handshaking)| (tick - handshaking.timestamp).as_secs() > REQUEST_TIMEOUT_SEC) { + for (who, _) in self.handshaking_peers.iter() + .filter(|(_, handshaking)| (tick - handshaking.timestamp).as_secs() > REQUEST_TIMEOUT_SEC) + { trace!(target: "sync", "Handshake timeout {}", who); aborting.push(who.clone()); } } - self.specialization.maintain_peers(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan)); + self.specialization.maintain_peers(&mut ProtocolContext::new(&mut self.context_data, network_out)); for p in aborting { - let _ = self - .network_chan - .send(NetworkMsg::ReportPeer(p, Severity::Timeout)); + network_out.disconnect_peer(p.clone()); + network_out.report_peer(p, TIMEOUT_REPUTATION_CHANGE); } } /// Called by peer to report status - fn on_status_message(&mut self, who: PeerId, status: message::Status) { + fn on_status_message(&mut self, mut network_out: &mut dyn NetworkOut, who: PeerId, status: message::Status) { trace!(target: "sync", "New peer {} {:?}", who, status); let protocol_version = { if self.context_data.peers.contains_key(&who) { debug!("Unexpected status packet from {}", who); + network_out.report_peer(who, UNEXPECTED_STATUS_REPUTATION_CHANGE); return; } if status.genesis_hash != self.genesis_hash { - let reason = format!( + trace!( + target: "protocol", "Peer is on different chain (our genesis: {} theirs: {})", self.genesis_hash, status.genesis_hash ); - self.network_chan.send(NetworkMsg::ReportPeer( - who, - Severity::Bad(reason), - )); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); return; } if status.version < MIN_VERSION && CURRENT_VERSION < status.min_supported_version { - let reason = format!("Peer using unsupported protocol version {}", status.version); - self.network_chan.send(NetworkMsg::ReportPeer( - who, - Severity::Bad(reason), - )); + trace!(target: "protocol", "Peer {:?} using unsupported protocol version {}", who, status.version); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); return; } - if self.config.roles & Roles::LIGHT == Roles::LIGHT { + + if self.config.roles.is_light() { + // we're not interested in light peers + if status.roles.is_light() { + debug!(target: "sync", "Peer {} is unable to serve light requests", who); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); + return; + } + + // we don't interested in peers that are far behind us let self_best_block = self .context_data .chain .info() - .ok() - .and_then(|info| info.best_queued_number) - .unwrap_or_else(|| Zero::zero()); + .chain.best_number; let blocks_difference = self_best_block - .as_() - .checked_sub(status.best_number.as_()) - .unwrap_or(0); + .checked_sub(&status.best_number) + .unwrap_or_else(Zero::zero) + .saturated_into::(); if blocks_difference > LIGHT_MAXIMAL_BLOCKS_DIFFERENCE { - self.network_chan.send(NetworkMsg::ReportPeer( - who, - Severity::Useless( - "Peer is far behind us and will unable to serve light requests" - .to_string(), - ), - )); + debug!(target: "sync", "Peer {} is far behind us and will unable to serve light requests", who); + network_out.report_peer(who.clone(), PEER_BEHIND_US_LIGHT_REPUTATION_CHANGE); + network_out.disconnect_peer(who); return; } } @@ -777,19 +885,15 @@ impl, H: ExHashT> Protocol { let info = match self.handshaking_peers.remove(&who) { Some(_handshaking) => { - let peer_info = PeerInfo { + PeerInfo { protocol_version: status.version, roles: status.roles, best_hash: status.best_hash, best_number: status.best_number - }; - self.connected_peers - .write() - .insert(who.clone(), ConnectedPeer { peer_info: peer_info.clone() }); - peer_info + } }, None => { - debug!(target: "sync", "Received status from previously unconnected node {}", who); + error!(target: "sync", "Received status from previously unconnected node {}", who); return; }, }; @@ -808,11 +912,10 @@ impl, H: ExHashT> Protocol { status.version }; - let mut context = ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.on_demand - .as_ref() - .map(|s| s.on_connect(who.clone(), status.roles, status.best_number)); - self.sync.new_peer(&mut context, who.clone()); + let info = self.context_data.peers.get(&who).expect("We just inserted above; QED").info.clone(); + self.on_demand_core.on_connect(&mut network_out, who.clone(), status.roles, status.best_number); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.new_peer(&mut context, who.clone(), info); if protocol_version > 2 { self.consensus_gossip.new_peer(&mut context, who.clone(), status.roles); } @@ -820,7 +923,13 @@ impl, H: ExHashT> Protocol { } /// Called when peer sends us new extrinsics - fn on_extrinsics(&mut self, who: PeerId, extrinsics: message::Transactions) { + fn on_extrinsics( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized), + who: PeerId, + extrinsics: message::Transactions + ) { // Accept extrinsics only when fully synced if self.sync.status().state != SyncState::Idle { trace!(target: "sync", "{} Ignoring extrinsics while syncing", who); @@ -829,7 +938,8 @@ impl, H: ExHashT> Protocol { trace!(target: "sync", "Received {} extrinsics from {}", extrinsics.len(), who); if let Some(ref mut peer) = self.context_data.peers.get_mut(&who) { for t in extrinsics { - if let Some(hash) = self.transaction_pool.import(&t) { + if let Some(hash) = transaction_pool.import(&t) { + network_out.report_peer(who.clone(), NEW_EXTRINSIC_REPUTATION_CHANGE); peer.known_extrinsics.insert(hash); } else { trace!(target: "sync", "Extrinsic rejected"); @@ -838,8 +948,12 @@ impl, H: ExHashT> Protocol { } } - /// Called when we propagate ready extrinsics to peers. - fn propagate_extrinsics(&mut self) { + /// Call when we must propagate ready extrinsics to peers. + pub fn propagate_extrinsics( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized) + ) { debug!(target: "sync", "Propagating extrinsics"); // Accept transactions only when fully synced @@ -847,7 +961,7 @@ impl, H: ExHashT> Protocol { return; } - let extrinsics = self.transaction_pool.transactions(); + let extrinsics = transaction_pool.transactions(); let mut propagated_to = HashMap::new(); for (who, peer) in self.context_data.peers.iter_mut() { let (hashes, to_send): (Vec<_>, Vec<_>) = extrinsics @@ -864,17 +978,18 @@ impl, H: ExHashT> Protocol { .push(who.to_base58()); } trace!(target: "sync", "Sending {} transactions to {}", to_send.len(), who); - self.network_chan.send(NetworkMsg::Outgoing(who.clone(), GenericMessage::Transactions(to_send))) + network_out.send_message(who.clone(), GenericMessage::Transactions(to_send)) } } - self.transaction_pool.on_broadcasted(propagated_to); + + transaction_pool.on_broadcasted(propagated_to); } /// Make sure an important block is propagated to peers. /// /// In chain-based consensus, we often need to make sure non-best forks are /// at least temporarily synced. - pub fn announce_block(&mut self, hash: B::Hash) { + pub fn announce_block(&mut self, network_out: &mut dyn NetworkOut, hash: B::Hash) { let header = match self.context_data.chain.header(&BlockId::Hash(hash)) { Ok(Some(header)) => header, Ok(None) => { @@ -893,43 +1008,32 @@ impl, H: ExHashT> Protocol { for (who, ref mut peer) in self.context_data.peers.iter_mut() { trace!(target: "sync", "Reannouncing block {:?} to {}", hash, who); peer.known_blocks.insert(hash); - self.network_chan.send(NetworkMsg::Outgoing(who.clone(), message.clone())) + network_out.send_message(who.clone(), message.clone()) } } /// Send Status message - fn send_status(&mut self, who: PeerId) { - if let Ok(info) = self.context_data.chain.info() { - let status = message::generic::Status { - version: CURRENT_VERSION, - min_supported_version: MIN_VERSION, - genesis_hash: info.chain.genesis_hash, - roles: self.config.roles.into(), - best_number: info.chain.best_number, - best_hash: info.chain.best_hash, - chain_status: self.specialization.status(), - }; - self.send_message(who, GenericMessage::Status(status)) - } - } - - fn abort(&mut self) { - self.sync.clear(); - self.specialization.on_abort(); - self.context_data.peers.clear(); - self.handshaking_peers.clear(); - self.consensus_gossip.abort(); - } - - fn stop(&mut self) { - // stop processing import requests first (without holding a sync lock) - self.sync.stop(); + fn send_status(&mut self, network_out: &mut dyn NetworkOut, who: PeerId) { + let info = self.context_data.chain.info(); + let status = message::generic::Status { + version: CURRENT_VERSION, + min_supported_version: MIN_VERSION, + genesis_hash: info.chain.genesis_hash, + roles: self.config.roles.into(), + best_number: info.chain.best_number, + best_hash: info.chain.best_hash, + chain_status: self.specialization.status(), + }; - // and then clear all the sync data - self.abort(); + self.send_message(network_out, who, GenericMessage::Status(status)) } - fn on_block_announce(&mut self, who: PeerId, announce: message::BlockAnnounce) { + fn on_block_announce( + &mut self, + mut network_out: &mut dyn NetworkOut, + who: PeerId, + announce: message::BlockAnnounce + ) -> CustomMessageOutcome { let header = announce.header; let hash = header.hash(); { @@ -937,27 +1041,70 @@ impl, H: ExHashT> Protocol { peer.known_blocks.insert(hash.clone()); } } - self.on_demand - .as_ref() - .map(|s| s.on_block_announce(who.clone(), *header.number())); - self.sync.on_block_announce( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), - who, + self.on_demand_core.on_block_announce(&mut network_out, who.clone(), *header.number()); + let try_import = self.sync.on_block_announce( + &mut ProtocolContext::new(&mut self.context_data, network_out), + who.clone(), hash, &header, ); + + // try_import is only true when we have all data required to import block + // in the BlockAnnounce message. This is only when: + // 1) we're on light client; + // AND + // - EITHER 2.1) announced block is stale; + // - OR 2.2) announced block is NEW and we normally only want to download this single block (i.e. + // there are no ascendants of this block scheduled for retrieval) + if !try_import { + return CustomMessageOutcome::None; + } + + // to import header from announced block let's construct response to request that normally would have + // been sent over network (but it is not in our case) + let blocks_to_import = self.sync.on_block_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), + who.clone(), + message::generic::BlockRequest { + id: 0, + fields: BlockAttributes::HEADER, + from: message::FromBlock::Hash(hash), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }, + message::generic::BlockResponse { + id: 0, + blocks: vec![ + message::generic::BlockData { + hash: hash, + header: Some(header), + body: None, + receipt: None, + message_queue: None, + justification: None, + }, + ], + }, + ); + match blocks_to_import { + Some((origin, blocks)) => CustomMessageOutcome::BlockImport(origin, blocks), + None => CustomMessageOutcome::None, + } } - fn on_block_imported(&mut self, hash: B::Hash, header: &B::Header) { + /// Call this when a block has been imported in the import queue and we should announce it on + /// the network. + pub fn on_block_imported(&mut self, network_out: &mut dyn NetworkOut, hash: B::Hash, header: &B::Header) { self.sync.update_chain_info(header); self.specialization.on_block_imported( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), hash.clone(), header, ); // blocks are not announced by light clients - if self.config.roles & Roles::LIGHT == Roles::LIGHT { + if self.config.roles.is_light() { return; } @@ -968,25 +1115,33 @@ impl, H: ExHashT> Protocol { for (who, ref mut peer) in self.context_data.peers.iter_mut() { if peer.known_blocks.insert(hash.clone()) { trace!(target: "sync", "Announcing block {:?} to {}", hash, who); - self.network_chan.send(NetworkMsg::Outgoing(who.clone(), message.clone())) + network_out.send_message(who.clone(), message.clone()) } } } - fn on_block_finalized(&mut self, hash: B::Hash, header: &B::Header) { + /// Call this when a block has been finalized. The sync layer may have some additional + /// requesting to perform. + pub fn on_block_finalized(&mut self, network_out: &mut dyn NetworkOut, hash: B::Hash, header: &B::Header) { self.sync.on_block_finalized( &hash, *header.number(), - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), ); } fn on_remote_call_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteCallRequest, ) { - trace!(target: "sync", "Remote call request {} from {} ({} at {})", request.id, who, request.method, request.block); + trace!(target: "sync", "Remote call request {} from {} ({} at {})", + request.id, + who, + request.method, + request.block + ); let proof = match self.context_data.chain.execution_proof( &request.block, &request.method, @@ -995,12 +1150,19 @@ impl, H: ExHashT> Protocol { Ok((_, proof)) => proof, Err(error) => { trace!(target: "sync", "Remote call request {} from {} ({} at {}) failed with: {}", - request.id, who, request.method, request.block, error); + request.id, + who, + request.method, + request.block, + error + ); + network_out.report_peer(who.clone(), RPC_FAILED_REPUTATION_CHANGE); Default::default() } }; self.send_message( + network_out, who, GenericMessage::RemoteCallResponse(message::RemoteCallResponse { id: request.id, @@ -1009,15 +1171,90 @@ impl, H: ExHashT> Protocol { ); } - fn on_remote_call_response(&mut self, who: PeerId, response: message::RemoteCallResponse) { + /// Request a justification for the given block. + /// + /// Uses `protocol` to queue a new justification request and tries to dispatch all pending + /// requests. + pub fn request_justification(&mut self, network_out: &mut dyn NetworkOut, hash: &B::Hash, number: NumberFor) { + let mut context = + ProtocolContext::new(&mut self.context_data, network_out); + self.sync.request_justification(&hash, number, &mut context); + } + + /// Clears all pending justification requests. + pub fn clear_justification_requests(&mut self) { + self.sync.clear_justification_requests() + } + + /// A batch of blocks have been processed, with or without errors. + /// Call this when a batch of blocks have been processed by the import queue, with or without + /// errors. + pub fn blocks_processed( + &mut self, + network_out: &mut dyn NetworkOut, + processed_blocks: Vec, + has_error: bool + ) { + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.blocks_processed(&mut context, processed_blocks, has_error); + } + + /// Restart the sync process. + pub fn restart(&mut self, network_out: &mut dyn NetworkOut) { + let peers = self.context_data.peers.clone(); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.restart(&mut context, |peer_id| peers.get(peer_id).map(|i| i.info.clone())); + } + + /// Notify about successful import of the given block. + pub fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { + self.sync.block_imported(hash, number) + } + + pub fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) { + self.sync.set_finality_proof_request_builder(request_builder) + } + + /// Call this when a justification has been processed by the import queue, with or without + /// errors. + pub fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { + self.sync.justification_import_result(hash, number, success) + } + + /// Request a finality proof for the given block. + /// + /// Queues a new finality proof request and tries to dispatch all pending requests. + pub fn request_finality_proof( + &mut self, + network_out: &mut dyn NetworkOut, + hash: &B::Hash, + number: NumberFor + ) { + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.request_finality_proof(&hash, number, &mut context); + } + + pub fn finality_proof_import_result( + &mut self, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + self.sync.finality_proof_import_result(request_block, finalization_result) + } + + fn on_remote_call_response( + &mut self, + mut network_out: &mut dyn NetworkOut, + who: PeerId, + response: message::RemoteCallResponse + ) { trace!(target: "sync", "Remote call response {} from {}", response.id, who); - self.on_demand - .as_ref() - .map(|s| s.on_remote_call_response(who, response)); + self.on_demand_core.on_remote_call_response(&mut network_out, who, response); } fn on_remote_read_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteReadRequest, ) { @@ -1027,11 +1264,17 @@ impl, H: ExHashT> Protocol { Ok(proof) => proof, Err(error) => { trace!(target: "sync", "Remote read request {} from {} ({} at {}) failed with: {}", - request.id, who, request.key.to_hex::(), request.block, error); + request.id, + who, + request.key.to_hex::(), + request.block, + error + ); Default::default() } }; self.send_message( + network_out, who, GenericMessage::RemoteReadResponse(message::RemoteReadResponse { id: request.id, @@ -1039,15 +1282,20 @@ impl, H: ExHashT> Protocol { }), ); } - fn on_remote_read_response(&mut self, who: PeerId, response: message::RemoteReadResponse) { + + fn on_remote_read_response( + &mut self, + mut network_out: &mut dyn NetworkOut, + who: PeerId, + response: message::RemoteReadResponse + ) { trace!(target: "sync", "Remote read response {} from {}", response.id, who); - self.on_demand - .as_ref() - .map(|s| s.on_remote_read_response(who, response)); + self.on_demand_core.on_remote_read_response(&mut network_out, who, response); } fn on_remote_header_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteHeaderRequest>, ) { @@ -1057,11 +1305,16 @@ impl, H: ExHashT> Protocol { Ok((header, proof)) => (Some(header), proof), Err(error) => { trace!(target: "sync", "Remote header proof request {} from {} ({}) failed with: {}", - request.id, who, request.block, error); + request.id, + who, + request.block, + error + ); (Default::default(), Default::default()) } }; self.send_message( + network_out, who, GenericMessage::RemoteHeaderResponse(message::RemoteHeaderResponse { id: request.id, @@ -1073,28 +1326,45 @@ impl, H: ExHashT> Protocol { fn on_remote_header_response( &mut self, + mut network_out: &mut dyn NetworkOut, who: PeerId, response: message::RemoteHeaderResponse, ) { trace!(target: "sync", "Remote header proof response {} from {}", response.id, who); - self.on_demand - .as_ref() - .map(|s| s.on_remote_header_response(who, response)); + self.on_demand_core.on_remote_header_response(&mut network_out, who, response); } fn on_remote_changes_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteChangesRequest, ) { trace!(target: "sync", "Remote changes proof request {} from {} for key {} ({}..{})", - request.id, who, request.key.to_hex::(), request.first, request.last); + request.id, + who, + request.key.to_hex::(), + request.first, + request.last + ); let key = StorageKey(request.key); - let proof = match self.context_data.chain.key_changes_proof(request.first, request.last, request.min, request.max, &key) { + let proof = match self.context_data.chain.key_changes_proof( + request.first, + request.last, + request.min, + request.max, + &key + ) { Ok(proof) => proof, Err(error) => { trace!(target: "sync", "Remote changes proof request {} from {} for key {} ({}..{}) failed with: {}", - request.id, who, key.0.to_hex::(), request.first, request.last, error); + request.id, + who, + key.0.to_hex::(), + request.first, + request.last, + error + ); ChangesProof:: { max_block: Zero::zero(), proof: vec![], @@ -1104,6 +1374,7 @@ impl, H: ExHashT> Protocol { } }; self.send_message( + network_out, who, GenericMessage::RemoteChangesResponse(message::RemoteChangesResponse { id: request.id, @@ -1117,20 +1388,95 @@ impl, H: ExHashT> Protocol { fn on_remote_changes_response( &mut self, + mut network_out: &mut dyn NetworkOut, who: PeerId, response: message::RemoteChangesResponse, B::Hash>, ) { trace!(target: "sync", "Remote changes proof response {} from {} (max={})", - response.id, who, response.max); - self.on_demand - .as_ref() - .map(|s| s.on_remote_changes_response(who, response)); + response.id, + who, + response.max + ); + self.on_demand_core.on_remote_changes_response(&mut network_out, who, response); + } + + fn on_finality_proof_request( + &mut self, + network_out: &mut dyn NetworkOut, + who: PeerId, + request: message::FinalityProofRequest, + finality_proof_provider: Option<&dyn FinalityProofProvider> + ) { + trace!(target: "sync", "Finality proof request from {} for {}", who, request.block); + let finality_proof = finality_proof_provider.as_ref() + .ok_or_else(|| String::from("Finality provider is not configured")) + .and_then(|provider| + provider.prove_finality(request.block, &request.request).map_err(|e| e.to_string()) + ); + let finality_proof = match finality_proof { + Ok(finality_proof) => finality_proof, + Err(error) => { + trace!(target: "sync", "Finality proof request from {} for {} failed with: {}", + who, + request.block, + error + ); + None + }, + }; + self.send_message( + network_out, + who, + GenericMessage::FinalityProofResponse(message::FinalityProofResponse { + id: 0, + block: request.block, + proof: finality_proof, + }), + ); + } + + fn on_finality_proof_response( + &mut self, + network_out: &mut dyn NetworkOut, + who: PeerId, + response: message::FinalityProofResponse, + ) -> CustomMessageOutcome { + trace!(target: "sync", "Finality proof response from {} for {}", who, response.block); + let outcome = self.sync.on_block_finality_proof_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), + who, + response, + ); + + if let Some((origin, hash, nb, proof)) = outcome { + CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) + } else { + CustomMessageOutcome::None + } + } + + fn on_remote_body_response( + &mut self, + mut network_out: &mut dyn NetworkOut, + peer: PeerId, + response: message::BlockResponse + ) { + self.on_demand_core.on_remote_body_response(&mut network_out, peer, response); } } +/// Outcome of an incoming custom message. +#[derive(Debug)] +pub enum CustomMessageOutcome { + BlockImport(BlockOrigin, Vec>), + JustificationImport(Origin, B::Hash, NumberFor, Justification), + FinalityProofImport(Origin, B::Hash, NumberFor, Vec), + None, +} + fn send_message( peers: &mut HashMap>, - network_chan: &NetworkChan, + network_out: &mut dyn NetworkOut, who: PeerId, mut message: Message, ) { @@ -1145,104 +1491,5 @@ fn send_message( peer.block_request = Some((time::Instant::now(), r.clone())); } } - network_chan.send(NetworkMsg::Outgoing(who, message)); -} - -/// Construct a simple protocol that is composed of several sub protocols. -/// Each "sub protocol" needs to implement `Specialization` and needs to provide a `new()` function. -/// For more fine grained implementations, this macro is not usable. -/// -/// # Example -/// -/// ```nocompile -/// construct_simple_protocol! { -/// pub struct MyProtocol where Block = MyBlock { -/// consensus_gossip: ConsensusGossip, -/// other_protocol: MyCoolStuff, -/// } -/// } -/// ``` -/// -/// You can also provide an optional parameter after `where Block = MyBlock`, so it looks like -/// `where Block = MyBlock, Status = consensus_gossip`. This will instruct the implementation to -/// use the `status()` function from the `ConsensusGossip` protocol. By default, `status()` returns -/// an empty vector. -#[macro_export] -macro_rules! construct_simple_protocol { - ( - $( #[ $attr:meta ] )* - pub struct $protocol:ident where - Block = $block:ident - $( , Status = $status_protocol_name:ident )* - { - $( $sub_protocol_name:ident : $sub_protocol:ident $( <$protocol_block:ty> )*, )* - } - ) => { - $( #[$attr] )* - pub struct $protocol { - $( $sub_protocol_name: $sub_protocol $( <$protocol_block> )*, )* - } - - impl $protocol { - /// Instantiate a node protocol handler. - pub fn new() -> Self { - Self { - $( $sub_protocol_name: $sub_protocol::new(), )* - } - } - } - - impl $crate::specialization::NetworkSpecialization<$block> for $protocol { - fn status(&self) -> Vec { - $( - let status = self.$status_protocol_name.status(); - - if !status.is_empty() { - return status; - } - )* - - Vec::new() - } - - fn on_connect( - &mut self, - _ctx: &mut $crate::Context<$block>, - _who: $crate::PeerId, - _status: $crate::StatusMessage<$block> - ) { - $( self.$sub_protocol_name.on_connect(_ctx, _who, _status); )* - } - - fn on_disconnect(&mut self, _ctx: &mut $crate::Context<$block>, _who: $crate::PeerId) { - $( self.$sub_protocol_name.on_disconnect(_ctx, _who); )* - } - - fn on_message( - &mut self, - _ctx: &mut $crate::Context<$block>, - _who: $crate::PeerId, - _message: &mut Option<$crate::message::Message<$block>> - ) { - $( self.$sub_protocol_name.on_message(_ctx, _who, _message); )* - } - - fn on_abort(&mut self) { - $( self.$sub_protocol_name.on_abort(); )* - } - - fn maintain_peers(&mut self, _ctx: &mut $crate::Context<$block>) { - $( self.$sub_protocol_name.maintain_peers(_ctx); )* - } - - fn on_block_imported( - &mut self, - _ctx: &mut $crate::Context<$block>, - _hash: <$block as $crate::BlockT>::Hash, - _header: &<$block as $crate::BlockT>::Header - ) { - $( self.$sub_protocol_name.on_block_imported(_ctx, _hash, _header); )* - } - } - } + network_out.send_message(who, message); } diff --git a/core/network/src/consensus_gossip.rs b/core/network/src/protocol/consensus_gossip.rs similarity index 80% rename from core/network/src/consensus_gossip.rs rename to core/network/src/protocol/consensus_gossip.rs index 75e91e664fec59604972bf4e14436473101905ef..5de6fb26024738cf5bdcfdc2d8e6e6a33253a577 100644 --- a/core/network/src/consensus_gossip.rs +++ b/core/network/src/protocol/consensus_gossip.rs @@ -24,7 +24,7 @@ use std::time; use log::{trace, debug}; use futures::sync::mpsc; use lru_cache::LruCache; -use network_libp2p::{Severity, PeerId}; +use network_libp2p::PeerId; use runtime_primitives::traits::{Block as BlockT, Hash, HashFor}; use runtime_primitives::ConsensusEngineId; pub use crate::message::generic::{Message, ConsensusMessage}; @@ -35,6 +35,15 @@ use crate::config::Roles; const KNOWN_MESSAGES_CACHE_SIZE: usize = 4096; const REBROADCAST_INTERVAL: time::Duration = time::Duration::from_secs(30); +/// Reputation change when a peer sends us a gossip message that we didn't know about. +const GOSSIP_SUCCESS_REPUTATION_CHANGE: i32 = 1 << 4; +/// Reputation change when a peer sends us a gossip message that we already knew about. +const DUPLICATE_GOSSIP_REPUTATION_CHANGE: i32 = -(1 << 2); +/// Reputation change when a peer sends us a gossip message for an unknown engine, whatever that +/// means. +const UNKNOWN_GOSSIP_REPUTATION_CHANGE: i32 = -(1 << 6); +/// Reputation change when a peer sends a message from a topic it isn't registered on. +const UNREGISTERED_TOPIC_REPUTATION_CHANGE: i32 = -(1 << 10); struct PeerConsensus { known_messages: HashSet, @@ -101,7 +110,7 @@ pub trait ValidatorContext { struct NetworkContext<'g, 'p, B: BlockT> { gossip: &'g mut ConsensusGossip, - protocol: &'p mut Context, + protocol: &'p mut dyn Context, engine_id: ConsensusEngineId, } @@ -123,10 +132,10 @@ impl<'g, 'p, B: BlockT> ValidatorContext for NetworkContext<'g, 'p, B> { /// Send addressed message to a peer. fn send_message(&mut self, who: &PeerId, message: Vec) { - self.protocol.send_message(who.clone(), Message::Consensus(ConsensusMessage { + self.protocol.send_consensus(who.clone(), ConsensusMessage { engine_id: self.engine_id, data: message, - })); + }); } /// Send all messages with given topic to a peer. @@ -136,11 +145,11 @@ impl<'g, 'p, B: BlockT> ValidatorContext for NetworkContext<'g, 'p, B> { } fn propagate<'a, B: BlockT, I>( - protocol: &mut Context, + protocol: &mut dyn Context, messages: I, intent: MessageIntent, peers: &mut HashMap>, - validators: &HashMap>>, + validators: &HashMap>>, ) where I: IntoIterator, // (msg_hash, topic, message) { @@ -183,7 +192,7 @@ fn propagate<'a, B: BlockT, I>( } peer.known_messages.insert(message_hash.clone()); trace!(target: "gossip", "Propagating to {}: {:?}", id, message); - protocol.send_message(id.clone(), Message::Consensus(message.clone())); + protocol.send_consensus(id.clone(), message.clone()); } } } @@ -191,23 +200,28 @@ fn propagate<'a, B: BlockT, I>( /// Validates consensus messages. pub trait Validator: Send + Sync { /// New peer is connected. - fn new_peer(&self, _context: &mut ValidatorContext, _who: &PeerId, _roles: Roles) { + fn new_peer(&self, _context: &mut dyn ValidatorContext, _who: &PeerId, _roles: Roles) { } /// New connection is dropped. - fn peer_disconnected(&self, _context: &mut ValidatorContext, _who: &PeerId) { + fn peer_disconnected(&self, _context: &mut dyn ValidatorContext, _who: &PeerId) { } /// Validate consensus message. - fn validate(&self, context: &mut ValidatorContext, sender: &PeerId, data: &[u8]) -> ValidationResult; + fn validate( + &self, + context: &mut dyn ValidatorContext, + sender: &PeerId, + data: &[u8] + ) -> ValidationResult; /// Produce a closure for validating messages on a given topic. - fn message_expired<'a>(&'a self) -> Box bool + 'a> { + fn message_expired<'a>(&'a self) -> Box bool + 'a> { Box::new(move |_topic, _data| false) } /// Produce a closure for filtering egress messages. - fn message_allowed<'a>(&'a self) -> Box bool + 'a> { + fn message_allowed<'a>(&'a self) -> Box bool + 'a> { Box::new(move |_who, _intent, _topic, _data| true) } } @@ -218,7 +232,7 @@ pub struct ConsensusGossip { live_message_sinks: HashMap<(ConsensusEngineId, B::Hash), Vec>>, messages: Vec>, known_messages: LruCache, - validators: HashMap>>, + validators: HashMap>>, next_broadcast: time::Instant, } @@ -241,7 +255,12 @@ impl ConsensusGossip { } /// Register message validator for a message type. - pub fn register_validator(&mut self, protocol: &mut Context, engine_id: ConsensusEngineId, validator: Arc>) { + pub fn register_validator( + &mut self, + protocol: &mut dyn Context, + engine_id: ConsensusEngineId, + validator: Arc> + ) { self.register_validator_internal(engine_id, validator.clone()); let peers: Vec<_> = self.peers.iter().map(|(id, peer)| (id.clone(), peer.roles)).collect(); for (id, roles) in peers { @@ -250,12 +269,17 @@ impl ConsensusGossip { } } - fn register_validator_internal(&mut self, engine_id: ConsensusEngineId, validator: Arc>) { + fn register_validator_internal(&mut self, engine_id: ConsensusEngineId, validator: Arc>) { self.validators.insert(engine_id, validator.clone()); } /// Handle new connected peer. - pub fn new_peer(&mut self, protocol: &mut Context, who: PeerId, roles: Roles) { + pub fn new_peer(&mut self, protocol: &mut dyn Context, who: PeerId, roles: Roles) { + // light nodes are not valid targets for consensus gossip messages + if !roles.is_full() { + return; + } + trace!(target:"gossip", "Registering {:?} {}", roles, who); self.peers.insert(who.clone(), PeerConsensus { known_messages: HashSet::new(), @@ -267,7 +291,7 @@ impl ConsensusGossip { } } - fn register_message( + fn register_message_hashed( &mut self, message_hash: B::Hash, topic: B::Hash, @@ -282,8 +306,22 @@ impl ConsensusGossip { } } + /// Registers a message without propagating it to any peers. The message + /// becomes available to new peers or when the service is asked to gossip + /// the message's topic. No validation is performed on the message, if the + /// message is already expired it should be dropped on the next garbage + /// collection. + pub fn register_message( + &mut self, + topic: B::Hash, + message: ConsensusMessage, + ) { + let message_hash = HashFor::::hash(&message.data[..]); + self.register_message_hashed(message_hash, topic, message); + } + /// Call when a peer has been disconnected to stop tracking gossip status. - pub fn peer_disconnected(&mut self, protocol: &mut Context, who: PeerId) { + pub fn peer_disconnected(&mut self, protocol: &mut dyn Context, who: PeerId) { for (engine_id, v) in self.validators.clone() { let mut context = NetworkContext { gossip: self, protocol, engine_id: engine_id.clone() }; v.peer_disconnected(&mut context, &who); @@ -291,7 +329,7 @@ impl ConsensusGossip { } /// Perform periodic maintenance - pub fn tick(&mut self, protocol: &mut Context) { + pub fn tick(&mut self, protocol: &mut dyn Context) { self.collect_garbage(); if time::Instant::now() >= self.next_broadcast { self.rebroadcast(protocol); @@ -300,14 +338,14 @@ impl ConsensusGossip { } /// Rebroadcast all messages to all peers. - fn rebroadcast(&mut self, protocol: &mut Context) { + fn rebroadcast(&mut self, protocol: &mut dyn Context) { let messages = self.messages.iter() .map(|entry| (&entry.message_hash, &entry.topic, &entry.message)); propagate(protocol, messages, MessageIntent::PeriodicRebroadcast, &mut self.peers, &self.validators); } /// Broadcast all messages with given topic. - pub fn broadcast_topic(&mut self, protocol: &mut Context, topic: B::Hash, force: bool) { + pub fn broadcast_topic(&mut self, protocol: &mut dyn Context, topic: B::Hash, force: bool) { let messages = self.messages.iter() .filter_map(|entry| if entry.topic == topic { Some((&entry.message_hash, &entry.topic, &entry.message)) } else { None } @@ -381,7 +419,7 @@ impl ConsensusGossip { /// in all other cases. pub fn on_incoming( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, who: PeerId, message: ConsensusMessage, ) { @@ -389,6 +427,7 @@ impl ConsensusGossip { if self.known_messages.contains_key(&message_hash) { trace!(target:"gossip", "Ignored already known message from {}", who); + protocol.report_peer(who.clone(), DUPLICATE_GOSSIP_REPUTATION_CHANGE); return; } @@ -406,15 +445,14 @@ impl ConsensusGossip { Some(ValidationResult::Discard) => None, None => { trace!(target:"gossip", "Unknown message engine id {:?} from {}", engine_id, who); - protocol.report_peer( - who, - Severity::Useless(format!("Sent unknown consensus engine id")), - ); + protocol.report_peer(who.clone(), UNKNOWN_GOSSIP_REPUTATION_CHANGE); + protocol.disconnect_peer(who); return; } }; if let Some((topic, keep)) = validation_result { + protocol.report_peer(who.clone(), GOSSIP_SUCCESS_REPUTATION_CHANGE); if let Some(ref mut peer) = self.peers.get_mut(&who) { peer.known_messages.insert(message_hash); if let Entry::Occupied(mut entry) = self.live_message_sinks.entry((engine_id, topic)) { @@ -433,10 +471,11 @@ impl ConsensusGossip { } } if keep { - self.register_message(message_hash, topic, message); + self.register_message_hashed(message_hash, topic, message); } } else { trace!(target:"gossip", "Ignored statement from unregistered peer {}", who); + protocol.report_peer(who.clone(), UNREGISTERED_TOPIC_REPUTATION_CHANGE); } } else { trace!(target:"gossip", "Handled valid one hop message from peer {}", who); @@ -444,18 +483,36 @@ impl ConsensusGossip { } /// Send all messages with given topic to a peer. - pub fn send_topic(&mut self, protocol: &mut Context, who: &PeerId, topic: B::Hash, engine_id: ConsensusEngineId, force: bool) { + pub fn send_topic( + &mut self, + protocol: &mut dyn Context, + who: &PeerId, + topic: B::Hash, + engine_id: ConsensusEngineId, + force: bool + ) { + let validator = self.validators.get(&engine_id); + let mut message_allowed = match validator { + None => return, // treat all messages with no validator as not allowed + Some(validator) => validator.message_allowed(), + }; + + let intent = if force { MessageIntent::ForcedBroadcast } else { MessageIntent::Broadcast }; + if let Some(ref mut peer) = self.peers.get_mut(who) { for entry in self.messages.iter().filter(|m| m.topic == topic && m.message.engine_id == engine_id) { if !force && peer.known_messages.contains(&entry.message_hash) { continue } + if !message_allowed(who, intent, &entry.topic, &entry.message.data) { + continue + } peer.known_messages.insert(entry.message_hash.clone()); trace!(target: "gossip", "Sending topic message to {}: {:?}", who, entry.message); - protocol.send_message(who.clone(), Message::Consensus(ConsensusMessage { + protocol.send_consensus(who.clone(), ConsensusMessage { engine_id: engine_id.clone(), data: entry.message.data.clone(), - })); + }); } } } @@ -463,13 +520,13 @@ impl ConsensusGossip { /// Multicast a message to all peers. pub fn multicast( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, topic: B::Hash, message: ConsensusMessage, force: bool, ) { let message_hash = HashFor::::hash(&message.data); - self.register_message(message_hash, topic, message.clone()); + self.register_message_hashed(message_hash, topic, message.clone()); let intent = if force { MessageIntent::ForcedBroadcast } else { MessageIntent::Broadcast }; propagate(protocol, iter::once((&message_hash, &topic, &message)), intent, &mut self.peers, &self.validators); } @@ -478,7 +535,7 @@ impl ConsensusGossip { /// later on. pub fn send_message( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, who: &PeerId, message: ConsensusMessage, ) { @@ -492,7 +549,7 @@ impl ConsensusGossip { trace!(target: "gossip", "Sending direct to {}: {:?}", who, message); peer.known_messages.insert(message_hash); - protocol.send_message(who.clone(), Message::Consensus(message.clone())); + protocol.send_consensus(who.clone(), message.clone()); } } @@ -519,7 +576,12 @@ mod tests { struct AllowAll; impl Validator for AllowAll { - fn validate(&self, _context: &mut ValidatorContext, _sender: &PeerId, _data: &[u8]) -> ValidationResult { + fn validate( + &self, + _context: &mut dyn ValidatorContext, + _sender: &PeerId, + _data: &[u8], + ) -> ValidationResult { ValidationResult::ProcessAndKeep(H256::default()) } } @@ -528,7 +590,12 @@ mod tests { fn collects_garbage() { struct AllowOne; impl Validator for AllowOne { - fn validate(&self, _context: &mut ValidatorContext, _sender: &PeerId, data: &[u8]) -> ValidationResult { + fn validate( + &self, + _context: &mut dyn ValidatorContext, + _sender: &PeerId, + data: &[u8], + ) -> ValidationResult { if data[0] == 1 { ValidationResult::ProcessAndKeep(H256::default()) } else { @@ -536,7 +603,7 @@ mod tests { } } - fn message_expired<'a>(&'a self) -> Box bool + 'a> { + fn message_expired<'a>(&'a self) -> Box bool + 'a> { Box::new(move |_topic, data| data[0] != 1 ) } } @@ -578,11 +645,9 @@ mod tests { consensus.register_validator_internal([0, 0, 0, 0], Arc::new(AllowAll)); let message = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 0] }; - - let message_hash = HashFor::::hash(&message.data); let topic = HashFor::::hash(&[1,2,3]); - consensus.register_message(message_hash, topic, message.clone()); + consensus.register_message(topic, message.clone()); let stream = consensus.messages_for([0, 0, 0, 0], topic); assert_eq!(stream.wait().next(), Some(Ok(TopicNotification { message: message.data, sender: None }))); @@ -596,8 +661,8 @@ mod tests { let msg_a = ConsensusMessage { data: vec![1, 2, 3], engine_id: [0, 0, 0, 0] }; let msg_b = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 0] }; - consensus.register_message(HashFor::::hash(&msg_a.data), topic,msg_a); - consensus.register_message(HashFor::::hash(&msg_b.data), topic,msg_b); + consensus.register_message(topic, msg_a); + consensus.register_message(topic, msg_b); assert_eq!(consensus.messages.len(), 2); } @@ -608,11 +673,9 @@ mod tests { consensus.register_validator_internal([0, 0, 0, 0], Arc::new(AllowAll)); let message = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 0] }; - - let message_hash = HashFor::::hash(&message.data); let topic = HashFor::::hash(&[1,2,3]); - consensus.register_message(message_hash, topic, message.clone()); + consensus.register_message(topic, message.clone()); let stream1 = consensus.messages_for([0, 0, 0, 0], topic); let stream2 = consensus.messages_for([0, 0, 0, 0], topic); @@ -630,8 +693,8 @@ mod tests { let msg_a = ConsensusMessage { data: vec![1, 2, 3], engine_id: [0, 0, 0, 0] }; let msg_b = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 1] }; - consensus.register_message(HashFor::::hash(&msg_a.data), topic, msg_a); - consensus.register_message(HashFor::::hash(&msg_b.data), topic, msg_b); + consensus.register_message(topic, msg_a); + consensus.register_message(topic, msg_b); let mut stream = consensus.messages_for([0, 0, 0, 0], topic).wait(); diff --git a/core/network/src/message.rs b/core/network/src/protocol/message.rs similarity index 86% rename from core/network/src/message.rs rename to core/network/src/protocol/message.rs index 6053d12f51d4276dca749aec8555bd08dd95e820..6a38c106b7342525f310adea514b7180a3d9ad01 100644 --- a/core/network/src/message.rs +++ b/core/network/src/protocol/message.rs @@ -23,7 +23,8 @@ pub use self::generic::{ BlockAnnounce, RemoteCallRequest, RemoteReadRequest, RemoteHeaderRequest, RemoteHeaderResponse, RemoteChangesRequest, RemoteChangesResponse, - FromBlock + FinalityProofRequest, FinalityProofResponse, + FromBlock, RemoteReadChildRequest, }; /// A unique ID of a request. @@ -125,12 +126,12 @@ pub struct RemoteReadResponse { /// Generic types. pub mod generic { use parity_codec::{Encode, Decode}; - use network_libp2p::{CustomMessage, CustomMessageId}; + use network_libp2p::CustomMessage; use runtime_primitives::Justification; use crate::config::Roles; use super::{ - BlockAttributes, RemoteCallResponse, RemoteReadResponse, - RequestId, Transactions, Direction, ConsensusEngineId, + RemoteReadResponse, Transactions, Direction, + RequestId, BlockAttributes, RemoteCallResponse, ConsensusEngineId, }; /// Consensus is mostly opaque to us #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] @@ -198,7 +199,13 @@ pub mod generic { RemoteChangesRequest(RemoteChangesRequest), /// Remote changes reponse. RemoteChangesResponse(RemoteChangesResponse), - /// Chain-specific message + /// Remote child storage read request. + RemoteReadChildRequest(RemoteReadChildRequest), + /// Finality proof request. + FinalityProofRequest(FinalityProofRequest), + /// Finality proof reponse. + FinalityProofResponse(FinalityProofResponse), + /// Chain-specific message. #[codec(index = "255")] ChainSpecific(Vec), } @@ -213,26 +220,6 @@ pub mod generic { fn from_bytes(bytes: &[u8]) -> Result { Decode::decode(&mut &bytes[..]).ok_or(()) } - - fn request_id(&self) -> CustomMessageId { - match *self { - Message::Status(_) => CustomMessageId::OneWay, - Message::BlockRequest(ref req) => CustomMessageId::Request(req.id), - Message::BlockResponse(ref resp) => CustomMessageId::Response(resp.id), - Message::BlockAnnounce(_) => CustomMessageId::OneWay, - Message::Transactions(_) => CustomMessageId::OneWay, - Message::Consensus(_) => CustomMessageId::OneWay, - Message::RemoteCallRequest(ref req) => CustomMessageId::Request(req.id), - Message::RemoteCallResponse(ref resp) => CustomMessageId::Response(resp.id), - Message::RemoteReadRequest(ref req) => CustomMessageId::Request(req.id), - Message::RemoteReadResponse(ref resp) => CustomMessageId::Response(resp.id), - Message::RemoteHeaderRequest(ref req) => CustomMessageId::Request(req.id), - Message::RemoteHeaderResponse(ref resp) => CustomMessageId::Response(resp.id), - Message::RemoteChangesRequest(ref req) => CustomMessageId::Request(req.id), - Message::RemoteChangesResponse(ref resp) => CustomMessageId::Response(resp.id), - Message::ChainSpecific(_) => CustomMessageId::OneWay, - } - } } /// Status sent on connection. @@ -311,6 +298,19 @@ pub mod generic { pub key: Vec, } + #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] + /// Remote storage read child request. + pub struct RemoteReadChildRequest { + /// Unique request id. + pub id: RequestId, + /// Block at which to perform call. + pub block: H, + /// Child Storage key. + pub storage_key: Vec, + /// Storage key. + pub key: Vec, + } + #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] /// Remote header request. pub struct RemoteHeaderRequest { @@ -364,4 +364,26 @@ pub mod generic { /// Missing changes tries roots proof. pub roots_proof: Vec>, } + + #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] + /// Finality proof request. + pub struct FinalityProofRequest { + /// Unique request id. + pub id: RequestId, + /// Hash of the block to request proof for. + pub block: H, + /// Additional data blob (that both requester and provider understood) required for proving finality. + pub request: Vec, + } + + #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] + /// Finality proof response. + pub struct FinalityProofResponse { + /// Id of a request this response was made for. + pub id: RequestId, + /// Hash of the block (the same as in the FinalityProofRequest). + pub block: H, + /// Finality proof (if available). + pub proof: Option>, + } } diff --git a/core/network/src/protocol/on_demand.rs b/core/network/src/protocol/on_demand.rs new file mode 100644 index 0000000000000000000000000000000000000000..90051e9cafb3e9b099ac3b2dadc069adfbc31ee2 --- /dev/null +++ b/core/network/src/protocol/on_demand.rs @@ -0,0 +1,1266 @@ +// Copyright 2017-2019 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 . + +//! On-demand requests service. + +use std::collections::{HashMap, VecDeque}; +use std::sync::Arc; +use std::time::{Instant, Duration}; +use log::{trace, info}; +use futures::sync::oneshot::{Sender as OneShotSender}; +use linked_hash_map::{Entry, LinkedHashMap}; +use client::error::Error as ClientError; +use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, + RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof, + RemoteReadChildRequest, RemoteBodyRequest}; +use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; +use network_libp2p::PeerId; +use crate::config::Roles; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; + +/// Remote request timeout. +const REQUEST_TIMEOUT: Duration = Duration::from_secs(15); +/// Default request retry count. +const RETRY_COUNT: usize = 1; +/// Reputation change for a peer when a request timed out. +const TIMEOUT_REPUTATION_CHANGE: i32 = -(1 << 8); + +/// Trait used by the `OnDemandCore` service to communicate messages back to the network. +pub trait OnDemandNetwork { + /// Adjusts the reputation of the given peer. + fn report_peer(&mut self, who: &PeerId, reputation_change: i32); + + /// Disconnect from the given peer. Used in case of misbehaviour. + fn disconnect_peer(&mut self, who: &PeerId); + + /// Send to `who` a request for a header. + fn send_header_request(&mut self, who: &PeerId, id: RequestId, block: <::Header as HeaderT>::Number); + + /// Send to `who` a read request. + fn send_read_request(&mut self, who: &PeerId, id: RequestId, block: ::Hash, key: Vec); + + /// Send to `who` a child read request. + fn send_read_child_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + storage_key: Vec, + key: Vec + ); + + /// Send to `who` a call request. + fn send_call_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + method: String, + data: Vec + ); + + /// Send to `who` a changes request. + fn send_changes_request( + &mut self, + who: &PeerId, + id: RequestId, + first: ::Hash, + last: ::Hash, + min: ::Hash, + max: ::Hash, + key: Vec + ); + + /// Send to `who` a body request. + fn send_body_request( + &mut self, + who: &PeerId, + id: RequestId, + fields: BlockAttributes, + from: FromBlock<::Hash, <::Header as HeaderT>::Number>, + to: Option, + direction: Direction, + max: Option + ); +} + +/// On-demand requests service. Dispatches requests to appropriate peers. +pub struct OnDemandCore { + checker: Arc>, + next_request_id: u64, + pending_requests: VecDeque>, + active_peers: LinkedHashMap>, + idle_peers: VecDeque, + best_blocks: HashMap>, +} + +struct Request { + id: u64, + timestamp: Instant, + retry_count: usize, + data: RequestData, +} + +/// One request for data made by the `Client`. +/// +/// Contains a `Sender` where to send the result. +pub(crate) enum RequestData { + RemoteBody(RemoteBodyRequest, OneShotSender, ClientError>>), + RemoteHeader(RemoteHeaderRequest, OneShotSender>), + RemoteRead(RemoteReadRequest, OneShotSender>, ClientError>>), + RemoteReadChild( + RemoteReadChildRequest, + OneShotSender>, ClientError>> + ), + RemoteCall(RemoteCallRequest, OneShotSender, ClientError>>), + RemoteChanges( + RemoteChangesRequest, + OneShotSender, u32)>, ClientError>> + ), +} + +enum Accept { + Ok, + CheckFailed(ClientError, RequestData), + Unexpected(RequestData), +} + +/// Dummy implementation of `FetchChecker` that always assumes that responses are bad. +/// +/// Considering that it is the responsibility of the client to build the fetcher, it can use this +/// implementation if it knows that it will never perform any request. +#[derive(Default, Clone)] +pub struct AlwaysBadChecker; + +impl FetchChecker for AlwaysBadChecker { + fn check_header_proof( + &self, + _request: &RemoteHeaderRequest, + _remote_header: Option, + _remote_proof: Vec> + ) -> Result { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_read_proof( + &self, + _request: &RemoteReadRequest, + _remote_proof: Vec> + ) -> Result>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_read_child_proof( + &self, + _request: &RemoteReadChildRequest, + _remote_proof: Vec> + ) -> Result>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_execution_proof( + &self, + _request: &RemoteCallRequest, + _remote_proof: Vec> + ) -> Result, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_changes_proof( + &self, + _request: &RemoteChangesRequest, + _remote_proof: ChangesProof + ) -> Result, u32)>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_body_proof( + &self, + _request: &RemoteBodyRequest, + _body: Vec + ) -> Result, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } +} + +impl OnDemandCore where + B::Header: HeaderT, +{ + /// Creates new on-demand requests processer. + pub fn new(checker: Arc>) -> Self { + OnDemandCore { + checker, + next_request_id: 0, + pending_requests: VecDeque::new(), + active_peers: LinkedHashMap::new(), + idle_peers: VecDeque::new(), + best_blocks: HashMap::new(), + } + } + + /// Inserts a new request in the list of requests to execute. + pub(crate) fn add_request(&mut self, network: impl OnDemandNetwork, data: RequestData) { + self.insert(RETRY_COUNT, data); + self.dispatch(network); + } + + /// Inserts a new request in the list of requests to execute. + fn insert(&mut self, retry_count: usize, data: RequestData) { + let request_id = self.next_request_id; + self.next_request_id += 1; + + self.pending_requests.push_back(Request { + id: request_id, + timestamp: Instant::now(), + retry_count, + data, + }); + } + + /// Try to accept response from given peer. + fn accept_response( + &mut self, + rtype: &str, + mut network: impl OnDemandNetwork, + peer: PeerId, + request_id: u64, + try_accept: impl FnOnce(Request, &Arc>) -> Accept + ) { + let request = match self.remove(peer.clone(), request_id) { + Some(request) => request, + None => { + info!("Invalid remote {} response from peer {}", rtype, peer); + network.report_peer(&peer, i32::min_value()); + network.disconnect_peer(&peer); + self.remove_peer(peer); + return; + }, + }; + + let retry_count = request.retry_count; + let (retry_count, retry_request_data) = match try_accept(request, &self.checker) { + Accept::Ok => (retry_count, None), + Accept::CheckFailed(error, retry_request_data) => { + info!("Failed to check remote {} response from peer {}: {}", rtype, peer, error); + network.report_peer(&peer, i32::min_value()); + network.disconnect_peer(&peer); + self.remove_peer(peer); + + if retry_count > 0 { + (retry_count - 1, Some(retry_request_data)) + } else { + trace!(target: "sync", "Failed to get remote {} response for given number of retries", rtype); + retry_request_data.fail(ClientError::RemoteFetchFailed.into()); + (0, None) + } + }, + Accept::Unexpected(retry_request_data) => { + info!("Unexpected response to remote {} from peer", rtype); + network.report_peer(&peer, i32::min_value()); + network.disconnect_peer(&peer); + self.remove_peer(peer); + + (retry_count, Some(retry_request_data)) + }, + }; + + if let Some(request_data) = retry_request_data { + self.insert(retry_count, request_data); + } + + self.dispatch(network); + } + + pub fn on_connect( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + role: Roles, + best_number: NumberFor + ) { + if !role.is_full() { + return; + } + + self.idle_peers.push_back(peer.clone()); + self.best_blocks.insert(peer, best_number); + + self.dispatch(network); + } + + pub fn on_block_announce(&mut self, network: impl OnDemandNetwork, peer: PeerId, best_number: NumberFor) { + self.best_blocks.insert(peer, best_number); + self.dispatch(network); + } + + pub fn on_disconnect(&mut self, network: impl OnDemandNetwork, peer: PeerId) { + self.remove_peer(peer); + self.dispatch(network); + } + + pub fn maintain_peers(&mut self, mut network: impl OnDemandNetwork) { + let now = Instant::now(); + + loop { + match self.active_peers.front() { + Some((_, request)) if now - request.timestamp >= REQUEST_TIMEOUT => (), + _ => break, + } + + let (bad_peer, request) = self.active_peers.pop_front().expect("front() is Some as checked above"); + self.pending_requests.push_front(request); + network.report_peer(&bad_peer, TIMEOUT_REPUTATION_CHANGE); + network.disconnect_peer(&bad_peer); + } + + self.dispatch(network); + } + + pub fn on_remote_header_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteHeaderResponse + ) { + self.accept_response("header", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteHeader(request, sender) => match checker.check_header_proof( + &request, + response.header, + response.proof + ) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed(error, RequestData::RemoteHeader(request, sender)), + }, + data => Accept::Unexpected(data), + }) + } + + pub fn on_remote_read_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteReadResponse + ) { + self.accept_response("read", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteRead(request, sender) => { + match checker.check_read_proof(&request, response.proof) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed( + error, + RequestData::RemoteRead(request, sender) + ), + }}, + RequestData::RemoteReadChild(request, sender) => { + match checker.check_read_child_proof(&request, response.proof) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed( + error, + RequestData::RemoteReadChild(request, sender) + ), + }}, + data => Accept::Unexpected(data), + }) + } + + pub fn on_remote_call_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteCallResponse + ) { + self.accept_response("call", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteCall(request, sender) => match checker.check_execution_proof(&request, response.proof) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed(error, RequestData::RemoteCall(request, sender)), + }, + data => Accept::Unexpected(data), + }) + } + + pub fn on_remote_changes_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteChangesResponse, B::Hash> + ) { + self.accept_response("changes", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteChanges(request, sender) => match checker.check_changes_proof( + &request, ChangesProof { + max_block: response.max, + proof: response.proof, + roots: response.roots.into_iter().collect(), + roots_proof: response.roots_proof, + }) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed(error, RequestData::RemoteChanges(request, sender)), + }, + data => Accept::Unexpected(data), + }) + } + + pub fn on_remote_body_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::BlockResponse + ) { + self.accept_response("body", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteBody(request, sender) => { + let mut bodies: Vec<_> = response + .blocks + .into_iter() + .filter_map(|b| b.body) + .collect(); + + // Number of bodies are hardcoded to 1 for valid `RemoteBodyResponses` + if bodies.len() != 1 { + return Accept::CheckFailed( + "RemoteBodyResponse: invalid number of blocks".into(), + RequestData::RemoteBody(request, sender), + ) + } + let body = bodies.remove(0); + + match checker.check_body_proof(&request, body) { + Ok(body) => { + let _ = sender.send(Ok(body)); + Accept::Ok + } + Err(error) => Accept::CheckFailed(error, RequestData::RemoteBody(request, sender)), + } + } + other => Accept::Unexpected(other), + }) + } + + pub fn is_on_demand_response(&self, peer: &PeerId, request_id: message::RequestId) -> bool { + self.active_peers.get(&peer).map_or(false, |r| r.id == request_id) + } + + fn remove(&mut self, peer: PeerId, id: u64) -> Option> { + match self.active_peers.entry(peer.clone()) { + Entry::Occupied(entry) => match entry.get().id == id { + true => { + self.idle_peers.push_back(peer); + Some(entry.remove()) + }, + false => None, + }, + Entry::Vacant(_) => None, + } + } + + pub fn remove_peer(&mut self, peer: PeerId) { + self.best_blocks.remove(&peer); + + if let Some(request) = self.active_peers.remove(&peer) { + self.pending_requests.push_front(request); + return; + } + + if let Some(idle_index) = self.idle_peers.iter().position(|i| *i == peer) { + self.idle_peers.swap_remove_back(idle_index); + } + } + + /// Dispatches pending requests. + fn dispatch(&mut self, mut network: impl OnDemandNetwork) { + let mut last_peer = self.idle_peers.back().cloned(); + let mut unhandled_requests = VecDeque::new(); + + loop { + let peer = match self.idle_peers.pop_front() { + Some(peer) => peer, + None => break, + }; + + // check if request can (optimistically) be processed by the peer + let can_be_processed_by_peer = { + let request = match self.pending_requests.front() { + Some(r) => r, + None => { + self.idle_peers.push_front(peer); + break; + }, + }; + let peer_best_block = self.best_blocks.get(&peer) + .expect("entries are inserted into best_blocks when peer is connected; + entries are removed from best_blocks when peer is disconnected; + peer is in idle_peers and thus connected; qed"); + request.required_block() <= *peer_best_block + }; + + if !can_be_processed_by_peer { + // return peer to the back of the queue + self.idle_peers.push_back(peer.clone()); + + // we have enumerated all peers and noone can handle request + if Some(peer) == last_peer { + let request = self.pending_requests.pop_front().expect("checked in loop condition; qed"); + unhandled_requests.push_back(request); + last_peer = self.idle_peers.back().cloned(); + } + + continue; + } + + last_peer = self.idle_peers.back().cloned(); + + let mut request = self.pending_requests.pop_front().expect("checked in loop condition; qed"); + request.timestamp = Instant::now(); + trace!(target: "sync", "Dispatching remote request {} to peer {}", request.id, peer); + request.send_to(&mut network, &peer); + self.active_peers.insert(peer, request); + } + + self.pending_requests.append(&mut unhandled_requests); + } +} + +impl Request { + fn required_block(&self) -> NumberFor { + match self.data { + RequestData::RemoteHeader(ref data, _) => data.block, + RequestData::RemoteRead(ref data, _) => *data.header.number(), + RequestData::RemoteReadChild(ref data, _) => *data.header.number(), + RequestData::RemoteCall(ref data, _) => *data.header.number(), + RequestData::RemoteChanges(ref data, _) => data.max_block.0, + RequestData::RemoteBody(ref data, _) => *data.header.number(), + } + } + + fn send_to(&self, out: &mut impl OnDemandNetwork, peer: &PeerId) { + match self.data { + RequestData::RemoteHeader(ref data, _) => + out.send_header_request( + peer, + self.id, + data.block, + ), + RequestData::RemoteRead(ref data, _) => + out.send_read_request( + peer, + self.id, + data.block, + data.key.clone(), + ), + RequestData::RemoteReadChild(ref data, _) => + out.send_read_child_request( + peer, + self.id, + data.block, + data.storage_key.clone(), + data.key.clone(), + ), + RequestData::RemoteCall(ref data, _) => + out.send_call_request( + peer, + self.id, + data.block, + data.method.clone(), + data.call_data.clone(), + ), + RequestData::RemoteChanges(ref data, _) => + out.send_changes_request( + peer, + self.id, + data.first_block.1.clone(), + data.last_block.1.clone(), + data.tries_roots.1.clone(), + data.max_block.1.clone(), + data.key.clone(), + ), + RequestData::RemoteBody(ref data, _) => + out.send_body_request( + peer, + self.id, + message::BlockAttributes::BODY, + message::FromBlock::Hash(data.header.hash()), + None, + message::Direction::Ascending, + Some(1) + ), + } + } +} + +impl RequestData { + fn fail(self, error: ClientError) { + // don't care if anyone is listening + match self { + RequestData::RemoteHeader(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteCall(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteRead(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteReadChild(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteChanges(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteBody(_, sender) => { let _ = sender.send(Err(error)); }, + } + } +} + +#[cfg(test)] +pub mod tests { + use std::collections::HashSet; + use std::sync::Arc; + use std::time::Instant; + use futures::{Future, sync::oneshot}; + use runtime_primitives::traits::{Block as BlockT, NumberFor, Header as HeaderT}; + use client::{error::{Error as ClientError, Result as ClientResult}}; + use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, + ChangesProof, RemoteCallRequest, RemoteReadRequest, + RemoteReadChildRequest, RemoteChangesRequest, RemoteBodyRequest}; + use crate::config::Roles; + use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; + use network_libp2p::PeerId; + use super::{REQUEST_TIMEOUT, OnDemandCore, OnDemandNetwork, RequestData}; + use test_client::runtime::{changes_trie_config, Block, Extrinsic, Header}; + + struct DummyFetchChecker { ok: bool } + + impl FetchChecker for DummyFetchChecker { + fn check_header_proof( + &self, + _request: &RemoteHeaderRequest
, + header: Option
, + _remote_proof: Vec> + ) -> ClientResult
{ + match self.ok { + true if header.is_some() => Ok(header.unwrap()), + _ => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_read_proof(&self, _: &RemoteReadRequest
, _: Vec>) -> ClientResult>> { + match self.ok { + true => Ok(Some(vec![42])), + false => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_read_child_proof( + &self, + _: &RemoteReadChildRequest
, + _: Vec> + ) -> ClientResult>> { + match self.ok { + true => Ok(Some(vec![42])), + false => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_execution_proof(&self, _: &RemoteCallRequest
, _: Vec>) -> ClientResult> { + match self.ok { + true => Ok(vec![42]), + false => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_changes_proof( + &self, + _: &RemoteChangesRequest
, + _: ChangesProof
+ ) -> ClientResult, u32)>> { + match self.ok { + true => Ok(vec![(100, 2)]), + false => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_body_proof( + &self, + _: &RemoteBodyRequest
, + body: Vec + ) -> ClientResult> { + match self.ok { + true => Ok(body), + false => Err(ClientError::Backend("Test error".into())), + } + } + } + + fn dummy(ok: bool) -> OnDemandCore { + OnDemandCore::new(Arc::new(DummyFetchChecker { ok })) + } + + fn total_peers(on_demand: &OnDemandCore) -> usize { + on_demand.idle_peers.len() + on_demand.active_peers.len() + } + + fn receive_call_response( + network_interface: impl OnDemandNetwork, + on_demand: &mut OnDemandCore, + peer: PeerId, + id: message::RequestId + ) { + on_demand.on_remote_call_response(network_interface, peer, message::RemoteCallResponse { + id: id, + proof: vec![vec![2]], + }); + } + + fn dummy_header() -> Header { + Header { + parent_hash: Default::default(), + number: 0, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: Default::default(), + } + } + + #[derive(Default)] + struct DummyNetwork { + disconnected_peers: HashSet, + } + + impl<'a, B: BlockT> OnDemandNetwork for &'a mut DummyNetwork { + fn report_peer(&mut self, _: &PeerId, _: i32) {} + fn disconnect_peer(&mut self, who: &PeerId) { + self.disconnected_peers.insert(who.clone()); + } + fn send_header_request(&mut self, _: &PeerId, _: RequestId, _: <::Header as HeaderT>::Number) {} + fn send_read_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: Vec) {} + fn send_read_child_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: Vec, + _: Vec) {} + fn send_call_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: String, _: Vec) {} + fn send_changes_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: ::Hash, + _: ::Hash, _: ::Hash, _: Vec) {} + fn send_body_request(&mut self, _: &PeerId, _: RequestId, _: BlockAttributes, _: FromBlock<::Hash, + <::Header as HeaderT>::Number>, _: Option, _: Direction, _: Option) {} + } + + fn assert_disconnected_peer(dummy: &DummyNetwork) { + assert_eq!(dummy.disconnected_peers.len(), 1); + } + + #[test] + fn knows_about_peers_roles() { + let mut network_interface = DummyNetwork::default(); + let mut on_demand = dummy(true); + let peer0 = PeerId::random(); + let peer1 = PeerId::random(); + let peer2 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0, Roles::LIGHT, 1000); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 2000); + on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::AUTHORITY, 3000); + assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.best_blocks.get(&peer1), Some(&2000)); + assert_eq!(on_demand.best_blocks.get(&peer2), Some(&3000)); + } + + #[test] + fn disconnects_from_idle_peer() { + let peer0 = PeerId::random(); + + let mut network_interface = DummyNetwork::default(); + let mut on_demand = dummy(true); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 100); + assert_eq!(1, total_peers(&on_demand)); + assert!(!on_demand.best_blocks.is_empty()); + + on_demand.on_disconnect(&mut network_interface, peer0); + assert_eq!(0, total_peers(&on_demand)); + assert!(on_demand.best_blocks.is_empty()); + } + + #[test] + fn disconnects_from_timeouted_peer() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + let peer1 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 1000); + assert_eq!(vec![peer0.clone(), peer1.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert!(on_demand.active_peers.is_empty()); + + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: None, + }, oneshot::channel().0)); + assert_eq!(vec![peer1.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(vec![peer0.clone()], on_demand.active_peers.keys().cloned().collect::>()); + + on_demand.active_peers[&peer0].timestamp = Instant::now() - REQUEST_TIMEOUT - REQUEST_TIMEOUT; + on_demand.maintain_peers(&mut network_interface); + assert!(on_demand.idle_peers.is_empty()); + assert_eq!(vec![peer1.clone()], on_demand.active_peers.keys().cloned().collect::>()); + assert_disconnected_peer(&network_interface); + } + + #[test] + fn disconnects_from_peer_on_response_with_wrong_id() { + let mut on_demand = dummy(true); + let peer0 = PeerId::random(); + let mut network_interface = DummyNetwork::default(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: None, + }, oneshot::channel().0)); + receive_call_response(&mut network_interface, &mut on_demand, peer0, 1); + assert_disconnected_peer(&network_interface); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn disconnects_from_peer_on_incorrect_response() { + let mut on_demand = dummy(false); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: Some(1), + }, oneshot::channel().0)); + + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); + assert_disconnected_peer(&network_interface); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn disconnects_from_peer_on_unexpected_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + receive_call_response(&mut network_interface, &mut on_demand, peer0, 0); + assert_disconnected_peer(&network_interface); + } + + #[test] + fn disconnects_from_peer_on_wrong_response_type() { + let mut on_demand = dummy(false); + let peer0 = PeerId::random(); + let mut network_interface = DummyNetwork::default(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: Some(1), + }, oneshot::channel().0)); + + on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { + id: 0, + proof: vec![vec![2]], + }); + assert_disconnected_peer(&network_interface); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn receives_remote_failure_after_retry_count_failures() { + use parking_lot::{Condvar, Mutex}; + + let retry_count = 2; + let peer_ids = (0 .. retry_count + 1).map(|_| PeerId::random()).collect::>(); + let mut on_demand = dummy(false); + let mut network_interface = DummyNetwork::default(); + for i in 0..retry_count+1 { + on_demand.on_connect(&mut network_interface, peer_ids[i].clone(), Roles::FULL, 1000); + } + + let sync = Arc::new((Mutex::new(0), Mutex::new(0), Condvar::new())); + let thread_sync = sync.clone(); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: Some(retry_count) + }, tx)); + let thread = ::std::thread::spawn(move || { + let &(ref current, ref finished_at, ref finished) = &*thread_sync; + let _ = response.wait().unwrap().unwrap_err(); + *finished_at.lock() = *current.lock(); + finished.notify_one(); + }); + + let &(ref current, ref finished_at, ref finished) = &*sync; + for i in 0..retry_count+1 { + let mut current = current.lock(); + *current = *current + 1; + receive_call_response(&mut network_interface, &mut on_demand, peer_ids[i].clone(), i as u64); + } + + let mut finished_at = finished_at.lock(); + assert!(!finished.wait_for(&mut finished_at, ::std::time::Duration::from_millis(1000)).timed_out()); + assert_eq!(*finished_at, retry_count + 1); + + thread.join().unwrap(); + } + + #[test] + fn receives_remote_call_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!(result, vec![42]); + }); + + receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); + thread.join().unwrap(); + } + + #[test] + fn receives_remote_read_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteRead(RemoteReadRequest { + header: dummy_header(), + block: Default::default(), + key: b":key".to_vec(), + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!(result, Some(vec![42])); + }); + + on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { + id: 0, + proof: vec![vec![2]], + }); + thread.join().unwrap(); + } + + #[test] + fn receives_remote_read_child_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteReadChild(RemoteReadChildRequest { + header: dummy_header(), + block: Default::default(), + storage_key: b":child_storage:sub".to_vec(), + key: b":key".to_vec(), + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!(result, Some(vec![42])); + }); + + on_demand.on_remote_read_response(&mut network_interface, + peer0.clone(), message::RemoteReadResponse { + id: 0, + proof: vec![vec![2]], + }); + thread.join().unwrap(); + } + + #[test] + fn receives_remote_header_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 1, + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!( + result.hash(), + "6443a0b46e0412e626363028115a9f2c\ + f963eeed526b8b33e5316f08b50d0dc3".parse().unwrap() + ); + }); + + on_demand.on_remote_header_response(&mut network_interface, peer0.clone(), message::RemoteHeaderResponse { + id: 0, + header: Some(Header { + parent_hash: Default::default(), + number: 1, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: Default::default(), + }), + proof: vec![vec![2]], + }); + thread.join().unwrap(); + } + + #[test] + fn receives_remote_changes_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteChanges(RemoteChangesRequest { + changes_trie_config: changes_trie_config(), + first_block: (1, Default::default()), + last_block: (100, Default::default()), + max_block: (100, Default::default()), + tries_roots: (1, Default::default(), vec![]), + key: vec![], + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!(result, vec![(100, 2)]); + }); + + on_demand.on_remote_changes_response(&mut network_interface, peer0.clone(), message::RemoteChangesResponse { + id: 0, + max: 1000, + proof: vec![vec![2]], + roots: vec![], + roots_proof: vec![], + }); + thread.join().unwrap(); + } + + #[test] + fn does_not_sends_request_to_peer_who_has_no_required_block() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + let peer2 = PeerId::random(); + + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 100); + + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 200, + retry_count: None, + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 250, + retry_count: None, + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 250, + retry_count: None, + }, oneshot::channel().0)); + + on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 150); + + assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.pending_requests.len(), 3); + + on_demand.on_block_announce(&mut network_interface, peer1.clone(), 250); + + assert_eq!(vec![peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.pending_requests.len(), 2); + + on_demand.on_block_announce(&mut network_interface, peer2.clone(), 250); + + assert!(!on_demand.idle_peers.iter().any(|_| true)); + assert_eq!(on_demand.pending_requests.len(), 1); + + on_demand.on_remote_header_response(&mut network_interface, peer1.clone(), message::RemoteHeaderResponse { + id: 0, + header: Some(dummy_header()), + proof: vec![], + }); + + assert!(!on_demand.idle_peers.iter().any(|_| true)); + assert_eq!(on_demand.pending_requests.len(), 0); + } + + #[test] + fn does_not_loop_forever_after_dispatching_request_to_last_peer() { + // this test is a regression for a bug where the dispatch function would + // loop forever after dispatching a request to the last peer, since the + // last peer was not updated + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + let peer2 = PeerId::random(); + let peer3 = PeerId::random(); + + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 250, + retry_count: None, + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 250, + retry_count: None, + }, oneshot::channel().0)); + + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 200); + on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 200); + on_demand.on_connect(&mut network_interface, peer3.clone(), Roles::FULL, 250); + + assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn tries_to_send_all_pending_requests() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 300, + retry_count: None, + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 250, + retry_count: None, + }, oneshot::channel().0)); + + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + + assert!(on_demand.idle_peers.iter().cloned().collect::>().is_empty()); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn remote_body_with_one_block_body_should_succeed() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + + let header = dummy_header(); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + + on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }, oneshot::channel().0)); + + assert!(on_demand.pending_requests.is_empty()); + assert_eq!(on_demand.active_peers.len(), 1); + + let block = message::BlockData:: { + hash: primitives::H256::random(), + header: None, + body: Some(Vec::new()), + message_queue: None, + receipt: None, + justification: None, + }; + + let response = message::generic::BlockResponse { + id: 0, + blocks: vec![block], + }; + + on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); + + assert!(on_demand.active_peers.is_empty()); + assert_eq!(on_demand.idle_peers.len(), 1); + } + + #[test] + fn remote_body_with_three_bodies_should_fail() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + + let header = dummy_header(); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + + on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }, oneshot::channel().0)); + + assert!(on_demand.pending_requests.is_empty()); + assert_eq!(on_demand.active_peers.len(), 1); + + let response = { + let blocks: Vec<_> = (0..3).map(|_| message::BlockData:: { + hash: primitives::H256::random(), + header: None, + body: Some(Vec::new()), + message_queue: None, + receipt: None, + justification: None, + }).collect(); + + message::generic::BlockResponse { + id: 0, + blocks, + } + }; + + on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); + assert!(on_demand.active_peers.is_empty()); + assert!(on_demand.idle_peers.is_empty(), "peer should be disconnected after bad response"); + } +} diff --git a/core/network/src/protocol/specialization.rs b/core/network/src/protocol/specialization.rs new file mode 100644 index 0000000000000000000000000000000000000000..e8a0a0c9491116ada17a7920fb53c1b90f797af1 --- /dev/null +++ b/core/network/src/protocol/specialization.rs @@ -0,0 +1,151 @@ +// Copyright 2017-2019 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 . + +//! Specializations of the substrate network protocol to allow more complex forms of communication. + +use crate::PeerId; +use runtime_primitives::traits::Block as BlockT; +use crate::protocol::Context; + +/// A specialization of the substrate network protocol. Handles events and sends messages. +pub trait NetworkSpecialization: Send + Sync + 'static { + /// Get the current specialization-status. + fn status(&self) -> Vec; + + /// Called when a peer successfully handshakes. + fn on_connect(&mut self, ctx: &mut dyn Context, who: PeerId, status: crate::message::Status); + + /// Called when a peer is disconnected. If the peer ID is unknown, it should be ignored. + fn on_disconnect(&mut self, ctx: &mut dyn Context, who: PeerId); + + /// Called when a network-specific message arrives. + fn on_message( + &mut self, + ctx: &mut dyn Context, + who: PeerId, + message: &mut Option> + ); + + /// Called on abort. + #[deprecated(note = "This method is never called; aborting corresponds to dropping the object")] + fn on_abort(&mut self) { } + + /// Called periodically to maintain peers and handle timeouts. + fn maintain_peers(&mut self, _ctx: &mut dyn Context) { } + + /// Called when a block is _imported_ at the head of the chain (not during major sync). + /// Not guaranteed to be called for every block, but will be most of the after major sync. + fn on_block_imported(&mut self, _ctx: &mut dyn Context, _hash: B::Hash, _header: &B::Header) { } +} + +/// Construct a simple protocol that is composed of several sub protocols. +/// Each "sub protocol" needs to implement `Specialization` and needs to provide a `new()` function. +/// For more fine grained implementations, this macro is not usable. +/// +/// # Example +/// +/// ```nocompile +/// construct_simple_protocol! { +/// pub struct MyProtocol where Block = MyBlock { +/// consensus_gossip: ConsensusGossip, +/// other_protocol: MyCoolStuff, +/// } +/// } +/// ``` +/// +/// You can also provide an optional parameter after `where Block = MyBlock`, so it looks like +/// `where Block = MyBlock, Status = consensus_gossip`. This will instruct the implementation to +/// use the `status()` function from the `ConsensusGossip` protocol. By default, `status()` returns +/// an empty vector. +#[macro_export] +macro_rules! construct_simple_protocol { + ( + $( #[ $attr:meta ] )* + pub struct $protocol:ident where + Block = $block:ident + $( , Status = $status_protocol_name:ident )* + { + $( $sub_protocol_name:ident : $sub_protocol:ident $( <$protocol_block:ty> )*, )* + } + ) => { + $( #[$attr] )* + pub struct $protocol { + $( $sub_protocol_name: $sub_protocol $( <$protocol_block> )*, )* + } + + impl $protocol { + /// Instantiate a node protocol handler. + pub fn new() -> Self { + Self { + $( $sub_protocol_name: $sub_protocol::new(), )* + } + } + } + + impl $crate::specialization::NetworkSpecialization<$block> for $protocol { + fn status(&self) -> Vec { + $( + let status = self.$status_protocol_name.status(); + + if !status.is_empty() { + return status; + } + )* + + Vec::new() + } + + fn on_connect( + &mut self, + _ctx: &mut $crate::Context<$block>, + _who: $crate::PeerId, + _status: $crate::StatusMessage<$block> + ) { + $( self.$sub_protocol_name.on_connect(_ctx, _who, _status); )* + } + + fn on_disconnect(&mut self, _ctx: &mut $crate::Context<$block>, _who: $crate::PeerId) { + $( self.$sub_protocol_name.on_disconnect(_ctx, _who); )* + } + + fn on_message( + &mut self, + _ctx: &mut $crate::Context<$block>, + _who: $crate::PeerId, + _message: &mut Option<$crate::message::Message<$block>> + ) { + $( self.$sub_protocol_name.on_message(_ctx, _who, _message); )* + } + + fn on_abort(&mut self) { + $( self.$sub_protocol_name.on_abort(); )* + } + + fn maintain_peers(&mut self, _ctx: &mut $crate::Context<$block>) { + $( self.$sub_protocol_name.maintain_peers(_ctx); )* + } + + fn on_block_imported( + &mut self, + _ctx: &mut $crate::Context<$block>, + _hash: <$block as $crate::BlockT>::Hash, + _header: &<$block as $crate::BlockT>::Header + ) { + $( self.$sub_protocol_name.on_block_imported(_ctx, _hash, _header); )* + } + } + } +} diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs new file mode 100644 index 0000000000000000000000000000000000000000..4ec8f18e355b4d4bed05c3de7296e3334bfae94d --- /dev/null +++ b/core/network/src/protocol/sync.rs @@ -0,0 +1,1020 @@ +// Copyright 2017-2019 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 . + +//! Contains the state of the chain synchronization process +//! +//! At any given point in time, a running node tries as much as possible to be at the head of the +//! chain. This module handles the logic of which blocks to request from remotes, and processing +//! responses. It yields blocks to check and potentially move to the database. +//! +//! # Usage +//! +//! The `ChainSync` struct maintains the state of the block requests. Whenever something happens on +//! the network, or whenever a block has been successfully verified, call the appropriate method in +//! order to update it. You must also regularly call `tick()`. +//! +//! To each of these methods, you must pass a `Context` object that the `ChainSync` will use to +//! send its new outgoing requests. +//! + +use std::cmp::max; +use std::ops::Range; +use std::collections::{HashMap, VecDeque}; +use log::{debug, trace, warn, info, error}; +use crate::protocol::PeerInfo as ProtocolPeerInfo; +use network_libp2p::PeerId; +use client::{BlockStatus, ClientInfo}; +use consensus::{BlockOrigin, import_queue::{IncomingBlock, SharedFinalityProofRequestBuilder}}; +use client::error::Error as ClientError; +use blocks::BlockCollection; +use extra_requests::ExtraRequestsAggregator; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, NumberFor, Zero, One, + CheckedSub, SaturatedConversion +}; +use runtime_primitives::{Justification, generic::BlockId}; +use crate::message; +use crate::config::Roles; +use std::collections::HashSet; + +mod blocks; +mod extra_requests; + +// Maximum blocks to request in a single packet. +const MAX_BLOCKS_TO_REQUEST: usize = 128; +// Maximum blocks to store in the import queue. +const MAX_IMPORTING_BLOCKS: usize = 2048; +// Number of blocks in the queue that prevents ancestry search. +const MAJOR_SYNC_BLOCKS: usize = 5; +// Number of recently announced blocks to track for each peer. +const ANNOUNCE_HISTORY_SIZE: usize = 64; +// Max number of blocks to download for unknown forks. +const MAX_UNKNOWN_FORK_DOWNLOAD_LEN: u32 = 32; +/// Reputation change when a peer sent us a status message that led to a database read error. +const BLOCKCHAIN_STATUS_READ_ERROR_REPUTATION_CHANGE: i32 = -(1 << 16); +/// Reputation change when a peer failed to answer our legitimate ancestry block search. +const ANCESTRY_BLOCK_ERROR_REPUTATION_CHANGE: i32 = -(1 << 9); +/// Reputation change when a peer sent us a status message with a different genesis than us. +const GENESIS_MISMATCH_REPUTATION_CHANGE: i32 = i32::min_value() + 1; + +/// Context for a network-specific handler. +pub trait Context { + /// Get a reference to the client. + fn client(&self) -> &dyn crate::chain::Client; + + /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or + /// irresponsible or appeared lazy. + fn report_peer(&mut self, who: PeerId, reputation: i32); + + /// Force disconnecting from a peer. Use this when a peer misbehaved. + fn disconnect_peer(&mut self, who: PeerId); + + /// Request a finality proof from a peer. + fn send_finality_proof_request(&mut self, who: PeerId, request: message::FinalityProofRequest); + + /// Request a block from a peer. + fn send_block_request(&mut self, who: PeerId, request: message::BlockRequest); +} + +#[derive(Debug)] +pub(crate) struct PeerSync { + pub common_number: NumberFor, + pub best_hash: B::Hash, + pub best_number: NumberFor, + pub state: PeerSyncState, + pub recently_announced: VecDeque, +} + +#[derive(Debug)] +/// Peer sync status. +pub(crate) struct PeerInfo { + /// Their best block hash. + pub best_hash: B::Hash, + /// Their best block number. + pub best_number: NumberFor, +} + +#[derive(Copy, Clone, Eq, PartialEq, Debug)] +pub(crate) enum AncestorSearchState { + /// Use exponential backoff to find an ancestor, then switch to binary search. + /// We keep track of the exponent. + ExponentialBackoff(NumberFor), + /// Using binary search to find the best ancestor. + /// We keep track of left and right bounds. + BinarySearch(NumberFor, NumberFor), +} + +#[derive(Copy, Clone, Eq, PartialEq, Debug)] +pub(crate) enum PeerSyncState { + AncestorSearch(NumberFor, AncestorSearchState), + Available, + DownloadingNew(NumberFor), + DownloadingStale(B::Hash), + DownloadingJustification(B::Hash), + DownloadingFinalityProof(B::Hash), +} + +/// Relay chain sync strategy. +pub struct ChainSync { + _genesis_hash: B::Hash, + peers: HashMap>, + blocks: BlockCollection, + best_queued_number: NumberFor, + best_queued_hash: B::Hash, + role: Roles, + required_block_attributes: message::BlockAttributes, + extra_requests: ExtraRequestsAggregator, + queue_blocks: HashSet, + best_importing_number: NumberFor, +} + +/// Reported sync state. +#[derive(Clone, Eq, PartialEq, Debug)] +pub enum SyncState { + /// Initial sync is complete, keep-up sync is active. + Idle, + /// Actively catching up with the chain. + Downloading +} + +/// Syncing status and statistics +#[derive(Clone)] +pub struct Status { + /// Current global sync state. + pub state: SyncState, + /// Target sync block number. + pub best_seen_block: Option>, + /// Number of peers participating in syncing. + pub num_peers: u32, +} + +impl Status { + /// Whether the synchronization status is doing major downloading work or + /// is near the head of the chain. + pub fn is_major_syncing(&self) -> bool { + match self.state { + SyncState::Idle => false, + SyncState::Downloading => true, + } + } + + /// Are we all alone? + pub fn is_offline(&self) -> bool { + self.num_peers == 0 + } +} + +impl ChainSync { + /// Create a new instance. Pass the initial known state of the chain. + pub(crate) fn new( + role: Roles, + info: &ClientInfo, + ) -> Self { + let mut required_block_attributes = message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION; + if role.is_full() { + required_block_attributes |= message::BlockAttributes::BODY; + } + + ChainSync { + _genesis_hash: info.chain.genesis_hash, + peers: HashMap::new(), + blocks: BlockCollection::new(), + best_queued_hash: info.chain.best_hash, + best_queued_number: info.chain.best_number, + extra_requests: ExtraRequestsAggregator::new(), + role, + required_block_attributes, + queue_blocks: Default::default(), + best_importing_number: Zero::zero(), + } + } + + fn best_seen_block(&self) -> Option> { + self.peers.values().max_by_key(|p| p.best_number).map(|p| p.best_number) + } + + fn state(&self, best_seen: &Option>) -> SyncState { + match best_seen { + &Some(n) if n > self.best_queued_number && n - self.best_queued_number > 5.into() => SyncState::Downloading, + _ => SyncState::Idle, + } + } + + /// Returns the state of the sync of the given peer. Returns `None` if the peer is unknown. + pub(crate) fn peer_info(&self, who: &PeerId) -> Option> { + self.peers.get(who).map(|peer| { + PeerInfo { + best_hash: peer.best_hash, + best_number: peer.best_number, + } + }) + } + + /// Returns sync status. + pub(crate) fn status(&self) -> Status { + let best_seen = self.best_seen_block(); + let state = self.state(&best_seen); + Status { + state, + best_seen_block: best_seen, + num_peers: self.peers.len() as u32, + } + } + + /// Handle new connected peer. Call this method whenever we connect to a new peer. + pub(crate) fn new_peer( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + info: ProtocolPeerInfo + ) { + // there's nothing sync can get from the node that has no blockchain data + // (the opposite is not true, but all requests are served at protocol level) + if !info.roles.is_full() { + return; + } + + let status = block_status(&*protocol.client(), &self.queue_blocks, info.best_hash); + match (status, info.best_number) { + (Err(e), _) => { + debug!(target:"sync", "Error reading blockchain: {:?}", e); + protocol.report_peer(who.clone(), BLOCKCHAIN_STATUS_READ_ERROR_REPUTATION_CHANGE); + protocol.disconnect_peer(who); + }, + (Ok(BlockStatus::KnownBad), _) => { + info!("New peer with known bad best block {} ({}).", info.best_hash, info.best_number); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + }, + (Ok(BlockStatus::Unknown), b) if b.is_zero() => { + info!("New peer with unknown genesis hash {} ({}).", info.best_hash, info.best_number); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + }, + (Ok(BlockStatus::Unknown), _) if self.queue_blocks.len() > MAJOR_SYNC_BLOCKS => { + // when actively syncing the common point moves too fast. + debug!( + target:"sync", + "New peer with unknown best hash {} ({}), assuming common block.", + self.best_queued_hash, + self.best_queued_number + ); + self.peers.insert(who, PeerSync { + common_number: self.best_queued_number, + best_hash: info.best_hash, + best_number: info.best_number, + state: PeerSyncState::Available, + recently_announced: Default::default(), + }); + } + (Ok(BlockStatus::Unknown), _) => { + let our_best = self.best_queued_number; + if our_best.is_zero() { + // We are at genesis, just start downloading + debug!(target:"sync", "New peer with best hash {} ({}).", info.best_hash, info.best_number); + self.peers.insert(who.clone(), PeerSync { + common_number: Zero::zero(), + best_hash: info.best_hash, + best_number: info.best_number, + state: PeerSyncState::Available, + recently_announced: Default::default(), + }); + self.download_new(protocol, who) + } else { + let common_best = ::std::cmp::min(our_best, info.best_number); + debug!(target:"sync", + "New peer with unknown best hash {} ({}), searching for common ancestor.", + info.best_hash, + info.best_number + ); + self.peers.insert(who.clone(), PeerSync { + common_number: Zero::zero(), + best_hash: info.best_hash, + best_number: info.best_number, + state: PeerSyncState::AncestorSearch( + common_best, + AncestorSearchState::ExponentialBackoff(One::one()) + ), + recently_announced: Default::default(), + }); + Self::request_ancestry(protocol, who, common_best) + } + }, + (Ok(BlockStatus::Queued), _) | + (Ok(BlockStatus::InChainWithState), _) | + (Ok(BlockStatus::InChainPruned), _) => { + debug!(target:"sync", "New peer with known best hash {} ({}).", info.best_hash, info.best_number); + self.peers.insert(who.clone(), PeerSync { + common_number: info.best_number, + best_hash: info.best_hash, + best_number: info.best_number, + state: PeerSyncState::Available, + recently_announced: Default::default(), + }); + } + } + } + + fn handle_ancestor_search_state( + state: AncestorSearchState, + curr_block_num: NumberFor, + block_hash_match: bool, + ) -> Option<(AncestorSearchState, NumberFor)> { + let two = >::one() + >::one(); + match state { + AncestorSearchState::ExponentialBackoff(next_distance_to_tip) => { + if block_hash_match && next_distance_to_tip == One::one() { + // We found the ancestor in the first step so there is no need to execute binary search. + return None; + } + if block_hash_match { + let left = curr_block_num; + let right = left + next_distance_to_tip / two; + let middle = left + (right - left) / two; + Some((AncestorSearchState::BinarySearch(left, right), middle)) + } else { + let next_block_num = curr_block_num.checked_sub(&next_distance_to_tip) + .unwrap_or_else(Zero::zero); + let next_distance_to_tip = next_distance_to_tip * two; + Some((AncestorSearchState::ExponentialBackoff(next_distance_to_tip), next_block_num)) + } + }, + AncestorSearchState::BinarySearch(mut left, mut right) => { + if left >= curr_block_num { + return None; + } + if block_hash_match { + left = curr_block_num; + } else { + right = curr_block_num; + } + assert!(right >= left); + let middle = left + (right - left) / two; + Some((AncestorSearchState::BinarySearch(left, right), middle)) + }, + } + } + + /// Handle a response from the remote to a block request that we made. + /// + /// `request` must be the original request that triggered `response`. + /// + /// If this corresponds to a valid block, this outputs the block that must be imported in the + /// import queue. + #[must_use] + pub(crate) fn on_block_data( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + request: message::BlockRequest, + response: message::BlockResponse + ) -> Option<(BlockOrigin, Vec>)> { + let new_blocks: Vec> = if let Some(ref mut peer) = self.peers.get_mut(&who) { + let mut blocks = response.blocks; + if request.direction == message::Direction::Descending { + trace!(target: "sync", "Reversing incoming block list"); + blocks.reverse(); + } + let peer_state = peer.state.clone(); + match peer_state { + PeerSyncState::DownloadingNew(start_block) => { + self.blocks.clear_peer_download(&who); + peer.state = PeerSyncState::Available; + self.blocks.insert(start_block, blocks, who); + self.blocks + .drain(self.best_queued_number + One::one()) + .into_iter() + .map(|block_data| { + IncomingBlock { + hash: block_data.block.hash, + header: block_data.block.header, + body: block_data.block.body, + justification: block_data.block.justification, + origin: block_data.origin, + } + }).collect() + }, + PeerSyncState::DownloadingStale(_) => { + peer.state = PeerSyncState::Available; + blocks.into_iter().map(|b| { + IncomingBlock { + hash: b.hash, + header: b.header, + body: b.body, + justification: b.justification, + origin: Some(who.clone()), + } + }).collect() + }, + PeerSyncState::AncestorSearch(num, state) => { + let block_hash_match = match (blocks.get(0), protocol.client().block_hash(num)) { + (Some(ref block), Ok(maybe_our_block_hash)) => { + trace!(target: "sync", "Got ancestry block #{} ({}) from peer {}", num, block.hash, who); + maybe_our_block_hash.map_or(false, |x| x == block.hash) + }, + (None, _) => { + debug!(target: "sync", "Invalid response when searching for ancestor from {}", who); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + return None + }, + (_, Err(e)) => { + info!("Error answering legitimate blockchain query: {:?}", e); + protocol.report_peer(who.clone(), ANCESTRY_BLOCK_ERROR_REPUTATION_CHANGE); + protocol.disconnect_peer(who); + return None + }, + }; + if block_hash_match && peer.common_number < num { + peer.common_number = num; + } + if !block_hash_match && num.is_zero() { + trace!(target:"sync", "Ancestry search: genesis mismatch for peer {}", who); + protocol.report_peer(who.clone(), GENESIS_MISMATCH_REPUTATION_CHANGE); + protocol.disconnect_peer(who); + return None + } + if let Some((next_state, next_block_num)) = + Self::handle_ancestor_search_state(state, num, block_hash_match) { + peer.state = PeerSyncState::AncestorSearch(next_block_num, next_state); + Self::request_ancestry(protocol, who, next_block_num); + return None + } else { + peer.state = PeerSyncState::Available; + vec![] + } + }, + PeerSyncState::Available | + PeerSyncState::DownloadingJustification(..) | + PeerSyncState::DownloadingFinalityProof(..) => Vec::new(), + } + } else { + Vec::new() + }; + + let is_recent = new_blocks + .first() + .map(|block| self.peers.iter().any(|(_, peer)| peer.recently_announced.contains(&block.hash))) + .unwrap_or(false); + let origin = if is_recent { BlockOrigin::NetworkBroadcast } else { BlockOrigin::NetworkInitialSync }; + + if let Some((hash, number)) = new_blocks.last() + .and_then(|b| b.header.as_ref().map(|h| (b.hash.clone(), *h.number()))) + { + trace!(target:"sync", "Accepted {} blocks ({:?}) with origin {:?}", new_blocks.len(), hash, origin); + self.block_queued(&hash, number); + } + self.maintain_sync(protocol); + let new_best_importing_number = new_blocks + .last() + .and_then(|b| b.header.as_ref().map(|h| h.number().clone())) + .unwrap_or_else(|| Zero::zero()); + self.queue_blocks + .extend(new_blocks.iter().map(|b| b.hash.clone())); + self.best_importing_number = max(new_best_importing_number, self.best_importing_number); + Some((origin, new_blocks)) + } + + /// Handle a response from the remote to a justification request that we made. + /// + /// `request` must be the original request that triggered `response`. + /// + /// Returns `Some` if this produces a justification that must be imported into the import + /// queue. + #[must_use] + pub(crate) fn on_block_justification_data( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + _request: message::BlockRequest, + response: message::BlockResponse, + ) -> Option<(PeerId, B::Hash, NumberFor, Justification)> { + let peer = if let Some(peer) = self.peers.get_mut(&who) { + peer + } else { + error!(target: "sync", "Called on_block_justification_data with a bad peer ID"); + return None; + }; + + if let PeerSyncState::DownloadingJustification(hash) = peer.state { + peer.state = PeerSyncState::Available; + + // we only request one justification at a time + match response.blocks.into_iter().next() { + Some(response) => { + if hash != response.hash { + info!("Invalid block justification provided by {}: requested: {:?} got: {:?}", + who, hash, response.hash); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + return None; + } + + return self.extra_requests.justifications().on_response( + who, + response.justification, + ); + }, + None => { + // we might have asked the peer for a justification on a block that we thought it had + // (regardless of whether it had a justification for it or not). + trace!(target: "sync", "Peer {:?} provided empty response for justification request {:?}", + who, + hash, + ); + return None; + }, + } + } + + self.maintain_sync(protocol); + None + } + + /// Handle new finality proof data. + pub(crate) fn on_block_finality_proof_data( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + response: message::FinalityProofResponse, + ) -> Option<(PeerId, B::Hash, NumberFor, Vec)> { + let peer = if let Some(peer) = self.peers.get_mut(&who) { + peer + } else { + error!(target: "sync", "Called on_block_finality_proof_data with a bad peer ID"); + return None; + }; + + if let PeerSyncState::DownloadingFinalityProof(hash) = peer.state { + peer.state = PeerSyncState::Available; + + // we only request one finality proof at a time + if hash != response.block { + info!( + "Invalid block finality proof provided: requested: {:?} got: {:?}", + hash, + response.block, + ); + + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + return None; + } + + return self.extra_requests.finality_proofs().on_response( + who, + response.proof, + ); + } + + self.maintain_sync(protocol); + None + } + + /// A batch of blocks have been processed, with or without errors. + /// Call this when a batch of blocks have been processed by the import queue, with or without + /// errors. + pub fn blocks_processed(&mut self, protocol: &mut Context, processed_blocks: Vec, has_error: bool) { + for hash in processed_blocks { + self.queue_blocks.remove(&hash); + } + if has_error { + self.best_importing_number = Zero::zero(); + } + self.maintain_sync(protocol) + } + + /// Maintain the sync process (download new blocks, fetch justifications). + fn maintain_sync(&mut self, protocol: &mut dyn Context) { + let peers: Vec = self.peers.keys().map(|p| p.clone()).collect(); + for peer in peers { + self.download_new(protocol, peer); + } + self.extra_requests.dispatch(&mut self.peers, protocol); + } + + /// Called periodically to perform any time-based actions. Must be called at a regular + /// interval. + pub fn tick(&mut self, protocol: &mut dyn Context) { + self.extra_requests.dispatch(&mut self.peers, protocol); + } + + /// Request a justification for the given block. + /// + /// Uses `protocol` to queue a new justification request and tries to dispatch all pending + /// requests. + pub fn request_justification(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut dyn Context) { + self.extra_requests.justifications().queue_request( + (*hash, number), + |base, block| protocol.client().is_descendent_of(base, block), + ); + + self.extra_requests.justifications().dispatch(&mut self.peers, protocol); + } + + /// Clears all pending justification requests. + pub fn clear_justification_requests(&mut self) { + self.extra_requests.justifications().clear(); + } + + /// Call this when a justification has been processed by the import queue, with or without + /// errors. + pub fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { + let finalization_result = if success { Ok((hash, number)) } else { Err(()) }; + if !self.extra_requests.justifications().on_import_result((hash, number), finalization_result) { + debug!(target: "sync", "Got justification import result for unknown justification {:?} {:?} request.", + hash, + number, + ); + } + } + + /// Request a finality proof for the given block. + /// + /// Queues a new finality proof request and tries to dispatch all pending requests. + pub fn request_finality_proof(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut dyn Context) { + self.extra_requests.finality_proofs().queue_request( + (*hash, number), + |base, block| protocol.client().is_descendent_of(base, block), + ); + + self.extra_requests.finality_proofs().dispatch(&mut self.peers, protocol); + } + + pub fn finality_proof_import_result( + &mut self, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + self.extra_requests.finality_proofs().on_import_result(request_block, finalization_result); + } + + pub fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) { + self.extra_requests.finality_proofs().essence().0 = Some(request_builder); + } + + /// Notify about successful import of the given block. + pub fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { + trace!(target: "sync", "Block imported successfully {} ({})", number, hash); + } + + /// Notify about finalization of the given block. + pub fn on_block_finalized(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut dyn Context) { + if let Err(err) = self.extra_requests.on_block_finalized( + hash, + number, + &|base, block| protocol.client().is_descendent_of(base, block), + ) { + warn!(target: "sync", "Error cleaning up pending extra data requests: {:?}", err); + }; + } + + fn block_queued(&mut self, hash: &B::Hash, number: NumberFor) { + if number > self.best_queued_number { + self.best_queued_number = number; + self.best_queued_hash = *hash; + } + // Update common blocks + for (n, peer) in self.peers.iter_mut() { + if let PeerSyncState::AncestorSearch(_, _) = peer.state { + // Abort search. + peer.state = PeerSyncState::Available; + } + let new_common_number = if peer.best_number >= number { + number + } else { + peer.best_number + }; + trace!( + target: "sync", + "Updating peer {} info, ours={}, common={}->{}, their best={}", + n, + number, + peer.common_number, + new_common_number, + peer.best_number, + ); + peer.common_number = new_common_number; + } + } + + /// Sets the new head of chain. + pub(crate) fn update_chain_info(&mut self, best_header: &B::Header) { + let hash = best_header.hash(); + self.block_queued(&hash, best_header.number().clone()) + } + + /// Call when a node announces a new block. + /// + /// If true is returned, then the caller MUST try to import passed header (call `on_block_data). + /// The network request isn't sent in this case. + #[must_use] + pub(crate) fn on_block_announce( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + hash: B::Hash, + header: &B::Header, + ) -> bool { + let number = *header.number(); + debug!(target: "sync", "Received block announcement with number {:?}", number); + if number.is_zero() { + warn!(target: "sync", "Ignored invalid block announcement from {}: {}", who, hash); + return false; + } + let parent_status = block_status(&*protocol.client(), &self.queue_blocks, header.parent_hash().clone()).ok() + .unwrap_or(BlockStatus::Unknown); + let known_parent = parent_status != BlockStatus::Unknown; + let ancient_parent = parent_status == BlockStatus::InChainPruned; + + let known = self.is_known(protocol, &hash); + let peer = if let Some(peer) = self.peers.get_mut(&who) { + peer + } else { + error!(target: "sync", "Called on_block_announce with a bad peer ID"); + return false; + }; + while peer.recently_announced.len() >= ANNOUNCE_HISTORY_SIZE { + peer.recently_announced.pop_front(); + } + peer.recently_announced.push_back(hash.clone()); + if number > peer.best_number { + // update their best block + peer.best_number = number; + peer.best_hash = hash; + } + if let PeerSyncState::AncestorSearch(_, _) = peer.state { + return false; + } + if header.parent_hash() == &self.best_queued_hash || known_parent { + peer.common_number = number - One::one(); + } else if known { + peer.common_number = number + } + + // known block case + if known || self.is_already_downloading(&hash) { + trace!(target: "sync", "Known block announce from {}: {}", who, hash); + return false; + } + + // stale block case + let requires_additional_data = !self.role.is_light(); + let stale = number <= self.best_queued_number; + if stale { + if !(known_parent || self.is_already_downloading(header.parent_hash())) { + if protocol.client().block_status(&BlockId::Number(*header.number())) + .unwrap_or(BlockStatus::Unknown) == BlockStatus::InChainPruned + { + trace!( + target: "sync", + "Ignored unknown ancient block announced from {}: {} {:?}", + who, hash, header + ); + return false; + } + + trace!( + target: "sync", + "Considering new unknown stale block announced from {}: {} {:?}", + who, hash, header + ); + let request = self.download_unknown_stale(&who, &hash); + match request { + Some(request) => if requires_additional_data { + protocol.send_block_request(who, request); + return false; + } else { + return true; + }, + None => return false, + } + } else { + if ancient_parent { + trace!( + target: "sync", + "Ignored ancient stale block announced from {}: {} {:?}", + who, hash, header + ); + return false; + } + + let request = self.download_stale(&who, &hash); + match request { + Some(request) => if requires_additional_data { + protocol.send_block_request(who, request); + return false; + } else { + return true; + }, + None => return false, + } + } + } + + if ancient_parent { + trace!(target: "sync", "Ignored ancient block announced from {}: {} {:?}", who, hash, header); + return false; + } + + trace!(target: "sync", "Considering new block announced from {}: {} {:?}", who, hash, header); + let (range, request) = match self.select_new_blocks(who.clone()) { + Some((range, request)) => (range, request), + None => return false, + }; + let is_required_data_available = + !requires_additional_data && + range.end - range.start == One::one() && + range.start == *header.number(); + if !is_required_data_available { + protocol.send_block_request(who, request); + return false; + } + + true + } + + fn is_already_downloading(&self, hash: &B::Hash) -> bool { + self.peers.iter().any(|(_, p)| p.state == PeerSyncState::DownloadingStale(*hash)) + } + + fn is_known(&self, protocol: &mut dyn Context, hash: &B::Hash) -> bool { + block_status(&*protocol.client(), &self.queue_blocks, *hash).ok().map_or(false, |s| s != BlockStatus::Unknown) + } + + /// Call when a peer has disconnected. + pub(crate) fn peer_disconnected(&mut self, protocol: &mut dyn Context, who: PeerId) { + self.blocks.clear_peer_download(&who); + self.peers.remove(&who); + self.extra_requests.peer_disconnected(who); + self.maintain_sync(protocol); + } + + /// Restart the sync process. + pub(crate) fn restart( + &mut self, + protocol: &mut dyn Context, + mut peer_info: impl FnMut(&PeerId) -> Option> + ) { + self.queue_blocks.clear(); + self.best_importing_number = Zero::zero(); + self.blocks.clear(); + let info = protocol.client().info(); + self.best_queued_hash = info.chain.best_hash; + self.best_queued_number = info.chain.best_number; + debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); + let ids: Vec = self.peers.drain().map(|(id, _)| id).collect(); + for id in ids { + if let Some(info) = peer_info(&id) { + self.new_peer(protocol, id, info); + } + } + } + + // Download old block with known parent. + fn download_stale( + &mut self, + who: &PeerId, + hash: &B::Hash, + ) -> Option> { + let peer = self.peers.get_mut(who)?; + match peer.state { + PeerSyncState::Available => { + peer.state = PeerSyncState::DownloadingStale(*hash); + Some(message::generic::BlockRequest { + id: 0, + fields: self.required_block_attributes.clone(), + from: message::FromBlock::Hash(*hash), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }) + }, + _ => None, + } + } + + // Download old block with unknown parent. + fn download_unknown_stale( + &mut self, + who: &PeerId, + hash: &B::Hash, + ) -> Option> { + let peer = self.peers.get_mut(who)?; + match peer.state { + PeerSyncState::Available => { + peer.state = PeerSyncState::DownloadingStale(*hash); + Some(message::generic::BlockRequest { + id: 0, + fields: self.required_block_attributes.clone(), + from: message::FromBlock::Hash(*hash), + to: None, + direction: message::Direction::Descending, + max: Some(MAX_UNKNOWN_FORK_DOWNLOAD_LEN), + }) + }, + _ => None, + } + } + + // Issue a request for a peer to download new blocks, if any are available. + fn download_new(&mut self, protocol: &mut dyn Context, who: PeerId) { + if let Some((_, request)) = self.select_new_blocks(who.clone()) { + protocol.send_block_request(who, request); + } + } + + // Select a range of NEW blocks to download from peer. + fn select_new_blocks(&mut self, who: PeerId) -> Option<(Range>, message::BlockRequest)> { + // when there are too many blocks in the queue => do not try to download new blocks + if self.queue_blocks.len() > MAX_IMPORTING_BLOCKS { + trace!(target: "sync", "Too many blocks in the queue."); + return None; + } + + let peer = self.peers.get_mut(&who)?; + match peer.state { + PeerSyncState::Available => { + trace!( + target: "sync", + "Considering new block download from {}, common block is {}, best is {:?}", + who, + peer.common_number, + peer.best_number, + ); + let range = self.blocks.needed_blocks( + who.clone(), + MAX_BLOCKS_TO_REQUEST, + peer.best_number, + peer.common_number + ); + match range { + Some(range) => { + trace!(target: "sync", "Requesting blocks from {}, ({} to {})", who, range.start, range.end); + let from = message::FromBlock::Number(range.start); + let max = Some((range.end - range.start).saturated_into::()); + peer.state = PeerSyncState::DownloadingNew(range.start); + Some(( + range, + message::generic::BlockRequest { + id: 0, + fields: self.required_block_attributes.clone(), + from, + to: None, + direction: message::Direction::Ascending, + max, + }, + )) + }, + None => { + trace!(target: "sync", "Nothing to request"); + None + }, + } + }, + _ => { + trace!(target: "sync", "Peer {} is busy", who); + None + }, + } + } + + fn request_ancestry(protocol: &mut dyn Context, who: PeerId, block: NumberFor) { + trace!(target: "sync", "Requesting ancestry block #{} from {}", block, who); + let request = message::generic::BlockRequest { + id: 0, + fields: message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION, + from: message::FromBlock::Number(block), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }; + protocol.send_block_request(who, request); + } +} + +/// Get block status, taking into account import queue. +fn block_status( + chain: &dyn crate::chain::Client, + queue_blocks: &HashSet, + hash: B::Hash) -> Result +{ + if queue_blocks.contains(&hash) { + return Ok(BlockStatus::Queued); + } + + chain.block_status(&BlockId::Hash(hash)) +} diff --git a/core/network/src/blocks.rs b/core/network/src/protocol/sync/blocks.rs similarity index 85% rename from core/network/src/blocks.rs rename to core/network/src/protocol/sync/blocks.rs index 60c6886f09f27c210876825bcc4fa364235676e2..66730fcc3ee5246da6d5d2a13aa814d48af97367 100644 --- a/core/network/src/blocks.rs +++ b/core/network/src/protocol/sync/blocks.rs @@ -21,7 +21,7 @@ use std::collections::{HashMap, BTreeMap}; use std::collections::hash_map::Entry; use log::trace; use network_libp2p::PeerId; -use runtime_primitives::traits::{Block as BlockT, NumberFor, As}; +use runtime_primitives::traits::{Block as BlockT, NumberFor, One}; use crate::message; const MAX_PARALLEL_DOWNLOADS: u32 = 1; @@ -48,7 +48,7 @@ impl BlockRangeState { pub fn len(&self) -> NumberFor { match *self { BlockRangeState::Downloading { len, .. } => len, - BlockRangeState::Complete(ref blocks) => As::sa(blocks.len() as u64), + BlockRangeState::Complete(ref blocks) => (blocks.len() as u32).into(), } } } @@ -100,17 +100,19 @@ impl BlockCollection { } /// Returns a set of block hashes that require a header download. The returned set is marked as being downloaded. - pub fn needed_blocks(&mut self, who: PeerId, count: usize, peer_best: NumberFor, common: NumberFor) -> Option>> { + pub fn needed_blocks(&mut self, who: PeerId, count: usize, peer_best: NumberFor, common: NumberFor) + -> Option>> { // First block number that we need to download - let first_different = common + As::sa(1); - let count = As::sa(count as u64); + let first_different = common + >::one(); + let count = (count as u32).into(); let (mut range, downloading) = { let mut downloading_iter = self.blocks.iter().peekable(); let mut prev: Option<(&NumberFor, &BlockRangeState)> = None; loop { let next = downloading_iter.next(); break match &(prev, next) { - &(Some((start, &BlockRangeState::Downloading { ref len, downloading })), _) if downloading < MAX_PARALLEL_DOWNLOADS => + &(Some((start, &BlockRangeState::Downloading { ref len, downloading })), _) + if downloading < MAX_PARALLEL_DOWNLOADS => (*start .. *start + *len, downloading), &(Some((start, r)), Some((next_start, _))) if *start + r.len() < *next_start => (*start + r.len() .. cmp::min(*next_start, *start + r.len() + count), 0), // gap @@ -132,11 +134,15 @@ impl BlockCollection { trace!(target: "sync", "Out of range for peer {} ({} vs {})", who, range.start, peer_best); return None; } - range.end = cmp::min(peer_best + As::sa(1), range.end); + range.end = cmp::min(peer_best + One::one(), range.end); self.peer_requests.insert(who, range.start); - self.blocks.insert(range.start, BlockRangeState::Downloading { len: range.end - range.start, downloading: downloading + 1 }); + self.blocks.insert(range.start, BlockRangeState::Downloading { + len: range.end - range.start, + downloading: downloading + 1 + }); if range.end <= range.start { - panic!("Empty range {:?}, count={}, peer_best={}, common={}, blocks={:?}", range, count, peer_best, common, self.blocks); + panic!("Empty range {:?}, count={}, peer_best={}, common={}, blocks={:?}", + range, count, peer_best, common, self.blocks); } Some(range) } @@ -150,7 +156,7 @@ impl BlockCollection { for (start, range_data) in &mut self.blocks { match range_data { &mut BlockRangeState::Complete(ref mut blocks) if *start <= prev => { - prev = *start + As::sa(blocks.len() as u64); + prev = *start + (blocks.len() as u32).into(); let mut blocks = mem::replace(blocks, Vec::new()); drained.append(&mut blocks); ranges.push(*start); @@ -248,14 +254,17 @@ mod test { bc.insert(1, blocks[1..11].to_vec(), peer0.clone()); assert_eq!(bc.needed_blocks(peer0.clone(), 40, 150, 0), Some(11 .. 41)); - assert_eq!(bc.drain(1), blocks[1..11].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()); + assert_eq!(bc.drain(1), blocks[1..11].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()); bc.clear_peer_download(&peer0); bc.insert(11, blocks[11..41].to_vec(), peer0.clone()); let drained = bc.drain(12); - assert_eq!(drained[..30], blocks[11..41].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()[..]); - assert_eq!(drained[30..], blocks[41..81].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); + assert_eq!(drained[..30], blocks[11..41].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()[..]); + assert_eq!(drained[30..], blocks[41..81].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); bc.clear_peer_download(&peer2); assert_eq!(bc.needed_blocks(peer2.clone(), 40, 150, 80), Some(81 .. 121)); @@ -266,8 +275,10 @@ mod test { assert_eq!(bc.drain(80), vec![]); let drained = bc.drain(81); - assert_eq!(drained[..40], blocks[81..121].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer2.clone()) }).collect::>()[..]); - assert_eq!(drained[40..], blocks[121..150].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); + assert_eq!(drained[..40], blocks[81..121].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer2.clone()) }).collect::>()[..]); + assert_eq!(drained[40..], blocks[121..150].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); } #[test] diff --git a/core/network/src/protocol/sync/extra_requests.rs b/core/network/src/protocol/sync/extra_requests.rs new file mode 100644 index 0000000000000000000000000000000000000000..f41997a05ce9e8f98c8364201fab86d96ad730ee --- /dev/null +++ b/core/network/src/protocol/sync/extra_requests.rs @@ -0,0 +1,467 @@ +// Copyright 2017-2018 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 . + +use std::collections::{HashMap, HashSet, VecDeque}; +use std::time::{Duration, Instant}; +use log::{trace, warn}; +use client::error::Error as ClientError; +use consensus::import_queue::SharedFinalityProofRequestBuilder; +use fork_tree::ForkTree; +use network_libp2p::PeerId; +use runtime_primitives::Justification; +use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use crate::protocol::message; +use crate::protocol::sync::{Context, PeerSync, PeerSyncState}; + +// Time to wait before trying to get the same extra data from the same peer. +const EXTRA_RETRY_WAIT: Duration = Duration::from_secs(10); + +/// Pending extra data request for the given block (hash and number). +type ExtraRequest = (::Hash, NumberFor); + +/// Extra requests processor. +pub(crate) trait ExtraRequestsEssence { + type Response; + + /// Name of request type to display in logs. + fn type_name(&self) -> &'static str; + /// Send network message corresponding to the request. + fn send_network_request(&self, protocol: &mut dyn Context, peer: PeerId, request: ExtraRequest); + /// Create peer state for peer that is downloading extra data. + fn peer_downloading_state(&self, block: B::Hash) -> PeerSyncState; +} + +/// Manages all extra data requests required for sync. +pub(crate) struct ExtraRequestsAggregator { + /// Manages justifications requests. + justifications: ExtraRequests, + /// Manages finality proof requests. + finality_proofs: ExtraRequests>, +} + +impl ExtraRequestsAggregator { + pub(crate) fn new() -> Self { + ExtraRequestsAggregator { + justifications: ExtraRequests::new(JustificationsRequestsEssence), + finality_proofs: ExtraRequests::new(FinalityProofRequestsEssence(None)), + } + } + + pub(crate) fn justifications(&mut self) -> &mut ExtraRequests { + &mut self.justifications + } + + pub(crate) fn finality_proofs(&mut self) -> &mut ExtraRequests> { + &mut self.finality_proofs + } + + /// Dispatches all possible pending requests to the given peers. + pub(crate) fn dispatch(&mut self, peers: &mut HashMap>, protocol: &mut dyn Context) { + self.justifications.dispatch(peers, protocol); + self.finality_proofs.dispatch(peers, protocol); + } + + /// Removes any pending extra requests for blocks lower than the + /// given best finalized. + pub(crate) fn on_block_finalized( + &mut self, + best_finalized_hash: &B::Hash, + best_finalized_number: NumberFor, + is_descendent_of: &F, + ) -> Result<(), fork_tree::Error> + where F: Fn(&B::Hash, &B::Hash) -> Result + { + self.justifications.on_block_finalized(best_finalized_hash, best_finalized_number, is_descendent_of)?; + self.finality_proofs.on_block_finalized(best_finalized_hash, best_finalized_number, is_descendent_of)?; + Ok(()) + } + + /// Retry any pending request if a peer disconnected. + pub(crate) fn peer_disconnected(&mut self, who: PeerId) { + self.justifications.peer_disconnected(&who); + self.finality_proofs.peer_disconnected(&who); + } +} + +/// Manages pending block extra data (e.g. justification) requests. +/// Multiple extras may be requested for competing forks, or for the same branch +/// at different (increasing) heights. This structure will guarantee that extras +/// are fetched in-order, and that obsolete changes are pruned (when finalizing a +/// competing fork). +pub(crate) struct ExtraRequests { + tree: ForkTree, ()>, + pending_requests: VecDeque>, + peer_requests: HashMap>, + previous_requests: HashMap, Vec<(PeerId, Instant)>>, + importing_requests: HashSet>, + essence: Essence, +} + +impl> ExtraRequests { + fn new(essence: Essence) -> Self { + ExtraRequests { + tree: ForkTree::new(), + pending_requests: VecDeque::new(), + peer_requests: HashMap::new(), + previous_requests: HashMap::new(), + importing_requests: HashSet::new(), + essence, + } + } + + /// Get mutable reference to the requests essence. + pub(crate) fn essence(&mut self) -> &mut Essence { + &mut self.essence + } + + /// Dispatches all possible pending requests to the given peers. Peers are + /// filtered according to the current known best block (i.e. we won't send a + /// extra request for block #10 to a peer at block #2), and we also + /// throttle requests to the same peer if a previous justification request + /// yielded no results. + pub(crate) fn dispatch(&mut self, peers: &mut HashMap>, protocol: &mut dyn Context) { + if self.pending_requests.is_empty() { + return; + } + + let initial_pending_requests = self.pending_requests.len(); + + // clean up previous failed requests so we can retry again + for (_, requests) in self.previous_requests.iter_mut() { + requests.retain(|(_, instant)| instant.elapsed() < EXTRA_RETRY_WAIT); + } + + let mut available_peers = peers.iter().filter_map(|(peer, sync)| { + // don't request to any peers that already have pending requests or are unavailable + if sync.state != PeerSyncState::Available || self.peer_requests.contains_key(&peer) { + None + } else { + Some((peer.clone(), sync.best_number)) + } + }).collect::>(); + + let mut last_peer = available_peers.back().map(|p| p.0.clone()); + let mut unhandled_requests = VecDeque::new(); + + loop { + let (peer, peer_best_number) = match available_peers.pop_front() { + Some(p) => p, + _ => break, + }; + + // only ask peers that have synced past the block number that we're + // asking the extra for and to whom we haven't already made + // the same request recently + let peer_eligible = { + let request = match self.pending_requests.front() { + Some(r) => r.clone(), + _ => break, + }; + + peer_best_number >= request.1 && + !self.previous_requests + .get(&request) + .map(|requests| requests.iter().any(|i| i.0 == peer)) + .unwrap_or(false) + }; + + if !peer_eligible { + available_peers.push_back((peer.clone(), peer_best_number)); + + // we tried all peers and none can answer this request + if Some(peer) == last_peer { + last_peer = available_peers.back().map(|p| p.0.clone()); + + let request = self.pending_requests.pop_front() + .expect("verified to be Some in the beginning of the loop; qed"); + + unhandled_requests.push_back(request); + } + + continue; + } + + last_peer = available_peers.back().map(|p| p.0.clone()); + + let request = self.pending_requests.pop_front() + .expect("verified to be Some in the beginning of the loop; qed"); + + self.peer_requests.insert(peer.clone(), request); + + peers.get_mut(&peer) + .expect("peer was is taken from available_peers; available_peers is a subset of peers; qed") + .state = self.essence.peer_downloading_state(request.0.clone()); + + trace!(target: "sync", "Requesting {} for block #{} from {}", self.essence.type_name(), request.0, peer); + self.essence.send_network_request(protocol, peer, request); + } + + self.pending_requests.append(&mut unhandled_requests); + + trace!(target: "sync", "Dispatched {} {} requests ({} pending)", + initial_pending_requests - self.pending_requests.len(), + self.essence.type_name(), + self.pending_requests.len(), + ); + } + + /// Queue a extra data request (without dispatching it). + pub(crate) fn queue_request(&mut self, request: ExtraRequest, is_descendent_of: F) + where F: Fn(&B::Hash, &B::Hash) -> Result + { + match self.tree.import(request.0.clone(), request.1.clone(), (), &is_descendent_of) { + Ok(true) => { + // this is a new root so we add it to the current `pending_requests` + self.pending_requests.push_back((request.0, request.1)); + }, + Err(err) => { + warn!(target: "sync", "Failed to insert requested {} {:?} {:?} into tree: {:?}", + self.essence.type_name(), + request.0, + request.1, + err, + ); + return; + }, + _ => {}, + } + } + + /// Retry any pending request if a peer disconnected. + fn peer_disconnected(&mut self, who: &PeerId) { + if let Some(request) = self.peer_requests.remove(who) { + self.pending_requests.push_front(request); + } + } + + /// Process the import result of an extra. + /// Queues a retry in case the import failed. + /// Returns true if import has been queued. + pub(crate) fn on_import_result( + &mut self, + request: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) -> bool { + self.try_finalize_root(request, finalization_result, true) + } + + /// Processes the response for the request previously sent to the given + /// peer. Queues a retry in case the given justification + /// was `None`. + pub(crate) fn on_response( + &mut self, + who: PeerId, + response: Option, + ) -> Option<(PeerId, B::Hash, NumberFor, Essence::Response)> { + // we assume that the request maps to the given response, this is + // currently enforced by the outer network protocol before passing on + // messages to chain sync. + if let Some(request) = self.peer_requests.remove(&who) { + if let Some(response) = response { + self.importing_requests.insert(request); + return Some((who, request.0, request.1, response)); + } + + self.previous_requests + .entry(request) + .or_insert(Vec::new()) + .push((who, Instant::now())); + self.pending_requests.push_front(request); + } + + None + } + + /// Removes any pending extra requests for blocks lower than the + /// given best finalized. + fn on_block_finalized( + &mut self, + best_finalized_hash: &B::Hash, + best_finalized_number: NumberFor, + is_descendent_of: F, + ) -> Result<(), fork_tree::Error> + where F: Fn(&B::Hash, &B::Hash) -> Result + { + let is_scheduled_root = self.try_finalize_root( + (*best_finalized_hash, best_finalized_number), + Ok((*best_finalized_hash, best_finalized_number)), + false, + ); + if is_scheduled_root { + return Ok(()); + } + + self.tree.finalize(best_finalized_hash, best_finalized_number, &is_descendent_of)?; + + let roots = self.tree.roots().collect::>(); + + self.pending_requests.retain(|(h, n)| roots.contains(&(h, n, &()))); + self.peer_requests.retain(|_, (h, n)| roots.contains(&(h, n, &()))); + self.previous_requests.retain(|(h, n), _| roots.contains(&(h, n, &()))); + + Ok(()) + } + + /// Clear all data. + pub(crate) fn clear(&mut self) { + self.tree = ForkTree::new(); + self.pending_requests.clear(); + self.peer_requests.clear(); + self.previous_requests.clear(); + } + + /// Try to finalize pending root. + /// Returns true if import of this request has been scheduled. + fn try_finalize_root( + &mut self, + request: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + reschedule_on_failure: bool, + ) -> bool { + if !self.importing_requests.remove(&request) { + return false; + } + + let (finalized_hash, finalized_number) = match finalization_result { + Ok((finalized_hash, finalized_number)) => (finalized_hash, finalized_number), + Err(_) => { + if reschedule_on_failure { + self.pending_requests.push_front(request); + } + return true; + }, + }; + + if self.tree.finalize_root(&finalized_hash).is_none() { + warn!(target: "sync", "Imported {} for {:?} {:?} which isn't a root in the tree: {:?}", + self.essence.type_name(), + finalized_hash, + finalized_number, + self.tree.roots().collect::>(), + ); + return true; + }; + + self.previous_requests.clear(); + self.peer_requests.clear(); + self.pending_requests = + self.tree.roots().map(|(h, n, _)| (h.clone(), n.clone())).collect(); + + true + } +} + +pub(crate) struct JustificationsRequestsEssence; + +impl ExtraRequestsEssence for JustificationsRequestsEssence { + type Response = Justification; + + fn type_name(&self) -> &'static str { + "justification" + } + + fn send_network_request(&self, protocol: &mut dyn Context, peer: PeerId, request: ExtraRequest) { + protocol.send_block_request(peer, message::generic::BlockRequest { + id: 0, + fields: message::BlockAttributes::JUSTIFICATION, + from: message::FromBlock::Hash(request.0), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }) + } + + fn peer_downloading_state(&self, block: B::Hash) -> PeerSyncState { + PeerSyncState::DownloadingJustification(block) + } +} + +pub(crate) struct FinalityProofRequestsEssence(pub Option>); + +impl ExtraRequestsEssence for FinalityProofRequestsEssence { + type Response = Vec; + + fn type_name(&self) -> &'static str { + "finality proof" + } + + fn send_network_request(&self, protocol: &mut dyn Context, peer: PeerId, request: ExtraRequest) { + protocol.send_finality_proof_request(peer, message::generic::FinalityProofRequest { + id: 0, + block: request.0, + request: self.0.as_ref() + .map(|builder| builder.build_request_data(&request.0)) + .unwrap_or_default(), + }) + } + + fn peer_downloading_state(&self, block: B::Hash) -> PeerSyncState { + PeerSyncState::DownloadingFinalityProof(block) + } +} + +#[cfg(test)] +mod tests { + use client::error::Error as ClientError; + use test_client::runtime::{Block, Hash}; + use super::ExtraRequestsAggregator; + + #[test] + fn request_is_rescheduled_when_earlier_block_is_finalized() { + let _ = ::env_logger::try_init(); + + let mut extra_requests = ExtraRequestsAggregator::::new(); + + let hash4 = [4; 32].into(); + let hash5 = [5; 32].into(); + let hash6 = [6; 32].into(); + let hash7 = [7; 32].into(); + + fn is_descendent_of(base: &Hash, target: &Hash) -> Result { + Ok(target[0] >= base[0]) + } + + // make #4 last finalized block + extra_requests.finality_proofs().tree.import(hash4, 4, (), &is_descendent_of).unwrap(); + extra_requests.finality_proofs().tree.finalize_root(&hash4); + + // schedule request for #6 + extra_requests.finality_proofs().queue_request((hash6, 6), is_descendent_of); + + // receive finality proof for #5 + extra_requests.finality_proofs().importing_requests.insert((hash6, 6)); + extra_requests.finality_proofs().on_block_finalized(&hash5, 5, is_descendent_of).unwrap(); + extra_requests.finality_proofs().on_import_result((hash6, 6), Ok((hash5, 5))); + + // ensure that request for #6 is still pending + assert_eq!( + extra_requests.finality_proofs().pending_requests.iter().collect::>(), + vec![&(hash6, 6)], + ); + + // receive finality proof for #7 + extra_requests.finality_proofs().importing_requests.insert((hash6, 6)); + extra_requests.finality_proofs().on_block_finalized(&hash6, 6, is_descendent_of).unwrap(); + extra_requests.finality_proofs().on_block_finalized(&hash7, 7, is_descendent_of).unwrap(); + extra_requests.finality_proofs().on_import_result((hash6, 6), Ok((hash7, 7))); + + // ensure that there's no request for #6 + assert_eq!( + extra_requests.finality_proofs().pending_requests.iter().collect::>(), + Vec::<&(Hash, u64)>::new(), + ); + } +} diff --git a/core/network/src/util.rs b/core/network/src/protocol/util.rs similarity index 100% rename from core/network/src/util.rs rename to core/network/src/protocol/util.rs diff --git a/core/network/src/service.rs b/core/network/src/service.rs index f9e827b4ab2bbe43228b2b52ae4a045fc3215c51..6a328e854d8cbf48df06c3f026661c9770a22ede 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -15,30 +15,35 @@ // along with Substrate. If not, see . use std::collections::HashMap; +use std::io; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; -use std::{io, thread}; +use std::time::Duration; -use log::{warn, debug, error, trace, info}; -use futures::{Async, Future, Stream, stream, sync::oneshot, sync::mpsc}; +use log::{warn, debug, error, info}; +use futures::{prelude::*, sync::oneshot, sync::mpsc}; use parking_lot::{Mutex, RwLock}; -use network_libp2p::{ProtocolId, NetworkConfiguration, Severity}; -use network_libp2p::{start_service, parse_str_addr, Service as NetworkService, ServiceEvent as NetworkServiceEvent}; +use network_libp2p::{start_service, parse_str_addr, Service as Libp2pNetService, ServiceEvent as Libp2pNetServiceEvent}; use network_libp2p::{RegisteredProtocol, NetworkState}; use peerset::PeersetHandle; -use consensus::import_queue::{ImportQueue, Link}; +use consensus::import_queue::{ImportQueue, Link, SharedFinalityProofRequestBuilder}; use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; -use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; -use crate::message::Message; -use crate::protocol::{self, Context, FromNetworkMsg, Protocol, ConnectedPeer, ProtocolMsg, ProtocolStatus, PeerInfo}; +use crate::AlwaysBadChecker; +use crate::chain::FinalityProofProvider; +use crate::protocol::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; +use crate::protocol::message::Message; +use crate::protocol::on_demand::RequestData; +use crate::protocol::{self, Context, CustomMessageOutcome, Protocol, ConnectedPeer}; +use crate::protocol::{ProtocolStatus, PeerInfo, NetworkOut}; use crate::config::Params; use crate::error::Error; -use crate::specialization::NetworkSpecialization; +use crate::protocol::specialization::NetworkSpecialization; -use crossbeam_channel::{self as channel, Receiver, Sender, TryRecvError}; -use tokio::prelude::task::AtomicTask; -use tokio::runtime::Builder as RuntimeBuilder; +/// Interval at which we send status updates on the SyncProvider status stream. +const STATUS_INTERVAL: Duration = Duration::from_millis(5000); +/// Interval at which we update the `peers` field on the main thread. +const CONNECTED_PEERS_INTERVAL: Duration = Duration::from_millis(500); pub use network_libp2p::PeerId; @@ -51,8 +56,13 @@ pub trait SyncProvider: Send + Sync { fn status(&self) -> mpsc::UnboundedReceiver>; /// Get network state. fn network_state(&self) -> NetworkState; - /// Get currently connected peers - fn peers(&self) -> Vec<(PeerId, PeerInfo)>; + + /// Get currently connected peers. + /// + /// > **Warning**: This method can return outdated information and should only ever be used + /// > when obtaining outdated information is acceptable. + fn peers_debug_info(&self) -> Vec<(PeerId, PeerInfo)>; + /// Are we in the process of downloading the chain? fn is_major_syncing(&self) -> bool; } @@ -81,50 +91,72 @@ pub trait TransactionPool: Send + Sync { #[derive(Clone)] pub struct NetworkLink> { /// The protocol sender - pub(crate) protocol_sender: Sender>, + pub(crate) protocol_sender: mpsc::UnboundedSender>, /// The network sender - pub(crate) network_sender: NetworkChan, + pub(crate) network_sender: mpsc::UnboundedSender>, } impl> Link for NetworkLink { fn block_imported(&self, hash: &B::Hash, number: NumberFor) { - let _ = self.protocol_sender.send(ProtocolMsg::BlockImportedSync(hash.clone(), number)); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::BlockImportedSync(hash.clone(), number)); } fn blocks_processed(&self, processed_blocks: Vec, has_error: bool) { - let _ = self.protocol_sender.send(ProtocolMsg::BlocksProcessed(processed_blocks, has_error)); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::BlocksProcessed(processed_blocks, has_error)); } fn justification_imported(&self, who: PeerId, hash: &B::Hash, number: NumberFor, success: bool) { - let _ = self.protocol_sender.send(ProtocolMsg::JustificationImportResult(hash.clone(), number, success)); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::JustificationImportResult(hash.clone(), number, success)); if !success { - let reason = Severity::Bad(format!("Invalid justification provided for #{}", hash).to_string()); - let _ = self.network_sender.send(NetworkMsg::ReportPeer(who, reason)); + info!("Invalid justification provided by {} for #{}", who, hash); + let _ = self.network_sender.unbounded_send(NetworkMsg::ReportPeer(who.clone(), i32::min_value())); + let _ = self.network_sender.unbounded_send(NetworkMsg::DisconnectPeer(who.clone())); } } fn clear_justification_requests(&self) { - let _ = self.protocol_sender.send(ProtocolMsg::ClearJustificationRequests); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::ClearJustificationRequests); } fn request_justification(&self, hash: &B::Hash, number: NumberFor) { - let _ = self.protocol_sender.send(ProtocolMsg::RequestJustification(hash.clone(), number)); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestJustification(hash.clone(), number)); + } + + fn request_finality_proof(&self, hash: &B::Hash, number: NumberFor) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestFinalityProof( + hash.clone(), + number, + )); } - fn useless_peer(&self, who: PeerId, reason: &str) { - trace!(target:"sync", "Useless peer {}, {}", who, reason); - self.network_sender.send(NetworkMsg::ReportPeer(who, Severity::Useless(reason.to_string()))); + fn finality_proof_imported( + &self, + who: PeerId, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + let success = finalization_result.is_ok(); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::FinalityProofImportResult( + request_block, + finalization_result, + )); + if !success { + info!("Invalid finality proof provided by {} for #{}", who, request_block.0); + let _ = self.network_sender.unbounded_send(NetworkMsg::ReportPeer(who.clone(), i32::min_value())); + let _ = self.network_sender.unbounded_send(NetworkMsg::DisconnectPeer(who.clone())); + } } - fn note_useless_and_restart_sync(&self, who: PeerId, reason: &str) { - trace!(target:"sync", "Bad peer {}, {}", who, reason); - // is this actually malign or just useless? - self.network_sender.send(NetworkMsg::ReportPeer(who, Severity::Useless(reason.to_string()))); - let _ = self.protocol_sender.send(ProtocolMsg::RestartSync); + fn report_peer(&self, who: PeerId, reputation_change: i32) { + let _ = self.network_sender.unbounded_send(NetworkMsg::ReportPeer(who, reputation_change)); } fn restart(&self) { - let _ = self.protocol_sender.send(ProtocolMsg::RestartSync); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RestartSync); + } + + fn set_finality_proof_request_builder(&self, request_builder: SharedFinalityProofRequestBuilder) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::SetFinalityProofRequestBuilder(request_builder)); } } @@ -143,7 +175,7 @@ impl ReportHandle { } /// Substrate network service. Handles network IO and manages connectivity. -pub struct Service> { +pub struct NetworkService> { /// Sinks to propagate status updates. status_sinks: Arc>>>>, /// Are we connected to any peer? @@ -152,76 +184,99 @@ pub struct Service> { is_major_syncing: Arc, /// Peers whom we are connected with. peers: Arc>>>, + /// Channel for networking messages processed by the background thread. + network_chan: mpsc::UnboundedSender>, /// Network service - network: Arc>>>, + network: Arc>>>, /// Peerset manager (PSM); manages the reputation of nodes and indicates the network which /// nodes it should be connected to or not. peerset: PeersetHandle, /// Protocol sender - protocol_sender: Sender>, - /// Sender for messages to the background service task, and handle for the background thread. - /// Dropping the sender should close the task and the thread. - /// This is an `Option` because we need to extract it in the destructor. - bg_thread: Option<(oneshot::Sender<()>, thread::JoinHandle<()>)>, + protocol_sender: mpsc::UnboundedSender>, } -impl> Service { - /// Creates and register protocol with the network service - pub fn new( +impl, H: ExHashT> NetworkWorker { + /// Creates the network service. + /// + /// Returns a `NetworkWorker` that implements `Future` and must be regularly polled in order + /// for the network processing to advance. From it, you can extract a `NetworkService` using + /// `worker.service()`. The `NetworkService` can be shared through the codebase. + pub fn new( params: Params, - protocol_id: ProtocolId, - import_queue: Box>, - ) -> Result<(Arc>, NetworkChan), Error> { - let (network_chan, network_port) = network_channel(); + ) -> Result, Error> { + let (network_chan, network_port) = mpsc::unbounded(); + let (protocol_sender, protocol_rx) = mpsc::unbounded(); let status_sinks = Arc::new(Mutex::new(Vec::new())); + + // connect the import-queue to the network service. + let link = NetworkLink { + protocol_sender: protocol_sender.clone(), + network_sender: network_chan.clone(), + }; + params.import_queue.start(Box::new(link))?; + // Start in off-line mode, since we're not connected to any nodes yet. let is_offline = Arc::new(AtomicBool::new(true)); let is_major_syncing = Arc::new(AtomicBool::new(false)); let peers: Arc>>> = Arc::new(Default::default()); - let (protocol_sender, network_to_protocol_sender) = Protocol::new( - status_sinks.clone(), - is_offline.clone(), - is_major_syncing.clone(), - peers.clone(), - network_chan.clone(), - params.config, + let protocol = Protocol::new( + protocol::ProtocolConfig { roles: params.roles }, params.chain, - import_queue.clone(), - params.on_demand, - params.transaction_pool, + params.on_demand.as_ref().map(|od| od.checker().clone()) + .unwrap_or(Arc::new(AlwaysBadChecker)), params.specialization, )?; let versions: Vec<_> = ((protocol::MIN_VERSION as u8)..=(protocol::CURRENT_VERSION as u8)).collect(); - let registered = RegisteredProtocol::new(protocol_id, &versions); - let (thread, network, peerset) = start_thread( - network_to_protocol_sender, - network_port, - params.network_config, - registered, - )?; + let registered = RegisteredProtocol::new(params.protocol_id, &versions); + + // Start the main service. + let (network, peerset) = match start_service(params.network_config, registered) { + Ok((network, peerset)) => (Arc::new(Mutex::new(network)), peerset), + Err(err) => { + warn!("Error starting network: {}", err); + return Err(err.into()) + }, + }; - let service = Arc::new(Service { - status_sinks, - is_offline, - is_major_syncing, - peers, - peerset, - network, + let service = Arc::new(NetworkService { + status_sinks: status_sinks.clone(), + is_offline: is_offline.clone(), + is_major_syncing: is_major_syncing.clone(), + network_chan, + peers: peers.clone(), + peerset: peerset.clone(), + network: network.clone(), protocol_sender: protocol_sender.clone(), - bg_thread: Some(thread), }); - // connect the import-queue to the network service. - let link = NetworkLink { - protocol_sender, - network_sender: network_chan.clone(), - }; - - import_queue.start(Box::new(link))?; + Ok(NetworkWorker { + is_offline, + is_major_syncing, + network_service: network, + peerset, + service, + protocol, + peers, + import_queue: params.import_queue, + transaction_pool: params.transaction_pool, + finality_proof_provider: params.finality_proof_provider, + network_port, + protocol_rx, + status_sinks, + on_demand_in: params.on_demand.and_then(|od| od.extract_receiver()), + status_interval: tokio_timer::Interval::new_interval(STATUS_INTERVAL), + connected_peers_interval: tokio_timer::Interval::new_interval(CONNECTED_PEERS_INTERVAL), + }) + } - Ok((service, network_chan)) + /// Return a `NetworkService` that can be shared through the code base and can be used to + /// manipulate the worker. + pub fn service(&self) -> &Arc> { + &self.service } +} +impl> NetworkService { /// Returns the downloaded bytes per second averaged over the past few seconds. #[inline] pub fn average_download_per_sec(&self) -> u64 { @@ -243,19 +298,19 @@ impl> Service { pub fn on_block_imported(&self, hash: B::Hash, header: B::Header) { let _ = self .protocol_sender - .send(ProtocolMsg::BlockImported(hash, header)); + .unbounded_send(ProtocolMsg::BlockImported(hash, header)); } /// Called when a new block is finalized by the client. pub fn on_block_finalized(&self, hash: B::Hash, header: B::Header) { let _ = self .protocol_sender - .send(ProtocolMsg::BlockFinalized(hash, header)); + .unbounded_send(ProtocolMsg::BlockFinalized(hash, header)); } /// Called when new transactons are imported by the client. pub fn trigger_repropagate(&self) { - let _ = self.protocol_sender.send(ProtocolMsg::PropagateExtrinsics); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::PropagateExtrinsics); } /// Make sure an important block is propagated to peers. @@ -263,7 +318,7 @@ impl> Service { /// In chain-based consensus, we often need to make sure non-best forks are /// at least temporarily synced. pub fn announce_block(&self, hash: B::Hash) { - let _ = self.protocol_sender.send(ProtocolMsg::AnnounceBlock(hash)); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::AnnounceBlock(hash)); } /// Send a consensus message through the gossip @@ -276,38 +331,47 @@ impl> Service { ) { let _ = self .protocol_sender - .send(ProtocolMsg::GossipConsensusMessage( + .unbounded_send(ProtocolMsg::GossipConsensusMessage( topic, engine_id, message, recipient, )); } - /// Return a cloneable handle for reporting peers' benefits or misbehavior. - pub fn report_handle(&self) -> ReportHandle { - ReportHandle { inner: self.peerset.clone() } - } - /// Report a given peer as either beneficial (+) or costly (-) according to the /// given scalar. pub fn report_peer(&self, who: PeerId, cost_benefit: i32) { self.peerset.report_peer(who, cost_benefit); } + /// Send a message to the given peer. Has no effect if we're not connected to this peer. + /// + /// This method is extremely poor in terms of API and should be eventually removed. + pub fn disconnect_peer(&self, who: PeerId) { + let _ = self.network_chan.unbounded_send(NetworkMsg::DisconnectPeer(who)); + } + + /// Send a message to the given peer. Has no effect if we're not connected to this peer. + /// + /// This method is extremely poor in terms of API and should be eventually removed. + pub fn send_request(&self, who: PeerId, message: Message) { + let _ = self.network_chan.unbounded_send(NetworkMsg::Outgoing(who, message)); + } + /// Execute a closure with the chain-specific network specialization. pub fn with_spec(&self, f: F) - where F: FnOnce(&mut S, &mut Context) + Send + 'static + where F: FnOnce(&mut S, &mut dyn Context) + Send + 'static { let _ = self .protocol_sender - .send(ProtocolMsg::ExecuteWithSpec(Box::new(f))); + .unbounded_send(ProtocolMsg::ExecuteWithSpec(Box::new(f))); } /// Execute a closure with the consensus gossip. pub fn with_gossip(&self, f: F) - where F: FnOnce(&mut ConsensusGossip, &mut Context) + Send + 'static + where F: FnOnce(&mut ConsensusGossip, &mut dyn Context) + Send + 'static { let _ = self .protocol_sender - .send(ProtocolMsg::ExecuteWithGossip(Box::new(f))); + .unbounded_send(ProtocolMsg::ExecuteWithGossip(Box::new(f))); } /// Are we in the process of downloading the chain? @@ -317,7 +381,7 @@ impl> Service { } } -impl> ::consensus::SyncOracle for Service { +impl> ::consensus::SyncOracle for NetworkService { fn is_major_syncing(&self) -> bool { self.is_major_syncing() } @@ -327,18 +391,7 @@ impl> ::consensus::SyncOracle f } } -impl> Drop for Service { - fn drop(&mut self) { - if let Some((sender, join)) = self.bg_thread.take() { - let _ = sender.send(()); - if let Err(e) = join.join() { - error!("Error while waiting on background thread: {:?}", e); - } - } - } -} - -impl> SyncProvider for Service { +impl> SyncProvider for NetworkService { fn is_major_syncing(&self) -> bool { self.is_major_syncing() } @@ -354,7 +407,7 @@ impl> SyncProvider for Servi self.network.lock().state() } - fn peers(&self) -> Vec<(PeerId, PeerInfo)> { + fn peers_debug_info(&self) -> Vec<(PeerId, PeerInfo)> { let peers = (*self.peers.read()).clone(); peers.into_iter().map(|(idx, connected)| (idx, connected.peer_info)).collect() } @@ -372,7 +425,7 @@ pub trait ManageNetwork { fn add_reserved_peer(&self, peer: String) -> Result<(), String>; } -impl> ManageNetwork for Service { +impl> ManageNetwork for NetworkService { fn accept_unreserved_peers(&self) { self.peerset.set_reserved_only(false); } @@ -393,224 +446,281 @@ impl> ManageNetwork for Service } } - -/// Create a NetworkPort/Chan pair. -pub fn network_channel() -> (NetworkChan, NetworkPort) { - let (network_sender, network_receiver) = channel::unbounded(); - let task_notify = Arc::new(AtomicTask::new()); - let network_port = NetworkPort::new(network_receiver, task_notify.clone()); - let network_chan = NetworkChan::new(network_sender, task_notify); - (network_chan, network_port) +/// Messages to be handled by Libp2pNetService. +#[derive(Debug)] +pub enum NetworkMsg { + /// Send an outgoing custom message. + Outgoing(PeerId, Message), + /// Disconnect a peer we're connected to, or do nothing if we're not connected. + DisconnectPeer(PeerId), + /// Performs a reputation adjustement on a peer. + ReportPeer(PeerId, i32), + /// Synchronization response. + #[cfg(any(test, feature = "test-helpers"))] + Synchronized, } +/// Messages sent to Protocol from elsewhere inside the system. +pub enum ProtocolMsg> { + /// A batch of blocks has been processed, with or without errors. + BlocksProcessed(Vec, bool), + /// Tell protocol to restart sync. + RestartSync, + /// Tell protocol to propagate extrinsics. + PropagateExtrinsics, + /// Tell protocol that a block was imported (sent by the import-queue). + BlockImportedSync(B::Hash, NumberFor), + /// Tell protocol to clear all pending justification requests. + ClearJustificationRequests, + /// Tell protocol to request justification for a block. + RequestJustification(B::Hash, NumberFor), + /// Inform protocol whether a justification was successfully imported. + JustificationImportResult(B::Hash, NumberFor, bool), + /// Set finality proof request builder. + SetFinalityProofRequestBuilder(SharedFinalityProofRequestBuilder), + /// Tell protocol to request finality proof for a block. + RequestFinalityProof(B::Hash, NumberFor), + /// Inform protocol whether a finality proof was successfully imported. + FinalityProofImportResult((B::Hash, NumberFor), Result<(B::Hash, NumberFor), ()>), + /// Propagate a block to peers. + AnnounceBlock(B::Hash), + /// A block has been imported (sent by the client). + BlockImported(B::Hash, B::Header), + /// A block has been finalized (sent by the client). + BlockFinalized(B::Hash, B::Header), + /// Execute a closure with the chain-specific network specialization. + ExecuteWithSpec(Box + Send + 'static>), + /// Execute a closure with the consensus gossip. + ExecuteWithGossip(Box + Send + 'static>), + /// Incoming gossip consensus message. + GossipConsensusMessage(B::Hash, ConsensusEngineId, Vec, GossipMessageRecipient), + /// Tell protocol to perform regular maintenance. + #[cfg(any(test, feature = "test-helpers"))] + Tick, + /// Synchronization request. + #[cfg(any(test, feature = "test-helpers"))] + Synchronize, +} -/// A sender of NetworkMsg that notifies a task when a message has been sent. -#[derive(Clone)] -pub struct NetworkChan { - sender: Sender>, - task_notify: Arc, +/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. +pub trait SpecTask> { + fn call_box(self: Box, spec: &mut S, context: &mut dyn Context); } -impl NetworkChan { - /// Create a new network chan. - pub fn new(sender: Sender>, task_notify: Arc) -> Self { - NetworkChan { - sender, - task_notify, - } +impl, F: FnOnce(&mut S, &mut dyn Context)> SpecTask for F { + fn call_box(self: Box, spec: &mut S, context: &mut dyn Context) { + (*self)(spec, context) } +} - /// Send a messaging, to be handled on a stream. Notify the task handling the stream. - pub fn send(&self, msg: NetworkMsg) { - let _ = self.sender.send(msg); - self.task_notify.notify(); - } +/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. +pub trait GossipTask { + fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut dyn Context); } -impl Drop for NetworkChan { - /// Notifying the task when a sender is dropped(when all are dropped, the stream is finished). - fn drop(&mut self) { - self.task_notify.notify(); +impl, &mut dyn Context)> GossipTask for F { + fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut dyn Context) { + (*self)(gossip, context) } } +/// Future tied to the `Network` service and that must be polled in order for the network to +/// advance. +#[must_use = "The NetworkWorker must be polled in order for the network to work"] +pub struct NetworkWorker, H: ExHashT> { + is_offline: Arc, + is_major_syncing: Arc, + protocol: Protocol, + /// The network service that can be extracted and shared through the codebase. + service: Arc>, + network_service: Arc>>>, + peers: Arc>>>, + import_queue: Box>, + transaction_pool: Arc>, + finality_proof_provider: Option>>, + network_port: mpsc::UnboundedReceiver>, + protocol_rx: mpsc::UnboundedReceiver>, + status_sinks: Arc>>>>, + peerset: PeersetHandle, + on_demand_in: Option>>, -/// A receiver of NetworkMsg that makes the protocol-id available with each message. -pub struct NetworkPort { - receiver: Receiver>, - task_notify: Arc, + /// Interval at which we send status updates on the `status_sinks`. + status_interval: tokio_timer::Interval, + /// Interval at which we update the `connected_peers` Arc. + connected_peers_interval: tokio_timer::Interval, } -impl NetworkPort { - /// Create a new network port for a given protocol-id. - pub fn new(receiver: Receiver>, task_notify: Arc) -> Self { - Self { - receiver, - task_notify, - } - } +impl, H: ExHashT> Future for NetworkWorker { + type Item = (); + type Error = io::Error; - /// Receive a message, if any is currently-enqueued. - /// Register the current tokio task for notification when a new message is available. - pub fn take_one_message(&self) -> Result>, ()> { - self.task_notify.register(); - match self.receiver.try_recv() { - Ok(msg) => Ok(Some(msg)), - Err(TryRecvError::Empty) => Ok(None), - Err(TryRecvError::Disconnected) => Err(()), + fn poll(&mut self) -> Poll { + // Implementation of `protocol::NetworkOut` using the available local variables. + struct Context<'a, B: BlockT>(&'a mut Libp2pNetService>, &'a PeersetHandle); + impl<'a, B: BlockT> NetworkOut for Context<'a, B> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.1.report_peer(who, reputation) + } + fn disconnect_peer(&mut self, who: PeerId) { + self.0.drop_node(&who) + } + fn send_message(&mut self, who: PeerId, message: Message) { + self.0.send_custom_message(&who, message) + } } - } - /// Get a reference to the underlying crossbeam receiver. - #[cfg(any(test, feature = "test-helpers"))] - pub fn receiver(&self) -> &Receiver> { - &self.receiver - } -} + while let Ok(Async::Ready(_)) = self.status_interval.poll() { + let status = self.protocol.status(); + self.status_sinks.lock().retain(|sink| sink.unbounded_send(status.clone()).is_ok()); + } -/// Messages to be handled by NetworkService. -#[derive(Debug)] -pub enum NetworkMsg { - /// Send an outgoing custom message. - Outgoing(PeerId, Message), - /// Report a peer. - ReportPeer(PeerId, Severity), - /// Synchronization response. - #[cfg(any(test, feature = "test-helpers"))] - Synchronized, -} + while let Ok(Async::Ready(_)) = self.connected_peers_interval.poll() { + let infos = self.protocol.peers_info().map(|(id, info)| { + (id.clone(), ConnectedPeer { peer_info: info.clone() }) + }).collect(); + *self.peers.write() = infos; + } -/// Starts the background thread that handles the networking. -fn start_thread( - protocol_sender: Sender>, - network_port: NetworkPort, - config: NetworkConfiguration, - registered: RegisteredProtocol>, -) -> Result<((oneshot::Sender<()>, thread::JoinHandle<()>), Arc>>>, PeersetHandle), Error> { - // Start the main service. - let (service, peerset) = match start_service(config, registered) { - Ok((service, peerset)) => (Arc::new(Mutex::new(service)), peerset), - Err(err) => { - warn!("Error starting network: {}", err); - return Err(err.into()) - }, - }; - - let (close_tx, close_rx) = oneshot::channel(); - let service_clone = service.clone(); - let mut runtime = RuntimeBuilder::new().name_prefix("libp2p-").build()?; - let peerset_clone = peerset.clone(); - let thread = thread::Builder::new().name("network".to_string()).spawn(move || { - let fut = run_thread(protocol_sender, service_clone, network_port, peerset_clone) - .select(close_rx.then(|_| Ok(()))) - .map(|(val, _)| val) - .map_err(|(err,_ )| err); - - // Note that we use `block_on` and not `block_on_all` because we want to kill the thread - // instantly if `close_rx` receives something. - match runtime.block_on(fut) { - Ok(()) => debug!(target: "sub-libp2p", "Networking thread finished"), - Err(err) => error!(target: "sub-libp2p", "Error while running libp2p: {:?}", err), - }; - })?; + match self.protocol.poll(&mut Context(&mut self.network_service.lock(), &self.peerset), &*self.transaction_pool) { + Ok(Async::Ready(v)) => void::unreachable(v), + Ok(Async::NotReady) => {} + Err(err) => void::unreachable(err), + } - Ok(((close_tx, thread), service, peerset)) -} + // Check for new incoming on-demand requests. + if let Some(on_demand_in) = self.on_demand_in.as_mut() { + while let Ok(Async::Ready(Some(rq))) = on_demand_in.poll() { + self.protocol.add_on_demand_request(&mut Context(&mut self.network_service.lock(), &self.peerset), rq); + } + } -/// Runs the background thread that handles the networking. -fn run_thread( - protocol_sender: Sender>, - network_service: Arc>>>, - network_port: NetworkPort, - peerset: PeersetHandle, -) -> impl Future { + loop { + match self.network_port.poll() { + Ok(Async::NotReady) => break, + Ok(Async::Ready(Some(NetworkMsg::Outgoing(who, outgoing_message)))) => + self.network_service.lock().send_custom_message(&who, outgoing_message), + Ok(Async::Ready(Some(NetworkMsg::ReportPeer(who, reputation)))) => + self.peerset.report_peer(who, reputation), + Ok(Async::Ready(Some(NetworkMsg::DisconnectPeer(who)))) => + self.network_service.lock().drop_node(&who), - let network_service_2 = network_service.clone(); + #[cfg(any(test, feature = "test-helpers"))] + Ok(Async::Ready(Some(NetworkMsg::Synchronized))) => {} - // Protocol produces a stream of messages about what happens in sync. - let protocol = stream::poll_fn(move || { - match network_port.take_one_message() { - Ok(Some(message)) => Ok(Async::Ready(Some(message))), - Ok(None) => Ok(Async::NotReady), - Err(_) => Err(()) + Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), + } } - }).for_each(move |msg| { - // Handle message from Protocol. - match msg { - NetworkMsg::Outgoing(who, outgoing_message) => { - network_service_2 - .lock() - .send_custom_message(&who, outgoing_message); - }, - NetworkMsg::ReportPeer(who, severity) => { - match severity { - Severity::Bad(message) => { - info!(target: "sync", "Banning {:?} because {:?}", who, message); - network_service_2.lock().drop_node(&who); - // temporary: make sure the peer gets dropped from the peerset - peerset.report_peer(who, i32::min_value()); - }, - Severity::Useless(message) => { - debug!(target: "sync", "Dropping {:?} because {:?}", who, message); - network_service_2.lock().drop_node(&who) - }, - Severity::Timeout => { - debug!(target: "sync", "Dropping {:?} because it timed out", who); - network_service_2.lock().drop_node(&who) - }, + + loop { + let msg = match self.protocol_rx.poll() { + Ok(Async::Ready(Some(msg))) => msg, + Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), + Ok(Async::NotReady) => break, + }; + + let mut network_service = self.network_service.lock(); + let mut network_out = Context(&mut network_service, &self.peerset); + + match msg { + ProtocolMsg::BlockImported(hash, header) => + self.protocol.on_block_imported(&mut network_out, hash, &header), + ProtocolMsg::BlockFinalized(hash, header) => + self.protocol.on_block_finalized(&mut network_out, hash, &header), + ProtocolMsg::ExecuteWithSpec(task) => { + let (mut context, spec) = self.protocol.specialization_lock(&mut network_out); + task.call_box(spec, &mut context); + }, + ProtocolMsg::ExecuteWithGossip(task) => { + let (mut context, gossip) = self.protocol.consensus_gossip_lock(&mut network_out); + task.call_box(gossip, &mut context); } - }, - #[cfg(any(test, feature = "test-helpers"))] - NetworkMsg::Synchronized => (), - } - Ok(()) - }) - .then(|res| { - match res { - Ok(()) => (), - Err(_) => error!("Protocol disconnected"), - }; - Ok(()) - }); - - // The network service produces events about what happens on the network. Let's process them. - let network = stream::poll_fn(move || network_service.lock().poll()).for_each(move |event| { - match event { - NetworkServiceEvent::OpenedCustomProtocol { peer_id, version, debug_info, .. } => { - debug_assert!( - version <= protocol::CURRENT_VERSION as u8 - && version >= protocol::MIN_VERSION as u8 - ); - let _ = protocol_sender.send(FromNetworkMsg::PeerConnected(peer_id, debug_info)); - } - NetworkServiceEvent::ClosedCustomProtocol { peer_id, debug_info, .. } => { - let _ = protocol_sender.send(FromNetworkMsg::PeerDisconnected(peer_id, debug_info)); - } - NetworkServiceEvent::CustomMessage { peer_id, message, .. } => { - let _ = protocol_sender.send(FromNetworkMsg::CustomMessage(peer_id, message)); - return Ok(()) + ProtocolMsg::GossipConsensusMessage(topic, engine_id, message, recipient) => + self.protocol.gossip_consensus_message(&mut network_out, topic, engine_id, message, recipient), + ProtocolMsg::BlocksProcessed(hashes, has_error) => + self.protocol.blocks_processed(&mut network_out, hashes, has_error), + ProtocolMsg::RestartSync => + self.protocol.restart(&mut network_out), + ProtocolMsg::AnnounceBlock(hash) => + self.protocol.announce_block(&mut network_out, hash), + ProtocolMsg::BlockImportedSync(hash, number) => + self.protocol.block_imported(&hash, number), + ProtocolMsg::ClearJustificationRequests => + self.protocol.clear_justification_requests(), + ProtocolMsg::RequestJustification(hash, number) => + self.protocol.request_justification(&mut network_out, &hash, number), + ProtocolMsg::JustificationImportResult(hash, number, success) => + self.protocol.justification_import_result(hash, number, success), + ProtocolMsg::SetFinalityProofRequestBuilder(builder) => + self.protocol.set_finality_proof_request_builder(builder), + ProtocolMsg::RequestFinalityProof(hash, number) => + self.protocol.request_finality_proof(&mut network_out, &hash, number), + ProtocolMsg::FinalityProofImportResult(requested_block, finalziation_result) => + self.protocol.finality_proof_import_result(requested_block, finalziation_result), + ProtocolMsg::PropagateExtrinsics => + self.protocol.propagate_extrinsics(&mut network_out, &*self.transaction_pool), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Tick => self.protocol.tick(&mut network_out), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Synchronize => {}, } - NetworkServiceEvent::Clogged { peer_id, messages, .. } => { - debug!(target: "sync", "{} clogging messages:", messages.len()); - for msg in messages.into_iter().take(5) { - debug!(target: "sync", "{:?}", msg); - let _ = protocol_sender.send(FromNetworkMsg::PeerClogged(peer_id.clone(), Some(msg))); + } + + loop { + let mut network_service = self.network_service.lock(); + let poll_value = network_service.poll(); + let mut network_out = Context(&mut network_service, &self.peerset); + + let outcome = match poll_value { + Ok(Async::NotReady) => break, + Ok(Async::Ready(Some(Libp2pNetServiceEvent::OpenedCustomProtocol { peer_id, version, debug_info, .. }))) => { + debug_assert!( + version <= protocol::CURRENT_VERSION as u8 + && version >= protocol::MIN_VERSION as u8 + ); + self.protocol.on_peer_connected(&mut network_out, peer_id, debug_info); + CustomMessageOutcome::None + } + Ok(Async::Ready(Some(Libp2pNetServiceEvent::ClosedCustomProtocol { peer_id, debug_info, .. }))) => { + self.protocol.on_peer_disconnected(&mut network_out, peer_id, debug_info); + CustomMessageOutcome::None + }, + Ok(Async::Ready(Some(Libp2pNetServiceEvent::CustomMessage { peer_id, message, .. }))) => + self.protocol.on_custom_message( + &mut network_out, + &*self.transaction_pool, + peer_id, + message, + self.finality_proof_provider.as_ref().map(|p| &**p) + ), + Ok(Async::Ready(Some(Libp2pNetServiceEvent::Clogged { peer_id, messages, .. }))) => { + debug!(target: "sync", "{} clogging messages:", messages.len()); + for msg in messages.into_iter().take(5) { + debug!(target: "sync", "{:?}", msg); + self.protocol.on_clogged_peer(&mut network_out, peer_id.clone(), Some(msg)); + } + CustomMessageOutcome::None + } + Ok(Async::Ready(None)) => return Ok(Async::Ready(())), + Err(err) => { + error!(target: "sync", "Error in the network: {:?}", err); + return Err(err) } + }; + + match outcome { + CustomMessageOutcome::BlockImport(origin, blocks) => + self.import_queue.import_blocks(origin, blocks), + CustomMessageOutcome::JustificationImport(origin, hash, nb, justification) => + self.import_queue.import_justification(origin, hash, nb, justification), + CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) => + self.import_queue.import_finality_proof(origin, hash, nb, proof), + CustomMessageOutcome::None => {} } - }; - Ok(()) - }); - - // Merge all futures into one. - let futures: Vec + Send>> = vec![ - Box::new(protocol) as Box<_>, - Box::new(network) as Box<_> - ]; - - futures::select_all(futures) - .and_then(move |_| { - debug!("Networking ended"); - Ok(()) - }) - .map_err(|(r, _, _)| r) + } + + self.is_offline.store(self.protocol.is_offline(), Ordering::Relaxed); + self.is_major_syncing.store(self.protocol.is_major_syncing(), Ordering::Relaxed); + + Ok(Async::NotReady) + } } diff --git a/core/network/src/specialization.rs b/core/network/src/specialization.rs deleted file mode 100644 index e440097dd1f674cc5e0afc41751e9b12dd1dcce9..0000000000000000000000000000000000000000 --- a/core/network/src/specialization.rs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2017-2019 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 . - -//! Specializations of the substrate network protocol to allow more complex forms of communication. - -use crate::PeerId; -use runtime_primitives::traits::Block as BlockT; -use crate::protocol::Context; - -/// A specialization of the substrate network protocol. Handles events and sends messages. -pub trait NetworkSpecialization: Send + Sync + 'static { - /// Get the current specialization-status. - fn status(&self) -> Vec; - - /// Called when a peer successfully handshakes. - fn on_connect(&mut self, ctx: &mut Context, who: PeerId, status: crate::message::Status); - - /// Called when a peer is disconnected. If the peer ID is unknown, it should be ignored. - fn on_disconnect(&mut self, ctx: &mut Context, who: PeerId); - - /// Called when a network-specific message arrives. - fn on_message(&mut self, ctx: &mut Context, who: PeerId, message: &mut Option>); - - /// Called on abort. - fn on_abort(&mut self) { } - - /// Called periodically to maintain peers and handle timeouts. - fn maintain_peers(&mut self, _ctx: &mut Context) { } - - /// Called when a block is _imported_ at the head of the chain (not during major sync). - /// Not guaranteed to be called for every block, but will be most of the after major sync. - fn on_block_imported(&mut self, _ctx: &mut Context, _hash: B::Hash, _header: &B::Header) { } -} diff --git a/core/network/src/sync.rs b/core/network/src/sync.rs deleted file mode 100644 index 80ff8221a1a02fb844c1fcc8874c0fe27223f68a..0000000000000000000000000000000000000000 --- a/core/network/src/sync.rs +++ /dev/null @@ -1,1072 +0,0 @@ -// Copyright 2017-2019 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 . - -use std::cmp::max; -use std::collections::{HashMap, VecDeque}; -use std::time::{Duration, Instant}; -use log::{debug, trace, warn}; -use crate::protocol::Context; -use fork_tree::ForkTree; -use network_libp2p::{Severity, PeerId}; -use client::{BlockStatus, ClientInfo}; -use consensus::BlockOrigin; -use consensus::import_queue::{ImportQueue, IncomingBlock}; -use client::error::Error as ClientError; -use crate::blocks::BlockCollection; -use runtime_primitives::Justification; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor, Zero, CheckedSub}; -use runtime_primitives::generic::BlockId; -use crate::message::{self, generic::Message as GenericMessage}; -use crate::config::Roles; -use std::collections::HashSet; -use std::sync::Arc; -use std::sync::atomic::{AtomicBool, Ordering}; - -// Maximum blocks to request in a single packet. -const MAX_BLOCKS_TO_REQUEST: usize = 128; -// Maximum blocks to store in the import queue. -const MAX_IMPORTING_BLOCKS: usize = 2048; -// Number of blocks in the queue that prevents ancestry search. -const MAJOR_SYNC_BLOCKS: usize = 5; -// Time to wait before trying to get a justification from the same peer. -const JUSTIFICATION_RETRY_WAIT: Duration = Duration::from_secs(10); -// Number of recently announced blocks to track for each peer. -const ANNOUNCE_HISTORY_SIZE: usize = 64; -// Max number of blocks to download for unknown forks. -const MAX_UNKNOWN_FORK_DOWNLOAD_LEN: u32 = 32; - -#[derive(Debug)] -struct PeerSync { - pub common_number: NumberFor, - pub best_hash: B::Hash, - pub best_number: NumberFor, - pub state: PeerSyncState, - pub recently_announced: VecDeque, -} - -#[derive(Debug)] -/// Peer sync status. -pub(crate) struct PeerInfo { - /// Their best block hash. - pub best_hash: B::Hash, - /// Their best block number. - pub best_number: NumberFor, -} - -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -enum AncestorSearchState { - /// Use exponential backoff to find an ancestor, then switch to binary search. - /// We keep track of the exponent. - ExponentialBackoff(NumberFor), - /// Using binary search to find the best ancestor. - /// We keep track of left and right bounds. - BinarySearch(NumberFor, NumberFor), -} - -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -enum PeerSyncState { - AncestorSearch(NumberFor, AncestorSearchState), - Available, - DownloadingNew(NumberFor), - DownloadingStale(B::Hash), - DownloadingJustification(B::Hash), -} - -/// Pending justification request for the given block (hash and number). -type PendingJustification = (::Hash, NumberFor); - -/// Manages pending block justification requests. Multiple justifications may be -/// requested for competing forks, or for the same branch at different -/// (increasing) heights. This structure will guarantee that justifications are -/// fetched in-order, and that obsolete changes are pruned (when finalizing a -/// competing fork). -struct PendingJustifications { - justifications: ForkTree, ()>, - pending_requests: VecDeque>, - peer_requests: HashMap>, - previous_requests: HashMap, Vec<(PeerId, Instant)>>, - importing_requests: HashSet>, -} - -impl PendingJustifications { - fn new() -> PendingJustifications { - PendingJustifications { - justifications: ForkTree::new(), - pending_requests: VecDeque::new(), - peer_requests: HashMap::new(), - previous_requests: HashMap::new(), - importing_requests: HashSet::new(), - } - } - - /// Dispatches all possible pending requests to the given peers. Peers are - /// filtered according to the current known best block (i.e. we won't send a - /// justification request for block #10 to a peer at block #2), and we also - /// throttle requests to the same peer if a previous justification request - /// yielded no results. - fn dispatch(&mut self, peers: &mut HashMap>, protocol: &mut Context) { - if self.pending_requests.is_empty() { - return; - } - - let initial_pending_requests = self.pending_requests.len(); - - // clean up previous failed requests so we can retry again - for (_, requests) in self.previous_requests.iter_mut() { - requests.retain(|(_, instant)| instant.elapsed() < JUSTIFICATION_RETRY_WAIT); - } - - let mut available_peers = peers.iter().filter_map(|(peer, sync)| { - // don't request to any peers that already have pending requests or are unavailable - if sync.state != PeerSyncState::Available || self.peer_requests.contains_key(&peer) { - None - } else { - Some((peer.clone(), sync.best_number)) - } - }).collect::>(); - - let mut last_peer = available_peers.back().map(|p| p.0.clone()); - let mut unhandled_requests = VecDeque::new(); - - loop { - let (peer, peer_best_number) = match available_peers.pop_front() { - Some(p) => p, - _ => break, - }; - - // only ask peers that have synced past the block number that we're - // asking the justification for and to whom we haven't already made - // the same request recently - let peer_eligible = { - let request = match self.pending_requests.front() { - Some(r) => r.clone(), - _ => break, - }; - - peer_best_number >= request.1 && - !self.previous_requests - .get(&request) - .map(|requests| requests.iter().any(|i| i.0 == peer)) - .unwrap_or(false) - }; - - if !peer_eligible { - available_peers.push_back((peer.clone(), peer_best_number)); - - // we tried all peers and none can answer this request - if Some(peer) == last_peer { - last_peer = available_peers.back().map(|p| p.0.clone()); - - let request = self.pending_requests.pop_front() - .expect("verified to be Some in the beginning of the loop; qed"); - - unhandled_requests.push_back(request); - } - - continue; - } - - last_peer = available_peers.back().map(|p| p.0.clone()); - - let request = self.pending_requests.pop_front() - .expect("verified to be Some in the beginning of the loop; qed"); - - self.peer_requests.insert(peer.clone(), request); - - peers.get_mut(&peer) - .expect("peer was is taken from available_peers; available_peers is a subset of peers; qed") - .state = PeerSyncState::DownloadingJustification(request.0); - - trace!(target: "sync", "Requesting justification for block #{} from {}", request.0, peer); - let request = message::generic::BlockRequest { - id: 0, - fields: message::BlockAttributes::JUSTIFICATION, - from: message::FromBlock::Hash(request.0), - to: None, - direction: message::Direction::Ascending, - max: Some(1), - }; - - protocol.send_message(peer, GenericMessage::BlockRequest(request)); - } - - self.pending_requests.append(&mut unhandled_requests); - - trace!(target: "sync", "Dispatched {} justification requests ({} pending)", - initial_pending_requests - self.pending_requests.len(), - self.pending_requests.len(), - ); - } - - /// Queue a justification request (without dispatching it). - fn queue_request( - &mut self, - justification: &PendingJustification, - is_descendent_of: F, - ) where F: Fn(&B::Hash, &B::Hash) -> Result { - match self.justifications.import(justification.0.clone(), justification.1.clone(), (), &is_descendent_of) { - Ok(true) => { - // this is a new root so we add it to the current `pending_requests` - self.pending_requests.push_back((justification.0, justification.1)); - }, - Err(err) => { - warn!(target: "sync", "Failed to insert requested justification {:?} {:?} into tree: {:?}", - justification.0, - justification.1, - err, - ); - return; - }, - _ => {}, - }; - } - - /// Retry any pending request if a peer disconnected. - fn peer_disconnected(&mut self, who: PeerId) { - if let Some(request) = self.peer_requests.remove(&who) { - self.pending_requests.push_front(request); - } - } - - /// Process the import of a justification. - /// Queues a retry in case the import failed. - fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { - let request = (hash, number); - - if !self.importing_requests.remove(&request) { - debug!(target: "sync", "Got justification import result for unknown justification {:?} {:?} request.", - request.0, - request.1, - ); - - return; - }; - - if success { - if self.justifications.finalize_root(&request.0).is_none() { - warn!(target: "sync", "Imported justification for {:?} {:?} which isn't a root in the tree: {:?}", - request.0, - request.1, - self.justifications.roots().collect::>(), - ); - - return; - }; - - self.previous_requests.clear(); - self.peer_requests.clear(); - self.pending_requests = - self.justifications.roots().map(|(h, n, _)| (h.clone(), n.clone())).collect(); - - return; - } - self.pending_requests.push_front(request); - } - - /// Processes the response for the request previously sent to the given - /// peer. Queues a retry in case the given justification - /// was `None`. - fn on_response( - &mut self, - who: PeerId, - justification: Option, - import_queue: &ImportQueue, - ) { - // we assume that the request maps to the given response, this is - // currently enforced by the outer network protocol before passing on - // messages to chain sync. - if let Some(request) = self.peer_requests.remove(&who) { - if let Some(justification) = justification { - import_queue.import_justification(who.clone(), request.0, request.1, justification); - self.importing_requests.insert(request); - return - } - - self.previous_requests - .entry(request) - .or_insert(Vec::new()) - .push((who, Instant::now())); - - self.pending_requests.push_front(request); - } - } - - /// Removes any pending justification requests for blocks lower than the - /// given best finalized. - fn on_block_finalized( - &mut self, - best_finalized_hash: &B::Hash, - best_finalized_number: NumberFor, - is_descendent_of: F, - ) -> Result<(), fork_tree::Error> - where F: Fn(&B::Hash, &B::Hash) -> Result - { - if self.importing_requests.contains(&(*best_finalized_hash, best_finalized_number)) { - // we imported this justification ourselves, so we should get back a response - // from the import queue through `justification_import_result` - return Ok(()); - } - - self.justifications.finalize(best_finalized_hash, best_finalized_number, &is_descendent_of)?; - - let roots = self.justifications.roots().collect::>(); - - self.pending_requests.retain(|(h, n)| roots.contains(&(h, n, &()))); - self.peer_requests.retain(|_, (h, n)| roots.contains(&(h, n, &()))); - self.previous_requests.retain(|(h, n), _| roots.contains(&(h, n, &()))); - - Ok(()) - } - - /// Clear all data. - fn clear(&mut self) { - self.justifications = ForkTree::new(); - self.pending_requests.clear(); - self.peer_requests.clear(); - self.previous_requests.clear(); - } -} - -/// Relay chain sync strategy. -pub struct ChainSync { - genesis_hash: B::Hash, - peers: HashMap>, - blocks: BlockCollection, - best_queued_number: NumberFor, - best_queued_hash: B::Hash, - required_block_attributes: message::BlockAttributes, - justifications: PendingJustifications, - import_queue: Box>, - queue_blocks: HashSet, - best_importing_number: NumberFor, - is_stopping: AtomicBool, - is_offline: Arc, - is_major_syncing: Arc, -} - -/// Reported sync state. -#[derive(Clone, Eq, PartialEq, Debug)] -pub enum SyncState { - /// Initial sync is complete, keep-up sync is active. - Idle, - /// Actively catching up with the chain. - Downloading -} - -/// Syncing status and statistics -#[derive(Clone)] -pub struct Status { - /// Current global sync state. - pub state: SyncState, - /// Target sync block number. - pub best_seen_block: Option>, - /// Number of peers participating in syncing. - pub num_peers: u32, -} - -impl Status { - /// Whether the synchronization status is doing major downloading work or - /// is near the head of the chain. - pub fn is_major_syncing(&self) -> bool { - match self.state { - SyncState::Idle => false, - SyncState::Downloading => true, - } - } - - /// Are we all alone? - pub fn is_offline(&self) -> bool { - self.num_peers == 0 - } -} - -impl ChainSync { - /// Create a new instance. - pub(crate) fn new( - is_offline: Arc, - is_major_syncing: Arc, - role: Roles, - info: &ClientInfo, - import_queue: Box> - ) -> Self { - let mut required_block_attributes = message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION; - if role.intersects(Roles::FULL | Roles::AUTHORITY) { - required_block_attributes |= message::BlockAttributes::BODY; - } - - ChainSync { - genesis_hash: info.chain.genesis_hash, - peers: HashMap::new(), - blocks: BlockCollection::new(), - best_queued_hash: info.best_queued_hash.unwrap_or(info.chain.best_hash), - best_queued_number: info.best_queued_number.unwrap_or(info.chain.best_number), - justifications: PendingJustifications::new(), - required_block_attributes, - import_queue, - queue_blocks: Default::default(), - best_importing_number: Zero::zero(), - is_stopping: Default::default(), - is_offline, - is_major_syncing, - } - } - - fn best_seen_block(&self) -> Option> { - self.peers.values().max_by_key(|p| p.best_number).map(|p| p.best_number) - } - - fn state(&self, best_seen: &Option>) -> SyncState { - match best_seen { - &Some(n) if n > self.best_queued_number && n - self.best_queued_number > As::sa(5) => SyncState::Downloading, - _ => SyncState::Idle, - } - } - - /// Returns peer sync status (if any). - pub(crate) fn peer_info(&self, who: &PeerId) -> Option> { - self.peers.get(who).map(|peer| { - PeerInfo { - best_hash: peer.best_hash, - best_number: peer.best_number, - } - }) - } - - /// Returns sync status. - pub(crate) fn status(&self) -> Status { - let best_seen = self.best_seen_block(); - let state = self.state(&best_seen); - Status { - state: state, - best_seen_block: best_seen, - num_peers: self.peers.len() as u32, - } - } - - /// Handle new connected peer. - pub(crate) fn new_peer(&mut self, protocol: &mut Context, who: PeerId) { - // Initialize some variables to determine if - // is_offline or is_major_syncing should be updated - // after processing this new peer. - let previous_len = self.peers.len(); - let previous_best_seen = self.best_seen_block(); - let previous_state = self.state(&previous_best_seen); - - if let Some(info) = protocol.peer_info(&who) { - let status = block_status(&*protocol.client(), &self.queue_blocks, info.best_hash); - match (status, info.best_number) { - (Err(e), _) => { - debug!(target:"sync", "Error reading blockchain: {:?}", e); - let reason = format!("Error legimimately reading blockchain status: {:?}", e); - protocol.report_peer(who, Severity::Useless(reason)); - }, - (Ok(BlockStatus::KnownBad), _) => { - let reason = format!("New peer with known bad best block {} ({}).", info.best_hash, info.best_number); - protocol.report_peer(who, Severity::Bad(reason)); - }, - (Ok(BlockStatus::Unknown), b) if b == As::sa(0) => { - let reason = format!("New peer with unknown genesis hash {} ({}).", info.best_hash, info.best_number); - protocol.report_peer(who, Severity::Bad(reason)); - }, - (Ok(BlockStatus::Unknown), _) if self.queue_blocks.len() > MAJOR_SYNC_BLOCKS => { - // when actively syncing the common point moves too fast. - debug!(target:"sync", "New peer with unknown best hash {} ({}), assuming common block.", self.best_queued_hash, self.best_queued_number); - self.peers.insert(who, PeerSync { - common_number: self.best_queued_number, - best_hash: info.best_hash, - best_number: info.best_number, - state: PeerSyncState::Available, - recently_announced: Default::default(), - }); - } - (Ok(BlockStatus::Unknown), _) => { - let our_best = self.best_queued_number; - if our_best > As::sa(0) { - let common_best = ::std::cmp::min(our_best, info.best_number); - debug!(target:"sync", "New peer with unknown best hash {} ({}), searching for common ancestor.", info.best_hash, info.best_number); - self.peers.insert(who.clone(), PeerSync { - common_number: As::sa(0), - best_hash: info.best_hash, - best_number: info.best_number, - state: PeerSyncState::AncestorSearch(common_best, AncestorSearchState::ExponentialBackoff(As::sa(1))), - recently_announced: Default::default(), - }); - Self::request_ancestry(protocol, who, common_best) - } else { - // We are at genesis, just start downloading - debug!(target:"sync", "New peer with best hash {} ({}).", info.best_hash, info.best_number); - self.peers.insert(who.clone(), PeerSync { - common_number: As::sa(0), - best_hash: info.best_hash, - best_number: info.best_number, - state: PeerSyncState::Available, - recently_announced: Default::default(), - }); - self.download_new(protocol, who) - } - }, - (Ok(BlockStatus::Queued), _) | (Ok(BlockStatus::InChainWithState), _) | (Ok(BlockStatus::InChainPruned), _) => { - debug!(target:"sync", "New peer with known best hash {} ({}).", info.best_hash, info.best_number); - self.peers.insert(who.clone(), PeerSync { - common_number: info.best_number, - best_hash: info.best_hash, - best_number: info.best_number, - state: PeerSyncState::Available, - recently_announced: Default::default(), - }); - } - } - } - - let current_best_seen = self.best_seen_block(); - let current_state = self.state(¤t_best_seen); - let current_len = self.peers.len(); - if previous_len == 0 && current_len > 0 { - // We were offline, and now we're connected to at least one peer. - self.is_offline.store(false, Ordering::Relaxed); - } - if previous_len < current_len { - // We added a peer, let's see if major_syncing should be updated. - match (previous_state, current_state) { - (SyncState::Idle, SyncState::Downloading) => self.is_major_syncing.store(true, Ordering::Relaxed), - (SyncState::Downloading, SyncState::Idle) => self.is_major_syncing.store(false, Ordering::Relaxed), - _ => {}, - } - } - } - - fn handle_ancestor_search_state( - state: AncestorSearchState, - curr_block_num: NumberFor, - block_hash_match: bool, - ) -> Option<(AncestorSearchState, NumberFor)> { - match state { - AncestorSearchState::ExponentialBackoff(next_distance_to_tip) => { - if block_hash_match && next_distance_to_tip == As::sa(1) { - // We found the ancestor in the first step so there is no need to execute binary search. - return None; - } - if block_hash_match { - let left = curr_block_num; - let right = left + next_distance_to_tip / As::sa(2); - let middle = left + (right - left) / As::sa(2); - Some((AncestorSearchState::BinarySearch(left, right), middle)) - } else { - let next_block_num = curr_block_num.checked_sub(&next_distance_to_tip).unwrap_or(As::sa(0)); - let next_distance_to_tip = next_distance_to_tip * As::sa(2); - Some((AncestorSearchState::ExponentialBackoff(next_distance_to_tip), next_block_num)) - } - }, - AncestorSearchState::BinarySearch(mut left, mut right) => { - if left >= curr_block_num { - return None; - } - if block_hash_match { - left = curr_block_num; - } else { - right = curr_block_num; - } - assert!(right >= left); - let middle = left + (right - left) / As::sa(2); - Some((AncestorSearchState::BinarySearch(left, right), middle)) - }, - } - } - - /// Handle new block data. - pub(crate) fn on_block_data( - &mut self, - protocol: &mut Context, - who: PeerId, - request: message::BlockRequest, - response: message::BlockResponse - ) { - let new_blocks: Vec> = if let Some(ref mut peer) = self.peers.get_mut(&who) { - let mut blocks = response.blocks; - if request.direction == message::Direction::Descending { - trace!(target: "sync", "Reversing incoming block list"); - blocks.reverse(); - } - let peer_state = peer.state.clone(); - match peer_state { - PeerSyncState::DownloadingNew(start_block) => { - self.blocks.clear_peer_download(&who); - peer.state = PeerSyncState::Available; - self.blocks.insert(start_block, blocks, who); - self.blocks - .drain(self.best_queued_number + As::sa(1)) - .into_iter() - .map(|block_data| { - IncomingBlock { - hash: block_data.block.hash, - header: block_data.block.header, - body: block_data.block.body, - justification: block_data.block.justification, - origin: block_data.origin, - } - }).collect() - }, - PeerSyncState::DownloadingStale(_) => { - peer.state = PeerSyncState::Available; - blocks.into_iter().map(|b| { - IncomingBlock { - hash: b.hash, - header: b.header, - body: b.body, - justification: b.justification, - origin: Some(who.clone()), - } - }).collect() - }, - PeerSyncState::AncestorSearch(num, state) => { - let block_hash_match = match (blocks.get(0), protocol.client().block_hash(num)) { - (Some(ref block), Ok(maybe_our_block_hash)) => { - trace!(target: "sync", "Got ancestry block #{} ({}) from peer {}", num, block.hash, who); - maybe_our_block_hash.map_or(false, |x| x == block.hash) - }, - (None, _) => { - trace!(target:"sync", "Invalid response when searching for ancestor from {}", who); - protocol.report_peer(who, Severity::Bad("Invalid response when searching for ancestor".to_string())); - return; - }, - (_, Err(e)) => { - let reason = format!("Error answering legitimate blockchain query: {:?}", e); - protocol.report_peer(who, Severity::Useless(reason)); - return; - }, - }; - if block_hash_match && peer.common_number < num { - peer.common_number = num; - } - if !block_hash_match && num == As::sa(0) { - trace!(target:"sync", "Ancestry search: genesis mismatch for peer {}", who); - protocol.report_peer(who, Severity::Bad("Ancestry search: genesis mismatch for peer".to_string())); - return; - } - if let Some((next_state, next_block_num)) = Self::handle_ancestor_search_state(state, num, block_hash_match) { - peer.state = PeerSyncState::AncestorSearch(next_block_num, next_state); - Self::request_ancestry(protocol, who, next_block_num); - return; - } else { - peer.state = PeerSyncState::Available; - vec![] - } - }, - PeerSyncState::Available | PeerSyncState::DownloadingJustification(..) => Vec::new(), - } - } else { - Vec::new() - }; - - let is_recent = new_blocks - .first() - .map(|block| self.peers.iter().any(|(_, peer)| peer.recently_announced.contains(&block.hash))) - .unwrap_or(false); - let origin = if is_recent { BlockOrigin::NetworkBroadcast } else { BlockOrigin::NetworkInitialSync }; - - if let Some((hash, number)) = new_blocks.last() - .and_then(|b| b.header.as_ref().map(|h| (b.hash.clone(), *h.number()))) - { - trace!(target:"sync", "Accepted {} blocks ({:?}) with origin {:?}", new_blocks.len(), hash, origin); - self.block_queued(&hash, number); - } - self.maintain_sync(protocol); - let new_best_importing_number = new_blocks - .last() - .and_then(|b| b.header.as_ref().map(|h| h.number().clone())) - .unwrap_or_else(|| Zero::zero()); - self.queue_blocks - .extend(new_blocks.iter().map(|b| b.hash.clone())); - self.best_importing_number = max(new_best_importing_number, self.best_importing_number); - self.import_queue.import_blocks(origin, new_blocks); - } - - /// Handle new justification data. - pub(crate) fn on_block_justification_data( - &mut self, - protocol: &mut Context, - who: PeerId, - _request: message::BlockRequest, - response: message::BlockResponse, - ) { - if let Some(ref mut peer) = self.peers.get_mut(&who) { - if let PeerSyncState::DownloadingJustification(hash) = peer.state { - peer.state = PeerSyncState::Available; - - // we only request one justification at a time - match response.blocks.into_iter().next() { - Some(response) => { - if hash != response.hash { - let msg = format!( - "Invalid block justification provided: requested: {:?} got: {:?}", - hash, - response.hash, - ); - - protocol.report_peer(who, Severity::Bad(msg)); - return; - } - - self.justifications.on_response( - who, - response.justification, - &*self.import_queue, - ); - }, - None => { - // we might have asked the peer for a justification on a block that we thought it had - // (regardless of whether it had a justification for it or not). - trace!(target: "sync", "Peer {:?} provided empty response for justification request {:?}", - who, - hash, - ); - return; - }, - } - } - } - - self.maintain_sync(protocol); - } - - /// A batch of blocks have been processed, with or without errors. - pub fn blocks_processed(&mut self, processed_blocks: Vec, has_error: bool) { - for hash in processed_blocks { - self.queue_blocks.remove(&hash); - } - if has_error { - self.best_importing_number = Zero::zero(); - } - } - - /// Maintain the sync process (download new blocks, fetch justifications). - pub fn maintain_sync(&mut self, protocol: &mut Context) { - if self.is_stopping.load(Ordering::SeqCst) { - return - } - let peers: Vec = self.peers.keys().map(|p| p.clone()).collect(); - for peer in peers { - self.download_new(protocol, peer); - } - self.justifications.dispatch(&mut self.peers, protocol); - } - - /// Called periodically to perform any time-based actions. - pub fn tick(&mut self, protocol: &mut Context) { - self.justifications.dispatch(&mut self.peers, protocol); - } - - /// Request a justification for the given block. - /// - /// Queues a new justification request and tries to dispatch all pending requests. - pub fn request_justification(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut Context) { - self.justifications.queue_request( - &(*hash, number), - |base, block| protocol.client().is_descendent_of(base, block), - ); - - self.justifications.dispatch(&mut self.peers, protocol); - } - - /// Clears all pending justification requests. - pub fn clear_justification_requests(&mut self) { - self.justifications.clear(); - } - - pub fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { - self.justifications.justification_import_result(hash, number, success); - } - - pub fn stop(&self) { - self.is_stopping.store(true, Ordering::SeqCst); - self.import_queue.stop(); - } - - /// Notify about successful import of the given block. - pub fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { - trace!(target: "sync", "Block imported successfully {} ({})", number, hash); - } - - /// Notify about finalization of the given block. - pub fn on_block_finalized(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut Context) { - if let Err(err) = self.justifications.on_block_finalized( - hash, - number, - |base, block| protocol.client().is_descendent_of(base, block), - ) { - warn!(target: "sync", "Error cleaning up pending justification requests: {:?}", err); - }; - } - - fn block_queued(&mut self, hash: &B::Hash, number: NumberFor) { - let best_seen = self.best_seen_block(); - let previous_state = self.state(&best_seen); - if number > self.best_queued_number { - self.best_queued_number = number; - self.best_queued_hash = *hash; - } - let current_state = self.state(&best_seen); - // If the latest queued block changed our state, update is_major_syncing. - match (previous_state, current_state) { - (SyncState::Idle, SyncState::Downloading) => self.is_major_syncing.store(true, Ordering::Relaxed), - (SyncState::Downloading, SyncState::Idle) => self.is_major_syncing.store(false, Ordering::Relaxed), - _ => {}, - } - // Update common blocks - for (n, peer) in self.peers.iter_mut() { - if let PeerSyncState::AncestorSearch(_, _) = peer.state { - // Abort search. - peer.state = PeerSyncState::Available; - } - trace!(target: "sync", "Updating peer {} info, ours={}, common={}, their best={}", n, number, peer.common_number, peer.best_number); - if peer.best_number >= number { - peer.common_number = number; - } else { - peer.common_number = peer.best_number; - } - } - } - - pub(crate) fn update_chain_info(&mut self, best_header: &B::Header) { - let hash = best_header.hash(); - self.block_queued(&hash, best_header.number().clone()) - } - - /// Handle new block announcement. - pub(crate) fn on_block_announce(&mut self, protocol: &mut Context, who: PeerId, hash: B::Hash, header: &B::Header) { - let number = *header.number(); - if number <= As::sa(0) { - trace!(target: "sync", "Ignored invalid block announcement from {}: {}", who, hash); - return; - } - let parent_status = block_status(&*protocol.client(), &self.queue_blocks, header.parent_hash().clone()).ok() - .unwrap_or(BlockStatus::Unknown); - let known_parent = parent_status != BlockStatus::Unknown; - let ancient_parent = parent_status == BlockStatus::InChainPruned; - - let known = self.is_known(protocol, &hash); - if let Some(ref mut peer) = self.peers.get_mut(&who) { - while peer.recently_announced.len() >= ANNOUNCE_HISTORY_SIZE { - peer.recently_announced.pop_front(); - } - peer.recently_announced.push_back(hash.clone()); - if number > peer.best_number { - // update their best block - peer.best_number = number; - peer.best_hash = hash; - } - if let PeerSyncState::AncestorSearch(_, _) = peer.state { - return; - } - if header.parent_hash() == &self.best_queued_hash || known_parent { - peer.common_number = number - As::sa(1); - } else if known { - peer.common_number = number - } - } else { - return; - } - - if !(known || self.is_already_downloading(&hash)) { - let stale = number <= self.best_queued_number; - if stale { - if !(known_parent || self.is_already_downloading(header.parent_hash())) { - if protocol.client().block_status(&BlockId::Number(*header.number())) - .unwrap_or(BlockStatus::Unknown) == BlockStatus::InChainPruned - { - trace!(target: "sync", "Ignored unknown ancient block announced from {}: {} {:?}", who, hash, header); - } else { - trace!(target: "sync", "Considering new unknown stale block announced from {}: {} {:?}", who, hash, header); - self.download_unknown_stale(protocol, who, &hash); - } - } else { - if ancient_parent { - trace!(target: "sync", "Ignored ancient stale block announced from {}: {} {:?}", who, hash, header); - } else { - self.download_stale(protocol, who, &hash); - } - } - } else { - if ancient_parent { - trace!(target: "sync", "Ignored ancient block announced from {}: {} {:?}", who, hash, header); - } else { - trace!(target: "sync", "Considering new block announced from {}: {} {:?}", who, hash, header); - self.download_new(protocol, who); - } - } - } else { - trace!(target: "sync", "Known block announce from {}: {}", who, hash); - } - } - - fn is_already_downloading(&self, hash: &B::Hash) -> bool { - self.peers.iter().any(|(_, p)| p.state == PeerSyncState::DownloadingStale(*hash)) - } - - fn is_known(&self, protocol: &mut Context, hash: &B::Hash) -> bool { - block_status(&*protocol.client(), &self.queue_blocks, *hash).ok().map_or(false, |s| s != BlockStatus::Unknown) - } - - /// Handle disconnected peer. - pub(crate) fn peer_disconnected(&mut self, protocol: &mut Context, who: PeerId) { - let previous_best_seen = self.best_seen_block(); - let previous_state = self.state(&previous_best_seen); - self.blocks.clear_peer_download(&who); - self.peers.remove(&who); - if self.peers.len() == 0 { - // We're not connected to any peer anymore. - self.is_offline.store(true, Ordering::Relaxed); - } - let current_best_seen = self.best_seen_block(); - let current_state = self.state(¤t_best_seen); - // We removed a peer, let's see if this put us in idle state and is_major_syncing should be updated. - match (previous_state, current_state) { - (SyncState::Downloading, SyncState::Idle) => self.is_major_syncing.store(false, Ordering::Relaxed), - _ => {}, - } - self.justifications.peer_disconnected(who); - self.maintain_sync(protocol); - } - - /// Restart the sync process. - pub(crate) fn restart(&mut self, protocol: &mut Context) { - self.queue_blocks.clear(); - self.best_importing_number = Zero::zero(); - self.blocks.clear(); - match protocol.client().info() { - Ok(info) => { - self.best_queued_hash = info.best_queued_hash.unwrap_or(info.chain.best_hash); - self.best_queued_number = info.best_queued_number.unwrap_or(info.chain.best_number); - debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); - }, - Err(e) => { - debug!(target:"sync", "Error reading blockchain: {:?}", e); - self.best_queued_hash = self.genesis_hash; - self.best_queued_number = As::sa(0); - } - } - let ids: Vec = self.peers.drain().map(|(id, _)| id).collect(); - for id in ids { - self.new_peer(protocol, id); - } - } - - /// Clear all sync data. - pub(crate) fn clear(&mut self) { - self.blocks.clear(); - self.peers.clear(); - } - - // Download old block with known parent. - fn download_stale(&mut self, protocol: &mut Context, who: PeerId, hash: &B::Hash) { - if let Some(ref mut peer) = self.peers.get_mut(&who) { - match peer.state { - PeerSyncState::Available => { - let request = message::generic::BlockRequest { - id: 0, - fields: self.required_block_attributes.clone(), - from: message::FromBlock::Hash(*hash), - to: None, - direction: message::Direction::Ascending, - max: Some(1), - }; - peer.state = PeerSyncState::DownloadingStale(*hash); - protocol.send_message(who, GenericMessage::BlockRequest(request)); - }, - _ => (), - } - } - } - - // Download old block with unknown parent. - fn download_unknown_stale(&mut self, protocol: &mut Context, who: PeerId, hash: &B::Hash) { - if let Some(ref mut peer) = self.peers.get_mut(&who) { - match peer.state { - PeerSyncState::Available => { - let request = message::generic::BlockRequest { - id: 0, - fields: self.required_block_attributes.clone(), - from: message::FromBlock::Hash(*hash), - to: None, - direction: message::Direction::Descending, - max: Some(MAX_UNKNOWN_FORK_DOWNLOAD_LEN), - }; - peer.state = PeerSyncState::DownloadingStale(*hash); - protocol.send_message(who, GenericMessage::BlockRequest(request)); - }, - _ => (), - } - } - } - - // Issue a request for a peer to download new blocks, if any are available - fn download_new(&mut self, protocol: &mut Context, who: PeerId) { - if let Some(ref mut peer) = self.peers.get_mut(&who) { - // when there are too many blocks in the queue => do not try to download new blocks - if self.queue_blocks.len() > MAX_IMPORTING_BLOCKS { - trace!(target: "sync", "Too many blocks in the queue."); - return; - } - match peer.state { - PeerSyncState::Available => { - trace!(target: "sync", "Considering new block download from {}, common block is {}, best is {:?}", who, peer.common_number, peer.best_number); - if let Some(range) = self.blocks.needed_blocks(who.clone(), MAX_BLOCKS_TO_REQUEST, peer.best_number, peer.common_number) { - trace!(target: "sync", "Requesting blocks from {}, ({} to {})", who, range.start, range.end); - let request = message::generic::BlockRequest { - id: 0, - fields: self.required_block_attributes.clone(), - from: message::FromBlock::Number(range.start), - to: None, - direction: message::Direction::Ascending, - max: Some((range.end - range.start).as_() as u32), - }; - peer.state = PeerSyncState::DownloadingNew(range.start); - protocol.send_message(who, GenericMessage::BlockRequest(request)); - } else { - trace!(target: "sync", "Nothing to request"); - } - }, - _ => trace!(target: "sync", "Peer {} is busy", who), - } - } - } - - fn request_ancestry(protocol: &mut Context, who: PeerId, block: NumberFor) { - trace!(target: "sync", "Requesting ancestry block #{} from {}", block, who); - let request = message::generic::BlockRequest { - id: 0, - fields: message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION, - from: message::FromBlock::Number(block), - to: None, - direction: message::Direction::Ascending, - max: Some(1), - }; - protocol.send_message(who, GenericMessage::BlockRequest(request)); - } -} - -/// Get block status, taking into account import queue. -fn block_status( - chain: &crate::chain::Client, - queue_blocks: &HashSet, - hash: B::Hash) -> Result -{ - if queue_blocks.contains(&hash) { - return Ok(BlockStatus::Queued); - } - - chain.block_status(&BlockId::Hash(hash)) -} diff --git a/core/network/src/test/block_import.rs b/core/network/src/test/block_import.rs index 3b5e44cc47e5a76d1b2b65de3ded66a0f78abdfa..4cf639484f58feb76ed54bca41fb1ec218c15454 100644 --- a/core/network/src/test/block_import.rs +++ b/core/network/src/test/block_import.rs @@ -26,9 +26,14 @@ struct TestLink {} impl Link for TestLink {} -fn prepare_good_block() -> (client::Client, Hash, u64, PeerId, IncomingBlock) { +fn prepare_good_block() -> (client::Client< + test_client::Backend, + test_client::Executor, + Block, + test_client::runtime::RuntimeApi, + >, Hash, u64, PeerId, IncomingBlock) { let client = test_client::new(); - let block = client.new_block().unwrap().bake().unwrap(); + let block = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::File, block).unwrap(); let (hash, number) = (client.block_hash(1).unwrap().unwrap(), 1); @@ -77,7 +82,7 @@ fn async_import_queue_drops() { // Perform this test multiple times since it exhibits non-deterministic behavior. for _ in 0..100 { let verifier = Arc::new(PassThroughVerifier(true)); - let queue = BasicQueue::new(verifier, Arc::new(test_client::new()), None); + let queue = BasicQueue::new(verifier, Arc::new(test_client::new()), None, None, None); queue.start(Box::new(TestLink{})).unwrap(); drop(queue); } diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 46636fa11f2dd08dad4433334703c203e0910bf6..886a09fa2a10ba3421ccdd785cf20e82d09ba034 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -23,29 +23,33 @@ mod sync; use std::collections::{HashMap, HashSet, VecDeque}; use std::sync::Arc; -use std::sync::atomic::AtomicBool; +use crate::AlwaysBadChecker; use log::trace; -use client; +use crate::chain::FinalityProofProvider; +use client::{self, ClientInfo, BlockchainEvents, FinalityNotifications}; +use client::{in_mem::Backend as InMemoryBackend, error::Result as ClientResult}; use client::block_builder::BlockBuilder; -use crate::config::ProtocolConfig; +use client::backend::AuxStore; +use crate::config::Roles; use consensus::import_queue::{BasicQueue, ImportQueue, IncomingBlock}; -use consensus::import_queue::{Link, SharedBlockImport, SharedJustificationImport, Verifier}; -use consensus::{Error as ConsensusError, ErrorKind as ConsensusErrorKind}; +use consensus::import_queue::{ + Link, SharedBlockImport, SharedJustificationImport, Verifier, SharedFinalityProofImport, + SharedFinalityProofRequestBuilder, +}; +use consensus::{Error as ConsensusError}; use consensus::{BlockOrigin, ForkChoiceStrategy, ImportBlock, JustificationImport}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient, TopicNotification}; -use crossbeam_channel::{Sender, RecvError}; -use futures::Future; -use futures::sync::{mpsc, oneshot}; +use futures::{prelude::*, sync::{mpsc, oneshot}}; use crate::message::Message; use network_libp2p::PeerId; use parking_lot::{Mutex, RwLock}; -use primitives::{H256, ed25519::Public as AuthorityId}; -use crate::protocol::{ConnectedPeer, Context, FromNetworkMsg, Protocol, ProtocolMsg}; +use primitives::{H256, sr25519::Public as AuthorityId, Blake2Hasher}; +use crate::protocol::{Context, Protocol, ProtocolConfig, ProtocolStatus, CustomMessageOutcome, NetworkOut}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{AuthorityIdFor, Block as BlockT, Digest, DigestItem, Header, NumberFor}; use runtime_primitives::{Justification, ConsensusEngineId}; -use crate::service::{network_channel, NetworkChan, NetworkLink, NetworkMsg, NetworkPort, TransactionPool}; +use crate::service::{NetworkLink, NetworkMsg, ProtocolMsg, TransactionPool}; use crate::specialization::NetworkSpecialization; use test_client::{self, AccountKeyring}; @@ -58,7 +62,7 @@ pub use test_client::TestClient; pub struct PassThroughVerifier(pub bool); #[cfg(any(test, feature = "test-helpers"))] -/// This Verifiyer accepts all data as valid +/// This `Verifier` accepts all data as valid. impl Verifier for PassThroughVerifier { fn verify( &self, @@ -97,37 +101,123 @@ impl NetworkSpecialization for DummySpecialization { vec![] } - fn on_connect(&mut self, _ctx: &mut Context, _peer_id: PeerId, _status: crate::message::Status) { - } + fn on_connect( + &mut self, + _ctx: &mut dyn Context, + _peer_id: PeerId, + _status: crate::message::Status + ) {} - fn on_disconnect(&mut self, _ctx: &mut Context, _peer_id: PeerId) { - } + fn on_disconnect(&mut self, _ctx: &mut dyn Context, _peer_id: PeerId) {} fn on_message( &mut self, - _ctx: &mut Context, + _ctx: &mut dyn Context, _peer_id: PeerId, _message: &mut Option>, - ) { - } + ) {} +} + +pub type PeersFullClient = + client::Client; +pub type PeersLightClient = + client::Client; + +#[derive(Clone)] +pub enum PeersClient { + Full(Arc), + Light(Arc), } -pub type PeersClient = client::Client; +impl PeersClient { + pub fn as_full(&self) -> Option> { + match *self { + PeersClient::Full(ref client) => Some(client.clone()), + _ => None, + } + } + + pub fn as_block_import(&self) -> SharedBlockImport { + match *self { + PeersClient::Full(ref client) => client.clone() as _, + PeersClient::Light(ref client) => client.clone() as _, + } + } + + pub fn as_in_memory_backend(&self) -> InMemoryBackend { + #[allow(deprecated)] + match *self { + PeersClient::Full(ref client) => client.backend().as_in_memory(), + PeersClient::Light(_) => unimplemented!("TODO"), + } + } + + pub fn get_aux(&self, key: &[u8]) -> ClientResult>> { + #[allow(deprecated)] + match *self { + PeersClient::Full(ref client) => client.backend().get_aux(key), + PeersClient::Light(ref client) => client.backend().get_aux(key), + } + } + + pub fn info(&self) -> ClientInfo { + match *self { + PeersClient::Full(ref client) => client.info(), + PeersClient::Light(ref client) => client.info(), + } + } + + pub fn header(&self, block: &BlockId) -> ClientResult::Header>> { + match *self { + PeersClient::Full(ref client) => client.header(block), + PeersClient::Light(ref client) => client.header(block), + } + } + + pub fn justification(&self, block: &BlockId) -> ClientResult> { + match *self { + PeersClient::Full(ref client) => client.justification(block), + PeersClient::Light(ref client) => client.justification(block), + } + } + + pub fn finality_notification_stream(&self) -> FinalityNotifications { + match *self { + PeersClient::Full(ref client) => client.finality_notification_stream(), + PeersClient::Light(ref client) => client.finality_notification_stream(), + } + } + + pub fn finalize_block( + &self, + id: BlockId, + justification: Option, + notify: bool + ) -> ClientResult<()> { + match *self { + PeersClient::Full(ref client) => client.finalize_block(id, justification, notify), + PeersClient::Light(ref client) => client.finalize_block(id, justification, notify), + } + } +} /// A Link that can wait for a block to have been imported. pub struct TestLink> { link: NetworkLink, - network_to_protocol_sender: Sender>, + + #[cfg(any(test, feature = "test-helpers"))] + network_to_protocol_sender: mpsc::UnboundedSender>, } impl> TestLink { fn new( - protocol_sender: Sender>, - network_to_protocol_sender: Sender>, - network_sender: NetworkChan + protocol_sender: mpsc::UnboundedSender>, + _network_to_protocol_sender: mpsc::UnboundedSender>, + network_sender: mpsc::UnboundedSender> ) -> TestLink { TestLink { - network_to_protocol_sender, + #[cfg(any(test, feature = "test-helpers"))] + network_to_protocol_sender: _network_to_protocol_sender, link: NetworkLink { protocol_sender, network_sender, @@ -153,84 +243,125 @@ impl> Link for TestLink { self.link.request_justification(hash, number); } - fn useless_peer(&self, who: PeerId, reason: &str) { - self.link.useless_peer(who, reason); + fn finality_proof_imported( + &self, + who: PeerId, + request_block: (Hash, NumberFor), + finalization_result: Result<(Hash, NumberFor), ()>, + ) { + self.link.finality_proof_imported(who, request_block, finalization_result); + } + + fn request_finality_proof(&self, hash: &Hash, number: NumberFor) { + self.link.request_finality_proof(hash, number); + } + + fn set_finality_proof_request_builder(&self, request_builder: SharedFinalityProofRequestBuilder) { + self.link.set_finality_proof_request_builder(request_builder); } - fn note_useless_and_restart_sync(&self, who: PeerId, reason: &str) { - self.link.note_useless_and_restart_sync(who, reason); + fn report_peer(&self, who: PeerId, reputation_change: i32) { + self.link.report_peer(who, reputation_change); } fn restart(&self) { self.link.restart(); } + /// Send synchronization request to the block import channel. + /// + /// The caller should wait for the `Link::synchronized` call to ensure that it has synchronized + /// with `ImportQueue`. + #[cfg(any(test, feature = "test-helpers"))] fn synchronized(&self) { - let _ = self.network_to_protocol_sender.send(FromNetworkMsg::Synchronize); + drop(self.network_to_protocol_sender.unbounded_send(FromNetworkMsg::Synchronize)) } } pub struct Peer> { - pub is_offline: Arc, - pub is_major_syncing: Arc, - pub peers: Arc>>>, - pub peer_id: PeerId, - client: Arc, + peer_id: PeerId, + client: PeersClient, net_proto_channel: ProtocolChannel, - pub import_queue: Box>, + protocol_status: Arc>>, + import_queue: Box>, pub data: D, best_hash: Mutex>, finalized_hash: Mutex>, } -type MessageFilter = Fn(&NetworkMsg) -> bool; +type MessageFilter = dyn Fn(&NetworkMsg) -> bool; + +pub enum FromNetworkMsg { + /// A peer connected, with debug info. + PeerConnected(PeerId, String), + /// A peer disconnected, with debug info. + PeerDisconnected(PeerId, String), + /// A custom message from another peer. + CustomMessage(PeerId, Message), + /// Synchronization request. + Synchronize, +} struct ProtocolChannel> { + /// If true, we expect a tokio executor to be available. If false, we spawn our own. + use_tokio: bool, buffered_messages: Mutex>>, - network_to_protocol_sender: Sender>, - client_to_protocol_sender: Sender>, - protocol_to_network_receiver: NetworkPort, + network_to_protocol_sender: mpsc::UnboundedSender>, + client_to_protocol_sender: mpsc::UnboundedSender>, + protocol_to_network_receiver: Mutex>>, } impl> ProtocolChannel { /// Create new buffered network port. pub fn new( - network_to_protocol_sender: Sender>, - client_to_protocol_sender: Sender>, - protocol_to_network_receiver: NetworkPort, + use_tokio: bool, + network_to_protocol_sender: mpsc::UnboundedSender>, + client_to_protocol_sender: mpsc::UnboundedSender>, + protocol_to_network_receiver: mpsc::UnboundedReceiver>, ) -> Self { ProtocolChannel { + use_tokio, buffered_messages: Mutex::new(VecDeque::new()), network_to_protocol_sender, client_to_protocol_sender, - protocol_to_network_receiver, + protocol_to_network_receiver: Mutex::new(protocol_to_network_receiver), } } /// Send message from network to protocol. pub fn send_from_net(&self, message: FromNetworkMsg) { - let _ = self.network_to_protocol_sender.send(message); + let _ = self.network_to_protocol_sender.unbounded_send(message); - let _ = self.network_to_protocol_sender.send(FromNetworkMsg::Synchronize); + let _ = self.network_to_protocol_sender.unbounded_send(FromNetworkMsg::Synchronize); let _ = self.wait_sync(); } /// Send message from client to protocol. pub fn send_from_client(&self, message: ProtocolMsg) { - let _ = self.client_to_protocol_sender.send(message); + let _ = self.client_to_protocol_sender.unbounded_send(message); - let _ = self.client_to_protocol_sender.send(ProtocolMsg::Synchronize); + let _ = self.client_to_protocol_sender.unbounded_send(ProtocolMsg::Synchronize); let _ = self.wait_sync(); } /// Wait until synchronization response is generated by the protocol. - pub fn wait_sync(&self) -> Result<(), RecvError> { - loop { - match self.protocol_to_network_receiver.receiver().recv() { - Ok(NetworkMsg::Synchronized) => return Ok(()), - Err(error) => return Err(error), - Ok(msg) => self.buffered_messages.lock().push_back(msg), + pub fn wait_sync(&self) -> Result<(), ()> { + let fut = futures::future::poll_fn(|| { + loop { + let mut protocol_to_network_receiver = self.protocol_to_network_receiver.lock(); + match protocol_to_network_receiver.poll() { + Ok(Async::Ready(Some(NetworkMsg::Synchronized))) => return Ok(Async::Ready(())), + Ok(Async::Ready(None)) | Err(_) => return Err(()), + Ok(Async::NotReady) => return Ok(Async::NotReady), + Ok(Async::Ready(Some(msg))) => self.buffered_messages.lock().push_back(msg), + } } + }); + + if self.use_tokio { + fut.wait() + } else { + tokio::runtime::current_thread::block_on_all(fut) } } @@ -253,8 +384,13 @@ impl> ProtocolChannel { /// Whether this peer is done syncing (has no messages to send). fn is_done(&self) -> bool { - self.buffered_messages.lock().is_empty() - && self.protocol_to_network_receiver.receiver().is_empty() + let mut buffered_messages = self.buffered_messages.lock(); + if let Some(msg) = self.channel_message() { + buffered_messages.push_back(msg); + false + } else { + buffered_messages.is_empty() + } } /// Return oldest buffered message if it exists. @@ -271,24 +407,37 @@ impl> ProtocolChannel { /// Receive message from the channel. fn channel_message(&self) -> Option> { - self.protocol_to_network_receiver.receiver().try_recv().ok() + let fut = futures::future::poll_fn(|| -> Result<_, ()> { + Ok(Async::Ready(match self.protocol_to_network_receiver.lock().poll() { + Ok(Async::Ready(Some(m))) => Some(m), + Ok(Async::NotReady) => None, + Err(_) => None, + Ok(Async::Ready(None)) => None, + })) + }); + + if self.use_tokio { + fut.wait() + } else { + tokio::runtime::current_thread::block_on_all(fut) + }.ok().and_then(|a| a) } } impl> Peer { fn new( - is_offline: Arc, - is_major_syncing: Arc, - peers: Arc>>>, - client: Arc, + protocol_status: Arc>>, + client: PeersClient, import_queue: Box>, - network_to_protocol_sender: Sender>, - protocol_sender: Sender>, - network_sender: NetworkChan, - network_port: NetworkPort, + use_tokio: bool, + network_to_protocol_sender: mpsc::UnboundedSender>, + protocol_sender: mpsc::UnboundedSender>, + network_sender: mpsc::UnboundedSender>, + network_port: mpsc::UnboundedReceiver>, data: D, ) -> Self { let net_proto_channel = ProtocolChannel::new( + use_tokio, network_to_protocol_sender.clone(), protocol_sender.clone(), network_port, @@ -300,9 +449,7 @@ impl> Peer { ); import_queue.start(Box::new(network_link)).expect("Test ImportQueue always starts"); Peer { - is_offline, - is_major_syncing, - peers, + protocol_status, peer_id: PeerId::random(), client, import_queue, @@ -315,7 +462,7 @@ impl> Peer { /// Called after blockchain has been populated to updated current state. fn start(&self) { // Update the sync state to the latest chain state. - let info = self.client.info().expect("In-mem client does not fail"); + let info = self.client.info(); let header = self .client .header(&BlockId::Hash(info.chain.best_hash)) @@ -324,7 +471,7 @@ impl> Peer { self.net_proto_channel.send_from_client(ProtocolMsg::BlockImported(info.chain.best_hash, header)); } - pub fn on_block_imported( + fn on_block_imported( &self, hash: ::Hash, header: &::Header, @@ -334,14 +481,19 @@ impl> Peer { /// SyncOracle: are we connected to any peer? #[cfg(test)] - pub fn is_offline(&self) -> bool { - self.is_offline.load(std::sync::atomic::Ordering::Relaxed) + fn is_offline(&self) -> bool { + self.protocol_status.read().sync.is_offline() } /// SyncOracle: are we in the process of catching-up with the chain? #[cfg(test)] - pub fn is_major_syncing(&self) -> bool { - self.is_major_syncing.load(std::sync::atomic::Ordering::Relaxed) + fn is_major_syncing(&self) -> bool { + self.protocol_status.read().sync.is_major_syncing() + } + + /// Get protocol status. + fn protocol_status(&self) -> ProtocolStatus { + self.protocol_status.read().clone() } /// Called on connection to other indicated peer. @@ -370,7 +522,8 @@ impl> Peer { } /// Synchronize with import queue. - fn import_queue_sync(&self) { + #[cfg(any(test, feature = "test-helpers"))] + pub fn import_queue_sync(&self) { self.import_queue.synchronize(); let _ = self.net_proto_channel.wait_sync(); } @@ -382,7 +535,7 @@ impl> Peer { /// Send block import notifications. fn send_import_notifications(&self) { - let info = self.client.info().expect("In-mem client does not fail"); + let info = self.client.info(); let mut best_hash = self.best_hash.lock(); match *best_hash { @@ -397,8 +550,8 @@ impl> Peer { } /// Send block finalization notifications. - pub fn send_finality_notifications(&self) { - let info = self.client.info().expect("In-mem client does not fail"); + fn send_finality_notifications(&self) { + let info = self.client.info(); let mut finalized_hash = self.finalized_hash.lock(); match *finalized_hash { @@ -408,15 +561,12 @@ impl> Peer { } let header = self.client.header(&BlockId::Hash(info.chain.finalized_hash)).unwrap().unwrap(); - self.net_proto_channel.send_from_client(ProtocolMsg::BlockFinalized(info.chain.finalized_hash, header.clone())); + self.net_proto_channel.send_from_client( + ProtocolMsg::BlockFinalized(info.chain.finalized_hash, header.clone()) + ); *finalized_hash = Some(info.chain.finalized_hash); } - /// Restart sync for a peer. - fn restart_sync(&self) { - self.net_proto_channel.send_from_client(ProtocolMsg::Abort); - } - /// Push a message into the gossip network and relay to peers. /// `TestNet::sync_step` needs to be called to ensure it's propagated. pub fn gossip_message( @@ -436,10 +586,6 @@ impl> Peer { ); } - pub fn consensus_gossip_collect_garbage_for_topic(&self, _topic: ::Hash) { - self.with_gossip(move |gossip, _| gossip.collect_garbage()) - } - /// access the underlying consensus gossip handler pub fn consensus_gossip_messages_for( &self, @@ -456,13 +602,13 @@ impl> Peer { /// Execute a closure with the consensus gossip. pub fn with_gossip(&self, f: F) - where F: FnOnce(&mut ConsensusGossip, &mut Context) + Send + 'static + where F: FnOnce(&mut ConsensusGossip, &mut dyn Context) + Send + 'static { self.net_proto_channel.send_from_client(ProtocolMsg::ExecuteWithGossip(Box::new(f))); } /// Announce a block to peers. - pub fn announce_block(&self, block: Hash) { + fn announce_block(&self, block: Hash) { self.net_proto_channel.send_from_client(ProtocolMsg::AnnounceBlock(block)); } @@ -474,23 +620,30 @@ impl> Peer { /// Add blocks to the peer -- edit the block before adding pub fn generate_blocks(&self, count: usize, origin: BlockOrigin, edit_block: F) -> H256 - where F: FnMut(BlockBuilder) -> Block + where F: FnMut(BlockBuilder) -> Block { - let best_hash = self.client.info().unwrap().chain.best_hash; + let best_hash = self.client.info().chain.best_hash; self.generate_blocks_at(BlockId::Hash(best_hash), count, origin, edit_block) } /// Add blocks to the peer -- edit the block before adding. The chain will /// start at the given block iD. - pub fn generate_blocks_at(&self, at: BlockId, count: usize, origin: BlockOrigin, mut edit_block: F) -> H256 - where F: FnMut(BlockBuilder) -> Block - { - let mut at = self.client.header(&at).unwrap().unwrap().hash(); + fn generate_blocks_at( + &self, + at: BlockId, + count: usize, + origin: BlockOrigin, + mut edit_block: F + ) -> H256 where F: FnMut(BlockBuilder) -> Block { + let full_client = self.client.as_full().expect("blocks could only be generated by full clients"); + let mut at = full_client.header(&at).unwrap().unwrap().hash(); for _ in 0..count { - let builder = self.client.new_block_at(&BlockId::Hash(at)).unwrap(); + let builder = full_client.new_block_at(&BlockId::Hash(at), Default::default() + ).unwrap(); let block = edit_block(builder); let hash = block.header.hash(); trace!( + target: "test_network", "Generating {}, (#{}, parent={})", hash, block.header.number, @@ -518,7 +671,7 @@ impl> Peer { /// Push blocks to the peer (simplified: with or without a TX) pub fn push_blocks(&self, count: usize, with_tx: bool) -> H256 { - let best_hash = self.client.info().unwrap().chain.best_hash; + let best_hash = self.client.info().chain.best_hash; self.push_blocks_at(BlockId::Hash(best_hash), count, with_tx) } @@ -551,7 +704,7 @@ impl> Peer { } /// Get a reference to the client. - pub fn client(&self) -> &Arc { + pub fn client(&self) -> &PeersClient { &self.client } } @@ -587,7 +740,7 @@ pub trait TestNetFactory: Sized { /// These two need to be implemented! fn from_config(config: &ProtocolConfig) -> Self; - fn make_verifier(&self, client: Arc, config: &ProtocolConfig) -> Arc; + fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Arc; /// Get reference to peer. fn peer(&self, i: usize) -> &Peer; @@ -598,72 +751,297 @@ pub trait TestNetFactory: Sized { fn set_started(&mut self, now: bool); /// Get custom block import handle for fresh client, along with peer data. - fn make_block_import(&self, client: Arc) - -> (SharedBlockImport, Option>, Self::PeerData) + fn make_block_import(&self, client: PeersClient) + -> ( + SharedBlockImport, + Option>, + Option>, + Option>, + Self::PeerData, + ) { - (client, None, Default::default()) + (client.as_block_import(), None, None, None, Default::default()) + } + + /// Get finality proof provider (if supported). + fn make_finality_proof_provider(&self, _client: PeersClient) -> Option>> { + None } fn default_config() -> ProtocolConfig { ProtocolConfig::default() } + /// Must return true if the testnet is going to be used from within a tokio context. + fn uses_tokio(&self) -> bool { + false + } + /// Create new test network with this many peers. fn new(n: usize) -> Self { + trace!(target: "test_network", "Creating test network"); let config = Self::default_config(); let mut net = Self::from_config(&config); - for _ in 0..n { - net.add_peer(&config); + for i in 0..n { + trace!(target: "test_network", "Adding peer {}", i); + net.add_full_peer(&config); } net } - /// Add a peer. - fn add_peer(&mut self, config: &ProtocolConfig) { + /// Add created peer. + fn add_peer( + &mut self, + protocol_status: Arc>>, + import_queue: Box>, + tx_pool: EmptyTransactionPool, + finality_proof_provider: Option>>, + mut protocol: Protocol, + network_sender: mpsc::UnboundedSender>, + mut network_to_protocol_rx: mpsc::UnboundedReceiver>, + mut protocol_rx: mpsc::UnboundedReceiver>, + peer: Arc>, + ) { + std::thread::spawn(move || { + // Implementation of `protocol::NetworkOut` using the available local variables. + struct Ctxt<'a, B: BlockT>(&'a mpsc::UnboundedSender>); + impl<'a, B: BlockT> NetworkOut for Ctxt<'a, B> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + let _ = self.0.unbounded_send(NetworkMsg::ReportPeer(who, reputation)); + } + fn disconnect_peer(&mut self, who: PeerId) { + let _ = self.0.unbounded_send(NetworkMsg::DisconnectPeer(who)); + } + fn send_message(&mut self, who: PeerId, message: Message) { + let _ = self.0.unbounded_send(NetworkMsg::Outgoing(who, message)); + } + } + + tokio::runtime::current_thread::run(futures::future::poll_fn(move || { + while let Async::Ready(msg) = network_to_protocol_rx.poll().unwrap() { + let outcome = match msg { + Some(FromNetworkMsg::PeerConnected(peer_id, debug_msg)) => { + protocol.on_peer_connected(&mut Ctxt(&network_sender), peer_id, debug_msg); + CustomMessageOutcome::None + }, + Some(FromNetworkMsg::PeerDisconnected(peer_id, debug_msg)) => { + protocol.on_peer_disconnected(&mut Ctxt(&network_sender), peer_id, debug_msg); + CustomMessageOutcome::None + }, + Some(FromNetworkMsg::CustomMessage(peer_id, message)) => + protocol.on_custom_message( + &mut Ctxt(&network_sender), + &tx_pool, + peer_id, + message, + finality_proof_provider.as_ref().map(|p| &**p) + ), + Some(FromNetworkMsg::Synchronize) => { + let _ = network_sender.unbounded_send(NetworkMsg::Synchronized); + CustomMessageOutcome::None + }, + None => return Ok(Async::Ready(())), + }; + + match outcome { + CustomMessageOutcome::BlockImport(origin, blocks) => + import_queue.import_blocks(origin, blocks), + CustomMessageOutcome::JustificationImport(origin, hash, nb, justification) => + import_queue.import_justification(origin, hash, nb, justification), + CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) => + import_queue.import_finality_proof(origin, hash, nb, proof), + CustomMessageOutcome::None => {} + } + } + + loop { + let msg = match protocol_rx.poll() { + Ok(Async::Ready(Some(msg))) => msg, + Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), + Ok(Async::NotReady) => break, + }; + + match msg { + ProtocolMsg::BlockImported(hash, header) => + protocol.on_block_imported(&mut Ctxt(&network_sender), hash, &header), + ProtocolMsg::BlockFinalized(hash, header) => + protocol.on_block_finalized(&mut Ctxt(&network_sender), hash, &header), + ProtocolMsg::ExecuteWithSpec(task) => { + let mut ctxt = Ctxt(&network_sender); + let (mut context, spec) = protocol.specialization_lock(&mut ctxt); + task.call_box(spec, &mut context); + }, + ProtocolMsg::ExecuteWithGossip(task) => { + let mut ctxt = Ctxt(&network_sender); + let (mut context, gossip) = protocol.consensus_gossip_lock(&mut ctxt); + task.call_box(gossip, &mut context); + } + ProtocolMsg::GossipConsensusMessage(topic, engine_id, message, recipient) => + protocol.gossip_consensus_message( + &mut Ctxt(&network_sender), + topic, + engine_id, + message, + recipient + ), + ProtocolMsg::BlocksProcessed(hashes, has_error) => + protocol.blocks_processed(&mut Ctxt(&network_sender), hashes, has_error), + ProtocolMsg::RestartSync => + protocol.restart(&mut Ctxt(&network_sender)), + ProtocolMsg::AnnounceBlock(hash) => + protocol.announce_block(&mut Ctxt(&network_sender), hash), + ProtocolMsg::BlockImportedSync(hash, number) => + protocol.block_imported(&hash, number), + ProtocolMsg::ClearJustificationRequests => + protocol.clear_justification_requests(), + ProtocolMsg::RequestJustification(hash, number) => + protocol.request_justification(&mut Ctxt(&network_sender), &hash, number), + ProtocolMsg::JustificationImportResult(hash, number, success) => + protocol.justification_import_result(hash, number, success), + ProtocolMsg::SetFinalityProofRequestBuilder(builder) => + protocol.set_finality_proof_request_builder(builder), + ProtocolMsg::RequestFinalityProof(hash, number) => + protocol.request_finality_proof(&mut Ctxt(&network_sender), &hash, number), + ProtocolMsg::FinalityProofImportResult(requested_block, finalziation_result) => + protocol.finality_proof_import_result(requested_block, finalziation_result), + ProtocolMsg::PropagateExtrinsics => + protocol.propagate_extrinsics(&mut Ctxt(&network_sender), &tx_pool), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Tick => protocol.tick(&mut Ctxt(&network_sender)), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Synchronize => { + trace!(target: "sync", "handle_client_msg: received Synchronize msg"); + let _ = network_sender.unbounded_send(NetworkMsg::Synchronized); + } + } + } + + if let Async::Ready(_) = protocol.poll(&mut Ctxt(&network_sender), &tx_pool).unwrap() { + return Ok(Async::Ready(())) + } + + *protocol_status.write() = protocol.status(); + Ok(Async::NotReady) + })); + }); + + if self.started() { + peer.start(); + self.peers().iter().for_each(|other| { + other.on_connect(&*peer); + peer.on_connect(other); + }); + } + + self.mut_peers(|peers| { + peers.push(peer) + }); + } + + /// Add a full peer. + fn add_full_peer(&mut self, config: &ProtocolConfig) { let client = Arc::new(test_client::new()); - let tx_pool = Arc::new(EmptyTransactionPool); - let verifier = self.make_verifier(client.clone(), config); - let (block_import, justification_import, data) = self.make_block_import(client.clone()); - let (network_sender, network_port) = network_channel(); - - let import_queue = Box::new(BasicQueue::new(verifier, block_import, justification_import)); - let status_sinks = Arc::new(Mutex::new(Vec::new())); - let is_offline = Arc::new(AtomicBool::new(true)); - let is_major_syncing = Arc::new(AtomicBool::new(false)); + let verifier = self.make_verifier(PeersClient::Full(client.clone()), config); + let (block_import, justification_import, finality_proof_import, finality_proof_request_builder, data) + = self.make_block_import(PeersClient::Full(client.clone())); + let (network_sender, network_port) = mpsc::unbounded(); + + let import_queue = Box::new(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, + )); let specialization = self::SpecializationFactory::create(); - let peers: Arc>>> = Arc::new(Default::default()); - let (protocol_sender, network_to_protocol_sender) = Protocol::new( - status_sinks, - is_offline.clone(), - is_major_syncing.clone(), - peers.clone(), - network_sender.clone(), + let (network_to_protocol_sender, network_to_protocol_rx) = mpsc::unbounded(); + let (protocol_sender, protocol_rx) = mpsc::unbounded(); + + let protocol = Protocol::new( config.clone(), client.clone(), - import_queue.clone(), - None, - tx_pool, + Arc::new(AlwaysBadChecker), specialization, ).unwrap(); - let peer = Arc::new(Peer::new( - is_offline, - is_major_syncing, - peers, - client, - import_queue, - network_to_protocol_sender, - protocol_sender, - network_sender, - network_port, - data, + let protocol_status = Arc::new(RwLock::new(protocol.status())); + self.add_peer( + protocol_status.clone(), + import_queue.clone(), + EmptyTransactionPool, + self.make_finality_proof_provider(PeersClient::Full(client.clone())), + protocol, + network_sender.clone(), + network_to_protocol_rx, + protocol_rx, + Arc::new(Peer::new( + protocol_status, + PeersClient::Full(client), + import_queue, + self.uses_tokio(), + network_to_protocol_sender, + protocol_sender, + network_sender, + network_port, + data, + )), + ); + } + + /// Add a light peer. + fn add_light_peer(&mut self, config: &ProtocolConfig) { + let mut config = config.clone(); + config.roles = Roles::LIGHT; + + let client = Arc::new(test_client::new_light()); + let verifier = self.make_verifier(PeersClient::Light(client.clone()), &config); + let (block_import, justification_import, finality_proof_import, finality_proof_request_builder, data) + = self.make_block_import(PeersClient::Light(client.clone())); + let (network_sender, network_port) = mpsc::unbounded(); + + let import_queue = Box::new(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, )); + let specialization = self::SpecializationFactory::create(); - self.mut_peers(|peers| { - peers.push(peer) - }); + let (network_to_protocol_sender, network_to_protocol_rx) = mpsc::unbounded(); + let (protocol_sender, protocol_rx) = mpsc::unbounded(); + + let protocol = Protocol::new( + config, + client.clone(), + Arc::new(AlwaysBadChecker), + specialization, + ).unwrap(); + + let protocol_status = Arc::new(RwLock::new(protocol.status())); + self.add_peer( + protocol_status.clone(), + import_queue.clone(), + EmptyTransactionPool, + self.make_finality_proof_provider(PeersClient::Light(client.clone())), + protocol, + network_sender.clone(), + network_to_protocol_rx, + protocol_rx, + Arc::new(Peer::new( + protocol_status, + PeersClient::Light(client), + import_queue, + self.uses_tokio(), + network_to_protocol_sender, + protocol_sender, + network_sender, + network_port, + data, + )), + ); } /// Start network. @@ -685,6 +1063,7 @@ pub trait TestNetFactory: Sized { let need_continue = self.route_single(true, None, &|msg| match *msg { NetworkMsg::Outgoing(_, crate::message::generic::Message::Status(_)) => true, NetworkMsg::Outgoing(_, _) => false, + NetworkMsg::DisconnectPeer(_) | NetworkMsg::ReportPeer(_, _) | NetworkMsg::Synchronized => true, }); if !need_continue { @@ -727,7 +1106,7 @@ pub trait TestNetFactory: Sized { peers[recipient_pos].receive_message(&peer.peer_id, packet); }, - NetworkMsg::ReportPeer(who, _) => { + NetworkMsg::DisconnectPeer(who) => { if disconnect { to_disconnect.insert(who); } @@ -761,11 +1140,6 @@ pub trait TestNetFactory: Sized { self.peers().iter().for_each(|peer| peer.send_finality_notifications()) } - /// Restart sync for a peer. - fn restart_peer(&mut self, i: usize) { - self.peers()[i].restart_sync(); - } - /// Perform synchronization until complete, if provided the /// given nodes set are excluded from sync. fn sync_with(&mut self, disconnect: bool, disconnected: Option>) { @@ -781,6 +1155,11 @@ pub trait TestNetFactory: Sized { self.route_single(true, None, &|_| true); } + /// Maintain sync for a peer. + fn tick_peer(&mut self, i: usize) { + self.peers()[i].sync_step(); + } + /// Deliver pending messages until there are no more. fn sync(&mut self) { self.sync_with(true, None) @@ -815,7 +1194,7 @@ impl TestNetFactory for TestNet { } } - fn make_verifier(&self, _client: Arc, _config: &ProtocolConfig) + fn make_verifier(&self, _client: PeersClient, _config: &ProtocolConfig) -> Arc { Arc::new(PassThroughVerifier(false)) @@ -842,7 +1221,7 @@ impl TestNetFactory for TestNet { } } -pub struct ForceFinalized(Arc); +pub struct ForceFinalized(PeersClient); impl JustificationImport for ForceFinalized { type Error = ConsensusError; @@ -854,7 +1233,7 @@ impl JustificationImport for ForceFinalized { justification: Justification, ) -> Result<(), Self::Error> { self.0.finalize_block(BlockId::Hash(hash), Some(justification), true) - .map_err(|_| ConsensusErrorKind::InvalidJustification.into()) + .map_err(|_| ConsensusError::InvalidJustification.into()) } } @@ -869,7 +1248,7 @@ impl TestNetFactory for JustificationTestNet { JustificationTestNet(TestNet::from_config(config)) } - fn make_verifier(&self, client: Arc, config: &ProtocolConfig) + fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Arc { self.0.make_verifier(client, config) @@ -883,7 +1262,7 @@ impl TestNetFactory for JustificationTestNet { self.0.peers() } - fn mut_peers>>)>(&mut self, closure: F ) { + fn mut_peers>>)>(&mut self, closure: F) { self.0.mut_peers(closure) } @@ -895,9 +1274,15 @@ impl TestNetFactory for JustificationTestNet { self.0.set_started(new) } - fn make_block_import(&self, client: Arc) - -> (SharedBlockImport, Option>, Self::PeerData) + fn make_block_import(&self, client: PeersClient) + -> ( + SharedBlockImport, + Option>, + Option>, + Option>, + Self::PeerData, + ) { - (client.clone(), Some(Arc::new(ForceFinalized(client))), Default::default()) + (client.as_block_import(), Some(Arc::new(ForceFinalized(client))), None, None, Default::default()) } } diff --git a/core/network/src/test/sync.rs b/core/network/src/test/sync.rs index 92747226936503d2f6898df5135b52aa5cbe85f8..1e9e2948f3a1cf7b1761a2d29838b41849ca1df1 100644 --- a/core/network/src/test/sync.rs +++ b/core/network/src/test/sync.rs @@ -14,9 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use client::backend::Backend; -use client::blockchain::HeaderBackend as BlockchainHeaderBackend; +use client::{backend::Backend, blockchain::HeaderBackend}; use crate::config::Roles; +use crate::message; use consensus::BlockOrigin; use std::collections::HashSet; use super::*; @@ -33,10 +33,9 @@ fn test_ancestor_search_when_common_is(n: usize) { net.peer(1).push_blocks(100, false); net.peer(2).push_blocks(100, false); - net.restart_peer(0); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -46,7 +45,7 @@ fn sync_peers_works() { net.sync(); for peer in 0..3 { // Assert peers is up to date. - assert_eq!(net.peer(peer).peers.read().len(), 2); + assert_eq!(net.peer(peer).protocol_status.read().num_peers, 2); // And then disconnect. for other in 0..3 { if other != peer { @@ -57,8 +56,8 @@ fn sync_peers_works() { net.sync(); // Now peers are disconnected. for peer in 0..3 { - let peers = net.peer(peer).peers.read(); - assert_eq!(peers.len(), 0); + let status = net.peer(peer).protocol_status.read(); + assert_eq!(status.num_peers, 0); } } @@ -96,6 +95,7 @@ fn sync_cycle_from_offline_to_syncing_to_offline() { net.peer(peer).on_disconnect(net.peer(other)); } } + net.sync(); assert!(net.peer(peer).is_offline()); assert!(!net.peer(peer).is_major_syncing()); } @@ -119,6 +119,7 @@ fn syncing_node_not_major_syncing_when_disconnected() { net.peer(1).on_disconnect(net.peer(2)); // Peer 1 is not major-syncing. + net.sync(); assert!(!net.peer(1).is_major_syncing()); } @@ -129,8 +130,8 @@ fn sync_from_two_peers_works() { net.peer(1).push_blocks(100, false); net.peer(2).push_blocks(100, false); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); assert!(!net.peer(0).is_major_syncing()); } @@ -141,10 +142,9 @@ fn sync_from_two_peers_with_ancestry_search_works() { net.peer(0).push_blocks(10, true); net.peer(1).push_blocks(100, false); net.peer(2).push_blocks(100, false); - net.restart_peer(0); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -156,10 +156,9 @@ fn ancestry_search_works_when_backoff_is_one() { net.peer(1).push_blocks(2, false); net.peer(2).push_blocks(2, false); - net.restart_peer(0); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -171,10 +170,9 @@ fn ancestry_search_works_when_ancestor_is_genesis() { net.peer(1).push_blocks(100, false); net.peer(2).push_blocks(100, false); - net.restart_peer(0); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -197,8 +195,8 @@ fn sync_long_chain_works() { let mut net = TestNet::new(2); net.peer(1).push_blocks(500, false); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -208,8 +206,8 @@ fn sync_no_common_longer_chain_fails() { net.peer(0).push_blocks(20, true); net.peer(1).push_blocks(20, false); net.sync(); - assert!(!net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(!net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -287,11 +285,11 @@ fn sync_after_fork_works() { net.peer(2).push_blocks(1, false); // peer 1 has the best chain - let peer1_chain = net.peer(1).client.backend().as_in_memory().blockchain().clone(); + let peer1_chain = net.peer(1).client.as_in_memory_backend().blockchain().clone(); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain().canon_equals_to(&peer1_chain)); - assert!(net.peer(1).client.backend().as_in_memory().blockchain().canon_equals_to(&peer1_chain)); - assert!(net.peer(2).client.backend().as_in_memory().blockchain().canon_equals_to(&peer1_chain)); + assert!(net.peer(0).client.as_in_memory_backend().blockchain().canon_equals_to(&peer1_chain)); + assert!(net.peer(1).client.as_in_memory_backend().blockchain().canon_equals_to(&peer1_chain)); + assert!(net.peer(2).client.as_in_memory_backend().blockchain().canon_equals_to(&peer1_chain)); } #[test] @@ -307,8 +305,8 @@ fn syncs_all_forks() { net.sync(); // Check that all peers have all of the blocks. - assert_eq!(9, net.peer(0).client.backend().as_in_memory().blockchain().blocks_count()); - assert_eq!(9, net.peer(1).client.backend().as_in_memory().blockchain().blocks_count()); + assert_eq!(9, net.peer(0).client.as_in_memory_backend().blockchain().blocks_count()); + assert_eq!(9, net.peer(1).client.as_in_memory_backend().blockchain().blocks_count()); } #[test] @@ -322,11 +320,11 @@ fn own_blocks_are_announced() { net.peer(0).on_block_imported(header.hash(), &header); net.sync(); - assert_eq!(net.peer(0).client.backend().blockchain().info().unwrap().best_number, 1); - assert_eq!(net.peer(1).client.backend().blockchain().info().unwrap().best_number, 1); - let peer0_chain = net.peer(0).client.backend().as_in_memory().blockchain().clone(); - assert!(net.peer(1).client.backend().as_in_memory().blockchain().canon_equals_to(&peer0_chain)); - assert!(net.peer(2).client.backend().as_in_memory().blockchain().canon_equals_to(&peer0_chain)); + assert_eq!(net.peer(0).client.as_in_memory_backend().blockchain().info().best_number, 1); + assert_eq!(net.peer(1).client.as_in_memory_backend().blockchain().info().best_number, 1); + let peer0_chain = net.peer(0).client.as_in_memory_backend().blockchain().clone(); + assert!(net.peer(1).client.as_in_memory_backend().blockchain().canon_equals_to(&peer0_chain)); + assert!(net.peer(2).client.as_in_memory_backend().blockchain().canon_equals_to(&peer0_chain)); } #[test] @@ -338,9 +336,9 @@ fn blocks_are_not_announced_by_light_nodes() { // light peer1 is connected to full peer2 let mut light_config = ProtocolConfig::default(); light_config.roles = Roles::LIGHT; - net.add_peer(&ProtocolConfig::default()); - net.add_peer(&light_config); - net.add_peer(&ProtocolConfig::default()); + net.add_full_peer(&ProtocolConfig::default()); + net.add_full_peer(&light_config); + net.add_full_peer(&ProtocolConfig::default()); net.peer(0).push_blocks(1, false); net.peer(0).start(); @@ -358,9 +356,9 @@ fn blocks_are_not_announced_by_light_nodes() { // peer 0 has the best chain // peer 1 has the best chain // peer 2 has genesis-chain only - assert_eq!(net.peer(0).client.backend().blockchain().info().unwrap().best_number, 1); - assert_eq!(net.peer(1).client.backend().blockchain().info().unwrap().best_number, 1); - assert_eq!(net.peer(2).client.backend().blockchain().info().unwrap().best_number, 0); + assert_eq!(net.peer(0).client.info().chain.best_number, 1); + assert_eq!(net.peer(1).client.info().chain.best_number, 1); + assert_eq!(net.peer(2).client.info().chain.best_number, 0); } #[test] @@ -373,13 +371,13 @@ fn can_sync_small_non_best_forks() { // small fork + reorg on peer 1. net.peer(0).push_blocks_at(BlockId::Number(30), 2, true); - let small_hash = net.peer(0).client().info().unwrap().chain.best_hash; + let small_hash = net.peer(0).client().info().chain.best_hash; net.peer(0).push_blocks_at(BlockId::Number(30), 10, false); - assert_eq!(net.peer(0).client().info().unwrap().chain.best_number, 40); + assert_eq!(net.peer(0).client().info().chain.best_number, 40); // peer 1 only ever had the long fork. net.peer(1).push_blocks(10, false); - assert_eq!(net.peer(1).client().info().unwrap().chain.best_number, 40); + assert_eq!(net.peer(1).client().info().chain.best_number, 40); assert!(net.peer(0).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); assert!(net.peer(1).client().header(&BlockId::Hash(small_hash)).unwrap().is_none()); @@ -388,7 +386,7 @@ fn can_sync_small_non_best_forks() { // synchronization: 0 synced to longer chain and 1 didn't sync to small chain. - assert_eq!(net.peer(0).client().info().unwrap().chain.best_number, 40); + assert_eq!(net.peer(0).client().info().chain.best_number, 40); assert!(net.peer(0).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); assert!(!net.peer(1).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); @@ -401,3 +399,89 @@ fn can_sync_small_non_best_forks() { assert!(net.peer(0).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); assert!(net.peer(1).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); } + +#[test] +fn can_not_sync_from_light_peer() { + let _ = ::env_logger::try_init(); + + // given the network with 1 full nodes (#0) and 1 light node (#1) + let mut net = TestNet::new(1); + net.add_light_peer(&Default::default()); + + // generate some blocks on #0 + net.peer(0).push_blocks(1, false); + + // and let the light client sync from this node + // (mind the #1 is disconnected && not syncing) + net.sync(); + + // ensure #0 && #1 have the same best block + let full0_info = net.peer(0).client.info().chain; + let light_info = net.peer(1).client.info().chain; + assert_eq!(full0_info.best_number, 1); + assert_eq!(light_info.best_number, 1); + assert_eq!(light_info.best_hash, full0_info.best_hash); + + // add new full client (#2) && sync without #0 + net.add_full_peer(&Default::default()); + net.peer(1).on_connect(net.peer(2)); + net.peer(2).on_connect(net.peer(1)); + net.peer(1).announce_block(light_info.best_hash); + net.sync_with(true, Some(vec![0].into_iter().collect())); + + // ensure that the #2 has failed to sync block #1 + assert_eq!(net.peer(2).client.info().chain.best_number, 0); + // and that the #1 is still connected to #2 + // (because #2 has not tried to fetch block data from the #1 light node) + assert_eq!(net.peer(1).protocol_status().num_peers, 2); + + // and now try to fetch block data from light peer #1 + // (this should result in disconnect) + net.peer(1).receive_message( + &net.peer(2).peer_id, + message::generic::Message::BlockRequest(message::generic::BlockRequest { + id: 0, + fields: message::BlockAttributes::HEADER, + from: message::FromBlock::Hash(light_info.best_hash), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }), + ); + net.sync(); + // check that light #1 has disconnected from #2 + assert_eq!(net.peer(1).protocol_status().num_peers, 1); +} + +#[test] +fn light_peer_imports_header_from_announce() { + let _ = ::env_logger::try_init(); + + fn import_with_announce(net: &mut TestNet, hash: H256) { + let header = net.peer(0).client().header(&BlockId::Hash(hash)).unwrap().unwrap(); + net.peer(1).receive_message( + &net.peer(0).peer_id, + message::generic::Message::BlockAnnounce(message::generic::BlockAnnounce { + header, + }), + ); + + net.peer(1).import_queue_sync(); + assert!(net.peer(1).client().header(&BlockId::Hash(hash)).unwrap().is_some()); + } + + // given the network with 1 full nodes (#0) and 1 light node (#1) + let mut net = TestNet::new(1); + net.add_light_peer(&Default::default()); + + // let them connect to each other + net.sync(); + + // check that NEW block is imported from announce message + let new_hash = net.peer(0).push_blocks(1, false); + import_with_announce(&mut net, new_hash); + + // check that KNOWN STALE block is imported from announce message + let known_stale_hash = net.peer(0).push_blocks_at(BlockId::Number(0), 1, true); + import_with_announce(&mut net, known_stale_hash); +} diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 5fa0fab419fcd6d6af2f5fa89adde6553cd75efc..0672ebcc0ccfd1da69d71e20bbed7ae281ab8e3c 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers" name = "substrate-offchain" -version = "0.1.0" +version = "2.0.0" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" @@ -10,10 +10,10 @@ edition = "2018" client = { package = "substrate-client", path = "../../core/client" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common" } futures = "0.1.25" -inherents = { package = "substrate-inherents", path = "../../core/inherents" } log = "0.4" offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } parity-codec = { version = "3.3", features = ["derive"] } +parking_lot = "0.8.0" primitives = { package = "substrate-primitives", path = "../../core/primitives" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } tokio = "0.1.7" diff --git a/core/offchain/primitives/Cargo.toml b/core/offchain/primitives/Cargo.toml index 4d10e08f92dd603176b18fc5bc554fe909ae76a6..a081f681b621cd754fe83be33a8008b951037534 100644 --- a/core/offchain/primitives/Cargo.toml +++ b/core/offchain/primitives/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers primitives" name = "substrate-offchain-primitives" -version = "0.1.0" +version = "2.0.0" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 5d2a636be3924d82a18453750ae94130fdc95aa5..d2c7630c249d8adaebd770899b5d0a802e85f5c6 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -16,10 +16,13 @@ use std::sync::Arc; use futures::{Stream, Future, sync::mpsc}; -use inherents::pool::InherentsPool; -use log::{info, debug, warn}; +use log::{info, debug, warn, error}; use parity_codec::Decode; -use primitives::OffchainExt; +use primitives::offchain::{ + Timestamp, HttpRequestId, HttpRequestStatus, HttpError, + Externalities as OffchainExt, + CryptoKind, CryptoKeyId, +}; use runtime_primitives::{ generic::BlockId, traits::{self, Extrinsic}, @@ -36,9 +39,122 @@ enum ExtMessage { /// NOTE this is done to prevent recursive calls into the runtime (which are not supported currently). pub(crate) struct AsyncApi(mpsc::UnboundedSender); +fn unavailable_yet(name: &str) -> R { + error!("This {:?} API is not available for offchain workers yet. Follow + https://github.com/paritytech/substrate/issues/1458 for details", name); + Default::default() +} + impl OffchainExt for AsyncApi { - fn submit_extrinsic(&mut self, ext: Vec) { - let _ = self.0.unbounded_send(ExtMessage::SubmitExtrinsic(ext)); + fn submit_transaction(&mut self, ext: Vec) -> Result<(), ()> { + self.0.unbounded_send(ExtMessage::SubmitExtrinsic(ext)) + .map(|_| ()) + .map_err(|_| ()) + } + + fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { + unavailable_yet::<()>("new_crypto_key"); + Err(()) + } + + fn encrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unavailable_yet::<()>("encrypt"); + Err(()) + } + + fn decrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unavailable_yet::<()>("decrypt"); + Err(()) + } + + fn sign(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unavailable_yet::<()>("sign"); + Err(()) + } + + fn verify(&mut self, _key: Option, _msg: &[u8], _signature: &[u8]) -> Result { + unavailable_yet::<()>("verify"); + Err(()) + } + + fn timestamp(&mut self) -> Timestamp { + unavailable_yet("timestamp") + } + + fn sleep_until(&mut self, _deadline: Timestamp) { + unavailable_yet::<()>("sleep_until") + } + + fn random_seed(&mut self) -> [u8; 32] { + unavailable_yet("random_seed") + } + + fn local_storage_set(&mut self, _key: &[u8], _value: &[u8]) { + unavailable_yet("local_storage_set") + } + + fn local_storage_compare_and_set(&mut self, _key: &[u8], _old_value: &[u8], _new_value: &[u8]) { + unavailable_yet("local_storage_compare_and_set") + } + + fn local_storage_get(&mut self, _key: &[u8]) -> Option> { + unavailable_yet("local_storage_get") + } + + fn http_request_start( + &mut self, + _method: &str, + _uri: &str, + _meta: &[u8] + ) -> Result { + unavailable_yet::<()>("http_request_start"); + Err(()) + } + + fn http_request_add_header( + &mut self, + _request_id: HttpRequestId, + _name: &str, + _value: &str + ) -> Result<(), ()> { + unavailable_yet::<()>("http_request_add_header"); + Err(()) + } + + fn http_request_write_body( + &mut self, + _request_id: HttpRequestId, + _chunk: &[u8], + _deadline: Option + ) -> Result<(), HttpError> { + unavailable_yet::<()>("http_request_write_body"); + Err(HttpError::IoError) + } + + fn http_response_wait( + &mut self, + ids: &[HttpRequestId], + _deadline: Option + ) -> Vec { + unavailable_yet::<()>("http_response_wait"); + ids.iter().map(|_| HttpRequestStatus::Unknown).collect() + } + + fn http_response_headers( + &mut self, + _request_id: HttpRequestId + ) -> Vec<(Vec, Vec)> { + unavailable_yet("http_response_headers") + } + + fn http_response_read_body( + &mut self, + _request_id: HttpRequestId, + _buffer: &mut [u8], + _deadline: Option + ) -> Result { + unavailable_yet::<()>("http_response_read_body"); + Err(HttpError::IoError) } } @@ -46,21 +162,18 @@ impl OffchainExt for AsyncApi { pub(crate) struct Api { receiver: Option>, transaction_pool: Arc>, - inherents_pool: Arc::Extrinsic>>, at: BlockId, } impl Api { pub fn new( transaction_pool: Arc>, - inherents_pool: Arc::Extrinsic>>, at: BlockId, ) -> (AsyncApi, Self) { let (tx, rx) = mpsc::unbounded(); let api = Self { receiver: Some(rx), transaction_pool, - inherents_pool, at, }; (AsyncApi(tx), api) @@ -90,9 +203,8 @@ impl Api { info!("Submitting to the pool: {:?} (isSigned: {:?})", xt, xt.is_signed()); match self.transaction_pool.submit_one(&self.at, xt.clone()) { Ok(hash) => debug!("[{:?}] Offchain transaction added to the pool.", hash), - Err(_) => { - debug!("Offchain inherent added to the pool."); - self.inherents_pool.add(xt); + Err(e) => { + debug!("Couldn't submit transaction: {:?}", e); }, } } diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index cac960f2506f26ec409791065b68efdd8d565407..081ae61a5bcaeecc975bab74f911a4f2cfa7a41f 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -19,8 +19,8 @@ //! The offchain workers is a special function of the runtime that //! gets executed after block is imported. During execution //! it's able to asynchronously submit extrinsics that will either -//! be propagated to other nodes (transactions) or will be -//! added to the next block produced by the node as inherents. +//! be propagated to other nodes added to the next block +//! produced by the node as unsigned transactions. //! //! Offchain workers can be used for computation-heavy tasks //! that are not feasible for execution during regular block processing. @@ -39,7 +39,6 @@ use std::{ }; use client::runtime_api::ApiExt; -use inherents::pool::InherentsPool; use log::{debug, warn}; use primitives::ExecutionContext; use runtime_primitives::{ @@ -51,13 +50,14 @@ use transaction_pool::txpool::{Pool, ChainApi}; mod api; +pub mod testing; + pub use offchain_primitives::OffchainWorkerApi; /// An offchain workers manager. #[derive(Debug)] pub struct OffchainWorkers { client: Arc, - inherents_pool: Arc::Extrinsic>>, executor: TaskExecutor, _block: PhantomData, } @@ -66,12 +66,10 @@ impl OffchainWorkers { /// Creates new `OffchainWorkers`. pub fn new( client: Arc, - inherents_pool: Arc::Extrinsic>>, executor: TaskExecutor, ) -> Self { Self { client, - inherents_pool, executor, _block: PhantomData, } @@ -93,11 +91,11 @@ impl OffchainWorkers where { let runtime = self.client.runtime_api(); let at = BlockId::number(*number); - let has_api = runtime.has_api::>(&at); + let has_api = runtime.has_api::>(&at); debug!("Checking offchain workers at {:?}: {:?}", at, has_api); if has_api.unwrap_or(false) { - let (api, runner) = api::Api::new(pool.clone(), self.inherents_pool.clone(), at.clone()); + let (api, runner) = api::Api::new(pool.clone(), at.clone()); self.executor.spawn(runner.process()); debug!("Running offchain workers at {:?}", at); @@ -119,14 +117,14 @@ mod tests { let runtime = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone()))); - let inherents = Arc::new(InherentsPool::default()); // when - let offchain = OffchainWorkers::new(client, inherents.clone(), runtime.executor()); + let offchain = OffchainWorkers::new(client, runtime.executor()); offchain.on_block_imported(&0u64, &pool); // then runtime.shutdown_on_idle().wait().unwrap(); - assert_eq!(inherents.drain().len(), 1); + assert_eq!(pool.status().ready, 1); + assert_eq!(pool.ready().next().unwrap().is_propagateable(), false); } } diff --git a/core/offchain/src/testing.rs b/core/offchain/src/testing.rs new file mode 100644 index 0000000000000000000000000000000000000000..3419665d0a2f2873693168d89950eceb7eb363d8 --- /dev/null +++ b/core/offchain/src/testing.rs @@ -0,0 +1,244 @@ +// Copyright 2019 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 . + +//! Offchain Externalities implementation for tests. + +use std::{ + collections::BTreeMap, + sync::Arc, +}; +use parking_lot::RwLock; +use primitives::offchain::{ + self, + HttpError, + HttpRequestId as RequestId, + HttpRequestStatus as RequestStatus, + Timestamp, + CryptoKind, + CryptoKeyId, +}; + +/// Pending request. +#[derive(Debug, Default, PartialEq, Eq)] +pub struct PendingRequest { + /// HTTP method + pub method: String, + /// URI + pub uri: String, + /// Encoded Metadata + pub meta: Vec, + /// Request headers + pub headers: Vec<(String, String)>, + /// Request body + pub body: Vec, + /// Has the request been sent already. + pub sent: bool, + /// Response body + pub response: Vec, + /// Number of bytes already read from the response body. + pub read: usize, + /// Response headers + pub response_headers: Vec<(String, String)>, +} + +/// Internal state of the externalities. +/// +/// This can be used in tests to respond or assert stuff about interactions. +#[derive(Debug, Default)] +pub struct State { + /// A list of pending requests. + pub requests: BTreeMap, +} + +impl State { + /// Asserts that pending request has been submitted and fills it's response. + pub fn fulfill_pending_request( + &mut self, + id: u16, + expected: PendingRequest, + response: impl Into>, + response_headers: impl IntoIterator, + ) { + match self.requests.get_mut(&RequestId(id)) { + None => { + panic!("Missing expected request: {:?}.\n\nAll: {:?}", id, self.requests); + } + Some(req) => { + assert_eq!( + *req, + expected, + ); + req.response = response.into(); + req.response_headers = response_headers.into_iter().collect(); + } + } + } +} + +/// Implementation of offchain externalities used for tests. +#[derive(Clone, Default, Debug)] +pub struct TestOffchainExt(pub Arc>); + +impl offchain::Externalities for TestOffchainExt { + fn submit_transaction(&mut self, _ex: Vec) -> Result<(), ()> { + unimplemented!("not needed in tests so far") + } + + fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { + unimplemented!("not needed in tests so far") + } + + fn encrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unimplemented!("not needed in tests so far") + } + + fn decrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unimplemented!("not needed in tests so far") + } + + fn sign(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unimplemented!("not needed in tests so far") + } + + fn verify(&mut self, _key: Option, _msg: &[u8], _signature: &[u8]) -> Result { + unimplemented!("not needed in tests so far") + } + + fn timestamp(&mut self) -> Timestamp { + unimplemented!("not needed in tests so far") + } + + fn sleep_until(&mut self, _deadline: Timestamp) { + unimplemented!("not needed in tests so far") + } + + fn random_seed(&mut self) -> [u8; 32] { + unimplemented!("not needed in tests so far") + } + + fn local_storage_set(&mut self, _key: &[u8], _value: &[u8]) { + unimplemented!("not needed in tests so far") + } + + fn local_storage_compare_and_set( + &mut self, + _key: &[u8], + _old_value: &[u8], + _new_value: &[u8] + ) { + unimplemented!("not needed in tests so far") + } + + fn local_storage_get(&mut self, _key: &[u8]) -> Option> { + unimplemented!("not needed in tests so far") + } + + fn http_request_start(&mut self, method: &str, uri: &str, meta: &[u8]) -> Result { + let mut state = self.0.write(); + let id = RequestId(state.requests.len() as u16); + state.requests.insert(id.clone(), PendingRequest { + method: method.into(), + uri: uri.into(), + meta: meta.into(), + ..Default::default() + }); + Ok(id) + } + + fn http_request_add_header( + &mut self, + request_id: RequestId, + name: &str, + value: &str, + ) -> Result<(), ()> { + let mut state = self.0.write(); + if let Some(req) = state.requests.get_mut(&request_id) { + req.headers.push((name.into(), value.into())); + Ok(()) + } else { + Err(()) + } + } + + fn http_request_write_body( + &mut self, + request_id: RequestId, + chunk: &[u8], + _deadline: Option + ) -> Result<(), HttpError> { + let mut state = self.0.write(); + if let Some(req) = state.requests.get_mut(&request_id) { + if chunk.is_empty() { + req.sent = true; + } + req.body.extend(chunk); + Ok(()) + } else { + Err(HttpError::IoError) + } + } + + fn http_response_wait( + &mut self, + ids: &[RequestId], + _deadline: Option, + ) -> Vec { + let state = self.0.read(); + + ids.iter().map(|id| match state.requests.get(id) { + Some(req) if req.response.is_empty() => RequestStatus::DeadlineReached, + None => RequestStatus::Unknown, + _ => RequestStatus::Finished(200), + }).collect() + } + + fn http_response_headers(&mut self, request_id: RequestId) -> Vec<(Vec, Vec)> { + let state = self.0.read(); + if let Some(req) = state.requests.get(&request_id) { + req.response_headers + .clone() + .into_iter() + .map(|(k, v)| (k.into_bytes(), v.into_bytes())) + .collect() + } else { + Default::default() + } + } + + fn http_response_read_body( + &mut self, + request_id: RequestId, + buffer: &mut [u8], + _deadline: Option + ) -> Result { + let mut state = self.0.write(); + if let Some(req) = state.requests.get_mut(&request_id) { + if req.read >= req.response.len() { + // Remove the pending request as per spec. + state.requests.remove(&request_id); + Ok(0) + } else { + let read = std::cmp::min(buffer.len(), req.response[req.read..].len()); + buffer[0..read].copy_from_slice(&req.response[req.read..read]); + req.read += read; + Ok(read) + } + } else { + Err(HttpError::IoError) + } + } +} + diff --git a/core/panic-handler/Cargo.toml b/core/panic-handler/Cargo.toml index 10b80cc9b7ff6dfb200a8ce9b7fc48edc4b9056e..054bd643ac3e6adee588e176ccf243c6e6c854f4 100644 --- a/core/panic-handler/Cargo.toml +++ b/core/panic-handler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-panic-handler" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate panic handler." edition = "2018" diff --git a/core/peerset/Cargo.toml b/core/peerset/Cargo.toml index ed350378e5649eca31c4bc34f91089ed0134d047..aa08c8ca997a5d32546567bbb806cf778bac6d7a 100644 --- a/core/peerset/Cargo.toml +++ b/core/peerset/Cargo.toml @@ -3,14 +3,18 @@ description = "Connectivity manager based on reputation" homepage = "http://parity.io" license = "GPL-3.0" name = "substrate-peerset" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.1" -libp2p = { version = "0.7.0", default-features = false } +libp2p = { version = "0.9.0", default-features = false } linked-hash-map = "0.5" log = "0.4" lru-cache = "0.1.2" -serde_json = "1.0.24" \ No newline at end of file +serde_json = "1.0.24" + +[dev-dependencies] +rand = "0.6" +tokio = "0.1" diff --git a/core/peerset/src/lib.rs b/core/peerset/src/lib.rs index b801f47b588089b3b132245e53ee44715e60685f..aa3ce02076d56d5cf42605d6a8aa76cd444df581 100644 --- a/core/peerset/src/lib.rs +++ b/core/peerset/src/lib.rs @@ -17,34 +17,20 @@ //! Peer Set Manager (PSM). Contains the strategy for choosing which nodes the network should be //! connected to. -mod slots; +mod peersstate; -use std::collections::VecDeque; +use std::{collections::{HashSet, HashMap}, collections::VecDeque, time::Instant}; use futures::{prelude::*, sync::mpsc, try_ready}; use libp2p::PeerId; -use linked_hash_map::LinkedHashMap; -use log::trace; -use lru_cache::LruCache; -use slots::{SlotType, SlotState, Slots}; +use log::{debug, error, trace}; use serde_json::json; -const PEERSET_SCORES_CACHE_SIZE: usize = 1000; -const DISCOVERED_NODES_LIMIT: u32 = 1000; - -#[derive(Debug)] -struct PeersetData { - /// List of nodes that we know exist, but we are not connected to. - /// Elements in this list must never be in `out_slots` or `in_slots`. - discovered: Slots, - /// If true, we only accept reserved nodes. - reserved_only: bool, - /// Node slots for outgoing connections. - out_slots: Slots, - /// Node slots for incoming connections. - in_slots: Slots, - /// List of node scores. - scores: LruCache, -} +/// We don't accept nodes whose reputation is under this value. +const BANNED_THRESHOLD: i32 = 82 * (i32::min_value() / 100); +/// Reputation change for a node when we get disconnected from it. +const DISCONNECT_REPUTATION_CHANGE: i32 = -10; +/// Reserved peers group ID +const RESERVED_NODES: &'static str = "reserved"; #[derive(Debug)] enum Action { @@ -52,6 +38,9 @@ enum Action { RemoveReservedPeer(PeerId), SetReservedOnly(bool), ReportPeer(PeerId, i32), + SetPriorityGroup(String, HashSet), + AddToPriorityGroup(String, PeerId), + RemoveFromPriorityGroup(String, PeerId), } /// Shared handle to the peer set manager (PSM). Distributed around the code. @@ -88,6 +77,21 @@ impl PeersetHandle { pub fn report_peer(&self, peer_id: PeerId, score_diff: i32) { let _ = self.tx.unbounded_send(Action::ReportPeer(peer_id, score_diff)); } + + /// Modify a priority group. + pub fn set_priority_group(&self, group_id: String, peers: HashSet) { + let _ = self.tx.unbounded_send(Action::SetPriorityGroup(group_id, peers)); + } + + /// Add a peer to a priority group. + pub fn add_to_priority_group(&self, group_id: String, peer_id: PeerId) { + let _ = self.tx.unbounded_send(Action::AddToPriorityGroup(group_id, peer_id)); + } + + /// Remove a peer from a priority group. + pub fn remove_from_priority_group(&self, group_id: String, peer_id: PeerId) { + let _ = self.tx.unbounded_send(Action::RemoveFromPriorityGroup(group_id, peer_id)); + } } /// Message that can be sent by the peer set manager (PSM). @@ -108,7 +112,7 @@ pub enum Message { } /// Opaque identifier for an incoming connection. Allocated by the network. -#[derive(Debug, Copy, Clone, PartialEq, Eq)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub struct IncomingIndex(pub u64); impl From for IncomingIndex { @@ -148,9 +152,15 @@ pub struct PeersetConfig { /// errors. #[derive(Debug)] pub struct Peerset { - data: PeersetData, + data: peersstate::PeersState, + /// If true, we only accept reserved nodes. + reserved_only: bool, rx: mpsc::UnboundedReceiver, message_queue: VecDeque, + /// When the `Peerset` was created. + created: Instant, + /// Last time when we updated the reputations of connected nodes. + latest_time_update: Instant, } impl Peerset { @@ -158,30 +168,26 @@ impl Peerset { pub fn from_config(config: PeersetConfig) -> (Peerset, PeersetHandle) { let (tx, rx) = mpsc::unbounded(); - let data = PeersetData { - discovered: Slots::new(DISCOVERED_NODES_LIMIT), - reserved_only: config.reserved_only, - out_slots: Slots::new(config.out_peers), - in_slots: Slots::new(config.in_peers), - scores: LruCache::new(PEERSET_SCORES_CACHE_SIZE), - }; - let handle = PeersetHandle { tx, }; let mut peerset = Peerset { - data, + data: peersstate::PeersState::new(config.in_peers, config.out_peers), rx, + reserved_only: config.reserved_only, message_queue: VecDeque::new(), + created: Instant::now(), + latest_time_update: Instant::now(), }; - for peer_id in config.reserved_nodes { - peerset.data.discovered.add_peer(peer_id, SlotType::Reserved); - } - + peerset.data.set_priority_group(RESERVED_NODES, config.reserved_nodes.into_iter().collect()); for peer_id in config.bootnodes { - peerset.data.discovered.add_peer(peer_id, SlotType::Common); + if let peersstate::Peer::Unknown(entry) = peerset.data.peer(&peer_id) { + entry.discover(); + } else { + debug!(target: "peerset", "Duplicate bootnode in config: {:?}", peer_id); + } } peerset.alloc_slots(); @@ -189,115 +195,156 @@ impl Peerset { } fn on_add_reserved_peer(&mut self, peer_id: PeerId) { - // Nothing more to do if we're already connected. - if self.data.in_slots.contains(&peer_id) { - self.data.in_slots.mark_reserved(&peer_id); - return; - } - - match self.data.out_slots.add_peer(peer_id, SlotType::Reserved) { - SlotState::Added(peer_id) => { - // reserved node may have been previously stored as normal node in discovered list - self.data.discovered.remove_peer(&peer_id); - - // notify that connection has been made - trace!(target: "peerset", "Connecting to new reserved peer {}", peer_id); - self.message_queue.push_back(Message::Connect(peer_id)); - return; - }, - SlotState::Swaped { removed, added } => { - // reserved node may have been previously stored as normal node in discovered list - self.data.discovered.remove_peer(&added); - // let's add the peer we disconnected from to the discovered list again - self.data.discovered.add_peer(removed.clone(), SlotType::Common); - // swap connections - trace!(target: "peerset", "Connecting to new reserved peer {}, dropping {}", added, removed); - self.message_queue.push_back(Message::Drop(removed)); - self.message_queue.push_back(Message::Connect(added)); - } - SlotState::AlreadyExists(_) | SlotState::Upgraded(_) => { - return; - } - SlotState::MaxCapacity(peer_id) => { - self.data.discovered.add_peer(peer_id, SlotType::Reserved); - return; - } - } + let mut reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); + reserved.insert(peer_id); + self.data.set_priority_group(RESERVED_NODES, reserved); + self.alloc_slots(); } fn on_remove_reserved_peer(&mut self, peer_id: PeerId) { - self.data.in_slots.mark_not_reserved(&peer_id); - self.data.out_slots.mark_not_reserved(&peer_id); - self.data.discovered.mark_not_reserved(&peer_id); - if self.data.reserved_only { - if self.data.in_slots.remove_peer(&peer_id) || self.data.out_slots.remove_peer(&peer_id) { - // insert peer back into discovered list - self.data.discovered.add_peer(peer_id.clone(), SlotType::Common); - self.message_queue.push_back(Message::Drop(peer_id)); - // call alloc_slots again, cause we may have some reserved peers in discovered list - // waiting for the slot that was just cleared - self.alloc_slots(); + let mut reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); + reserved.remove(&peer_id); + self.data.set_priority_group(RESERVED_NODES, reserved); + match self.data.peer(&peer_id) { + peersstate::Peer::Connected(peer) => { + if self.reserved_only { + peer.disconnect(); + self.message_queue.push_back(Message::Drop(peer_id)); + } } + peersstate::Peer::NotConnected(_) => {}, + peersstate::Peer::Unknown(_) => {}, } } fn on_set_reserved_only(&mut self, reserved_only: bool) { // Disconnect non-reserved nodes. - self.data.reserved_only = reserved_only; - if self.data.reserved_only { - for peer_id in self.data.in_slots.clear_common_slots().into_iter().chain(self.data.out_slots.clear_common_slots().into_iter()) { - // insert peer back into discovered list - self.data.discovered.add_peer(peer_id.clone(), SlotType::Common); - self.message_queue.push_back(Message::Drop(peer_id)); + self.reserved_only = reserved_only; + if self.reserved_only { + let reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); + for peer_id in self.data.connected_peers().cloned().collect::>().into_iter() { + let peer = self.data.peer(&peer_id).into_connected() + .expect("We are enumerating connected peers, therefore the peer is connected; qed"); + if !reserved.contains(&peer_id) { + peer.disconnect(); + self.message_queue.push_back(Message::Drop(peer_id)); + } } } else { self.alloc_slots(); } } + fn on_set_priority_group(&mut self, group_id: &str, peers: HashSet) { + self.data.set_priority_group(group_id, peers); + self.alloc_slots(); + } + + fn on_add_to_priority_group(&mut self, group_id: &str, peer_id: PeerId) { + self.data.add_to_priority_group(group_id, peer_id); + self.alloc_slots(); + } + + fn on_remove_from_priority_group(&mut self, group_id: &str, peer_id: PeerId) { + self.data.remove_from_priority_group(group_id, &peer_id); + self.alloc_slots(); + } + fn on_report_peer(&mut self, peer_id: PeerId, score_diff: i32) { - let score = match self.data.scores.get_mut(&peer_id) { - Some(score) => { - *score = score.saturating_add(score_diff); - *score + // We want reputations to be up-to-date before adjusting them. + self.update_time(); + + match self.data.peer(&peer_id) { + peersstate::Peer::Connected(mut peer) => { + peer.add_reputation(score_diff); + if peer.reputation() < BANNED_THRESHOLD { + peer.disconnect(); + self.message_queue.push_back(Message::Drop(peer_id)); + } }, - None => { - self.data.scores.insert(peer_id.clone(), score_diff); - score_diff - } + peersstate::Peer::NotConnected(mut peer) => peer.add_reputation(score_diff), + peersstate::Peer::Unknown(peer) => peer.discover().add_reputation(score_diff), + } + } + + /// Updates the value of `self.latest_time_update` and performs all the updates that happen + /// over time, such as reputation increases for staying connected. + fn update_time(&mut self) { + // We basically do `(now - self.latest_update).as_secs()`, except that by the way we do it + // we know that we're not going to miss seconds because of rounding to integers. + let secs_diff = { + let now = Instant::now(); + let elapsed_latest = self.latest_time_update - self.created; + let elapsed_now = now - self.created; + self.latest_time_update = now; + elapsed_now.as_secs() - elapsed_latest.as_secs() }; - if score < 0 { - // peer will be removed from `in_slots` or `out_slots` in `on_dropped` method - if self.data.in_slots.contains(&peer_id) || self.data.out_slots.contains(&peer_id) { - self.data.in_slots.remove_peer(&peer_id); - self.data.out_slots.remove_peer(&peer_id); - self.message_queue.push_back(Message::Drop(peer_id)); + // For each elapsed second, move the node reputation towards zero. + // If we multiply each second the reputation by `k` (where `k` is between 0 and 1), it + // takes `ln(0.5) / ln(k)` seconds to reduce the reputation by half. Use this formula to + // empirically determine a value of `k` that looks correct. + for _ in 0..secs_diff { + for peer in self.data.peers().cloned().collect::>() { + // We use `k = 0.98`, so we divide by `50`. With that value, it takes 34.3 seconds + // to reduce the reputation by half. + fn reput_tick(reput: i32) -> i32 { + let mut diff = reput / 50; + if diff == 0 && reput < 0 { + diff = -1; + } else if diff == 0 && reput > 0 { + diff = 1; + } + reput.saturating_sub(diff) + } + match self.data.peer(&peer) { + peersstate::Peer::Connected(mut peer) => + peer.set_reputation(reput_tick(peer.reputation())), + peersstate::Peer::NotConnected(mut peer) => + peer.set_reputation(reput_tick(peer.reputation())), + peersstate::Peer::Unknown(_) => unreachable!("We iterate over known peers; qed") + } } } } + /// Try to fill available out slots with nodes. fn alloc_slots(&mut self) { - while let Some((peer_id, slot_type)) = self.data.discovered.pop_most_important_peer(self.data.reserved_only) { - match self.data.out_slots.add_peer(peer_id, slot_type) { - SlotState::Added(peer_id) => { - trace!(target: "peerset", "Connecting to new peer {}", peer_id); - self.message_queue.push_back(Message::Connect(peer_id)); - }, - SlotState::Swaped { removed, added } => { - // insert peer back into discovered list - trace!(target: "peerset", "Connecting to new peer {}, dropping {}", added, removed); - self.data.discovered.add_peer(removed.clone(), SlotType::Common); - self.message_queue.push_back(Message::Drop(removed)); - self.message_queue.push_back(Message::Connect(added)); - } - SlotState::Upgraded(_) | SlotState::AlreadyExists(_) => { - // TODO: we should never reach this point - }, - SlotState::MaxCapacity(peer_id) => { - self.data.discovered.add_peer(peer_id, slot_type); - break; - }, + self.update_time(); + + // Try to grab the next node to attempt to connect to. + while let Some(next) = { + if self.reserved_only { + self.data.priority_not_connected_peer_from_group(RESERVED_NODES) + } else { + self.data.priority_not_connected_peer() + } + } { + match next.try_outgoing() { + Ok(conn) => self.message_queue.push_back(Message::Connect(conn.into_peer_id())), + Err(_) => break, // No more slots available. + } + } + + loop { + if self.reserved_only { + break + } + + // Try to grab the next node to attempt to connect to. + let next = match self.data.highest_not_connected_peer() { + Some(p) => p, + None => break, // No known node to add. + }; + + // Don't connect to nodes with an abysmal reputation. + if next.reputation() < BANNED_THRESHOLD { + break; + } + + match next.try_outgoing() { + Ok(conn) => self.message_queue.push_back(Message::Connect(conn.into_peer_id())), + Err(_) => break, // No more slots available. } } } @@ -306,60 +353,31 @@ impl Peerset { /// a corresponding `Accept` or `Reject`, except if we were already connected to this peer. /// /// Note that this mechanism is orthogonal to `Connect`/`Drop`. Accepting an incoming - /// connection implicitely means `Accept`, but incoming connections aren't cancelled by + /// connection implicitely means `Connect`, but incoming connections aren't cancelled by /// `dropped`. /// - /// Because of concurrency issues, it is acceptable to call `incoming` with a `PeerId` the - /// peerset is already connected to, in which case it must not answer. + // Implementation note: because of concurrency issues, it is possible that we push a `Connect` + // message to the output channel with a `PeerId`, and that `incoming` gets called with the same + // `PeerId` before that message has been read by the user. In this situation we must not answer. pub fn incoming(&mut self, peer_id: PeerId, index: IncomingIndex) { - trace!( - target: "peerset", - "Incoming {:?}\nin_slots={:?}\nout_slots={:?}", - peer_id, self.data.in_slots, self.data.out_slots - ); - // if `reserved_only` is set, but this peer is not a part of our discovered list, - // a) it is not reserved, so we reject the connection - // b) we are already connected to it, so we reject the connection - if self.data.reserved_only && !self.data.discovered.is_reserved(&peer_id) { - self.message_queue.push_back(Message::Reject(index)); - return; - } + trace!(target: "peerset", "Incoming {:?}", peer_id); + self.update_time(); + + let not_connected = match self.data.peer(&peer_id) { + // If we're already connected, don't answer, as the docs mention. + peersstate::Peer::Connected(_) => return, + peersstate::Peer::NotConnected(entry) => entry, + peersstate::Peer::Unknown(entry) => entry.discover(), + }; - // check if we are already connected to this peer - if self.data.out_slots.contains(&peer_id) { - // we are already connected. in this case we do not answer - return; + if not_connected.reputation() < BANNED_THRESHOLD { + self.message_queue.push_back(Message::Reject(index)); + return } - let slot_type = if self.data.reserved_only { - SlotType::Reserved - } else { - SlotType::Common - }; - - match self.data.in_slots.add_peer(peer_id, slot_type) { - SlotState::Added(peer_id) => { - // reserved node may have been previously stored as normal node in discovered list - self.data.discovered.remove_peer(&peer_id); - self.message_queue.push_back(Message::Accept(index)); - return; - }, - SlotState::Swaped { removed, added } => { - // reserved node may have been previously stored as normal node in discovered list - self.data.discovered.remove_peer(&added); - // swap connections. - self.message_queue.push_back(Message::Drop(removed)); - self.message_queue.push_back(Message::Accept(index)); - }, - SlotState::AlreadyExists(_) | SlotState::Upgraded(_) => { - // we are already connected. in this case we do not answer - return; - }, - SlotState::MaxCapacity(peer_id) => { - self.data.discovered.add_peer(peer_id, slot_type); - self.message_queue.push_back(Message::Reject(index)); - return; - }, + match not_connected.try_accept_incoming() { + Ok(_) => self.message_queue.push_back(Message::Accept(index)), + Err(_) => self.message_queue.push_back(Message::Reject(index)), } } @@ -368,24 +386,21 @@ impl Peerset { /// Must only be called after the PSM has either generated a `Connect` message with this /// `PeerId`, or accepted an incoming connection with this `PeerId`. pub fn dropped(&mut self, peer_id: PeerId) { - trace!( - target: "peerset", - "Dropping {:?}\nin_slots={:?}\nout_slots={:?}", - peer_id, self.data.in_slots, self.data.out_slots - ); - // Automatically connect back if reserved. - if self.data.in_slots.is_reserved(&peer_id) || self.data.out_slots.is_reserved(&peer_id) { - self.message_queue.push_back(Message::Connect(peer_id)); - return; - } + trace!(target: "peerset", "Dropping {:?}", peer_id); + + // We want reputations to be up-to-date before adjusting them. + self.update_time(); - // Otherwise, free the slot. - self.data.in_slots.remove_peer(&peer_id); - self.data.out_slots.remove_peer(&peer_id); + match self.data.peer(&peer_id) { + peersstate::Peer::Connected(mut entry) => { + // Decrease the node's reputation so that we don't try it again and again and again. + entry.add_reputation(DISCONNECT_REPUTATION_CHANGE); + entry.disconnect(); + } + peersstate::Peer::NotConnected(_) | peersstate::Peer::Unknown(_) => + error!(target: "peerset", "Received dropped() for non-connected node"), + } - // Note: in this dummy implementation we consider that peers never expire. As soon as we - // are disconnected from a peer, we try again. - self.data.discovered.add_peer(peer_id, SlotType::Common); self.alloc_slots(); } @@ -394,31 +409,50 @@ impl Peerset { /// > **Note**: There is no equivalent "expired" message, meaning that it is the responsibility /// > of the PSM to remove `PeerId`s that fail to dial too often. pub fn discovered>(&mut self, peer_ids: I) { + let mut discovered_any = false; + for peer_id in peer_ids { - if !self.data.in_slots.contains(&peer_id) && !self.data.out_slots.contains(&peer_id) && !self.data.discovered.contains(&peer_id) { - trace!(target: "peerset", "Discovered new peer: {:?}", peer_id); - self.data.discovered.add_peer(peer_id, SlotType::Common); - } else { - trace!(target: "peerset", "Discovered known peer: {:?}", peer_id); + if let peersstate::Peer::Unknown(entry) = self.data.peer(&peer_id) { + entry.discover(); + discovered_any = true; } } - self.alloc_slots(); + if discovered_any { + self.alloc_slots(); + } } /// Produces a JSON object containing the state of the peerset manager, for debugging purposes. - pub fn debug_info(&self) -> serde_json::Value { + pub fn debug_info(&mut self) -> serde_json::Value { + self.update_time(); + json!({ - "data": { - // add scores - "discovered": self.data.discovered.debug_info(), - "reserved_only": self.data.reserved_only, - "out_slots": self.data.out_slots.debug_info(), - "in_slots": self.data.in_slots.debug_info() - }, + "nodes": self.data.peers().cloned().collect::>().into_iter().map(|peer_id| { + let state = match self.data.peer(&peer_id) { + peersstate::Peer::Connected(entry) => json!({ + "connected": true, + "reputation": entry.reputation() + }), + peersstate::Peer::NotConnected(entry) => json!({ + "connected": false, + "reputation": entry.reputation() + }), + peersstate::Peer::Unknown(_) => + unreachable!("We iterate over the known peers; QED") + }; + + (peer_id.to_base58(), state) + }).collect::>(), + "reserved_only": self.reserved_only, "message_queue": self.message_queue.len(), }) } + + /// Returns priority group by id. + pub fn get_priority_group(&self, group_id: &str) -> Option> { + self.data.get_priority_group(group_id) + } } impl Stream for Peerset { @@ -431,12 +465,15 @@ impl Stream for Peerset { return Ok(Async::Ready(Some(message))); } match try_ready!(self.rx.poll()) { - None => return Ok(Async::Ready(None)), + None => return Ok(Async::NotReady), Some(action) => match action { Action::AddReservedPeer(peer_id) => self.on_add_reserved_peer(peer_id), Action::RemoveReservedPeer(peer_id) => self.on_remove_reserved_peer(peer_id), Action::SetReservedOnly(reserved) => self.on_set_reserved_only(reserved), Action::ReportPeer(peer_id, score_diff) => self.on_report_peer(peer_id, score_diff), + Action::SetPriorityGroup(group_id, peers) => self.on_set_priority_group(&group_id, peers), + Action::AddToPriorityGroup(group_id, peer_id) => self.on_add_to_priority_group(&group_id, peer_id), + Action::RemoveFromPriorityGroup(group_id, peer_id) => self.on_remove_from_priority_group(&group_id, peer_id), } } } @@ -447,7 +484,8 @@ impl Stream for Peerset { mod tests { use libp2p::PeerId; use futures::prelude::*; - use super::{PeersetConfig, Peerset, Message, IncomingIndex}; + use super::{PeersetConfig, Peerset, Message, IncomingIndex, BANNED_THRESHOLD}; + use std::{thread, time::Duration}; fn assert_messages(mut peerset: Peerset, messages: Vec) -> Peerset { for expected_message in messages { @@ -455,7 +493,7 @@ mod tests { assert_eq!(message, expected_message); peerset = p; } - assert!(peerset.message_queue.is_empty()); + assert!(peerset.message_queue.is_empty(), peerset.message_queue); peerset } @@ -467,49 +505,6 @@ mod tests { Ok((message, peerset)) } - #[test] - fn test_peerset_from_config_with_bootnodes() { - let bootnode = PeerId::random(); - let bootnode2 = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 2, - bootnodes: vec![bootnode.clone(), bootnode2.clone()], - reserved_only: false, - reserved_nodes: Vec::new(), - }; - - let (peerset, _handle) = Peerset::from_config(config); - - assert_messages(peerset, vec![ - Message::Connect(bootnode), - Message::Connect(bootnode2), - ]); - } - - #[test] - fn test_peerset_from_config_with_reserved_nodes() { - let bootnode = PeerId::random(); - let bootnode2 = PeerId::random(); - let reserved_peer = PeerId::random(); - let reserved_peer2 = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 3, - bootnodes: vec![bootnode.clone(), bootnode2.clone()], - reserved_only: false, - reserved_nodes: vec![reserved_peer.clone(), reserved_peer2.clone()], - }; - - let (peerset, _handle) = Peerset::from_config(config); - - assert_messages(peerset, vec![ - Message::Connect(reserved_peer), - Message::Connect(reserved_peer2), - Message::Connect(bootnode) - ]); - } - #[test] fn test_peerset_add_reserved_peer() { let bootnode = PeerId::random(); @@ -533,87 +528,6 @@ mod tests { ]); } - #[test] - fn test_peerset_remove_reserved_peer() { - let reserved_peer = PeerId::random(); - let reserved_peer2 = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 2, - bootnodes: vec![], - reserved_only: false, - reserved_nodes: vec![reserved_peer.clone(), reserved_peer2.clone()], - }; - - let (peerset, handle) = Peerset::from_config(config); - handle.remove_reserved_peer(reserved_peer.clone()); - - let peerset = assert_messages(peerset, vec![ - Message::Connect(reserved_peer.clone()), - Message::Connect(reserved_peer2.clone()), - ]); - - handle.set_reserved_only(true); - handle.remove_reserved_peer(reserved_peer2.clone()); - - assert_messages(peerset, vec![ - Message::Drop(reserved_peer), - Message::Drop(reserved_peer2), - ]); - } - - #[test] - fn test_peerset_set_reserved_only() { - let bootnode = PeerId::random(); - let bootnode2 = PeerId::random(); - let reserved_peer = PeerId::random(); - let reserved_peer2 = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 4, - bootnodes: vec![bootnode.clone(), bootnode2.clone()], - reserved_only: false, - reserved_nodes: vec![reserved_peer.clone(), reserved_peer2.clone()], - }; - - let (peerset, handle) = Peerset::from_config(config); - handle.set_reserved_only(true); - handle.set_reserved_only(false); - - assert_messages(peerset, vec![ - Message::Connect(reserved_peer), - Message::Connect(reserved_peer2), - Message::Connect(bootnode.clone()), - Message::Connect(bootnode2.clone()), - Message::Drop(bootnode.clone()), - Message::Drop(bootnode2.clone()), - Message::Connect(bootnode), - Message::Connect(bootnode2), - ]); - } - - #[test] - fn test_peerset_report_peer() { - let bootnode = PeerId::random(); - let bootnode2 = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 1, - bootnodes: vec![bootnode.clone(), bootnode2.clone()], - reserved_only: false, - reserved_nodes: Vec::new(), - }; - - let (peerset, handle) = Peerset::from_config(config); - handle.report_peer(bootnode2, -1); - handle.report_peer(bootnode.clone(), -1); - - assert_messages(peerset, vec![ - Message::Connect(bootnode.clone()), - Message::Drop(bootnode) - ]); - } - #[test] fn test_peerset_incoming() { let bootnode = PeerId::random(); @@ -646,35 +560,6 @@ mod tests { ]); } - #[test] - fn test_peerset_dropped() { - let bootnode = PeerId::random(); - let bootnode2 = PeerId::random(); - let reserved_peer = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 2, - bootnodes: vec![bootnode.clone(), bootnode2.clone()], - reserved_only: false, - reserved_nodes: vec![reserved_peer.clone()], - }; - - let (peerset, _handle) = Peerset::from_config(config); - - let mut peerset = assert_messages(peerset, vec![ - Message::Connect(reserved_peer.clone()), - Message::Connect(bootnode.clone()), - ]); - - peerset.dropped(reserved_peer.clone()); - peerset.dropped(bootnode); - - let _peerset = assert_messages(peerset, vec![ - Message::Connect(reserved_peer), - Message::Connect(bootnode2), - ]); - } - #[test] fn test_peerset_discovered() { let bootnode = PeerId::random(); @@ -698,4 +583,46 @@ mod tests { Message::Connect(discovered), ]); } + + #[test] + fn test_peerset_banned() { + let (mut peerset, handle) = Peerset::from_config(PeersetConfig { + in_peers: 25, + out_peers: 25, + bootnodes: vec![], + reserved_only: false, + reserved_nodes: vec![], + }); + + // We ban a node by setting its reputation under the threshold. + let peer_id = PeerId::random(); + handle.report_peer(peer_id.clone(), BANNED_THRESHOLD - 1); + + let fut = futures::future::poll_fn(move || -> Result<_, ()> { + // We need one polling for the message to be processed. + assert_eq!(peerset.poll().unwrap(), Async::NotReady); + + // Check that an incoming connection from that node gets refused. + peerset.incoming(peer_id.clone(), IncomingIndex(1)); + if let Async::Ready(msg) = peerset.poll().unwrap() { + assert_eq!(msg.unwrap(), Message::Reject(IncomingIndex(1))); + } else { + panic!() + } + + // Wait a bit for the node's reputation to go above the threshold. + thread::sleep(Duration::from_millis(1500)); + + // Try again. This time the node should be accepted. + peerset.incoming(peer_id.clone(), IncomingIndex(2)); + while let Async::Ready(msg) = peerset.poll().unwrap() { + assert_eq!(msg.unwrap(), Message::Accept(IncomingIndex(2))); + } + + Ok(Async::Ready(())) + }); + + tokio::runtime::current_thread::Runtime::new().unwrap().block_on(fut).unwrap(); + } } + diff --git a/core/peerset/src/peersstate.rs b/core/peerset/src/peersstate.rs new file mode 100644 index 0000000000000000000000000000000000000000..e02d6304046bc6f74b9a69e8a1cfbc2dc322f5ab --- /dev/null +++ b/core/peerset/src/peersstate.rs @@ -0,0 +1,639 @@ +// Copyright 2019 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 . + +//! Contains the state storage behind the peerset. + +use libp2p::PeerId; +use std::{borrow::Cow, collections::{HashSet, HashMap}}; +use log::warn; + +/// State storage behind the peerset. +/// +/// # Usage +/// +/// This struct is nothing more but a data structure containing a list of nodes, where each node +/// has a reputation and is either connected to us or not. +/// +#[derive(Debug, Clone)] +pub struct PeersState { + /// List of nodes that we know about. + /// + /// > **Note**: This list should really be ordered by decreasing reputation, so that we can + /// easily select the best node to connect to. As a first draft, however, we don't + /// sort, to make the logic easier. + nodes: HashMap, + + /// Number of non-priority nodes for which the `ConnectionState` is `In`. + num_in: u32, + + /// Number of non-priority nodes for which the `ConnectionState` is `In`. + num_out: u32, + + /// Maximum allowed number of non-priority nodes for which the `ConnectionState` is `In`. + max_in: u32, + + /// Maximum allowed number of non-priority nodes for which the `ConnectionState` is `Out`. + max_out: u32, + + /// Priority groups. Each group is identified by a string ID and contains a set of peer IDs. + priority_nodes: HashMap>, +} + +/// State of a single node that we know about. +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +struct Node { + /// Whether we are connected to this node. + connection_state: ConnectionState, + + /// Reputation value of the node, between `i32::min_value` (we hate that node) and + /// `i32::max_value` (we love that node). + reputation: i32, +} + +impl Default for Node { + fn default() -> Node { + Node { + connection_state: ConnectionState::NotConnected, + reputation: 0, + } + } +} + +/// Whether we are connected to a node. +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +enum ConnectionState { + /// We are connected through an ingoing connection. + In, + /// We are connected through an outgoing connection. + Out, + /// We are not connected to this node. + NotConnected, +} + +impl ConnectionState { + /// Returns `true` for `In` and `Out`. + fn is_connected(self) -> bool { + match self { + ConnectionState::In => true, + ConnectionState::Out => true, + ConnectionState::NotConnected => false, + } + } +} + +impl PeersState { + /// Builds a new empty `PeersState`. + pub fn new(in_peers: u32, out_peers: u32) -> Self { + PeersState { + nodes: HashMap::new(), + num_in: 0, + num_out: 0, + max_in: in_peers, + max_out: out_peers, + priority_nodes: HashMap::new(), + } + } + + /// Returns an object that grants access to the state of a peer. + pub fn peer<'a>(&'a mut self, peer_id: &'a PeerId) -> Peer<'a> { + match self.nodes.get_mut(peer_id) { + None => return Peer::Unknown(UnknownPeer { + parent: self, + peer_id: Cow::Borrowed(peer_id), + }), + Some(peer) => { + if peer.connection_state.is_connected() { + Peer::Connected(ConnectedPeer { + state: self, + peer_id: Cow::Borrowed(peer_id), + }) + } else { + Peer::NotConnected(NotConnectedPeer { + state: self, + peer_id: Cow::Borrowed(peer_id), + }) + } + } + } + } + + /// Returns the list of all the peers we know of. + // Note: this method could theoretically return a `Peer`, but implementing that + // isn't simple. + pub fn peers(&self) -> impl Iterator { + self.nodes.keys() + } + + /// Returns the list of peers we are connected to. + // Note: this method could theoretically return a `ConnectedPeer`, but implementing that + // isn't simple. + pub fn connected_peers(&self) -> impl Iterator { + self.nodes.iter() + .filter(|(_, p)| p.connection_state.is_connected()) + .map(|(p, _)| p) + } + + /// Returns the first priority peer that we are not connected to. + /// + /// If multiple nodes are prioritized, which one is returned is unspecified. + pub fn priority_not_connected_peer(&mut self) -> Option { + let id = self.priority_nodes.values() + .flatten() + .find(|id| self.nodes.get(id).map_or(false, |node| !node.connection_state.is_connected())) + .cloned(); + id.map(move |id| NotConnectedPeer { + state: self, + peer_id: Cow::Owned(id), + }) + } + + /// Returns the first priority peer that we are not connected to. + /// + /// If multiple nodes are prioritized, which one is returned is unspecified. + pub fn priority_not_connected_peer_from_group(&mut self, group_id: &str) -> Option { + let id = self.priority_nodes.get(group_id) + .and_then(|group| group.iter() + .find(|id| self.nodes.get(id).map_or(false, |node| !node.connection_state.is_connected())) + .cloned()); + id.map(move |id| NotConnectedPeer { + state: self, + peer_id: Cow::Owned(id), + }) + } + + /// Returns the peer with the highest reputation and that we are not connected to. + /// + /// If multiple nodes have the same reputation, which one is returned is unspecified. + pub fn highest_not_connected_peer(&mut self) -> Option { + let outcome = self.nodes + .iter_mut() + .filter(|(_, Node { connection_state, .. })| !connection_state.is_connected()) + .fold(None::<(&PeerId, &mut Node)>, |mut cur_node, to_try| { + if let Some(cur_node) = cur_node.take() { + if cur_node.1.reputation >= to_try.1.reputation { + return Some(cur_node); + } + } + Some(to_try) + }) + .map(|(peer_id, _)| peer_id.clone()); + + if let Some(peer_id) = outcome { + Some(NotConnectedPeer { + state: self, + peer_id: Cow::Owned(peer_id), + }) + } else { + None + } + } + + fn disconnect(&mut self, peer_id: &PeerId) { + let is_priority = self.is_priority(peer_id); + if let Some(mut node) = self.nodes.get_mut(peer_id) { + if !is_priority { + match node.connection_state { + ConnectionState::In => self.num_in -= 1, + ConnectionState::Out => self.num_out -= 1, + ConnectionState::NotConnected => + debug_assert!(false, "State inconsistency: disconnecting a disconnected node") + } + } + node.connection_state = ConnectionState::NotConnected; + } else { + warn!(target: "peerset", "Attempting to disconnect unknown peer {}", peer_id); + } + } + + /// Sets the peer as connected with an outgoing connection. + fn try_outgoing(&mut self, peer_id: &PeerId) -> bool { + // Note that it is possible for num_out to be strictly superior to the max, in case we were + // connected to reserved node then marked them as not reserved. + let is_priority = self.is_priority(peer_id); + if self.num_out >= self.max_out && !is_priority { + return false; + } + + if let Some(mut peer) = self.nodes.get_mut(peer_id) { + peer.connection_state = ConnectionState::Out; + if !is_priority { + self.num_out += 1; + } + return true; + } + false + } + + /// Tries to accept the peer as an incoming connection. + /// + /// If there are enough slots available, switches the node to "connected" and returns `Ok`. If + /// the slots are full, the node stays "not connected" and we return `Err`. + /// + /// Note that reserved nodes don't count towards the number of slots. + fn try_accept_incoming(&mut self, peer_id: &PeerId) -> bool { + let is_priority = self.is_priority(peer_id); + // Note that it is possible for num_in to be strictly superior to the max, in case we were + // connected to reserved node then marked them as not reserved. + if self.num_in >= self.max_in && !is_priority { + return false; + } + if let Some(mut peer) = self.nodes.get_mut(peer_id) { + peer.connection_state = ConnectionState::In; + if !is_priority { + self.num_in += 1; + } + return true; + } + false + } + + /// Sets priority group + pub fn set_priority_group(&mut self, group_id: &str, peers: HashSet) { + // update slot counters + let all_other_groups: HashSet<_> = self.priority_nodes + .iter() + .filter(|(g, _)| *g != group_id) + .flat_map(|(_, id)| id.clone()) + .collect(); + let existing_group = self.priority_nodes.remove(group_id).unwrap_or_default(); + for id in existing_group { + // update slots for nodes that are no longer priority + if !all_other_groups.contains(&id) { + if let Some(peer) = self.nodes.get_mut(&id) { + match peer.connection_state { + ConnectionState::In => self.num_in += 1, + ConnectionState::Out => self.num_out += 1, + ConnectionState::NotConnected => {}, + } + } + } + } + + for id in &peers { + // update slots for nodes that become priority + if !all_other_groups.contains(&id) { + let peer = self.nodes.entry(id.clone()).or_default(); + match peer.connection_state { + ConnectionState::In => self.num_in -= 1, + ConnectionState::Out => self.num_out -= 1, + ConnectionState::NotConnected => {}, + } + } + } + self.priority_nodes.insert(group_id.into(), peers); + } + + /// Add a peer to a priority group. + pub fn add_to_priority_group(&mut self, group_id: &str, peer_id: PeerId) { + let mut peers = self.priority_nodes.get(group_id).cloned().unwrap_or_default(); + peers.insert(peer_id); + self.set_priority_group(group_id, peers); + } + + /// Remove a peer from a priority group. + pub fn remove_from_priority_group(&mut self, group_id: &str, peer_id: &PeerId) { + let mut peers = self.priority_nodes.get(group_id).cloned().unwrap_or_default(); + peers.remove(&peer_id); + self.set_priority_group(group_id, peers); + } + + /// Get priority group content. + pub fn get_priority_group(&self, group_id: &str) -> Option> { + self.priority_nodes.get(group_id).cloned() + } + + /// Check that node is any priority group. + fn is_priority(&self, peer_id: &PeerId) -> bool { + self.priority_nodes.iter().any(|(_, group)| group.contains(peer_id)) + } + + /// Returns the reputation value of the node. + fn reputation(&self, peer_id: &PeerId) -> i32 { + self.nodes.get(peer_id).map_or(0, |p| p.reputation) + } + + /// Sets the reputation of the peer. + fn set_reputation(&mut self, peer_id: &PeerId, value: i32) { + let node = self.nodes + .entry(peer_id.clone()) + .or_default(); + node.reputation = value; + } + + /// Performs an arithmetic addition on the reputation score of that peer. + /// + /// In case of overflow, the value will be capped. + /// If the peer is unknown to us, we insert it and consider that it has a reputation of 0. + fn add_reputation(&mut self, peer_id: &PeerId, modifier: i32) { + let node = self.nodes + .entry(peer_id.clone()) + .or_default(); + node.reputation = node.reputation.saturating_add(modifier); + } +} + +/// Grants access to the state of a peer in the `PeersState`. +pub enum Peer<'a> { + /// We are connected to this node. + Connected(ConnectedPeer<'a>), + /// We are not connected to this node. + NotConnected(NotConnectedPeer<'a>), + /// We have never heard of this node. + Unknown(UnknownPeer<'a>), +} + +impl<'a> Peer<'a> { + /// If we are the `Connected` variant, returns the inner `ConnectedPeer`. Returns `None` + /// otherwise. + pub fn into_connected(self) -> Option> { + match self { + Peer::Connected(peer) => Some(peer), + Peer::NotConnected(_) => None, + Peer::Unknown(_) => None, + } + } + + /// If we are the `Unknown` variant, returns the inner `ConnectedPeer`. Returns `None` + /// otherwise. + #[cfg(test)] // Feel free to remove this if this function is needed outside of tests + pub fn into_not_connected(self) -> Option> { + match self { + Peer::Connected(_) => None, + Peer::NotConnected(peer) => Some(peer), + Peer::Unknown(_) => None, + } + } + + /// If we are the `Unknown` variant, returns the inner `ConnectedPeer`. Returns `None` + /// otherwise. + #[cfg(test)] // Feel free to remove this if this function is needed outside of tests + pub fn into_unknown(self) -> Option> { + match self { + Peer::Connected(_) => None, + Peer::NotConnected(_) => None, + Peer::Unknown(peer) => Some(peer), + } + } +} + +/// A peer that is connected to us. +pub struct ConnectedPeer<'a> { + state: &'a mut PeersState, + peer_id: Cow<'a, PeerId>, +} + +impl<'a> ConnectedPeer<'a> { + /// Destroys this `ConnectedPeer` and returns the `PeerId` inside of it. + pub fn into_peer_id(self) -> PeerId { + self.peer_id.into_owned() + } + + /// Switches the peer to "not connected". + pub fn disconnect(self) -> NotConnectedPeer<'a> { + self.state.disconnect(&self.peer_id); + NotConnectedPeer { + state: self.state, + peer_id: self.peer_id, + } + } + + /// Returns the reputation value of the node. + pub fn reputation(&self) -> i32 { + self.state.reputation(&self.peer_id) + } + + /// Sets the reputation of the peer. + pub fn set_reputation(&mut self, value: i32) { + self.state.set_reputation(&self.peer_id, value) + } + + /// Performs an arithmetic addition on the reputation score of that peer. + /// + /// In case of overflow, the value will be capped. + pub fn add_reputation(&mut self, modifier: i32) { + self.state.add_reputation(&self.peer_id, modifier) + } +} + +/// A peer that is not connected to us. +#[derive(Debug)] +pub struct NotConnectedPeer<'a> { + state: &'a mut PeersState, + peer_id: Cow<'a, PeerId>, +} + +impl<'a> NotConnectedPeer<'a> { + /// Destroys this `NotConnectedPeer` and returns the `PeerId` inside of it. + #[cfg(test)] // Feel free to remove this if this function is needed outside of tests + pub fn into_peer_id(self) -> PeerId { + self.peer_id.into_owned() + } + + /// Tries to set the peer as connected as an outgoing connection. + /// + /// If there are enough slots available, switches the node to "connected" and returns `Ok`. If + /// the slots are full, the node stays "not connected" and we return `Err`. + /// + /// Note that priority nodes don't count towards the number of slots. + pub fn try_outgoing(self) -> Result, NotConnectedPeer<'a>> { + if self.state.try_outgoing(&self.peer_id) { + Ok(ConnectedPeer { + state: self.state, + peer_id: self.peer_id, + }) + } else { + Err(self) + } + } + + /// Tries to accept the peer as an incoming connection. + /// + /// If there are enough slots available, switches the node to "connected" and returns `Ok`. If + /// the slots are full, the node stays "not connected" and we return `Err`. + /// + /// Note that priority nodes don't count towards the number of slots. + pub fn try_accept_incoming(self) -> Result, NotConnectedPeer<'a>> { + if self.state.try_accept_incoming(&self.peer_id) { + Ok(ConnectedPeer { + state: self.state, + peer_id: self.peer_id, + }) + } else { + Err(self) + } + } + + /// Returns the reputation value of the node. + pub fn reputation(&self) -> i32 { + self.state.reputation(&self.peer_id) + } + + /// Sets the reputation of the peer. + pub fn set_reputation(&mut self, value: i32) { + self.state.set_reputation(&self.peer_id, value) + } + + /// Performs an arithmetic addition on the reputation score of that peer. + /// + /// In case of overflow, the value will be capped. + /// If the peer is unknown to us, we insert it and consider that it has a reputation of 0. + pub fn add_reputation(&mut self, modifier: i32) { + self.state.add_reputation(&self.peer_id, modifier) + } +} + +/// A peer that we have never heard of. +pub struct UnknownPeer<'a> { + parent: &'a mut PeersState, + peer_id: Cow<'a, PeerId>, +} + +impl<'a> UnknownPeer<'a> { + /// Inserts the peer identity in our list. + /// + /// The node starts with a reputation of 0. You can adjust these default + /// values using the `NotConnectedPeer` that this method returns. + pub fn discover(self) -> NotConnectedPeer<'a> { + self.parent.nodes.insert(self.peer_id.clone().into_owned(), Node { + connection_state: ConnectionState::NotConnected, + reputation: 0, + }); + + let state = self.parent; + NotConnectedPeer { + state, + peer_id: self.peer_id, + } + } +} + +#[cfg(test)] +mod tests { + use super::{PeersState, Peer}; + use libp2p::PeerId; + + #[test] + fn full_slots_in() { + let mut peers_state = PeersState::new(1, 1); + let id1 = PeerId::random(); + let id2 = PeerId::random(); + + if let Peer::Unknown(e) = peers_state.peer(&id1) { + assert!(e.discover().try_accept_incoming().is_ok()); + } + + if let Peer::Unknown(e) = peers_state.peer(&id2) { + assert!(e.discover().try_accept_incoming().is_err()); + } + } + + #[test] + fn priority_node_doesnt_use_slot() { + let mut peers_state = PeersState::new(1, 1); + let id1 = PeerId::random(); + let id2 = PeerId::random(); + + peers_state.set_priority_group("test", vec![id1.clone()].into_iter().collect()); + if let Peer::NotConnected(p) = peers_state.peer(&id1) { + assert!(p.try_accept_incoming().is_ok()); + } else { panic!() } + + if let Peer::Unknown(e) = peers_state.peer(&id2) { + assert!(e.discover().try_accept_incoming().is_ok()); + } else { panic!() } + } + + #[test] + fn disconnecting_frees_slot() { + let mut peers_state = PeersState::new(1, 1); + let id1 = PeerId::random(); + let id2 = PeerId::random(); + + assert!(peers_state.peer(&id1).into_unknown().unwrap().discover().try_accept_incoming().is_ok()); + assert!(peers_state.peer(&id2).into_unknown().unwrap().discover().try_accept_incoming().is_err()); + peers_state.peer(&id1).into_connected().unwrap().disconnect(); + assert!(peers_state.peer(&id2).into_not_connected().unwrap().try_accept_incoming().is_ok()); + } + + #[test] + fn priority_not_connected_peer() { + let mut peers_state = PeersState::new(25, 25); + let id1 = PeerId::random(); + let id2 = PeerId::random(); + + assert!(peers_state.priority_not_connected_peer().is_none()); + peers_state.peer(&id1).into_unknown().unwrap().discover(); + peers_state.peer(&id2).into_unknown().unwrap().discover(); + + assert!(peers_state.priority_not_connected_peer().is_none()); + peers_state.set_priority_group("test", vec![id1.clone()].into_iter().collect()); + assert!(peers_state.priority_not_connected_peer().is_some()); + peers_state.set_priority_group("test", vec![id2.clone(), id2.clone()].into_iter().collect()); + assert!(peers_state.priority_not_connected_peer().is_some()); + peers_state.set_priority_group("test", vec![].into_iter().collect()); + assert!(peers_state.priority_not_connected_peer().is_none()); + } + + #[test] + fn highest_not_connected_peer() { + let mut peers_state = PeersState::new(25, 25); + let id1 = PeerId::random(); + let id2 = PeerId::random(); + + assert!(peers_state.highest_not_connected_peer().is_none()); + peers_state.peer(&id1).into_unknown().unwrap().discover().set_reputation(50); + peers_state.peer(&id2).into_unknown().unwrap().discover().set_reputation(25); + assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id1.clone())); + peers_state.peer(&id2).into_not_connected().unwrap().set_reputation(75); + assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id2.clone())); + peers_state.peer(&id2).into_not_connected().unwrap().try_accept_incoming().unwrap(); + assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id1.clone())); + peers_state.peer(&id1).into_not_connected().unwrap().set_reputation(100); + peers_state.peer(&id2).into_connected().unwrap().disconnect(); + assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id1.clone())); + peers_state.peer(&id1).into_not_connected().unwrap().set_reputation(-100); + assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id2.clone())); + } + + #[test] + fn disconnect_priority_doesnt_panic() { + let mut peers_state = PeersState::new(1, 1); + let id = PeerId::random(); + peers_state.set_priority_group("test", vec![id.clone()].into_iter().collect()); + let peer = peers_state.peer(&id).into_not_connected().unwrap().try_outgoing().unwrap(); + peer.disconnect(); + } + + #[test] + fn multiple_priority_groups_slot_count() { + let mut peers_state = PeersState::new(1, 1); + let id = PeerId::random(); + + if let Peer::Unknown(p) = peers_state.peer(&id) { + assert!(p.discover().try_accept_incoming().is_ok()); + } else { panic!() } + + assert_eq!(peers_state.num_in, 1); + peers_state.set_priority_group("test1", vec![id.clone()].into_iter().collect()); + assert_eq!(peers_state.num_in, 0); + peers_state.set_priority_group("test2", vec![id.clone()].into_iter().collect()); + assert_eq!(peers_state.num_in, 0); + peers_state.set_priority_group("test1", vec![].into_iter().collect()); + assert_eq!(peers_state.num_in, 0); + peers_state.set_priority_group("test2", vec![].into_iter().collect()); + assert_eq!(peers_state.num_in, 1); + } +} diff --git a/core/peerset/src/slots.rs b/core/peerset/src/slots.rs deleted file mode 100644 index 094e01ac60da2ff0f0456d5e6efc41bd646c9b0a..0000000000000000000000000000000000000000 --- a/core/peerset/src/slots.rs +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2018-2019 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 . - -use std::{fmt, mem}; -use libp2p::PeerId; -use linked_hash_map::LinkedHashMap; -use serde_json::json; - -/// Describes the nature of connection with a given peer. -#[derive(Debug, PartialEq, Clone, Copy)] -pub enum SlotType { - /// Reserved peer is a peer we should always stay connected to. - Reserved, - /// Common peer is a type of peer that we stay connected to only if it's - /// useful for us. - Common, -} - -/// Descibes the result of `add_peer` action. -pub enum SlotState { - /// Returned when `add_peer` successfully adds a peer to the slot. - Added(PeerId), - /// Returned when we already have given peer in our list, but it is upgraded from - /// `Common` to `Reserved`. - Upgraded(PeerId), - /// Returned when we should removed a common peer to make space for a reserved peer. - Swaped { - /// Peer was removed from the list. - removed: PeerId, - /// Peer was added to the list. - added: PeerId, - }, - /// Error returned when we are already know about given peer. - AlreadyExists(PeerId), - /// Error returned when list is full and no more peers can be added. - MaxCapacity(PeerId), -} - -/// Contains all information about group of slots. -pub struct Slots { - /// Maximum number of slots. Total number of reserved and common slots must be always - /// smaller or equal to `max_slots`. - max_slots: usize, - /// Reserved slots. - reserved: LinkedHashMap, - /// Common slots. - common: LinkedHashMap, -} - -impl fmt::Debug for Slots { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - struct ListFormatter<'a>(&'a LinkedHashMap); - - impl<'a> fmt::Debug for ListFormatter<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_list().entries(self.0.keys()).finish() - } - } - - f.debug_struct("Slots") - .field("max_slots", &self.max_slots) - .field("reserved", &ListFormatter(&self.reserved)) - .field("common", &ListFormatter(&self.common)) - .finish() - } -} - -impl Slots { - /// Creates a group of slots with a limited size. - pub fn new(max_slots: u32) -> Self { - let max_slots = max_slots as usize; - Slots { - max_slots, - reserved: LinkedHashMap::new(), - common: LinkedHashMap::new(), - } - } - - /// Returns true if one of the slots contains given peer. - pub fn contains(&self, peer_id: &PeerId) -> bool { - self.common.contains_key(peer_id) || self.reserved.contains_key(peer_id) - } - - /// Tries to find a slot for a given peer and returns `SlotState`. - /// - /// - If a peer is already inserted into reserved list or inserted or - /// inserted into common list and readded with the same `SlotType`, - /// the function returns `SlotState::AlreadyExists` - /// - If a peer is already inserted common list returns `SlotState::Upgraded` - /// - If there is no slot for a reserved peer, we try to drop one common peer - /// and it a new reserved one in it's place, function returns `SlotState::Swaped` - /// - If there is no place for a peer, function returns `SlotState::MaxCapacity` - /// - If the peer was simply added, `SlotState::Added` is returned - pub fn add_peer(&mut self, peer_id: PeerId, slot_type: SlotType) -> SlotState { - if self.reserved.contains_key(&peer_id) { - return SlotState::AlreadyExists(peer_id); - } - - if self.common.contains_key(&peer_id) { - if slot_type == SlotType::Reserved { - self.common.remove(&peer_id); - self.reserved.insert(peer_id.clone(), ()); - return SlotState::Upgraded(peer_id); - } else { - return SlotState::AlreadyExists(peer_id); - } - } - - if self.max_slots == (self.common.len() + self.reserved.len()) { - if let SlotType::Reserved = slot_type { - if let Some((to_remove, _)) = self.common.pop_front() { - self.reserved.insert(peer_id.clone(), ()); - return SlotState::Swaped { - removed: to_remove, - added: peer_id, - }; - } - } - return SlotState::MaxCapacity(peer_id); - } - - match slot_type { - SlotType::Common => self.common.insert(peer_id.clone(), ()), - SlotType::Reserved => self.reserved.insert(peer_id.clone(), ()), - }; - - SlotState::Added(peer_id) - } - - /// Pops the oldest reserved peer. If none exists and `reserved_only = false` pops a common peer. - pub fn pop_most_important_peer(&mut self, reserved_only: bool) -> Option<(PeerId, SlotType)> { - if let Some((peer_id, _)) = self.reserved.pop_front() { - return Some((peer_id, SlotType::Reserved)); - } - - if reserved_only { - return None; - } - - self.common.pop_front() - .map(|(peer_id, _)| (peer_id, SlotType::Common)) - } - - /// Removes all common peers from the list and returns an iterator over them. - pub fn clear_common_slots(&mut self) -> impl Iterator { - let slots = mem::replace(&mut self.common, LinkedHashMap::new()); - slots.into_iter().map(|(peer_id, _)| peer_id) - } - - /// Marks given peer as a reserved one. - pub fn mark_reserved(&mut self, peer_id: &PeerId) { - if self.common.remove(peer_id).is_some() { - self.reserved.insert(peer_id.clone(), ()); - } - } - - /// Marks given peer as not reserved one. - pub fn mark_not_reserved(&mut self, peer_id: &PeerId) { - if self.reserved.remove(peer_id).is_some() { - self.common.insert(peer_id.clone(), ()); - } - } - - /// Removes a peer from a list and returns true if it existed. - pub fn remove_peer(&mut self, peer_id: &PeerId) -> bool { - self.common.remove(peer_id).is_some() || self.reserved.remove(peer_id).is_some() - } - - /// Returns true if given peer is reserved. - pub fn is_reserved(&self, peer_id: &PeerId) -> bool { - self.reserved.contains_key(peer_id) - } - - /// Produces a JSON object containing the state of slots, for debugging purposes. - pub fn debug_info(&self) -> serde_json::Value { - json!({ - "max_slots": self.max_slots, - "reserved": self.reserved.keys().map(|peer_id| peer_id.to_base58()).collect::>(), - "common": self.common.keys().map(|peer_id| peer_id.to_base58()).collect::>() - }) - } -} - -#[cfg(test)] -mod tests { - use libp2p::PeerId; - use serde_json::json; - use super::{Slots, SlotType}; - - #[test] - fn test_slots_debug_info() { - let reserved_peer = PeerId::random(); - let reserved_peer2 = PeerId::random(); - let common_peer = PeerId::random(); - let mut slots = Slots::new(10); - - slots.add_peer(reserved_peer.clone(), SlotType::Reserved); - slots.add_peer(reserved_peer2.clone(), SlotType::Reserved); - slots.add_peer(common_peer.clone(), SlotType::Common); - - let expected = json!({ - "max_slots": 10, - "reserved": vec![reserved_peer.to_base58(), reserved_peer2.to_base58()], - "common": vec![common_peer.to_base58()], - }); - - assert_eq!(expected, slots.debug_info()); - } -} diff --git a/core/peerset/tests/fuzz.rs b/core/peerset/tests/fuzz.rs new file mode 100644 index 0000000000000000000000000000000000000000..42a7f2770cc9ccfe64d5d455a1a1046be254bfd1 --- /dev/null +++ b/core/peerset/tests/fuzz.rs @@ -0,0 +1,138 @@ +// Copyright 2018-2019 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 . + +use futures::prelude::*; +use libp2p::PeerId; +use rand::distributions::{Distribution, Uniform, WeightedIndex}; +use rand::seq::IteratorRandom; +use std::{collections::HashMap, collections::HashSet, iter}; +use substrate_peerset::{IncomingIndex, Message, PeersetConfig, Peerset}; + +#[test] +fn run() { + for _ in 0..50 { + test_once(); + } +} + +fn test_once() { + // PRNG to use. + let mut rng = rand::thread_rng(); + + // Nodes that the peerset knows about. + let mut known_nodes = HashSet::::new(); + // Nodes that we have reserved. Always a subset of `known_nodes`. + let mut reserved_nodes = HashSet::::new(); + + let (mut peerset, peerset_handle) = Peerset::from_config(PeersetConfig { + bootnodes: (0 .. Uniform::new_inclusive(0, 4).sample(&mut rng)).map(|_| { + let id = PeerId::random(); + known_nodes.insert(id.clone()); + id + }).collect(), + reserved_nodes: (0 .. Uniform::new_inclusive(0, 2).sample(&mut rng)).map(|_| { + let id = PeerId::random(); + known_nodes.insert(id.clone()); + reserved_nodes.insert(id.clone()); + id + }).collect(), + reserved_only: Uniform::new_inclusive(0, 10).sample(&mut rng) == 0, + in_peers: Uniform::new_inclusive(0, 25).sample(&mut rng), + out_peers: Uniform::new_inclusive(0, 25).sample(&mut rng), + }); + + tokio::runtime::current_thread::Runtime::new().unwrap().block_on(futures::future::poll_fn(move || -> Result<_, ()> { + // List of nodes the user of `peerset` assumes it's connected to. Always a subset of + // `known_nodes`. + let mut connected_nodes = HashSet::::new(); + // List of nodes the user of `peerset` called `incoming` with and that haven't been + // accepted or rejected yet. + let mut incoming_nodes = HashMap::::new(); + // Next id for incoming connections. + let mut next_incoming_id = IncomingIndex(0); + + // Perform a certain number of actions while checking that the state is consistent. If we + // reach the end of the loop, the run has succeeded. + for _ in 0 .. 2500 { + // Each of these weights corresponds to an action that we may perform. + let action_weights = [150, 90, 90, 30, 30, 1, 1, 4, 4]; + match WeightedIndex::new(&action_weights).unwrap().sample(&mut rng) { + // If we generate 0, poll the peerset. + 0 => match peerset.poll().unwrap() { + Async::Ready(Some(Message::Connect(id))) => { + if let Some(id) = incoming_nodes.iter().find(|(_, v)| **v == id).map(|(&id, _)| id) { + incoming_nodes.remove(&id); + } + assert!(connected_nodes.insert(id)); + } + Async::Ready(Some(Message::Drop(id))) => { connected_nodes.remove(&id); } + Async::Ready(Some(Message::Accept(n))) => + assert!(connected_nodes.insert(incoming_nodes.remove(&n).unwrap())), + Async::Ready(Some(Message::Reject(n))) => + assert!(!connected_nodes.contains(&incoming_nodes.remove(&n).unwrap())), + Async::Ready(None) => panic!(), + Async::NotReady => {} + } + + // If we generate 1, discover a new node. + 1 => { + let new_id = PeerId::random(); + known_nodes.insert(new_id.clone()); + peerset.discovered(iter::once(new_id)); + } + + // If we generate 2, adjust a random reputation. + 2 => if let Some(id) = known_nodes.iter().choose(&mut rng) { + let val = Uniform::new_inclusive(i32::min_value(), i32::max_value()).sample(&mut rng); + peerset_handle.report_peer(id.clone(), val); + } + + // If we generate 3, disconnect from a random node. + 3 => if let Some(id) = connected_nodes.iter().choose(&mut rng).cloned() { + connected_nodes.remove(&id); + peerset.dropped(id); + } + + // If we generate 4, connect to a random node. + 4 => if let Some(id) = known_nodes.iter() + .filter(|n| incoming_nodes.values().all(|m| m != *n) && !connected_nodes.contains(n)) + .choose(&mut rng) { + peerset.incoming(id.clone(), next_incoming_id.clone()); + incoming_nodes.insert(next_incoming_id.clone(), id.clone()); + next_incoming_id.0 += 1; + } + + // 5 and 6 are the reserved-only mode. + 5 => peerset_handle.set_reserved_only(true), + 6 => peerset_handle.set_reserved_only(false), + + // 7 and 8 are about switching a random node in or out of reserved mode. + 7 => if let Some(id) = known_nodes.iter().filter(|n| !reserved_nodes.contains(n)).choose(&mut rng) { + peerset_handle.add_reserved_peer(id.clone()); + reserved_nodes.insert(id.clone()); + } + 8 => if let Some(id) = reserved_nodes.iter().choose(&mut rng).cloned() { + reserved_nodes.remove(&id); + peerset_handle.remove_reserved_peer(id); + } + + _ => unreachable!() + } + } + + Ok(Async::Ready(())) + })).unwrap(); +} diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 02133e0655dc0bb74a43f91110e0705728295e8c..ab34cfcd1336081448f37778d98e888931c248af 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -11,14 +11,12 @@ rustc-hex = { version = "2.0", default-features = false } serde = { version = "1.0", optional = true, features = ["derive"] } twox-hash = { version = "1.2.0", optional = true } byteorder = { version = "1.3.1", default-features = false } -primitive-types = { version = "0.2", default-features = false, features = ["codec"] } +primitive-types = { version = "0.2.3", default-features = false, features = ["codec"] } impl-serde = { version = "0.1", optional = true } wasmi = { version = "0.4.3", optional = true } hash-db = { version = "0.12", default-features = false } hash256-std-hasher = { version = "0.12", default-features = false } -ring = { version = "0.14", optional = true } -untrusted = { version = "0.6", optional = true } -hex-literal = { version = "0.1", optional = true } +ed25519-dalek = { version = "1.0.0-pre.1", optional = true } base58 = { version = "0.1", optional = true } blake2-rfc = { version = "0.2.18", optional = true } schnorrkel = { version = "0.1", optional = true } @@ -27,14 +25,22 @@ sha2 = { version = "0.8", optional = true } substrate-bip39 = { git = "https://github.com/paritytech/substrate-bip39", optional = true } tiny-bip39 = { version = "0.6.1", optional = true } hex = { version = "0.3", optional = true } -regex = {version = "1.1", optional = true } +regex = { version = "1.1", optional = true } +num-traits = { version = "0.2", default-features = false } [dev-dependencies] substrate-serializer = { path = "../serializer" } pretty_assertions = "0.6" -heapsize = "0.4" -hex-literal = "0.1" +hex-literal = "0.2" rand = "0.6" +criterion = "0.2" + +[[bench]] +name = "benches" +harness = false + +[lib] +bench = false [features] default = ["std"] @@ -55,9 +61,7 @@ std = [ "rustc-hex/std", "twox-hash", "blake2-rfc", - "ring", - "untrusted", - "hex-literal", + "ed25519-dalek", "hex", "base58", "substrate-bip39", @@ -68,4 +72,5 @@ std = [ "sha2", "schnorrkel", "regex", + "num-traits/std", ] diff --git a/core/primitives/benches/benches.rs b/core/primitives/benches/benches.rs index b81ef9dc4252d344f33a898fa7fb1991639ccc4e..4a003257e2b6d2630c933de2e2dfb00513ccfe1b 100644 --- a/core/primitives/benches/benches.rs +++ b/core/primitives/benches/benches.rs @@ -12,49 +12,83 @@ // See the License for the specific language governing permissions and // limitations under the License. -// TODO: Move benchmark to criterion #2354 -#![feature(test)] -extern crate test; -use hex_literal::{hex, hex_impl}; -use substrate_primitives::hashing::{twox_128, blake2_128}; +#[macro_use] +extern crate criterion; +use criterion::{Criterion, black_box, Bencher, Fun}; +use std::time::Duration; +use substrate_primitives::crypto::Pair as _; +use substrate_primitives::hashing::{twox_128, blake2_128}; const MAX_KEY_SIZE: u32 = 32; -fn data_set() -> Vec> { +fn get_key(key_size: u32) -> Vec { use rand::SeedableRng; use rand::Rng; let rnd: [u8; 32] = rand::rngs::StdRng::seed_from_u64(12).gen(); let mut rnd = rnd.iter().cycle(); - let mut res = Vec::new(); - for size in 1..=MAX_KEY_SIZE { - for _ in 0..1_000 { - let value = (0..size) - .map(|_| rnd.next().unwrap().clone()) - .collect(); - res.push(value); - } - } - res + + (0..key_size) + .map(|_| rnd.next().unwrap().clone()) + .collect() +} + +fn bench_blake2_128(b: &mut Bencher, key: &Vec) { + b.iter(|| { + let _a = blake2_128(black_box(key)); + }); } -fn bench_hash_128(b: &mut test::Bencher, f: &Fn(&[u8]) -> [u8; 16]) { - let data_set = data_set(); +fn bench_twox_128(b: &mut Bencher, key: &Vec) { b.iter(|| { - for data in &data_set { - let _a = f(data); - } + let _a = twox_128(black_box(key)); }); } -#[bench] -fn bench_blake2_128(b: &mut test::Bencher) { - bench_hash_128(b, &blake2_128); +fn bench_hash_128_fix_size(c: &mut Criterion) { + let key = get_key(MAX_KEY_SIZE); + let blake_fn = Fun::new("blake2_128", bench_blake2_128); + let twox_fn = Fun::new("twox_128", bench_twox_128); + let fns = vec![blake_fn, twox_fn]; + + c.bench_functions("fixed size hashing", fns, key); +} + +fn bench_hash_128_dyn_size(c: &mut Criterion) { + let mut keys = Vec::new(); + for i in (2..MAX_KEY_SIZE).step_by(4) { + keys.push(get_key(i).clone()) + } + + c.bench_function_over_inputs("dyn size hashing - blake2", |b, key| bench_blake2_128(b, &key), keys.clone()); + c.bench_function_over_inputs("dyn size hashing - twox", |b, key| bench_twox_128(b, &key), keys); +} + +fn bench_ed25519(c: &mut Criterion) { + c.bench_function_over_inputs("signing - ed25519", |b, &msg_size| { + let msg = (0..msg_size) + .map(|_| rand::random::()) + .collect::>(); + let key = substrate_primitives::ed25519::Pair::generate(); + b.iter(|| key.sign(&msg)) + }, vec![32, 1024, 1024 * 1024]); + + c.bench_function_over_inputs("verifying - ed25519", |b, &msg_size| { + let msg = (0..msg_size) + .map(|_| rand::random::()) + .collect::>(); + let key = substrate_primitives::ed25519::Pair::generate(); + let sig = key.sign(&msg); + let public = key.public(); + b.iter(|| substrate_primitives::ed25519::Pair::verify(&sig, &msg, &public)) + }, vec![32, 1024, 1024 * 1024]); } -#[bench] -fn bench_twox_128(b: &mut test::Bencher) { - bench_hash_128(b, &twox_128); +criterion_group!{ + name = benches; + config = Criterion::default().warm_up_time(Duration::from_millis(500)).without_plots(); + targets = bench_hash_128_fix_size, bench_hash_128_dyn_size, bench_ed25519 } +criterion_main!(benches); diff --git a/core/primitives/src/changes_trie.rs b/core/primitives/src/changes_trie.rs index 9cf0066d71a38772749f9748d48259bfd4ed05a8..eb6a75454fe41d3ebd9fd5d363e20ac920dad630 100644 --- a/core/primitives/src/changes_trie.rs +++ b/core/primitives/src/changes_trie.rs @@ -19,6 +19,7 @@ #[cfg(any(feature = "std", test))] use serde::{Serialize, Deserialize}; use parity_codec::{Encode, Decode}; +use num_traits::Zero; /// Substrate changes trie configuration. #[cfg_attr(any(feature = "std", test), derive(Serialize, Deserialize))] @@ -26,10 +27,14 @@ use parity_codec::{Encode, Decode}; pub struct ChangesTrieConfiguration { /// Interval (in blocks) at which level1-digests are created. Digests are not /// created when this is less or equal to 1. - pub digest_interval: u64, + pub digest_interval: u32, /// Maximal number of digest levels in hierarchy. 0 means that digests are not /// created at all (even level1 digests). 1 means only level1-digests are created. /// 2 means that every digest_interval^2 there will be a level2-digest, and so on. + /// Please ensure that maximum digest interval (i.e. digest_interval^digest_levels) + /// is within `u32` limits. Otherwise you'll never see digests covering such intervals + /// && maximal digests interval will be truncated to the last interval that fits + /// `u32` limits. pub digest_levels: u32, } @@ -40,29 +45,30 @@ impl ChangesTrieConfiguration { } /// Do we need to build digest at given block? - pub fn is_digest_build_required_at_block(&self, block: u64) -> bool { - block != 0 + pub fn is_digest_build_required_at_block(&self, block: Number) -> bool + where + Number: From + PartialEq + ::rstd::ops::Rem + Zero, + { + block != 0.into() && self.is_digest_build_enabled() - && block % self.digest_interval == 0 + && (block % self.digest_interval.into()).is_zero() } /// Returns max digest interval. One if digests are not created at all. - /// Returns ::std::u64::MAX instead of panic in the case of overflow. - pub fn max_digest_interval(&self) -> u64 { + pub fn max_digest_interval(&self) -> u32 { if !self.is_digest_build_enabled() { return 1; } - // FIXME: use saturating_pow once stabilized - https://github.com/rust-lang/rust/issues/48320 - let mut max_digest_interval = self.digest_interval; - for _ in 1..self.digest_levels { - max_digest_interval = match max_digest_interval.checked_mul(self.digest_interval) { - Some(max_digest_interval) => max_digest_interval, - None => return u64::max_value(), + // we'll get >1 loop iteration only when bad configuration parameters are selected + let mut current_level = self.digest_levels; + loop { + if let Some(max_digest_interval) = self.digest_interval.checked_pow(current_level) { + return max_digest_interval; } - } - max_digest_interval + current_level = current_level - 1; + } } /// Returns Some if digest must be built at given block number. @@ -72,17 +78,21 @@ impl ChangesTrieConfiguration { /// digest interval (in blocks) /// step between blocks we're interested in when digest is built /// ) - pub fn digest_level_at_block(&self, block: u64) -> Option<(u32, u64, u64)> { - if !self.is_digest_build_required_at_block(block) { + pub fn digest_level_at_block(&self, block: Number) -> Option<(u32, u32, u32)> + where + Number: Clone + From + PartialEq + ::rstd::ops::Rem + Zero, + { + if !self.is_digest_build_required_at_block(block.clone()) { return None; } let mut digest_interval = self.digest_interval; let mut current_level = 1u32; - let mut digest_step = 1u64; + let mut digest_step = 1u32; while current_level < self.digest_levels { let new_digest_interval = match digest_interval.checked_mul(self.digest_interval) { - Some(new_digest_interval) if block % new_digest_interval == 0 => new_digest_interval, + Some(new_digest_interval) if (block.clone() % new_digest_interval.into()).is_zero() + => new_digest_interval, _ => break, }; @@ -103,7 +113,7 @@ impl ChangesTrieConfiguration { mod tests { use super::ChangesTrieConfiguration; - fn config(interval: u64, levels: u32) -> ChangesTrieConfiguration { + fn config(interval: u32, levels: u32) -> ChangesTrieConfiguration { ChangesTrieConfiguration { digest_interval: interval, digest_levels: levels, @@ -121,31 +131,31 @@ mod tests { #[test] fn is_digest_build_required_at_block_works() { - assert!(!config(8, 4).is_digest_build_required_at_block(0)); - assert!(!config(8, 4).is_digest_build_required_at_block(1)); - assert!(!config(8, 4).is_digest_build_required_at_block(2)); - assert!(!config(8, 4).is_digest_build_required_at_block(4)); - assert!(config(8, 4).is_digest_build_required_at_block(8)); - assert!(!config(8, 4).is_digest_build_required_at_block(9)); - assert!(config(8, 4).is_digest_build_required_at_block(64)); - assert!(config(8, 4).is_digest_build_required_at_block(64)); - assert!(config(8, 4).is_digest_build_required_at_block(512)); - assert!(config(8, 4).is_digest_build_required_at_block(4096)); - assert!(!config(8, 4).is_digest_build_required_at_block(4103)); - assert!(config(8, 4).is_digest_build_required_at_block(4104)); - assert!(!config(8, 4).is_digest_build_required_at_block(4108)); + assert!(!config(8, 4).is_digest_build_required_at_block(0u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(1u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(2u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(4u64)); + assert!(config(8, 4).is_digest_build_required_at_block(8u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(9u64)); + assert!(config(8, 4).is_digest_build_required_at_block(64u64)); + assert!(config(8, 4).is_digest_build_required_at_block(64u64)); + assert!(config(8, 4).is_digest_build_required_at_block(512u64)); + assert!(config(8, 4).is_digest_build_required_at_block(4096u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(4103u64)); + assert!(config(8, 4).is_digest_build_required_at_block(4104u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(4108u64)); } #[test] fn digest_level_at_block_works() { - assert_eq!(config(8, 4).digest_level_at_block(0), None); - assert_eq!(config(8, 4).digest_level_at_block(7), None); - assert_eq!(config(8, 4).digest_level_at_block(63), None); - assert_eq!(config(8, 4).digest_level_at_block(8), Some((1, 8, 1))); - assert_eq!(config(8, 4).digest_level_at_block(64), Some((2, 64, 8))); - assert_eq!(config(8, 4).digest_level_at_block(512), Some((3, 512, 64))); - assert_eq!(config(8, 4).digest_level_at_block(4096), Some((4, 4096, 512))); - assert_eq!(config(8, 4).digest_level_at_block(4112), Some((1, 8, 1))); + assert_eq!(config(8, 4).digest_level_at_block(0u64), None); + assert_eq!(config(8, 4).digest_level_at_block(7u64), None); + assert_eq!(config(8, 4).digest_level_at_block(63u64), None); + assert_eq!(config(8, 4).digest_level_at_block(8u64), Some((1, 8, 1))); + assert_eq!(config(8, 4).digest_level_at_block(64u64), Some((2, 64, 8))); + assert_eq!(config(8, 4).digest_level_at_block(512u64), Some((3, 512, 64))); + assert_eq!(config(8, 4).digest_level_at_block(4096u64), Some((4, 4096, 512))); + assert_eq!(config(8, 4).digest_level_at_block(4112u64), Some((1, 8, 1))); } #[test] @@ -153,6 +163,6 @@ mod tests { assert_eq!(config(0, 0).max_digest_interval(), 1); assert_eq!(config(2, 2).max_digest_interval(), 4); assert_eq!(config(8, 4).max_digest_interval(), 4096); - assert_eq!(config(::std::u64::MAX, 1024).max_digest_interval(), ::std::u64::MAX); + assert_eq!(config(::std::u32::MAX, 1024).max_digest_interval(), ::std::u32::MAX); } } diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index e0ecd4ce42ec9b2ba5a908c15db833f4c8d3c5a1..9cd71bb9b2a390145e7123764e72c9462922def6 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -215,7 +215,9 @@ pub trait Derive: Sized { /// Derive a child key from a series of given junctions. /// /// Will be `None` for public keys if there are any hard junctions in there. - fn derive>(&self, _path: Iter) -> Option { None } + fn derive>(&self, _path: Iter) -> Option { + None + } } #[cfg(feature = "std")] @@ -266,11 +268,19 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { let cap = re.captures(s).ok_or(PublicError::InvalidFormat)?; let re_junction = Regex::new(r"/(/?[^/]+)") .expect("constructed from known-good static value; qed"); - let path = re_junction.captures_iter(&cap["path"]) - .map(|f| DeriveJunction::from(&f[1])); - Self::from_ss58check(cap.name("ss58").map(|r| r.as_str()).unwrap_or(DEV_ADDRESS))? - .derive(path) - .ok_or(PublicError::InvalidPath) + let addr = Self::from_ss58check( + cap.name("ss58") + .map(|r| r.as_str()) + .unwrap_or(DEV_ADDRESS) + )?; + if cap["path"].is_empty() { + Ok(addr) + } else { + let path = re_junction.captures_iter(&cap["path"]) + .map(|f| DeriveJunction::from(&f[1])); + addr.derive(path) + .ok_or(PublicError::InvalidPath) + } } } @@ -278,7 +288,7 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { /// /// For now it just specifies how to create a key from a phrase and derivation path. #[cfg(feature = "std")] -pub trait Pair: Sized { +pub trait Pair: Sized + 'static { /// TThe type which is used to encode a public key. type Public; @@ -400,7 +410,7 @@ pub trait Pair: Sized { #[cfg(test)] mod tests { use crate::DeriveJunction; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; use super::*; #[derive(Eq, PartialEq, Debug)] diff --git a/core/primitives/src/ed25519.rs b/core/primitives/src/ed25519.rs index 937cc19a899c707635a7889cd8da61bc72a282bb..e593e997a41c8effbff7627993072829ee75b02b 100644 --- a/core/primitives/src/ed25519.rs +++ b/core/primitives/src/ed25519.rs @@ -22,20 +22,16 @@ use crate::{hash::H256, hash::H512}; use parity_codec::{Encode, Decode}; -#[cfg(feature = "std")] -use untrusted; #[cfg(feature = "std")] use blake2_rfc; #[cfg(feature = "std")] -use ring::{signature, signature::KeyPair, rand::{SecureRandom, SystemRandom}}; -#[cfg(feature = "std")] -use base58::{ToBase58, FromBase58}; -#[cfg(feature = "std")] use substrate_bip39::seed_from_entropy; #[cfg(feature = "std")] use bip39::{Mnemonic, Language, MnemonicType}; #[cfg(feature = "std")] -use crate::crypto::{Pair as TraitPair, DeriveJunction, SecretStringError, Derive}; +use rand::Rng; +#[cfg(feature = "std")] +use crate::crypto::{Pair as TraitPair, DeriveJunction, SecretStringError, Derive, Ss58Codec}; #[cfg(feature = "std")] use serde::{de, Serializer, Serialize, Deserializer, Deserialize}; use crate::crypto::UncheckedFrom; @@ -52,12 +48,16 @@ pub struct Public(pub [u8; 32]); /// A key pair. #[cfg(feature = "std")] -pub struct Pair(signature::Ed25519KeyPair, Seed); +pub struct Pair(ed25519_dalek::Keypair); #[cfg(feature = "std")] impl Clone for Pair { fn clone(&self) -> Self { - Pair::from_seed(self.1.clone()) + Pair(ed25519_dalek::Keypair { + public: self.0.public.clone(), + secret: ed25519_dalek::SecretKey::from_bytes(self.0.secret.as_bytes()) + .expect("key is always the correct size; qed") + }) } } @@ -324,36 +324,6 @@ impl Public { #[cfg(feature = "std")] impl Derive for Public {} -#[cfg(feature = "std")] -impl Public { - /// Some if the string is a properly encoded SS58Check address. - pub fn from_ss58check(s: &str) -> Result { - let d = s.from_base58().map_err(|_| PublicError::BadBase58)?; // failure here would be invalid encoding. - if d.len() != 35 { - // Invalid length. - return Err(PublicError::BadLength); - } - if d[0] != 42 { - // Invalid version. - return Err(PublicError::UnknownVersion); - } - if d[33..35] != blake2_rfc::blake2b::blake2b(64, &[], &d[0..33]).as_bytes()[0..2] { - // Invalid checksum. - return Err(PublicError::InvalidChecksum); - } - Ok(Self::from_slice(&d[1..33])) - } - - /// Return the ss58-check string for this key. - pub fn to_ss58check(&self) -> String { - let mut v = vec![42u8]; - v.extend(self.as_slice()); - let r = blake2_rfc::blake2b::blake2b(64, &[], &v); - v.extend(&r.as_bytes()[0..2]); - v.to_base58() - } -} - #[cfg(feature = "std")] impl AsRef for Pair { fn as_ref(&self) -> &Pair { @@ -391,7 +361,7 @@ impl TraitPair for Pair { /// for storage. If you want a persistent key pair, use `generate_with_phrase` instead. fn generate() -> Pair { let mut seed: Seed = Default::default(); - SystemRandom::new().fill(seed.as_mut()).expect("system random source should always work! qed"); + rand::rngs::EntropyRng::new().fill(seed.as_mut()); Self::from_seed(seed) } @@ -421,9 +391,10 @@ impl TraitPair for Pair { /// /// You should never need to use this; generate(), generate_with_phrasee fn from_seed(seed: Seed) -> Pair { - let key = signature::Ed25519KeyPair::from_seed_unchecked(untrusted::Input::from(&seed[..])) + let secret = ed25519_dalek::SecretKey::from_bytes(&seed[..]) .expect("seed has valid length; qed"); - Pair(key, seed) + let public = ed25519_dalek::PublicKey::from(&secret); + Pair(ed25519_dalek::Keypair { secret, public }) } /// Make a new key pair from secret seed material. The slice must be 32 bytes long or it @@ -442,7 +413,7 @@ impl TraitPair for Pair { /// Derive a child key from a series of given junctions. fn derive>(&self, path: Iter) -> Result { - let mut acc = self.1.clone(); + let mut acc = self.0.secret.to_bytes(); for j in path { match j { DeriveJunction::Soft(_cc) => return Err(DeriveError::SoftKeyInPath), @@ -460,28 +431,20 @@ impl TraitPair for Pair { /// Get the public key. fn public(&self) -> Public { let mut r = [0u8; 32]; - let pk = self.0.public_key().as_ref(); + let pk = self.0.public.as_bytes(); r.copy_from_slice(pk); Public(r) } /// Sign a message. fn sign(&self, message: &[u8]) -> Signature { - let mut r = [0u8; 64]; - r.copy_from_slice(self.0.sign(message).as_ref()); + let r = self.0.sign(message).to_bytes(); Signature::from_raw(r) } /// Verify a signature on a message. Returns true if the signature is good. fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { - let public_key = untrusted::Input::from(&pubkey.as_ref().0[..]); - let msg = untrusted::Input::from(message.as_ref()); - let sig = untrusted::Input::from(&sig.0[..]); - - match signature::verify(&signature::ED25519, public_key, msg, sig) { - Ok(_) => true, - _ => false, - } + Self::verify_weak(&sig.0[..], message.as_ref(), &pubkey.as_ref().0[..]) } /// Verify a signature on a message. Returns true if the signature is good. @@ -489,11 +452,17 @@ impl TraitPair for Pair { /// This doesn't use the type system to ensure that `sig` and `pubkey` are the correct /// size. Use it only if you're coming from byte buffers and need the speed. fn verify_weak, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool { - let public_key = untrusted::Input::from(pubkey.as_ref()); - let msg = untrusted::Input::from(message.as_ref()); - let sig = untrusted::Input::from(sig); + let public_key = match ed25519_dalek::PublicKey::from_bytes(pubkey.as_ref()) { + Ok(pk) => pk, + Err(_) => return false, + }; + + let sig = match ed25519_dalek::Signature::from_bytes(sig) { + Ok(s) => s, + Err(_) => return false + }; - match signature::verify(&signature::ED25519, public_key, msg, sig) { + match public_key.verify(message.as_ref(), &sig) { Ok(_) => true, _ => false, } @@ -504,7 +473,7 @@ impl TraitPair for Pair { impl Pair { /// Get the seed for this key. pub fn seed(&self) -> &Seed { - &self.1 + self.0.secret.as_bytes() } /// Exactly as `from_string` except that if no matches are found then, the the first 32 @@ -522,7 +491,7 @@ impl Pair { #[cfg(test)] mod test { use super::*; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; use crate::crypto::DEV_PHRASE; #[test] @@ -533,6 +502,16 @@ mod test { ); } + #[test] + fn seed_and_derive_should_work() { + let seed = hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60"); + let pair = Pair::from_seed(seed); + assert_eq!(pair.seed(), &seed); + let path = vec![DeriveJunction::Hard([0u8; 32])]; + let derived = pair.derive(path.into_iter()).ok().unwrap(); + assert_eq!(derived.seed(), &hex!("ede3354e133f9c8e337ddd6ee5415ed4b4ffe5fc7d21e933f4930a3730e5b21c")); + } + #[test] fn test_vector_should_work() { let pair: Pair = Pair::from_seed(hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60")); @@ -562,6 +541,7 @@ mod test { let message = b"Something important"; let signature = pair.sign(&message[..]); assert!(Pair::verify(&signature, &message[..], &public)); + assert!(!Pair::verify(&signature, b"Something else", &public)); } #[test] @@ -573,6 +553,7 @@ mod test { let signature = pair.sign(&message[..]); println!("Correct signature: {:?}", signature); assert!(Pair::verify(&signature, &message[..], &public)); + assert!(!Pair::verify(&signature, "Other message", &public)); } #[test] diff --git a/core/primitives/src/hash.rs b/core/primitives/src/hash.rs index f3e3583be5771b3d0569753393cf232ad9a68cf4..c63463e32ae2b94fad78ff5789c500dbeeb11109 100644 --- a/core/primitives/src/hash.rs +++ b/core/primitives/src/hash.rs @@ -78,11 +78,4 @@ mod tests { assert!(ser::from_str::("\"0\"").unwrap_err().is_data()); assert!(ser::from_str::("\"10\"").unwrap_err().is_data()); } - - #[test] - fn test_heapsizeof() { - use heapsize::HeapSizeOf; - let h = H256::zero(); - assert_eq!(h.heap_size_of_children(), 0); - } } diff --git a/core/primitives/src/hexdisplay.rs b/core/primitives/src/hexdisplay.rs index d748208d0e09ff911be9245a4588ece343191d59..cd2b6c18cb7fed04ecb08a2a6ac936c7853a1762 100644 --- a/core/primitives/src/hexdisplay.rs +++ b/core/primitives/src/hexdisplay.rs @@ -21,7 +21,7 @@ pub struct HexDisplay<'a>(&'a [u8]); impl<'a> HexDisplay<'a> { /// Create new instance that will display `d` as a hex string when displayed. - pub fn from(d: &'a AsBytesRef) -> Self { HexDisplay(d.as_bytes_ref()) } + pub fn from(d: &'a dyn AsBytesRef) -> Self { HexDisplay(d.as_bytes_ref()) } } impl<'a> ::core::fmt::Display for HexDisplay<'a> { @@ -79,7 +79,7 @@ pub fn ascii_format(asciish: &[u8]) -> String { let mut latch = false; for c in asciish { match (latch, *c) { - (false, 32...127) => r.push(*c as char), + (false, 32..=127) => r.push(*c as char), _ => { if !latch { r.push('#'); diff --git a/core/primitives/src/lib.rs b/core/primitives/src/lib.rs index 97f5480743cef5f397cb13da3b823e54a1fea5f2..7c0fd324fe0e1aaa25403dd6a920f2f526205d19 100644 --- a/core/primitives/src/lib.rs +++ b/core/primitives/src/lib.rs @@ -19,7 +19,6 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] /// Initialize a key-value collection from array. /// @@ -57,6 +56,7 @@ pub mod ed25519; pub mod sr25519; pub mod hash; mod hasher; +pub mod offchain; pub mod sandbox; pub mod storage; pub mod uint; @@ -86,25 +86,11 @@ pub enum ExecutionContext { /// Context used for block construction. BlockConstruction, /// Offchain worker context. - OffchainWorker(Box), + OffchainWorker(Box), /// Context used for other calls. Other, } -/// An extended externalities for offchain workers. -pub trait OffchainExt { - /// Submits an extrinsics. - /// - /// The extrinsic will either go to the pool (signed) - /// or to the next produced block (inherent). - fn submit_extrinsic(&mut self, extrinsic: Vec); -} -impl OffchainExt for Box { - fn submit_extrinsic(&mut self, ex: Vec) { - (&mut **self).submit_extrinsic(ex) - } -} - /// Hex-serialized shim for `Vec`. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash, PartialOrd, Ord))] diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs new file mode 100644 index 0000000000000000000000000000000000000000..7d54c9d61eb31d47d8e3bca8232544ca915203b2 --- /dev/null +++ b/core/primitives/src/offchain.rs @@ -0,0 +1,410 @@ +// Copyright 2019 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 . + +//! Offchain workers types + +use rstd::prelude::{Vec, Box}; +use rstd::convert::TryFrom; + +/// A type of supported crypto. +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[repr(C)] +pub enum CryptoKind { + /// SR25519 crypto (Schnorrkel) + Sr25519 = 1, + /// ED25519 crypto (Edwards) + Ed25519 = 2, +} + +impl TryFrom for CryptoKind { + type Error = (); + + fn try_from(kind: u32) -> Result { + match kind { + e if e == u32::from(CryptoKind::Sr25519 as u8) => Ok(CryptoKind::Sr25519), + e if e == u32::from(CryptoKind::Ed25519 as u8) => Ok(CryptoKind::Ed25519), + _ => Err(()) + } + } +} + +/// Opaque type for created crypto keys. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct CryptoKeyId(pub u16); + +/// Opaque type for offchain http requests. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct HttpRequestId(pub u16); + +/// An error enum returned by some http methods. +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[repr(C)] +pub enum HttpError { + /// The requested action couldn't been completed within a deadline. + DeadlineReached = 1, + /// There was an IO Error while processing the request. + IoError = 2, +} + +impl TryFrom for HttpError { + type Error = (); + + fn try_from(error: u32) -> Result { + match error { + e if e == HttpError::DeadlineReached as u8 as u32 => Ok(HttpError::DeadlineReached), + e if e == HttpError::IoError as u8 as u32 => Ok(HttpError::IoError), + _ => Err(()) + } + } +} + +/// Status of the HTTP request +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum HttpRequestStatus { + /// Deadline was reached while we waited for this request to finish. + /// + /// Note the deadline is controlled by the calling part, it not necessarily means + /// that the request has timed out. + DeadlineReached, + /// Request timed out. + /// + /// This means that the request couldn't be completed by the host environment + /// within a reasonable time (according to the host), has now been terminated + /// and is considered finished. + /// To retry the request you need to construct it again. + Timeout, + /// Request status of this ID is not known. + Unknown, + /// The request has finished with given status code. + Finished(u16), +} + +impl From for u32 { + fn from(status: HttpRequestStatus) -> Self { + match status { + HttpRequestStatus::Unknown => 0, + HttpRequestStatus::DeadlineReached => 10, + HttpRequestStatus::Timeout => 20, + HttpRequestStatus::Finished(code) => u32::from(code), + } + } +} + +impl TryFrom for HttpRequestStatus { + type Error = (); + + fn try_from(status: u32) -> Result { + match status { + 0 => Ok(HttpRequestStatus::Unknown), + 10 => Ok(HttpRequestStatus::DeadlineReached), + 20 => Ok(HttpRequestStatus::Timeout), + 100..=999 => u16::try_from(status).map(HttpRequestStatus::Finished).map_err(|_| ()), + _ => Err(()), + } + } +} + +/// Opaque timestamp type +#[derive(Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Timestamp(u64); + +/// Duration type +#[derive(Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Duration(u64); + +impl Duration { + /// Create new duration representing given number of milliseconds. + pub fn from_millis(millis: u64) -> Self { + Duration(millis) + } + + /// Returns number of milliseconds this Duration represents. + pub fn millis(&self) -> u64 { + self.0 + } +} + +impl Timestamp { + /// Creates new `Timestamp` given unix timestamp in miliseconds. + pub fn from_unix_millis(millis: u64) -> Self { + Timestamp(millis) + } + + /// Increase the timestamp by given `Duration`. + pub fn add(&self, duration: Duration) -> Timestamp { + Timestamp(self.0.saturating_add(duration.0)) + } + + /// Decrease the timestamp by given `Duration` + pub fn sub(&self, duration: Duration) -> Timestamp { + Timestamp(self.0.saturating_sub(duration.0)) + } + + /// Returns a saturated difference (Duration) between two Timestamps. + pub fn diff(&self, other: &Self) -> Duration { + Duration(self.0.saturating_sub(other.0)) + } + + /// Return number of milliseconds since UNIX epoch. + pub fn unix_millis(&self) -> u64 { + self.0 + } +} + +/// An extended externalities for offchain workers. +pub trait Externalities { + /// Submit transaction. + /// + /// The transaction will end up in the pool and be propagated to others. + fn submit_transaction(&mut self, extrinsic: Vec) -> Result<(), ()>; + + /// Create new key(pair) for signing/encryption/decryption. + /// + /// Returns an error if given crypto kind is not supported. + fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result; + + /// Encrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn encrypt(&mut self, key: Option, data: &[u8]) -> Result, ()>; + + /// Decrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist. + fn decrypt(&mut self, key: Option, data: &[u8]) -> Result, ()>; + + /// Sign a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn sign(&mut self, key: Option, data: &[u8]) -> Result, ()>; + + /// Verifies that `signature` for `msg` matches given `key`. + /// + /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. + /// Returns an error in case the key is not available or does not exist or the parameters + /// lengths are incorrect. + fn verify(&mut self, key: Option, msg: &[u8], signature: &[u8]) -> Result; + + /// Returns current UNIX timestamp (in millis) + fn timestamp(&mut self) -> Timestamp; + + /// Pause the execution until `deadline` is reached. + fn sleep_until(&mut self, deadline: Timestamp); + + /// Returns a random seed. + /// + /// This is a trully random non deterministic seed generated by host environment. + /// Obviously fine in the off-chain worker context. + fn random_seed(&mut self) -> [u8; 32]; + + /// Sets a value in the local storage. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_set(&mut self, key: &[u8], value: &[u8]); + + /// Sets a value in the local storage if it matches current value. + /// + /// Since multiple offchain workers may be running concurrently, to prevent + /// data races use CAS to coordinate between them. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_compare_and_set(&mut self, key: &[u8], old_value: &[u8], new_value: &[u8]); + + /// Gets a value from the local storage. + /// + /// If the value does not exist in the storage `None` will be returned. + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_get(&mut self, key: &[u8]) -> Option>; + + /// Initiaties a http request given HTTP verb and the URL. + /// + /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. + /// Returns the id of newly started request. + fn http_request_start( + &mut self, + method: &str, + uri: &str, + meta: &[u8] + ) -> Result; + + /// Append header to the request. + fn http_request_add_header( + &mut self, + request_id: HttpRequestId, + name: &str, + value: &str + ) -> Result<(), ()>; + + /// Write a chunk of request body. + /// + /// Writing an empty chunks finalises the request. + /// Passing `None` as deadline blocks forever. + /// + /// Returns an error in case deadline is reached or the chunk couldn't be written. + fn http_request_write_body( + &mut self, + request_id: HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), HttpError>; + + /// Block and wait for the responses for given requests. + /// + /// Returns a vector of request statuses (the len is the same as ids). + /// Note that if deadline is not provided the method will block indefinitely, + /// otherwise unready responses will produce `DeadlineReached` status. + /// + /// Passing `None` as deadline blocks forever. + fn http_response_wait( + &mut self, + ids: &[HttpRequestId], + deadline: Option + ) -> Vec; + + /// Read all response headers. + /// + /// Returns a vector of pairs `(HeaderKey, HeaderValue)`. + fn http_response_headers( + &mut self, + request_id: HttpRequestId + ) -> Vec<(Vec, Vec)>; + + /// Read a chunk of body response to given buffer. + /// + /// Returns the number of bytes written or an error in case a deadline + /// is reached or server closed the connection. + /// Passing `None` as a deadline blocks forever. + fn http_response_read_body( + &mut self, + request_id: HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result; + +} +impl Externalities for Box { + fn submit_transaction(&mut self, ex: Vec) -> Result<(), ()> { + (&mut **self).submit_transaction(ex) + } + + fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result { + (&mut **self).new_crypto_key(crypto) + } + + fn encrypt(&mut self, key: Option, data: &[u8]) -> Result, ()> { + (&mut **self).encrypt(key, data) + } + + fn decrypt(&mut self, key: Option, data: &[u8]) -> Result, ()> { + (&mut **self).decrypt(key, data) + } + + fn sign(&mut self, key: Option, data: &[u8]) -> Result, ()> { + (&mut **self).sign(key, data) + } + + fn verify(&mut self, key: Option, msg: &[u8], signature: &[u8]) -> Result { + (&mut **self).verify(key, msg, signature) + } + + fn timestamp(&mut self) -> Timestamp { + (&mut **self).timestamp() + } + + fn sleep_until(&mut self, deadline: Timestamp) { + (&mut **self).sleep_until(deadline) + } + + fn random_seed(&mut self) -> [u8; 32] { + (&mut **self).random_seed() + } + + fn local_storage_set(&mut self, key: &[u8], value: &[u8]) { + (&mut **self).local_storage_set(key, value) + } + + fn local_storage_compare_and_set(&mut self, key: &[u8], old_value: &[u8], new_value: &[u8]) { + (&mut **self).local_storage_compare_and_set(key, old_value, new_value) + } + + fn local_storage_get(&mut self, key: &[u8]) -> Option> { + (&mut **self).local_storage_get(key) + } + + fn http_request_start(&mut self, method: &str, uri: &str, meta: &[u8]) -> Result { + (&mut **self).http_request_start(method, uri, meta) + } + + fn http_request_add_header(&mut self, request_id: HttpRequestId, name: &str, value: &str) -> Result<(), ()> { + (&mut **self).http_request_add_header(request_id, name, value) + } + + fn http_request_write_body( + &mut self, + request_id: HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), HttpError> { + (&mut **self).http_request_write_body(request_id, chunk, deadline) + } + + fn http_response_wait(&mut self, ids: &[HttpRequestId], deadline: Option) -> Vec { + (&mut **self).http_response_wait(ids, deadline) + } + + fn http_response_headers(&mut self, request_id: HttpRequestId) -> Vec<(Vec, Vec)> { + (&mut **self).http_response_headers(request_id) + } + + fn http_response_read_body( + &mut self, + request_id: HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result { + (&mut **self).http_response_read_body(request_id, buffer, deadline) + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn timestamp_ops() { + let t = Timestamp(5); + assert_eq!(t.add(Duration::from_millis(10)), Timestamp(15)); + assert_eq!(t.sub(Duration::from_millis(10)), Timestamp(0)); + assert_eq!(t.diff(&Timestamp(3)), Duration(2)); + } +} diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index e70e35c1aeb9ab067c932f7f2f92587643fef70a..876dcb707832487b67b25d127f5cb331c7cf8848 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -204,16 +204,16 @@ impl From for Signature { } #[cfg(feature = "std")] -impl ::std::fmt::Debug for Signature { +impl std::fmt::Debug for Signature { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) } } #[cfg(feature = "std")] -impl ::std::hash::Hash for Signature { - fn hash(&self, state: &mut H) { - ::std::hash::Hash::hash(&self.0[..], state); +impl std::hash::Hash for Signature { + fn hash(&self, state: &mut H) { + std::hash::Hash::hash(&self.0[..], state); } } @@ -304,15 +304,13 @@ impl Public { /// Return a `Vec` filled with raw data. #[cfg(feature = "std")] - pub fn to_raw_vec(self) -> Vec { - let r: &[u8; 32] = self.as_ref(); - r.to_vec() + pub fn into_raw_vec(self) -> Vec { + self.0.to_vec() } /// Return a slice filled with raw data. pub fn as_slice(&self) -> &[u8] { - let r: &[u8; 32] = self.as_ref(); - &r[..] + &self.0 } /// Return a slice filled with raw data. @@ -504,7 +502,7 @@ impl Pair { mod test { use super::*; use crate::crypto::{Ss58Codec, DEV_PHRASE, DEV_ADDRESS}; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; #[test] fn default_phrase_should_be_used() { @@ -637,7 +635,7 @@ mod test { #[test] fn verify_from_wasm_works() { // The values in this test case are compared to the output of `node-test.js` in schnorrkel-js. - // + // // This is to make sure that the wasm library is compatible. let pk = Pair::from_seed(hex!("0000000000000000000000000000000000000000000000000000000000000000")); let public = pk.public(); diff --git a/core/primitives/src/u32_trait.rs b/core/primitives/src/u32_trait.rs index 3fcdceac4cbbfacea532c498648ccee980a0e36c..d8fac34c301ab4ee78417c1d8c8755e89b53795a 100644 --- a/core/primitives/src/u32_trait.rs +++ b/core/primitives/src/u32_trait.rs @@ -21,6 +21,7 @@ pub trait Value { /// The actual value represented by the impl'ing type. const VALUE: u32; } + /// Type representing the value 0 for the `Value` trait. pub struct _0; impl Value for _0 { const VALUE: u32 = 0; } /// Type representing the value 1 for the `Value` trait. @@ -55,22 +56,174 @@ pub struct _14; impl Value for _14 { const VALUE: u32 = 14; } pub struct _15; impl Value for _15 { const VALUE: u32 = 15; } /// Type representing the value 16 for the `Value` trait. pub struct _16; impl Value for _16 { const VALUE: u32 = 16; } +/// Type representing the value 17 for the `Value` trait. +pub struct _17; impl Value for _17 { const VALUE: u32 = 17; } +/// Type representing the value 18 for the `Value` trait. +pub struct _18; impl Value for _18 { const VALUE: u32 = 18; } +/// Type representing the value 19 for the `Value` trait. +pub struct _19; impl Value for _19 { const VALUE: u32 = 19; } +/// Type representing the value 20 for the `Value` trait. +pub struct _20; impl Value for _20 { const VALUE: u32 = 20; } +/// Type representing the value 21 for the `Value` trait. +pub struct _21; impl Value for _21 { const VALUE: u32 = 21; } +/// Type representing the value 22 for the `Value` trait. +pub struct _22; impl Value for _22 { const VALUE: u32 = 22; } +/// Type representing the value 23 for the `Value` trait. +pub struct _23; impl Value for _23 { const VALUE: u32 = 23; } /// Type representing the value 24 for the `Value` trait. pub struct _24; impl Value for _24 { const VALUE: u32 = 24; } +/// Type representing the value 25 for the `Value` trait. +pub struct _25; impl Value for _25 { const VALUE: u32 = 25; } +/// Type representing the value 26 for the `Value` trait. +pub struct _26; impl Value for _26 { const VALUE: u32 = 26; } +/// Type representing the value 27 for the `Value` trait. +pub struct _27; impl Value for _27 { const VALUE: u32 = 27; } +/// Type representing the value 28 for the `Value` trait. +pub struct _28; impl Value for _28 { const VALUE: u32 = 28; } +/// Type representing the value 29 for the `Value` trait. +pub struct _29; impl Value for _29 { const VALUE: u32 = 29; } +/// Type representing the value 30 for the `Value` trait. +pub struct _30; impl Value for _30 { const VALUE: u32 = 30; } +/// Type representing the value 31 for the `Value` trait. +pub struct _31; impl Value for _31 { const VALUE: u32 = 31; } /// Type representing the value 32 for the `Value` trait. pub struct _32; impl Value for _32 { const VALUE: u32 = 32; } +/// Type representing the value 33 for the `Value` trait. +pub struct _33; impl Value for _33 { const VALUE: u32 = 33; } +/// Type representing the value 34 for the `Value` trait. +pub struct _34; impl Value for _34 { const VALUE: u32 = 34; } +/// Type representing the value 35 for the `Value` trait. +pub struct _35; impl Value for _35 { const VALUE: u32 = 35; } +/// Type representing the value 36 for the `Value` trait. +pub struct _36; impl Value for _36 { const VALUE: u32 = 36; } +/// Type representing the value 37 for the `Value` trait. +pub struct _37; impl Value for _37 { const VALUE: u32 = 37; } +/// Type representing the value 38 for the `Value` trait. +pub struct _38; impl Value for _38 { const VALUE: u32 = 38; } +/// Type representing the value 39 for the `Value` trait. +pub struct _39; impl Value for _39 { const VALUE: u32 = 39; } /// Type representing the value 40 for the `Value` trait. pub struct _40; impl Value for _40 { const VALUE: u32 = 40; } +/// Type representing the value 41 for the `Value` trait. +pub struct _41; impl Value for _41 { const VALUE: u32 = 41; } +/// Type representing the value 42 for the `Value` trait. +pub struct _42; impl Value for _42 { const VALUE: u32 = 42; } +/// Type representing the value 43 for the `Value` trait. +pub struct _43; impl Value for _43 { const VALUE: u32 = 43; } +/// Type representing the value 44 for the `Value` trait. +pub struct _44; impl Value for _44 { const VALUE: u32 = 44; } +/// Type representing the value 45 for the `Value` trait. +pub struct _45; impl Value for _45 { const VALUE: u32 = 45; } +/// Type representing the value 46 for the `Value` trait. +pub struct _46; impl Value for _46 { const VALUE: u32 = 46; } +/// Type representing the value 47 for the `Value` trait. +pub struct _47; impl Value for _47 { const VALUE: u32 = 47; } /// Type representing the value 48 for the `Value` trait. pub struct _48; impl Value for _48 { const VALUE: u32 = 48; } +/// Type representing the value 49 for the `Value` trait. +pub struct _49; impl Value for _49 { const VALUE: u32 = 49; } +/// Type representing the value 50 for the `Value` trait. +pub struct _50; impl Value for _50 { const VALUE: u32 = 50; } +/// Type representing the value 51 for the `Value` trait. +pub struct _51; impl Value for _51 { const VALUE: u32 = 51; } +/// Type representing the value 52 for the `Value` trait. +pub struct _52; impl Value for _52 { const VALUE: u32 = 52; } +/// Type representing the value 53 for the `Value` trait. +pub struct _53; impl Value for _53 { const VALUE: u32 = 53; } +/// Type representing the value 54 for the `Value` trait. +pub struct _54; impl Value for _54 { const VALUE: u32 = 54; } +/// Type representing the value 55 for the `Value` trait. +pub struct _55; impl Value for _55 { const VALUE: u32 = 55; } /// Type representing the value 56 for the `Value` trait. pub struct _56; impl Value for _56 { const VALUE: u32 = 56; } +/// Type representing the value 57 for the `Value` trait. +pub struct _57; impl Value for _57 { const VALUE: u32 = 57; } +/// Type representing the value 58 for the `Value` trait. +pub struct _58; impl Value for _58 { const VALUE: u32 = 58; } +/// Type representing the value 59 for the `Value` trait. +pub struct _59; impl Value for _59 { const VALUE: u32 = 59; } +/// Type representing the value 60 for the `Value` trait. +pub struct _60; impl Value for _60 { const VALUE: u32 = 60; } +/// Type representing the value 61 for the `Value` trait. +pub struct _61; impl Value for _61 { const VALUE: u32 = 61; } +/// Type representing the value 62 for the `Value` trait. +pub struct _62; impl Value for _62 { const VALUE: u32 = 62; } +/// Type representing the value 63 for the `Value` trait. +pub struct _63; impl Value for _63 { const VALUE: u32 = 63; } /// Type representing the value 64 for the `Value` trait. pub struct _64; impl Value for _64 { const VALUE: u32 = 64; } +/// Type representing the value 65 for the `Value` trait. +pub struct _65; impl Value for _65 { const VALUE: u32 = 65; } +/// Type representing the value 66 for the `Value` trait. +pub struct _66; impl Value for _66 { const VALUE: u32 = 66; } +/// Type representing the value 67 for the `Value` trait. +pub struct _67; impl Value for _67 { const VALUE: u32 = 67; } +/// Type representing the value 68 for the `Value` trait. +pub struct _68; impl Value for _68 { const VALUE: u32 = 68; } +/// Type representing the value 69 for the `Value` trait. +pub struct _69; impl Value for _69 { const VALUE: u32 = 69; } +/// Type representing the value 70 for the `Value` trait. +pub struct _70; impl Value for _70 { const VALUE: u32 = 70; } +/// Type representing the value 71 for the `Value` trait. +pub struct _71; impl Value for _71 { const VALUE: u32 = 71; } +/// Type representing the value 72 for the `Value` trait. +pub struct _72; impl Value for _72 { const VALUE: u32 = 72; } +/// Type representing the value 73 for the `Value` trait. +pub struct _73; impl Value for _73 { const VALUE: u32 = 73; } +/// Type representing the value 74 for the `Value` trait. +pub struct _74; impl Value for _74 { const VALUE: u32 = 74; } +/// Type representing the value 75 for the `Value` trait. +pub struct _75; impl Value for _75 { const VALUE: u32 = 75; } +/// Type representing the value 76 for the `Value` trait. +pub struct _76; impl Value for _76 { const VALUE: u32 = 76; } +/// Type representing the value 77 for the `Value` trait. +pub struct _77; impl Value for _77 { const VALUE: u32 = 77; } +/// Type representing the value 78 for the `Value` trait. +pub struct _78; impl Value for _78 { const VALUE: u32 = 78; } +/// Type representing the value 79 for the `Value` trait. +pub struct _79; impl Value for _79 { const VALUE: u32 = 79; } /// Type representing the value 80 for the `Value` trait. pub struct _80; impl Value for _80 { const VALUE: u32 = 80; } +/// Type representing the value 81 for the `Value` trait. +pub struct _81; impl Value for _81 { const VALUE: u32 = 81; } +/// Type representing the value 82 for the `Value` trait. +pub struct _82; impl Value for _82 { const VALUE: u32 = 82; } +/// Type representing the value 83 for the `Value` trait. +pub struct _83; impl Value for _83 { const VALUE: u32 = 83; } +/// Type representing the value 84 for the `Value` trait. +pub struct _84; impl Value for _84 { const VALUE: u32 = 84; } +/// Type representing the value 85 for the `Value` trait. +pub struct _85; impl Value for _85 { const VALUE: u32 = 85; } +/// Type representing the value 86 for the `Value` trait. +pub struct _86; impl Value for _86 { const VALUE: u32 = 86; } +/// Type representing the value 87 for the `Value` trait. +pub struct _87; impl Value for _87 { const VALUE: u32 = 87; } +/// Type representing the value 88 for the `Value` trait. +pub struct _88; impl Value for _88 { const VALUE: u32 = 88; } +/// Type representing the value 89 for the `Value` trait. +pub struct _89; impl Value for _89 { const VALUE: u32 = 89; } +/// Type representing the value 90 for the `Value` trait. +pub struct _90; impl Value for _90 { const VALUE: u32 = 90; } +/// Type representing the value 91 for the `Value` trait. +pub struct _91; impl Value for _91 { const VALUE: u32 = 91; } +/// Type representing the value 92 for the `Value` trait. +pub struct _92; impl Value for _92 { const VALUE: u32 = 92; } +/// Type representing the value 93 for the `Value` trait. +pub struct _93; impl Value for _93 { const VALUE: u32 = 93; } +/// Type representing the value 94 for the `Value` trait. +pub struct _94; impl Value for _94 { const VALUE: u32 = 94; } +/// Type representing the value 95 for the `Value` trait. +pub struct _95; impl Value for _95 { const VALUE: u32 = 95; } /// Type representing the value 96 for the `Value` trait. pub struct _96; impl Value for _96 { const VALUE: u32 = 96; } +/// Type representing the value 97 for the `Value` trait. +pub struct _97; impl Value for _97 { const VALUE: u32 = 97; } +/// Type representing the value 98 for the `Value` trait. +pub struct _98; impl Value for _98 { const VALUE: u32 = 98; } +/// Type representing the value 99 for the `Value` trait. +pub struct _99; impl Value for _99 { const VALUE: u32 = 99; } +/// Type representing the value 100 for the `Value` trait. +pub struct _100; impl Value for _100 { const VALUE: u32 = 100; } /// Type representing the value 112 for the `Value` trait. pub struct _112; impl Value for _112 { const VALUE: u32 = 112; } /// Type representing the value 128 for the `Value` trait. @@ -87,3 +240,4 @@ pub struct _256; impl Value for _256 { const VALUE: u32 = 256; } pub struct _384; impl Value for _384 { const VALUE: u32 = 384; } /// Type representing the value 512 for the `Value` trait. pub struct _512; impl Value for _512 { const VALUE: u32 = 512; } + diff --git a/core/rpc-servers/Cargo.toml b/core/rpc-servers/Cargo.toml index e4c72be4d7de0f54f40e4d4218199530423059dc..bca094b572d5f1d6ed6f5a143f8eaa27d1168bed 100644 --- a/core/rpc-servers/Cargo.toml +++ b/core/rpc-servers/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "substrate-rpc-servers" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -http = { package = "jsonrpc-http-server", version = "10.0.1" } -pubsub = { package = "jsonrpc-pubsub", version = "10.0.1" } -ws = { package = "jsonrpc-ws-server", version = "10.0.1" } +http = { package = "jsonrpc-http-server", version = "12.0.0" } +pubsub = { package = "jsonrpc-pubsub", version = "12.0.0" } +ws = { package = "jsonrpc-ws-server", version = "12.0.0" } log = "0.4" serde = "1.0" substrate-rpc = { path = "../rpc" } diff --git a/core/rpc-servers/src/lib.rs b/core/rpc-servers/src/lib.rs index b37895c503f22cc3d1e1486528005948e0a11e01..adf560ce5a6375eeee780ecace7ef6c42908959a 100644 --- a/core/rpc-servers/src/lib.rs +++ b/core/rpc-servers/src/lib.rs @@ -24,9 +24,12 @@ use std::io; use log::error; use sr_primitives::{traits::{Block as BlockT, NumberFor}, generic::SignedBlock}; -/// Maximal payload accepted by RPC servers +/// Maximal payload accepted by RPC servers. const MAX_PAYLOAD: usize = 15 * 1024 * 1024; +/// Default maximum number of connections for WS RPC servers. +const WS_MAX_CONNECTIONS: usize = 100; + type Metadata = apis::metadata::Metadata; type RpcHandler = pubsub::PubSubHandler; pub type HttpServer = http::Server; @@ -76,17 +79,19 @@ pub fn start_http( /// Start WS server listening on given address. pub fn start_ws( addr: &std::net::SocketAddr, + max_connections: Option, cors: Option<&Vec>, io: RpcHandler, ) -> io::Result { ws::ServerBuilder::with_meta_extractor(io, |context: &ws::RequestContext| Metadata::new(context.sender())) .max_payload(MAX_PAYLOAD) + .max_connections(max_connections.unwrap_or(WS_MAX_CONNECTIONS)) .allowed_origins(map_cors(cors)) .start(addr) .map_err(|err| match err { - ws::Error(ws::ErrorKind::Io(io), _) => io, - ws::Error(ws::ErrorKind::ConnectionClosed, _) => io::ErrorKind::BrokenPipe.into(), - ws::Error(e, _) => { + ws::Error::Io(io) => io, + ws::Error::ConnectionClosed => io::ErrorKind::BrokenPipe.into(), + e => { error!("{}", e); io::ErrorKind::Other.into() } diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index 600cd9ac48172d40d2ac468d1ad4dc4143fd3e43..c621f71a438559e9a311a98fa7c6acbb006dfc35 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -1,16 +1,17 @@ [package] name = "substrate-rpc" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" -jsonrpc-core = "10.0.1" -jsonrpc-pubsub = "10.0.1" -jsonrpc-derive = "10.0.2" +derive_more = "0.14.0" +jsonrpc-core = "12.0.0" +jsonrpc-core-client = "12.0.0" +jsonrpc-pubsub = "12.0.0" +jsonrpc-derive = "12.0.0" log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" parity-codec = "3.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" @@ -32,4 +33,3 @@ test_client = { package = "substrate-test-client", path = "../test-client" } test_runtime = { package = "substrate-test-runtime", path = "../test-runtime" } consensus = { package = "substrate-consensus-common", path = "../consensus/common" } rustc-hex = "2.0" -hex-literal = "0.1" diff --git a/core/rpc/src/author/error.rs b/core/rpc/src/author/error.rs index 0084c4da8fc0e0b7473244d2adb85e7f841a8d13..008a70b6744b9358248261716f030bc16822516a 100644 --- a/core/rpc/src/author/error.rs +++ b/core/rpc/src/author/error.rs @@ -16,35 +16,37 @@ //! Authoring RPC module errors. -use error_chain::*; use client; use transaction_pool::txpool; use crate::rpc; use crate::errors; -error_chain! { - foreign_links { - Client(client::error::Error) #[doc = "Client error"]; - } - links { - Pool(txpool::error::Error, txpool::error::ErrorKind) #[doc = "Pool error"]; - } - errors { - /// Not implemented yet - Unimplemented { - description("not yet implemented"), - display("Method Not Implemented"), - } - /// Incorrect extrinsic format. - BadFormat { - description("bad format"), - display("Invalid extrinsic format"), - } - /// Verification error - Verification(e: Box<::std::error::Error + Send>) { - description("extrinsic verification error"), - display("Extrinsic verification error: {}", e.description()), +/// Author RPC Result type. +pub type Result = std::result::Result; + +/// Author RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Transaction pool error, + Pool(txpool::error::Error), + /// Verification error + #[display(fmt="Extrinsic verification error: {}", "_0.description()")] + Verification(Box), + /// Incorrect extrinsic format. + #[display(fmt="Invalid extrinsic format")] + BadFormat, +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + Error::Pool(ref err) => Some(err), + Error::Verification(ref err) => Some(&**err), + _ => None, } } } @@ -73,49 +75,50 @@ const POOL_IMMEDIATELY_DROPPED: i64 = POOL_INVALID_TX + 6; impl From for rpc::Error { fn from(e: Error) -> Self { + use txpool::error::{Error as PoolError}; + match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), - Error(ErrorKind::BadFormat, _) => rpc::Error { + Error::BadFormat => rpc::Error { code: rpc::ErrorCode::ServerError(BAD_FORMAT), message: "Extrinsic has invalid format.".into(), data: None, }, - Error(ErrorKind::Verification(e), _) => rpc::Error { + Error::Verification(e) => rpc::Error { code: rpc::ErrorCode::ServerError(VERIFICATION_ERROR), message: e.description().into(), data: Some(format!("{:?}", e).into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::InvalidTransaction(code)), _) => rpc::Error { + Error::Pool(PoolError::InvalidTransaction(code)) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_INVALID_TX), message: "Invalid Transaction".into(), data: Some(code.into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::UnknownTransactionValidity(code)), _) => rpc::Error { + Error::Pool(PoolError::UnknownTransactionValidity(code)) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_UNKNOWN_VALIDITY), message: "Unknown Transaction Validity".into(), data: Some(code.into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::TemporarilyBanned), _) => rpc::Error { + Error::Pool(PoolError::TemporarilyBanned) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_TEMPORARILY_BANNED), message: "Transaction is temporarily banned".into(), data: None, }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::AlreadyImported(hash)), _) => rpc::Error { + Error::Pool(PoolError::AlreadyImported(hash)) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_ALREADY_IMPORTED), message: "Transaction Already Imported".into(), data: Some(format!("{:?}", hash).into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::TooLowPriority(old, new)), _) => rpc::Error { + Error::Pool(PoolError::TooLowPriority { old, new }) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_TOO_LOW_PRIORITY), message: format!("Priority is too low: ({} vs {})", old, new), data: Some("The transaction has too low priority to replace another transaction already in the pool.".into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::CycleDetected), _) => rpc::Error { + Error::Pool(PoolError::CycleDetected) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_CYCLE_DETECTED), message: "Cycle Detected".into(), data: None, }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::ImmediatelyDropped), _) => rpc::Error { + Error::Pool(PoolError::ImmediatelyDropped) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_IMMEDIATELY_DROPPED), message: "Immediately Dropped" .into(), data: Some("The transaction couldn't enter the pool because of the limit".into()), diff --git a/core/rpc/src/author/hash.rs b/core/rpc/src/author/hash.rs new file mode 100644 index 0000000000000000000000000000000000000000..a01e26de3c94b27c269c6dc6e65dbc780ac5cc05 --- /dev/null +++ b/core/rpc/src/author/hash.rs @@ -0,0 +1,32 @@ +// Copyright 2019 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 . + +//! Extrinsic helpers for author RPC module. + +use primitives::Bytes; +use serde::{Serialize, Deserialize}; + +/// RPC Extrinsic or hash +/// +/// Allows to refer to extrinsic either by its raw representation or its hash. +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum ExtrinsicOrHash { + /// The hash of the extrinsic. + Hash(Hash), + /// Raw extrinsic bytes. + Extrinsic(Bytes), +} diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index acd500ba0bfe309ddec5c36c698f0cb5a71473e0..5594984d0ea7f016461f49b507e8d65b783a1f50 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -16,11 +16,24 @@ //! Substrate block-author/full-node API. +pub mod error; +pub mod hash; + +#[cfg(test)] +mod tests; + use std::sync::Arc; -use log::warn; use client::{self, Client}; +use crate::rpc::futures::{Sink, Stream, Future}; +use crate::subscriptions::Subscriptions; +use jsonrpc_derive::rpc; +use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; +use log::warn; use parity_codec::{Encode, Decode}; +use primitives::{Bytes, Blake2Hasher, H256}; +use runtime_primitives::{generic, traits}; +use self::error::Result; use transaction_pool::{ txpool::{ ChainApi as PoolChainApi, @@ -31,19 +44,8 @@ use transaction_pool::{ watcher::Status, }, }; -use jsonrpc_derive::rpc; -use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; -use primitives::{Bytes, Blake2Hasher, H256}; -use crate::rpc::futures::{Sink, Stream, Future}; -use runtime_primitives::{generic, traits}; -use crate::subscriptions::Subscriptions; - -pub mod error; -#[cfg(test)] -mod tests; - -use self::error::Result; +pub use self::gen_client::Client as AuthorClient; /// Substrate authoring RPC API #[rpc] @@ -59,6 +61,10 @@ pub trait AuthorApi { #[rpc(name = "author_pendingExtrinsics")] fn pending_extrinsics(&self) -> Result>; + /// Remove given extrinsic from the pool and temporarily ban it to prevent reimporting. + #[rpc(name = "author_removeExtrinsic")] + fn remove_extrinsic(&self, bytes_or_hash: Vec>) -> Result>; + /// Submit an extrinsic to watch. #[pubsub(subscription = "author_extrinsicUpdate", subscribe, name = "author_submitAndWatchExtrinsic")] fn watch_extrinsic(&self, metadata: Self::Metadata, subscriber: Subscriber>, bytes: Bytes); @@ -72,7 +78,7 @@ pub trait AuthorApi { pub struct Author where P: PoolChainApi + Sync + Send + 'static { /// Substrate client client: Arc::Block, RA>>, - /// Extrinsic pool + /// Transactions pool pool: Arc>, /// Subscriptions manager subscriptions: Subscriptions, @@ -104,13 +110,13 @@ impl AuthorApi, BlockHash

> for Author whe type Metadata = crate::metadata::Metadata; fn submit_extrinsic(&self, ext: Bytes) -> Result> { - let xt = Decode::decode(&mut &ext[..]).ok_or(error::Error::from(error::ErrorKind::BadFormat))?; - let best_block_hash = self.client.info()?.chain.best_hash; + let xt = Decode::decode(&mut &ext[..]).ok_or(error::Error::BadFormat)?; + let best_block_hash = self.client.info().chain.best_hash; self.pool .submit_one(&generic::BlockId::hash(best_block_hash), xt) .map_err(|e| e.into_pool_error() .map(Into::into) - .unwrap_or_else(|e| error::ErrorKind::Verification(Box::new(e)).into()) + .unwrap_or_else(|e| error::Error::Verification(Box::new(e)).into()) ) } @@ -118,15 +124,35 @@ impl AuthorApi, BlockHash

> for Author whe Ok(self.pool.ready().map(|tx| tx.data.encode().into()).collect()) } + fn remove_extrinsic(&self, bytes_or_hash: Vec>>) -> Result>> { + let hashes = bytes_or_hash.into_iter() + .map(|x| match x { + hash::ExtrinsicOrHash::Hash(h) => Ok(h), + hash::ExtrinsicOrHash::Extrinsic(bytes) => { + let xt = Decode::decode(&mut &bytes[..]).ok_or(error::Error::BadFormat)?; + Ok(self.pool.hash_of(&xt)) + }, + }) + .collect::>>()?; + + Ok( + self.pool.remove_invalid(&hashes) + .into_iter() + .map(|tx| tx.hash.clone()) + .collect() + ) + } + fn watch_extrinsic(&self, _metadata: Self::Metadata, subscriber: Subscriber, BlockHash

>>, xt: Bytes) { let submit = || -> Result<_> { - let best_block_hash = self.client.info()?.chain.best_hash; - let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..]).ok_or(error::Error::from(error::ErrorKind::BadFormat))?; + let best_block_hash = self.client.info().chain.best_hash; + let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..]) + .ok_or(error::Error::BadFormat)?; self.pool .submit_and_watch(&generic::BlockId::hash(best_block_hash), dxt) .map_err(|e| e.into_pool_error() .map(Into::into) - .unwrap_or_else(|e| error::ErrorKind::Verification(Box::new(e)).into()) + .unwrap_or_else(|e| error::Error::Verification(Box::new(e)).into()) ) }; diff --git a/core/rpc/src/author/tests.rs b/core/rpc/src/author/tests.rs index 4d0277f7d656a2ec770dbdb8d84df8f23133181d..4c6a724acd5ae35bbf4ccbfbe71e7999a7d684e6 100644 --- a/core/rpc/src/author/tests.rs +++ b/core/rpc/src/author/tests.rs @@ -137,3 +137,31 @@ fn should_return_pending_extrinsics() { Ok(ref expected) if *expected == vec![Bytes(ex.encode())] ); } + +#[test] +fn should_remove_extrinsics() { + let runtime = runtime::Runtime::new().unwrap(); + let client = Arc::new(test_client::new()); + let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); + let p = Author { + client, + pool: pool.clone(), + subscriptions: Subscriptions::new(runtime.executor()), + }; + let ex1 = uxt(AccountKeyring::Alice, 0); + p.submit_extrinsic(ex1.encode().into()).unwrap(); + let ex2 = uxt(AccountKeyring::Alice, 1); + p.submit_extrinsic(ex2.encode().into()).unwrap(); + let ex3 = uxt(AccountKeyring::Bob, 0); + let hash3 = p.submit_extrinsic(ex3.encode().into()).unwrap(); + assert_eq!(pool.status().ready, 3); + + // now remove all 3 + let removed = p.remove_extrinsic(vec![ + hash::ExtrinsicOrHash::Hash(hash3), + // Removing this one will also remove ex2 + hash::ExtrinsicOrHash::Extrinsic(ex1.encode().into()), + ]).unwrap(); + + assert_eq!(removed.len(), 3); +} diff --git a/core/rpc/src/chain/error.rs b/core/rpc/src/chain/error.rs index 81fe01a19d6d469847b1de8ad3c6abe33f540c95..ad63af9add0510731df2083916551555b4df105a 100644 --- a/core/rpc/src/chain/error.rs +++ b/core/rpc/src/chain/error.rs @@ -14,28 +14,45 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use error_chain::*; + +//! Error helpers for Chain RPC module. + use client; use crate::rpc; use crate::errors; -error_chain! { - foreign_links { - Client(client::error::Error) #[doc = "Client error"]; - } - errors { - /// Not implemented yet - Unimplemented { - description("not yet implemented"), - display("Method Not Implemented"), +/// Chain RPC Result type. +pub type Result = std::result::Result; + +/// Chain RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Other error type. + Other(String), +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + _ => None, } } } +/// Base error code for all chain errors. +const BASE_ERROR: i64 = 3000; + impl From for rpc::Error { fn from(e: Error) -> Self { match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), + Error::Other(message) => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 1), + message, + data: None, + }, e => errors::internal(e), } } diff --git a/core/rpc/src/chain/mod.rs b/core/rpc/src/chain/mod.rs index ab930d00763ff623ab96d7f312e2be990ba6c7e8..3594ed48e3aaf990919131c3779c096c400cb779 100644 --- a/core/rpc/src/chain/mod.rs +++ b/core/rpc/src/chain/mod.rs @@ -16,27 +16,28 @@ //! Substrate blockchain API. +pub mod error; +pub mod number; + +#[cfg(test)] +mod tests; + use std::sync::Arc; -use log::warn; use client::{self, Client, BlockchainEvents}; +use crate::rpc::Result as RpcResult; +use crate::rpc::futures::{stream, Future, Sink, Stream}; +use crate::subscriptions::Subscriptions; use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; +use log::warn; use primitives::{H256, Blake2Hasher}; -use crate::rpc::Result as RpcResult; -use crate::rpc::futures::{stream, Future, Sink, Stream}; use runtime_primitives::generic::{BlockId, SignedBlock}; use runtime_primitives::traits::{Block as BlockT, Header, NumberFor}; - -use crate::subscriptions::Subscriptions; - -mod error; -#[cfg(test)] -mod tests; -mod number; - use self::error::Result; +pub use self::gen_client::Client as ChainClient; + /// Substrate blockchain API #[rpc] pub trait ChainApi { @@ -124,7 +125,7 @@ impl Chain where { fn unwrap_or_best(&self, hash: Option) -> Result { Ok(match hash.into() { - None => self.client.info()?.chain.best_hash, + None => self.client.info().chain.best_hash, Some(hash) => hash, }) } @@ -145,7 +146,7 @@ impl Chain where let header = best_block_hash() .and_then(|hash| self.header(hash.into())) .and_then(|header| { - header.ok_or_else(|| self::error::ErrorKind::Unimplemented.into()) + header.ok_or_else(|| "Best header missing.".to_owned().into()) }) .map_err(Into::into); @@ -188,13 +189,13 @@ impl ChainApi, Block::Hash, Block::Header, Sig fn block_hash(&self, number: Option>>) -> Result> { Ok(match number { - None => Some(self.client.info()?.chain.best_hash), + None => Some(self.client.info().chain.best_hash), Some(num_or_hex) => self.client.header(&BlockId::number(num_or_hex.to_number()?))?.map(|h| h.hash()), }) } fn finalized_head(&self) -> Result { - Ok(self.client.info()?.chain.finalized_hash) + Ok(self.client.info().chain.finalized_hash) } fn subscribe_new_head(&self, _metadata: Self::Metadata, subscriber: Subscriber) { @@ -214,7 +215,7 @@ impl ChainApi, Block::Hash, Block::Header, Sig fn subscribe_finalized_heads(&self, _meta: Self::Metadata, subscriber: Subscriber) { self.subscribe_headers( subscriber, - || Ok(Some(self.client.info()?.chain.finalized_hash)), + || Ok(Some(self.client.info().chain.finalized_hash)), || self.client.finality_notification_stream() .map(|notification| notification.header), ) diff --git a/core/rpc/src/chain/number.rs b/core/rpc/src/chain/number.rs index 2e5af190ea94f36bd38b890242696e9c575861a4..df796d5e6d9911c2f952dc344cd69b23eef0a3b9 100644 --- a/core/rpc/src/chain/number.rs +++ b/core/rpc/src/chain/number.rs @@ -14,9 +14,11 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use serde::Deserialize; +//! Chain RPC Block number type. + +use serde::{Serialize, Deserialize}; +use std::{convert::TryFrom, fmt::Debug}; use primitives::U256; -use runtime_primitives::traits; /// RPC Block number type /// @@ -25,7 +27,7 @@ use runtime_primitives::traits; /// or we attempt to parse given hex value. /// We do that for consistency with the returned type, default generic header /// serializes block number as hex to avoid overflows in JavaScript. -#[derive(Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(untagged)] pub enum NumberOrHex { /// The original header number type of block. @@ -34,30 +36,28 @@ pub enum NumberOrHex { Hex(U256), } -impl> NumberOrHex { +impl + From + Debug + PartialOrd> NumberOrHex { /// Attempts to convert into concrete block number. /// /// Fails in case hex number is too big. pub fn to_number(self) -> Result { - let num: u64 = match self { - NumberOrHex::Number(n) => n.as_(), + let num = match self { + NumberOrHex::Number(n) => n, NumberOrHex::Hex(h) => { - // FIXME #1377 this only supports `u64` since `BlockNumber` - // is `As` we could possibly go with `u128`. let l = h.low_u64(); if U256::from(l) != h { - return Err(format!("`{}` does not fit into the block number type.", h)); + return Err(format!("`{}` does not fit into u64 type; unsupported for now.", h)) } else { - l + Number::try_from(l) + .map_err(|_| format!("`{}` does not fit into block number type.", h))? } }, }; // FIXME <2329>: Database seems to limit the block number to u32 for no reason - if num > u32::max_value() as u64 { - Err(format!("`{}` > u32::max_value(), the max block number is u32.", num)) - } else { - Ok(traits::As::sa(num)) + if num > Number::from(u32::max_value()) { + return Err(format!("`{:?}` > u32::max_value(), the max block number is u32.", num)) } + Ok(num) } } diff --git a/core/rpc/src/chain/tests.rs b/core/rpc/src/chain/tests.rs index 26b7202305b16745ba0d516cb442765085e97ac5..02507442d5291da07d5d1a2f4c26635117d0f1a5 100644 --- a/core/rpc/src/chain/tests.rs +++ b/core/rpc/src/chain/tests.rs @@ -68,7 +68,7 @@ fn should_return_a_block() { subscriptions: Subscriptions::new(remote), }; - let block = api.client.new_block().unwrap().bake().unwrap(); + let block = api.client.new_block(Default::default()).unwrap().bake().unwrap(); let block_hash = block.hash(); api.client.import(BlockOrigin::Own, block).unwrap(); @@ -138,7 +138,7 @@ fn should_return_block_hash() { Ok(None) ); - let block = client.client.new_block().unwrap().bake().unwrap(); + let block = client.client.new_block(Default::default()).unwrap().bake().unwrap(); client.client.import(BlockOrigin::Own, block.clone()).unwrap(); assert_matches!( @@ -172,7 +172,7 @@ fn should_return_finalized_hash() { ); // import new block - let builder = client.client.new_block().unwrap(); + let builder = client.client.new_block(Default::default()).unwrap(); client.client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); // no finalization yet assert_matches!( @@ -205,7 +205,7 @@ fn should_notify_about_latest_block() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let builder = api.client.new_block().unwrap(); + let builder = api.client.new_block(Default::default()).unwrap(); api.client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); } @@ -236,7 +236,7 @@ fn should_notify_about_finalized_block() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let builder = api.client.new_block().unwrap(); + let builder = api.client.new_block(Default::default()).unwrap(); api.client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); api.client.finalize_block(BlockId::number(1), None, true).unwrap(); } diff --git a/core/rpc/src/errors.rs b/core/rpc/src/errors.rs index a709013ad26801a471f7dd99d94c6ed10390b78b..da910de76215ae18339f942a40394b5cdbae7404 100644 --- a/core/rpc/src/errors.rs +++ b/core/rpc/src/errors.rs @@ -17,14 +17,6 @@ use crate::rpc; use log::warn; -pub fn unimplemented() -> rpc::Error { - rpc::Error { - code: rpc::ErrorCode::ServerError(1), - message: "Not implemented yet".into(), - data: None, - } -} - pub fn internal(e: E) -> rpc::Error { warn!("Unknown error: {:?}", e); rpc::Error { diff --git a/core/rpc/src/state/error.rs b/core/rpc/src/state/error.rs index d4b3013abb2c079d2e3d1e7267f80c0a04ce1ee0..4b9d30b36b2043ef130492db91eb74004d12aba5 100644 --- a/core/rpc/src/state/error.rs +++ b/core/rpc/src/state/error.rs @@ -14,34 +14,52 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use error_chain::*; +//! State RPC errors. + use client; use crate::rpc; use crate::errors; -error_chain! { - foreign_links { - Client(client::error::Error) #[doc = "Client error"]; - } +/// State RPC Result type. +pub type Result = std::result::Result; - errors { - /// Provided block range couldn't be resolved to a list of blocks. - InvalidBlockRange(from: String, to: String, details: String) { - description("Invalid block range"), - display("Cannot resolve a block range ['{:?}' ... '{:?}]. {}", from, to, details), - } - /// Not implemented yet - Unimplemented { - description("not implemented yet"), - display("Method Not Implemented"), +/// State RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Provided block range couldn't be resolved to a list of blocks. + #[display(fmt = "Cannot resolve a block range ['{:?}' ... '{:?}]. {}", from, to, details)] + InvalidBlockRange { + /// Beginning of the block range. + from: String, + /// End of the block range. + to: String, + /// Details of the error message. + details: String, + }, +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + _ => None, } } } +/// Base code for all state errors. +const BASE_ERROR: i64 = 4000; + impl From for rpc::Error { fn from(e: Error) -> Self { match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), + Error::InvalidBlockRange { .. } => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 1), + message: format!("{}", e), + data: None, + }, e => errors::internal(e), } } diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs index 168c0bd692732dbc564f04a511f11d0f288da3ec..e52d318d9f09887ce5f1c81e0a8374331bda83f0 100644 --- a/core/rpc/src/state/mod.rs +++ b/core/rpc/src/state/mod.rs @@ -16,34 +16,37 @@ //! Substrate state API. +pub mod error; + +#[cfg(test)] +mod tests; + use std::{ collections::{BTreeMap, HashMap}, ops::Range, sync::Arc, }; -use error_chain::bail; -use log::{warn, trace}; use client::{self, Client, CallExecutor, BlockchainEvents, runtime_api::Metadata}; +use crate::rpc::Result as RpcResult; +use crate::rpc::futures::{stream, Future, Sink, Stream}; +use crate::subscriptions::Subscriptions; use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; -use primitives::{H256, Blake2Hasher, Bytes}; +use log::{warn, trace}; use primitives::hexdisplay::HexDisplay; use primitives::storage::{self, StorageKey, StorageData, StorageChangeSet}; -use crate::rpc::Result as RpcResult; -use crate::rpc::futures::{stream, Future, Sink, Stream}; +use primitives::{H256, Blake2Hasher, Bytes}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header, ProvideRuntimeApi, As, NumberFor}; +use runtime_primitives::traits::{ + Block as BlockT, Header, ProvideRuntimeApi, NumberFor, + SaturatedConversion +}; use runtime_version::RuntimeVersion; +use self::error::Result; use state_machine::{self, ExecutionStrategy}; -use crate::subscriptions::Subscriptions; - -mod error; -#[cfg(test)] -mod tests; - -use self::error::Result; +pub use self::gen_client::Client as StateClient; /// Substrate state API #[rpc] @@ -57,7 +60,7 @@ pub trait StateApi { /// Returns the keys with prefix, leave empty to get all the keys #[rpc(name = "state_getKeys")] - fn storage_keys(&self, key: StorageKey, hash: Option) -> Result>; + fn storage_keys(&self, prefix: StorageKey, hash: Option) -> Result>; /// Returns a storage entry at a specific block's state. #[rpc(name = "state_getStorage", alias("state_getStorageAt"))] @@ -71,6 +74,40 @@ pub trait StateApi { #[rpc(name = "state_getStorageSize", alias("state_getStorageSizeAt"))] fn storage_size(&self, key: StorageKey, hash: Option) -> Result>; + /// Returns the keys with prefix from a child storage, leave empty to get all the keys + #[rpc(name = "state_getChildKeys")] + fn child_storage_keys( + &self, + child_storage_key: StorageKey, + prefix: StorageKey, + hash: Option + ) -> Result>; + + /// Returns a child storage entry at a specific block's state. + #[rpc(name = "state_getChildStorage")] + fn child_storage( + &self, + child_storage_key: StorageKey, + key: StorageKey, hash: Option + ) -> Result>; + + /// Returns the hash of a child storage entry at a block's state. + #[rpc(name = "state_getChildStorageHash")] + fn child_storage_hash( + &self, + child_storage_key: StorageKey, + key: StorageKey, hash: Option + ) -> Result>; + + /// Returns the size of a child storage entry at a block's state. + #[rpc(name = "state_getChildStorageSize")] + fn child_storage_size( + &self, + child_storage_key: StorageKey, + key: StorageKey, + hash: Option + ) -> Result>; + /// Returns the runtime metadata as an opaque blob. #[rpc(name = "state_getMetadata")] fn metadata(&self, hash: Option) -> Result; @@ -84,7 +121,12 @@ pub trait StateApi { /// NOTE This first returned result contains the initial state of storage for all keys. /// Subsequent values in the vector represent changes to the previous state (diffs). #[rpc(name = "state_queryStorage")] - fn query_storage(&self, keys: Vec, block: Hash, hash: Option) -> Result>>; + fn query_storage( + &self, + keys: Vec, + block: Hash, + hash: Option + ) -> Result>>; /// New runtime version subscription #[pubsub( @@ -106,11 +148,15 @@ pub trait StateApi { /// New storage subscription #[pubsub(subscription = "state_storage", subscribe, name = "state_subscribeStorage")] - fn subscribe_storage(&self, metadata: Self::Metadata, subscriber: Subscriber>, keys: Option>); + fn subscribe_storage( + &self, metadata: Self::Metadata, subscriber: Subscriber>, keys: Option> + ); /// Unsubscribe from storage subscription #[pubsub(subscription = "state_storage", unsubscribe, name = "state_unsubscribeStorage")] - fn unsubscribe_storage(&self, metadata: Option, id: SubscriptionId) -> RpcResult; + fn unsubscribe_storage( + &self, metadata: Option, id: SubscriptionId + ) -> RpcResult; } /// State API with subscriptions support. @@ -171,7 +217,7 @@ impl State where blocks.push(hdr.hash()); last = hdr; } else { - bail!(invalid_block_range( + return Err(invalid_block_range( Some(from), Some(to), format!("Parent of {} ({}) not found", last.number(), last.hash()), @@ -179,7 +225,7 @@ impl State where } } if last.hash() != from.hash() { - bail!(invalid_block_range( + return Err(invalid_block_range( Some(from), Some(to), format!("Expected to reach `from`, got {} ({})", last.number(), last.hash()), @@ -190,7 +236,7 @@ impl State where }; // check if we can filter blocks-with-changes from some (sub)range using changes tries let changes_trie_range = self.client.max_key_changes_range(from_number, BlockId::Hash(to.hash()))?; - let filtered_range_begin = changes_trie_range.map(|(begin, _)| (begin - from_number).as_() as usize); + let filtered_range_begin = changes_trie_range.map(|(begin, _)| (begin - from_number).saturated_into::()); let (unfiltered_range, filtered_range) = split_range(blocks.len(), filtered_range_begin); Ok(QueryStorageRange { hashes: blocks, @@ -199,7 +245,7 @@ impl State where filtered_range, }) }, - (from, to) => bail!( + (from, to) => Err( invalid_block_range(from.as_ref(), to.as_ref(), "Invalid range or unknown block".into()) ), } @@ -242,7 +288,7 @@ impl State where ) -> Result<()> { let (begin, end) = match range.filtered_range { Some(ref filtered_range) => ( - range.first_number + As::sa(filtered_range.start as u64), + range.first_number + filtered_range.start.saturated_into(), BlockId::Hash(range.hashes[filtered_range.end - 1].clone()) ), None => return Ok(()), @@ -254,7 +300,7 @@ impl State where if last_block == Some(block) { continue; } - let block_hash = range.hashes[(block - range.first_number).as_() as usize].clone(); + let block_hash = range.hashes[(block - range.first_number).saturated_into::()].clone(); let id = BlockId::Hash(block_hash); let value_at_block = self.client.storage(&id, key)?; changes_map.entry(block) @@ -277,7 +323,7 @@ impl State where E: CallExecutor, { fn unwrap_or_best(&self, hash: Option) -> Result { - crate::helpers::unwrap_or_else(|| Ok(self.client.info()?.chain.best_hash), hash) + crate::helpers::unwrap_or_else(|| Ok(self.client.info().chain.best_hash), hash) } } @@ -324,6 +370,50 @@ impl StateApi for State where Ok(self.storage(key, block)?.map(|x| x.0.len() as u64)) } + fn child_storage( + &self, + child_storage_key: StorageKey, + key: StorageKey, + block: Option + ) -> Result> { + let block = self.unwrap_or_best(block)?; + trace!(target: "rpc", "Querying child storage at {:?} for key {}", block, HexDisplay::from(&key.0)); + Ok(self.client.child_storage(&BlockId::Hash(block), &child_storage_key, &key)?) + } + + fn child_storage_keys( + &self, + child_storage_key: StorageKey, + key_prefix: StorageKey, + block: Option + ) -> Result> { + let block = self.unwrap_or_best(block)?; + trace!(target: "rpc", "Querying child storage keys at {:?}", block); + Ok(self.client.child_storage_keys(&BlockId::Hash(block), &child_storage_key, &key_prefix)?) + } + + fn child_storage_hash( + &self, + child_storage_key: StorageKey, + key: StorageKey, + block: Option + ) -> Result> { + use runtime_primitives::traits::{Hash, Header as HeaderT}; + Ok( + self.child_storage(child_storage_key, key, block)? + .map(|x| ::Hashing::hash(&x.0)) + ) + } + + fn child_storage_size( + &self, + child_storage_key: StorageKey, + key: StorageKey, + block: Option + ) -> Result> { + Ok(self.child_storage(child_storage_key, key, block)?.map(|x| x.0.len() as u64)) + } + fn metadata(&self, block: Option) -> Result { let block = self.unwrap_or_best(block)?; self.client.runtime_api().metadata(&BlockId::Hash(block)).map(Into::into).map_err(Into::into) @@ -360,7 +450,7 @@ impl StateApi for State where // initial values let initial = stream::iter_result(keys .map(|keys| { - let block = self.client.info().map(|info| info.chain.best_hash).unwrap_or_default(); + let block = self.client.info().chain.best_hash; let changes = keys .into_iter() .map(|key| self.storage(key.clone(), Some(block.clone()).into()) @@ -397,7 +487,9 @@ impl StateApi for State where } fn subscribe_runtime_version(&self, _meta: Self::Metadata, subscriber: Subscriber) { - let stream = match self.client.storage_changes_notification_stream(Some(&[StorageKey(storage::well_known_keys::CODE.to_vec())])) { + let stream = match self.client.storage_changes_notification_stream( + Some(&[StorageKey(storage::well_known_keys::CODE.to_vec())]) + ) { Ok(stream) => stream, Err(err) => { let _ = subscriber.reject(error::Error::from(err).into()); @@ -415,9 +507,9 @@ impl StateApi for State where let stream = stream .map_err(|e| warn!("Error creating storage notification stream: {:?}", e)) .filter_map(move |_| { - let version = client.info().and_then(|info| { - client.runtime_version_at(&BlockId::hash(info.chain.best_hash)) - }) + let info = client.info(); + let version = client + .runtime_version_at(&BlockId::hash(info.chain.best_hash)) .map_err(error::Error::from) .map_err(Into::into); if previous_version != version { @@ -465,11 +557,15 @@ pub(crate) fn split_range(size: usize, middle: Option) -> (Range, (range1, range2) } -fn invalid_block_range(from: Option<&H>, to: Option<&H>, reason: String) -> error::ErrorKind { +fn invalid_block_range(from: Option<&H>, to: Option<&H>, reason: String) -> error::Error { let to_string = |x: Option<&H>| match x { None => "unknown hash".into(), Some(h) => format!("{} ({})", h.number(), h.hash()), }; - error::ErrorKind::InvalidBlockRange(to_string(from), to_string(to), reason) + error::Error::InvalidBlockRange { + from: to_string(from), + to: to_string(to), + details: reason, + } } diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 5cf83921ad87605671096802fd0b361722e567f2..b40ac06c60640a94cfaa190b9d32fe6aef77ff80 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -15,42 +15,79 @@ // along with Substrate. If not, see . use super::*; -use self::error::{Error, ErrorKind}; +use self::error::Error; -use sr_io::blake2_256; use assert_matches::assert_matches; use consensus::BlockOrigin; -use test_client::{self, runtime, AccountKeyring, TestClient, BlockBuilderExt}; +use primitives::storage::well_known_keys; +use sr_io::blake2_256; +use test_client::{self, runtime, AccountKeyring, TestClient, BlockBuilderExt, LocalExecutor, TestClientBuilder}; +use substrate_executor::NativeExecutionDispatch; #[test] fn should_return_storage() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let genesis_hash = client.genesis_hash(); let client = State::new(client, Subscriptions::new(core.executor())); + let key = StorageKey(b":code".to_vec()); + assert_eq!( + client.storage(key.clone(), Some(genesis_hash).into()) + .map(|x| x.map(|x| x.0.len())).unwrap().unwrap() as usize, + LocalExecutor::native_equivalent().len(), + ); assert_matches!( - client.storage(StorageKey(vec![10]), Some(genesis_hash).into()), - Ok(None) - ) + client.storage_hash(key.clone(), Some(genesis_hash).into()).map(|x| x.is_some()), + Ok(true) + ); + assert_eq!( + client.storage_size(key.clone(), None).unwrap().unwrap() as usize, + LocalExecutor::native_equivalent().len(), + ); +} + +#[test] +fn should_return_child_storage() { + let core = tokio::runtime::Runtime::new().unwrap(); + let client = Arc::new(test_client::new()); + let genesis_hash = client.genesis_hash(); + let client = State::new(client, Subscriptions::new(core.executor())); + let child_key = StorageKey(well_known_keys::CHILD_STORAGE_KEY_PREFIX.iter().chain(b"test").cloned().collect()); + let key = StorageKey(b"key".to_vec()); + + + assert_matches!( + client.child_storage(child_key.clone(), key.clone(), Some(genesis_hash).into()), + Ok(Some(StorageData(ref d))) if d[0] == 42 && d.len() == 1 + ); + assert_matches!( + client.child_storage_hash(child_key.clone(), key.clone(), Some(genesis_hash).into()) + .map(|x| x.is_some()), + Ok(true) + ); + assert_matches!( + client.child_storage_size(child_key.clone(), key.clone(), None), + Ok(Some(1)) + ); } #[test] fn should_call_contract() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let genesis_hash = client.genesis_hash(); let client = State::new(client, Subscriptions::new(core.executor())); assert_matches!( client.call("balanceOf".into(), Bytes(vec![1,2,3]), Some(genesis_hash).into()), - Err(Error(ErrorKind::Client(client::error::Error::Execution(_)), _)) + Err(Error::Client(client::error::Error::Execution(_))) ) } #[test] fn should_notify_about_storage_changes() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); + let mut core = tokio::runtime::Runtime::new().unwrap(); let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); @@ -62,7 +99,7 @@ fn should_notify_about_storage_changes() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let mut builder = api.client.new_block().unwrap(); + let mut builder = api.client.new_block(Default::default()).unwrap(); builder.push_transfer(runtime::Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Ferdie.into(), @@ -81,7 +118,7 @@ fn should_notify_about_storage_changes() { #[test] fn should_send_initial_storage_changes_and_notifications() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); + let mut core = tokio::runtime::Runtime::new().unwrap(); let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); @@ -97,7 +134,7 @@ fn should_send_initial_storage_changes_and_notifications() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let mut builder = api.client.new_block().unwrap(); + let mut builder = api.client.new_block(Default::default()).unwrap(); builder.push_transfer(runtime::Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Ferdie.into(), @@ -127,11 +164,11 @@ fn should_query_storage() { >; fn run_tests(client: Arc) { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let api = State::new(client.clone(), Subscriptions::new(core.executor())); let add_block = |nonce| { - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push_transfer(runtime::Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Ferdie.into(), @@ -199,7 +236,7 @@ fn should_query_storage() { } run_tests(Arc::new(test_client::new())); - run_tests(Arc::new(test_client::new_with_changes_trie())); + run_tests(Arc::new(TestClientBuilder::new().set_support_changes_trie(true).build())); } #[test] @@ -214,20 +251,20 @@ fn should_split_ranges() { #[test] fn should_return_runtime_version() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let api = State::new(client.clone(), Subscriptions::new(core.executor())); assert_eq!( - ::serde_json::to_string(&api.runtime_version(None.into()).unwrap()).unwrap(), - r#"{"specName":"test","implName":"parity-test","authoringVersion":1,"specVersion":1,"implVersion":1,"apis":[["0xdf6acb689907609b",2],["0x37e397fc7c91f5e4",1],["0xd2bc9897eed08f15",1],["0x40fe3ad401f8959a",3],["0xc6e9a76309f39b09",1],["0xdd718d5cc53262d4",1],["0xf78b278be53f454c",1],["0x7801759919ee83e5",1]]}"# + serde_json::to_string(&api.runtime_version(None.into()).unwrap()).unwrap(), + r#"{"specName":"test","implName":"parity-test","authoringVersion":1,"specVersion":1,"implVersion":1,"apis":[["0xdf6acb689907609b",2],["0x37e397fc7c91f5e4",1],["0xd2bc9897eed08f15",1],["0x40fe3ad401f8959a",3],["0xc6e9a76309f39b09",1],["0xdd718d5cc53262d4",1],["0xcbca25e39f142387",1],["0xf78b278be53f454c",1],["0x7801759919ee83e5",1]]}"# ); } #[test] fn should_notify_on_runtime_version_initially() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); + let mut core = tokio::runtime::Runtime::new().unwrap(); let (subscriber, id, transport) = Subscriber::new_test("test"); { @@ -246,3 +283,4 @@ fn should_notify_on_runtime_version_initially() { // no more notifications on this channel assert_eq!(core.block_on(next.into_future()).unwrap().0, None); } + diff --git a/core/rpc/src/system/error.rs b/core/rpc/src/system/error.rs index d3c7e8b33387048385abcad3e620a615646f0dc5..bdd4cbe667e59a084d3b83f41b62e88f1518d5cd 100644 --- a/core/rpc/src/system/error.rs +++ b/core/rpc/src/system/error.rs @@ -16,40 +16,33 @@ //! System RPC module errors. -use error_chain::*; - use crate::rpc; -use crate::errors; use crate::system::helpers::Health; -error_chain! { - errors { - /// Node is not fully functional - NotHealthy(h: Health) { - description("node is not healthy"), - display("Node is not fully functional: {}", h) - } +/// System RPC Result type. +pub type Result = std::result::Result; - /// Not implemented yet - Unimplemented { - description("not yet implemented"), - display("Method Not Implemented"), - } - } +/// System RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Provided block range couldn't be resolved to a list of blocks. + #[display(fmt = "Node is not fully functional: {}", _0)] + NotHealthy(Health), } -const ERROR: i64 = 2000; +impl std::error::Error for Error {} + +/// Base code for all system errors. +const BASE_ERROR: i64 = 2000; impl From for rpc::Error { fn from(e: Error) -> Self { match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), - Error(ErrorKind::NotHealthy(h), _) => rpc::Error { - code: rpc::ErrorCode::ServerError(ERROR + 1), - message: "node is not healthy".into(), - data:serde_json::to_value(h).ok(), + Error::NotHealthy(ref h) => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 1), + message: format!("{}", e), + data: serde_json::to_value(h).ok(), }, - e => errors::internal(e), } } } diff --git a/core/rpc/src/system/helpers.rs b/core/rpc/src/system/helpers.rs index 82c7773b5b919ed152559a857f4288b8cbe6672d..00e2ba9f408b7658ccb45a10d62642bbfed1209c 100644 --- a/core/rpc/src/system/helpers.rs +++ b/core/rpc/src/system/helpers.rs @@ -17,7 +17,7 @@ //! Substrate system API helpers. use std::fmt; -use serde::Serialize; +use serde::{Serialize, Deserialize}; use serde_json::{Value, map::Map}; /// Node properties @@ -37,7 +37,7 @@ pub struct SystemInfo { } /// Health struct returned by the RPC -#[derive(Debug, PartialEq, Serialize)] +#[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Health { /// Number of connected peers @@ -51,7 +51,7 @@ pub struct Health { } /// Network Peer information -#[derive(Debug, PartialEq, Serialize)] +#[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PeerInfo { /// Peer ID diff --git a/core/rpc/src/system/mod.rs b/core/rpc/src/system/mod.rs index 331d9cd85ba61739c3833c5ec2497f2cf2331988..d6f2b755159f702d01c5c5baedfee61723d89d4a 100644 --- a/core/rpc/src/system/mod.rs +++ b/core/rpc/src/system/mod.rs @@ -17,8 +17,8 @@ //! Substrate system API. pub mod error; +pub mod helpers; -mod helpers; #[cfg(test)] mod tests; @@ -30,6 +30,8 @@ use runtime_primitives::traits::{self, Header as HeaderT}; use self::error::Result; pub use self::helpers::{Properties, SystemInfo, Health, PeerInfo}; +pub use self::gen_client::Client as SystemClient; + /// Substrate system RPC API #[rpc] pub trait SystemApi { @@ -72,7 +74,7 @@ pub trait SystemApi { /// System API implementation pub struct System { info: SystemInfo, - sync: Arc>, + sync: Arc>, should_have_peers: bool, } @@ -80,7 +82,7 @@ impl System { /// Creates new `System` given the `SystemInfo`. pub fn new( info: SystemInfo, - sync: Arc>, + sync: Arc>, should_have_peers: bool, ) -> Self { System { @@ -110,14 +112,14 @@ impl SystemApi::Number> for Sy fn system_health(&self) -> Result { Ok(Health { - peers: self.sync.peers().len(), + peers: self.sync.peers_debug_info().len(), is_syncing: self.sync.is_major_syncing(), should_have_peers: self.should_have_peers, }) } fn system_peers(&self) -> Result::Number>>> { - Ok(self.sync.peers().into_iter().map(|(peer_id, p)| PeerInfo { + Ok(self.sync.peers_debug_info().into_iter().map(|(peer_id, p)| PeerInfo { peer_id: peer_id.to_base58(), roles: format!("{:?}", p.roles), protocol_version: p.protocol_version, diff --git a/core/rpc/src/system/tests.rs b/core/rpc/src/system/tests.rs index b4b71a7937af16e988e6e156a1bdecde1b05ecca..14cd421fd19e2770ab00d781a31344dc7f802e21 100644 --- a/core/rpc/src/system/tests.rs +++ b/core/rpc/src/system/tests.rs @@ -59,7 +59,7 @@ impl network::SyncProvider for Status { } } - fn peers(&self) -> Vec<(PeerId, NetworkPeerInfo)> { + fn peers_debug_info(&self) -> Vec<(PeerId, NetworkPeerInfo)> { let mut peers = vec![]; for _peer in 0..self.peers { peers.push( diff --git a/core/serializer/Cargo.toml b/core/serializer/Cargo.toml index 6aade8fc6ad5e15d6e1c51d62565ab801ffd8f6c..ae320e4277bb5d54a492efc324b04d7796d70298 100644 --- a/core/serializer/Cargo.toml +++ b/core/serializer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-serializer" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index e657826b50c0d8f9c5104b6dd2483c1b7618c603..0a0cd91553a435e100ca27b68870c59164bd8441 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "substrate-service" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] +derive_more = "0.14.0" futures = "0.1.17" -parking_lot = "0.7.1" -error-chain = "0.12" +parking_lot = "0.8.0" lazy_static = "1.0" log = "0.4" slog = {version = "^2", features = ["nested-values"]} @@ -16,7 +16,6 @@ exit-future = "0.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" target_info = "0.1" -inherents = { package = "substrate-inherents", path = "../../core/inherents" } keystore = { package = "substrate-keystore", path = "../../core/keystore" } sr-io = { path = "../../core/sr-io" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } @@ -24,7 +23,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } network = { package = "substrate-network", path = "../../core/network" } client = { package = "substrate-client", path = "../../core/client" } -client_db = { package = "substrate-client-db", path = "../../core/client/db" } +client_db = { package = "substrate-client-db", path = "../../core/client/db", features = ["kvdb-rocksdb"] } parity-codec = "3.3" substrate-executor = { path = "../../core/executor" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } @@ -34,3 +33,7 @@ offchain = { package = "substrate-offchain", path = "../../core/offchain" } [dev-dependencies] substrate-test-client = { path = "../test-client" } +node-executor = { path = "../../node/executor" } +node-primitives = { path = "../../node/primitives" } +node-runtime = { path = "../../node/runtime" } +grandpa = { package = "substrate-finality-grandpa", path = "../../core/finality-grandpa" } diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index 36cbee9039395737edb62df50fa0d54d4a80fac3..83f103ec8fe0248a41c8710fe53b9ad1d909987d 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -21,7 +21,7 @@ use futures::Future; use log::{info, warn}; use runtime_primitives::generic::{SignedBlock, BlockId}; -use runtime_primitives::traits::{As, Block, Header, NumberFor}; +use runtime_primitives::traits::{SaturatedConversion, Zero, One, Block, Header, NumberFor}; use consensus_common::import_queue::{ImportQueue, IncomingBlock, Link}; use network::message; @@ -50,9 +50,9 @@ pub fn export_blocks( let mut block = from; let last = match to { - Some(v) if v == As::sa(0) => As::sa(1), + Some(v) if v.is_zero() => One::one(), Some(v) => v, - None => client.info()?.chain.best_number, + None => client.info().chain.best_number, }; if last < block { @@ -66,8 +66,8 @@ pub fn export_blocks( }); info!("Exporting blocks from #{} to #{}", block, last); if !json { - let last_: u64 = last.as_(); - let block_: u64 = block.as_(); + let last_: u64 = last.saturated_into::(); + let block_: u64 = block.saturated_into::(); let len: u64 = last_ - block_ + 1; output.write(&len.encode())?; } @@ -87,13 +87,13 @@ pub fn export_blocks( }, None => break, } - if block.as_() % 10000 == 0 { + if (block % 10000.into()).is_zero() { info!("#{}", block); } if block == last { break; } - block += As::sa(1); + block += One::one(); } Ok(()) } @@ -127,7 +127,8 @@ pub fn import_blocks( { let client = new_client::(&config)?; // FIXME #1134 this shouldn't need a mutable config. - let queue = components::FullComponents::::build_import_queue(&mut config, client.clone())?; + let select_chain = components::FullComponents::::build_select_chain(&mut config, client.clone())?; + let queue = components::FullComponents::::build_import_queue(&mut config, client.clone(), select_chain)?; let (wait_send, wait_recv) = std::sync::mpsc::channel(); let wait_link = WaitLink::new(wait_send); @@ -150,7 +151,7 @@ pub fn import_blocks( let (header, extrinsics) = signed.block.deconstruct(); let hash = header.hash(); let block = message::BlockData:: { - hash: hash, + hash, justification: signed.justification, header: Some(header), body: Some(extrinsics), @@ -185,7 +186,7 @@ pub fn import_blocks( blocks_imported += 1; } - info!("Imported {} blocks. Best: #{}", block_count, client.info()?.chain.best_number); + info!("Imported {} blocks. Best: #{}", block_count, client.info().chain.best_number); Ok(()) } @@ -199,9 +200,9 @@ pub fn revert_chain( { let client = new_client::(&config)?; let reverted = client.revert(blocks)?; - let info = client.info()?.chain; + let info = client.info().chain; - if reverted.as_() == 0 { + if reverted.is_zero() { info!("There aren't any non-finalized blocks to revert."); } else { info!("Reverted {} blocks. Best: #{} ({})", reverted, info.best_number, info.best_hash); diff --git a/core/service/src/components.rs b/core/service/src/components.rs index e9fb7c9b19deaff2b591d67db42a6e4d764d2ae0..30cb1cb764012353813a63d851c94fa7e1ee0cd5 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -16,15 +16,15 @@ //! Substrate service components. -use std::{sync::Arc, net::SocketAddr, marker::PhantomData, ops::Deref, ops::DerefMut}; +use std::{sync::Arc, net::SocketAddr, ops::Deref, ops::DerefMut}; use serde::{Serialize, de::DeserializeOwned}; use tokio::runtime::TaskExecutor; use crate::chain_spec::ChainSpec; use client_db; use client::{self, Client, runtime_api}; use crate::{error, Service, maybe_start_server}; -use consensus_common::import_queue::ImportQueue; -use network::{self, OnDemand}; +use consensus_common::{import_queue::ImportQueue, SelectChain}; +use network::{self, OnDemand, FinalityProofProvider}; use substrate_executor::{NativeExecutor, NativeExecutionDispatch}; use transaction_pool::txpool::{self, Options as TransactionPoolOptions, Pool as TransactionPool}; use runtime_primitives::{ @@ -38,7 +38,8 @@ use parking_lot::Mutex; // Type aliases. // These exist mainly to avoid typing `::Foo` all over the code. /// Network service type for a factory. -pub type NetworkService = network::Service<::Block, ::NetworkProtocol>; +pub type NetworkService = + network::NetworkService<::Block, ::NetworkProtocol>; /// Code executor type for a factory. pub type CodeExecutor = NativeExecutor<::RuntimeDispatch>; @@ -72,7 +73,7 @@ pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecu client_db::light::LightStorage<::Block>, network::OnDemand<::Block> >, - network::OnDemand<::Block> + network::OnDemand<::Block>, >, client::LocalCallExecutor< client::light::backend::Backend< @@ -138,11 +139,12 @@ pub trait StartRPC { fn start_rpc( client: Arc>, - network: Arc>>, + network: Arc>>, should_have_peers: bool, system_info: SystemInfo, rpc_http: Option, rpc_ws: Option, + rpc_ws_max_connections: Option, rpc_cors: Option>, task_executor: TaskExecutor, transaction_pool: Arc>, @@ -157,11 +159,12 @@ impl StartRPC for C where fn start_rpc( client: Arc>, - network: Arc>>, + network: Arc>>, should_have_peers: bool, rpc_system_info: SystemInfo, rpc_http: Option, rpc_ws: Option, + rpc_ws_max_connections: Option, rpc_cors: Option>, task_executor: TaskExecutor, transaction_pool: Arc>, @@ -186,8 +189,19 @@ impl StartRPC for C where }; Ok(( - maybe_start_server(rpc_http, |address| rpc::start_http(address, rpc_cors.as_ref(), handler()))?, - maybe_start_server(rpc_ws, |address| rpc::start_ws(address, rpc_cors.as_ref(), handler()))?.map(Mutex::new), + maybe_start_server( + rpc_http, + |address| rpc::start_http(address, rpc_cors.as_ref(), handler()), + )?, + maybe_start_server( + rpc_ws, + |address| rpc::start_ws( + address, + rpc_ws_max_connections, + rpc_cors.as_ref(), + handler(), + ), + )?.map(Mutex::new), )) } } @@ -304,9 +318,11 @@ pub trait ServiceFactory: 'static + Sized { /// Extended light service type. type LightService: ServiceTrait>; /// ImportQueue for full client - type FullImportQueue: consensus_common::import_queue::ImportQueue + 'static; + type FullImportQueue: ImportQueue + 'static; /// ImportQueue for light clients - type LightImportQueue: consensus_common::import_queue::ImportQueue + 'static; + type LightImportQueue: ImportQueue + 'static; + /// The Fork Choice Strategy for the chain + type SelectChain: SelectChain + 'static; //TODO: replace these with a constructor trait. that TransactionPool implements. (#1242) /// Extrinsic pool constructor for the full client. @@ -320,6 +336,17 @@ pub trait ServiceFactory: 'static + Sized { fn build_network_protocol(config: &FactoryFullConfiguration) -> Result; + /// Build finality proof provider for serving network requests on full node. + fn build_finality_proof_provider( + client: Arc> + ) -> Result>>, error::Error>; + + /// Build the Fork Choice algorithm for full client + fn build_select_chain( + config: &mut FactoryFullConfiguration, + client: Arc>, + ) -> Result; + /// Build full service. fn new_full(config: FactoryFullConfiguration, executor: TaskExecutor) -> Result; @@ -330,7 +357,8 @@ pub trait ServiceFactory: 'static + Sized { /// ImportQueue for a full client fn build_full_import_queue( config: &mut FactoryFullConfiguration, - _client: Arc> + _client: Arc>, + _select_chain: Self::SelectChain, ) -> Result { if let Some(name) = config.chain_spec.consensus_engine() { match name { @@ -378,6 +406,8 @@ pub trait Components: Sized + 'static { >; /// Our Import Queue type ImportQueue: ImportQueue> + 'static; + /// The Fork Choice Strategy for the chain + type SelectChain: SelectChain>; /// Create client. fn build_client( @@ -398,13 +428,24 @@ pub trait Components: Sized + 'static { /// instance of import queue for clients fn build_import_queue( config: &mut FactoryFullConfiguration, - client: Arc> + client: Arc>, + select_chain: Option, ) -> Result; + + /// Finality proof provider for serving network requests. + fn build_finality_proof_provider( + client: Arc> + ) -> Result::Block>>>, error::Error>; + + /// Build fork choice selector + fn build_select_chain( + config: &mut FactoryFullConfiguration, + client: Arc> + ) -> Result, error::Error>; } /// A struct that implement `Components` for the full client. pub struct FullComponents { - _factory: PhantomData, service: Service>, } @@ -416,7 +457,6 @@ impl FullComponents { ) -> Result { Ok( Self { - _factory: Default::default(), service: Service::new(config, task_executor)?, } ) @@ -445,6 +485,7 @@ impl Components for FullComponents { type ImportQueue = Factory::FullImportQueue; type RuntimeApi = Factory::RuntimeApi; type RuntimeServices = Factory::FullService; + type SelectChain = Factory::SelectChain; fn build_client( config: &FactoryFullConfiguration, @@ -469,23 +510,39 @@ impl Components for FullComponents { )?), None)) } - fn build_transaction_pool(config: TransactionPoolOptions, client: Arc>) - -> Result, error::Error> - { + fn build_transaction_pool( + config: TransactionPoolOptions, + client: Arc> + ) -> Result, error::Error> { Factory::build_full_transaction_pool(config, client) } fn build_import_queue( config: &mut FactoryFullConfiguration, - client: Arc> + client: Arc>, + select_chain: Option, ) -> Result { - Factory::build_full_import_queue(config, client) + let select_chain = select_chain + .ok_or(error::Error::SelectChainRequired)?; + Factory::build_full_import_queue(config, client, select_chain) + } + + fn build_select_chain( + config: &mut FactoryFullConfiguration, + client: Arc> + ) -> Result, error::Error> { + Self::Factory::build_select_chain(config, client).map(Some) + } + + fn build_finality_proof_provider( + client: Arc> + ) -> Result::Block>>>, error::Error> { + Factory::build_finality_proof_provider(client) } } /// A struct that implement `Components` for the light client. pub struct LightComponents { - _factory: PhantomData, service: Service>, } @@ -497,7 +554,6 @@ impl LightComponents { ) -> Result { Ok( Self { - _factory: Default::default(), service: Service::new(config, task_executor)?, } ) @@ -520,6 +576,7 @@ impl Components for LightComponents { type ImportQueue = ::LightImportQueue; type RuntimeApi = Factory::RuntimeApi; type RuntimeServices = Factory::LightService; + type SelectChain = Factory::SelectChain; fn build_client( config: &FactoryFullConfiguration, @@ -554,36 +611,49 @@ impl Components for LightComponents { fn build_import_queue( config: &mut FactoryFullConfiguration, - client: Arc> + client: Arc>, + _select_chain: Option, ) -> Result { Factory::build_light_import_queue(config, client) } + + fn build_finality_proof_provider( + _client: Arc> + ) -> Result::Block>>>, error::Error> { + Ok(None) + } + fn build_select_chain( + _config: &mut FactoryFullConfiguration, + _client: Arc> + ) -> Result, error::Error> { + Ok(None) + } } #[cfg(test)] mod tests { use super::*; use consensus_common::BlockOrigin; - use substrate_test_client::{self, TestClient, AccountKeyring, runtime::Transfer}; + use substrate_test_client::{TestClient, AccountKeyring, runtime::Transfer, TestClientBuilder}; #[test] fn should_remove_transactions_from_the_pool() { - let client = Arc::new(substrate_test_client::new()); + let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); + let client = Arc::new(client); let pool = TransactionPool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone())); - let transaction = { - let transfer = Transfer { - amount: 5, - nonce: 0, - from: AccountKeyring::Alice.into(), - to: Default::default(), - }; - transfer.into_signed_tx() - }; + let transaction = Transfer { + amount: 5, + nonce: 0, + from: AccountKeyring::Alice.into(), + to: Default::default(), + }.into_signed_tx(); + let best = longest_chain.best_chain().unwrap(); + // store the transaction in the pool - pool.submit_one(&BlockId::hash(client.best_block_header().unwrap().hash()), transaction.clone()).unwrap(); + pool.submit_one(&BlockId::hash(best.hash()), transaction.clone()).unwrap(); // import the block - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push(transaction.clone()).unwrap(); let block = builder.bake().unwrap(); let id = BlockId::hash(block.header().hash()); diff --git a/core/service/src/config.rs b/core/service/src/config.rs index 20134c788d170b56866e51475069684e5e32a516..5996ec837d38ea707bb3bcec9a92b6b515ca14b6 100644 --- a/core/service/src/config.rs +++ b/core/service/src/config.rs @@ -66,6 +66,8 @@ pub struct Configuration { pub rpc_http: Option, /// RPC over Websockets binding address. `None` if disabled. pub rpc_ws: Option, + /// Maximum number of connections for WebSockets RPC server. `None` if default. + pub rpc_ws_max_connections: Option, /// CORS settings for HTTP & WS servers. `None` if all origins are allowed. pub rpc_cors: Option>, /// Telemetry service URL. `None` if disabled. @@ -78,6 +80,8 @@ pub struct Configuration { pub force_authoring: bool, /// Disable GRANDPA when running in validator mode pub disable_grandpa: bool, + /// Node keystore's password + pub password: String, } impl Configuration { @@ -102,12 +106,14 @@ impl Configuration = std::result::Result; - links { - Consensus(consensus_common::Error, consensus_common::ErrorKind) #[doc="Consensus error"]; - Network(network::error::Error, network::error::ErrorKind) #[doc="Network error"]; - Keystore(keystore::Error, keystore::ErrorKind) #[doc="Keystore error"]; +/// Service errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// IO error. + Io(std::io::Error), + /// Consensus error. + Consensus(consensus_common::Error), + /// Network error. + Network(network::error::Error), + /// Keystore error. + Keystore(keystore::Error), + /// Best chain selection strategy is missing. + #[display(fmt="Best chain selection strategy (SelectChain) is not provided.")] + SelectChainRequired, + /// Other error. + Other(String), +} + +impl<'a> From<&'a str> for Error { + fn from(s: &'a str) -> Self { + Error::Other(s.into()) } +} - errors { +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + Error::Io(ref err) => Some(err), + Error::Consensus(ref err) => Some(err), + Error::Network(ref err) => Some(err), + Error::Keystore(ref err) => Some(err), + _ => None, + } } } diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index afd2b52e57f2e8e753b68ec05f049eaaa0e952b1..b33608392d7b36ab78ef725d5ab39f3799b6fb27 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -20,10 +20,10 @@ #![warn(missing_docs)] mod components; -mod error; mod chain_spec; pub mod config; pub mod chain_ops; +pub mod error; use std::io; use std::net::SocketAddr; @@ -34,17 +34,16 @@ use parking_lot::Mutex; use client::BlockchainEvents; use exit_future::Signal; use futures::prelude::*; -use inherents::pool::InherentsPool; use keystore::Store as Keystore; use log::{info, warn, debug}; use parity_codec::{Encode, Decode}; use primitives::Pair; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Header, As}; +use runtime_primitives::traits::{Header, SaturatedConversion}; use substrate_executor::NativeExecutor; use tel::{telemetry, SUBSTRATE_INFO}; -pub use self::error::{ErrorKind, Error}; +pub use self::error::Error; pub use config::{Configuration, Roles, PruningMode}; pub use chain_spec::{ChainSpec, Properties}; pub use transaction_pool::txpool::{ @@ -64,7 +63,7 @@ use components::{StartRPC, MaintainTransactionPool, OffchainWorker}; #[doc(hidden)] pub use std::{ops::Deref, result::Result, sync::Arc}; #[doc(hidden)] -pub use network::OnDemand; +pub use network::{FinalityProofProvider, OnDemand}; #[doc(hidden)] pub use tokio::runtime::TaskExecutor; @@ -73,16 +72,16 @@ const DEFAULT_PROTOCOL_ID: &str = "sup"; /// Substrate service. pub struct Service { client: Arc>, + select_chain: Option<::SelectChain>, network: Option>>, transaction_pool: Arc>, - inherents_pool: Arc>>, keystore: Keystore, exit: ::exit_future::Exit, signal: Option, /// Configuration of this Service pub config: FactoryFullConfiguration, - _rpc: Box<::std::any::Any + Send + Sync>, - _telemetry: Option>, + _rpc: Box, + _telemetry: Option, _offchain_workers: Option, ComponentBlock>>>, _telemetry_on_connect_sinks: Arc>>>, } @@ -105,7 +104,7 @@ pub type TelemetryOnConnectNotifications = mpsc::UnboundedReceiver<()>; /// Used to hook on telemetry connection established events. pub struct TelemetryOnConnect<'a> { /// Handle to a future that will resolve on exit. - pub on_exit: Box + Send + 'static>, + pub on_exit: Box + Send + 'static>, /// Event stream. pub telemetry_connection_sinks: TelemetryOnConnectNotifications, /// Executor to which the hook is spawned. @@ -141,7 +140,7 @@ impl Service { let public_key = match keystore.contents()?.get(0) { Some(public_key) => public_key.clone(), None => { - let key = keystore.generate("")?; + let key = keystore.generate(&config.password)?; let public_key = key.public(); info!("Generated a new keypair: {:?}", public_key); @@ -150,32 +149,32 @@ impl Service { }; let (client, on_demand) = Components::build_client(&config, executor)?; - let import_queue = Box::new(Components::build_import_queue(&mut config, client.clone())?); - let best_header = client.best_block_header()?; + let select_chain = Components::build_select_chain(&mut config, client.clone())?; + let import_queue = Box::new(Components::build_import_queue( + &mut config, + client.clone(), + select_chain.clone(), + )?); + let finality_proof_provider = Components::build_finality_proof_provider(client.clone())?; + let chain_info = client.info().chain; let version = config.full_version(); - info!("Best block: #{}", best_header.number()); - telemetry!(SUBSTRATE_INFO; "node.start"; "height" => best_header.number().as_(), "best" => ?best_header.hash()); + info!("Highest known block at #{}", chain_info.best_number); + telemetry!(SUBSTRATE_INFO; "node.start"; + "height" => chain_info.best_number.saturated_into::(), + "best" => ?chain_info.best_hash + ); let network_protocol = ::build_network_protocol(&config)?; let transaction_pool = Arc::new( Components::build_transaction_pool(config.transaction_pool.clone(), client.clone())? ); let transaction_pool_adapter = Arc::new(TransactionPoolAdapter:: { - imports_external_transactions: !(config.roles == Roles::LIGHT), + imports_external_transactions: !config.roles.is_light(), pool: transaction_pool.clone(), client: client.clone(), }); - let network_params = network::config::Params { - config: network::config::ProtocolConfig { roles: config.roles }, - network_config: config.network.clone(), - chain: client.clone(), - on_demand: on_demand.as_ref().map(|d| d.clone() as _), - transaction_pool: transaction_pool_adapter.clone() as _, - specialization: network_protocol, - }; - let protocol_id = { let protocol_id_full = match config.chain_spec.protocol_id() { Some(pid) => pid, @@ -189,19 +188,30 @@ impl Service { network::ProtocolId::from(protocol_id_full) }; - let has_bootnodes = !network_params.network_config.boot_nodes.is_empty(); - let (network, network_chan) = network::Service::new( - network_params, + let network_params = network::config::Params { + roles: config.roles, + network_config: config.network.clone(), + chain: client.clone(), + finality_proof_provider, + on_demand, + transaction_pool: transaction_pool_adapter.clone() as _, + import_queue, protocol_id, - import_queue - )?; - on_demand.map(|on_demand| on_demand.set_network_sender(network_chan)); + specialization: network_protocol, + }; + + let has_bootnodes = !network_params.network_config.boot_nodes.is_empty(); + let network_mut = network::NetworkWorker::new(network_params)?; + let network = network_mut.service().clone(); + + task_executor.spawn(network_mut + .map_err(|_| ()) + .select(exit.clone()) + .then(|_| Ok(()))); - let inherents_pool = Arc::new(InherentsPool::default()); let offchain_workers = if config.offchain_worker { Some(Arc::new(offchain::OffchainWorkers::new( client.clone(), - inherents_pool.clone(), task_executor.clone(), ))) } else { @@ -317,8 +327,16 @@ impl Service { properties: config.chain_spec.properties(), }; let rpc = Components::RuntimeServices::start_rpc( - client.clone(), network.clone(), has_bootnodes, system_info, config.rpc_http, - config.rpc_ws, config.rpc_cors.clone(), task_executor.clone(), transaction_pool.clone(), + client.clone(), + network.clone(), + has_bootnodes, + system_info, + config.rpc_http, + config.rpc_ws, + config.rpc_ws_max_connections, + config.rpc_cors.clone(), + task_executor.clone(), + transaction_pool.clone(), )?; let telemetry_connection_sinks: Arc>>> = Default::default(); @@ -333,8 +351,9 @@ impl Service { let version = version.clone(); let chain_name = config.chain_spec.name().to_owned(); let telemetry_connection_sinks_ = telemetry_connection_sinks.clone(); - Arc::new(tel::init_telemetry(tel::TelemetryConfig { + let telemetry = tel::init_telemetry(tel::TelemetryConfig { endpoints, + wasm_external_transport: None, on_connect: Box::new(move || { telemetry!(SUBSTRATE_INFO; "system.connected"; "name" => name.clone(), @@ -351,14 +370,18 @@ impl Service { sink.unbounded_send(()).is_ok() }); }), - })) + }); + task_executor.spawn(telemetry.clone() + .select(exit.clone()) + .then(|_| Ok(()))); + telemetry }); Ok(Service { client, network: Some(network), + select_chain, transaction_pool, - inherents_pool, signal: Some(signal), keystore, config, @@ -375,7 +398,7 @@ impl Service { if self.config.roles != Roles::AUTHORITY { return None } let keystore = &self.keystore; if let Ok(Some(Ok(key))) = keystore.contents().map(|keys| keys.get(0) - .map(|k| keystore.load(k, ""))) + .map(|k| keystore.load(k, &self.config.password))) { Some(key) } else { @@ -384,7 +407,7 @@ impl Service { } /// return a shared instance of Telemetry (if enabled) - pub fn telemetry(&self) -> Option> { + pub fn telemetry(&self) -> Option { self._telemetry.as_ref().map(|t| t.clone()) } } @@ -395,6 +418,11 @@ impl Service where Components: components::Components { self.client.clone() } + /// Get clone of select chain. + pub fn select_chain(&self) -> Option<::SelectChain> { + self.select_chain.clone() + } + /// Get shared network instance. pub fn network(&self) -> Arc> { self.network.as_ref().expect("self.network always Some").clone() @@ -405,11 +433,6 @@ impl Service where Components: components::Components { self.transaction_pool.clone() } - /// Get shared inherents pool instance. - pub fn inherents_pool(&self) -> Arc>> { - self.inherents_pool.clone() - } - /// Get shared keystore. pub fn keystore(&self) -> &Keystore { &self.keystore @@ -461,26 +484,36 @@ pub struct TransactionPoolAdapter { impl TransactionPoolAdapter { fn best_block_id(&self) -> Option>> { - self.client.info() - .map(|info| BlockId::hash(info.chain.best_hash)) - .map_err(|e| { - debug!("Error getting best block: {:?}", e); - }) - .ok() + Some(BlockId::hash(self.client.info().chain.best_hash)) } } +/// Get transactions for propagation. +/// +/// Function extracted to simplify the test and prevent creating `ServiceFactory`. +fn transactions_to_propagate(pool: &TransactionPool) + -> Vec<(H, B::Extrinsic)> +where + PoolApi: ChainApi, + B: BlockT, + H: std::hash::Hash + Eq + runtime_primitives::traits::Member + serde::Serialize, + E: txpool::error::IntoPoolError + From, +{ + pool.ready() + .filter(|t| t.is_propagateable()) + .map(|t| { + let hash = t.hash.clone(); + let ex: B::Extrinsic = t.data.clone(); + (hash, ex) + }) + .collect() +} + impl network::TransactionPool, ComponentBlock> for TransactionPoolAdapter where ::RuntimeApi: Send + Sync { fn transactions(&self) -> Vec<(ComponentExHash, ComponentExtrinsic)> { - self.pool.ready() - .map(|t| { - let hash = t.hash.clone(); - let ex: ComponentExtrinsic = t.data.clone(); - (hash, ex) - }) - .collect() + transactions_to_propagate(&self.pool) } fn import(&self, transaction: &ComponentExtrinsic) -> Option> { @@ -495,7 +528,7 @@ impl network::TransactionPool, ComponentBlock< match self.pool.submit_one(&best_block_id, uxt) { Ok(hash) => Some(hash), Err(e) => match e.into_pool_error() { - Ok(txpool::error::Error(txpool::error::ErrorKind::AlreadyImported(hash), _)) => { + Ok(txpool::error::Error::AlreadyImported(hash)) => { hash.downcast::>().ok() .map(|x| x.as_ref().clone()) }, @@ -528,33 +561,78 @@ impl network::TransactionPool, ComponentBlock< /// /// # Example /// -/// ```nocompile +/// ``` +/// # use substrate_service::{ +/// # construct_service_factory, Service, FullBackend, FullExecutor, LightBackend, LightExecutor, +/// # FullComponents, LightComponents, FactoryFullConfiguration, FullClient, TaskExecutor +/// # }; +/// # use transaction_pool::{self, txpool::{Pool as TransactionPool}}; +/// # use network::construct_simple_protocol; +/// # use client::{self, LongestChain}; +/// # use primitives::{Pair as PairT, ed25519}; +/// # use consensus_common::import_queue::{BasicQueue, Verifier}; +/// # use consensus_common::{BlockOrigin, ImportBlock}; +/// # use node_runtime::{GenesisConfig, RuntimeApi}; +/// # use std::sync::Arc; +/// # use node_primitives::Block; +/// # use runtime_primitives::Justification; +/// # use runtime_primitives::traits::{AuthorityIdFor, Block as BlockT}; +/// # use grandpa; +/// # construct_simple_protocol! { +/// # pub struct NodeProtocol where Block = Block { } +/// # } +/// # struct MyVerifier; +/// # impl Verifier for MyVerifier { +/// # fn verify( +/// # &self, +/// # origin: BlockOrigin, +/// # header: B::Header, +/// # justification: Option, +/// # body: Option>, +/// # ) -> Result<(ImportBlock, Option>>), String> { +/// # unimplemented!(); +/// # } +/// # } +/// type FullChainApi = transaction_pool::ChainApi< +/// client::Client, FullExecutor, Block, RuntimeApi>, Block>; +/// type LightChainApi = transaction_pool::ChainApi< +/// client::Client, LightExecutor, Block, RuntimeApi>, Block>; +/// /// construct_service_factory! { /// struct Factory { -/// // Declare the block type +/// // Declare the block type /// Block = Block, -/// // Declare the network protocol and give an initializer. +/// RuntimeApi = RuntimeApi, +/// // Declare the network protocol and give an initializer. /// NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, /// RuntimeDispatch = node_executor::Executor, -/// FullTransactionPoolApi = transaction_pool::ChainApi, FullExecutor, Block> +/// FullTransactionPoolApi = FullChainApi /// { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, -/// LightTransactionPoolApi = transaction_pool::ChainApi, LightExecutor, Block> +/// LightTransactionPoolApi = LightChainApi /// { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, /// Genesis = GenesisConfig, /// Configuration = (), -/// FullService = Service> -/// { |config, executor| Service::>::new(config, executor) }, -/// // Setup as Consensus Authority (if the role and key are given) +/// FullService = FullComponents +/// { |config, executor| >::new(config, executor) }, +/// // Setup as Consensus Authority (if the role and key are given) /// AuthoritySetup = { -/// |service: Self::FullService, executor: TaskExecutor, key: Arc| { Ok(service) }}, -/// LightService = Service> -/// { |config, executor| Service::>::new(config, executor) }, -/// // Declare the import queue. The import queue is special as it takes two initializers. -/// // The first one is for the initializing the full import queue and the second for the -/// // light import queue. -/// ImportQueue = BasicQueue -/// { |_, client| Ok(BasicQueue::new(Arc::new(NoneVerifier {}, client))) } -/// { |_, client| Ok(BasicQueue::new(Arc::new(NoneVerifier {}, client))) }, +/// |service: Self::FullService, executor: TaskExecutor, key: Option>| { +/// Ok(service) +/// }}, +/// LightService = LightComponents +/// { |config, executor| >::new(config, executor) }, +/// FullImportQueue = BasicQueue +/// { |_, client, _| Ok(BasicQueue::new(Arc::new(MyVerifier), client, None, None, None)) }, +/// LightImportQueue = BasicQueue +/// { |_, client| Ok(BasicQueue::new(Arc::new(MyVerifier), client, None, None, None)) }, +/// SelectChain = LongestChain, Self::Block> +/// { |config: &FactoryFullConfiguration, client: Arc>| { +/// #[allow(deprecated)] +/// Ok(LongestChain::new(client.backend().clone())) +/// }}, +/// FinalityProofProvider = { |client: Arc>| { +/// Ok(Some(Arc::new(grandpa::FinalityProofProvider::new(client.clone(), client)) as _)) +/// }}, /// } /// } /// ``` @@ -578,6 +656,9 @@ macro_rules! construct_service_factory { { $( $full_import_queue_init:tt )* }, LightImportQueue = $light_import_queue:ty { $( $light_import_queue_init:tt )* }, + SelectChain = $select_chain:ty + { $( $select_chain_init:tt )* }, + FinalityProofProvider = { $( $finality_proof_provider_init:tt )* }, } ) => { $( #[$attr] )* @@ -597,6 +678,7 @@ macro_rules! construct_service_factory { type LightService = $light_service; type FullImportQueue = $full_import_queue; type LightImportQueue = $light_import_queue; + type SelectChain = $select_chain; fn build_full_transaction_pool( config: $crate::TransactionPoolOptions, @@ -620,11 +702,19 @@ macro_rules! construct_service_factory { ( $( $protocol_init )* ) (config) } + fn build_select_chain( + config: &mut $crate::FactoryFullConfiguration, + client: Arc<$crate::FullClient> + ) -> $crate::Result { + ( $( $select_chain_init )* ) (config, client) + } + fn build_full_import_queue( config: &mut $crate::FactoryFullConfiguration, client: $crate::Arc<$crate::FullClient>, + select_chain: Self::SelectChain ) -> $crate::Result { - ( $( $full_import_queue_init )* ) (config, client) + ( $( $full_import_queue_init )* ) (config, client, select_chain) } fn build_light_import_queue( @@ -634,6 +724,12 @@ macro_rules! construct_service_factory { ( $( $light_import_queue_init )* ) (config, client) } + fn build_finality_proof_provider( + client: Arc<$crate::FullClient> + ) -> Result>>, $crate::Error> { + ( $( $finality_proof_provider_init )* ) (client) + } + fn new_light( config: $crate::FactoryFullConfiguration, executor: $crate::TaskExecutor @@ -655,3 +751,41 @@ macro_rules! construct_service_factory { } } } + +#[cfg(test)] +mod tests { + use super::*; + use consensus_common::SelectChain; + use runtime_primitives::traits::BlindCheckable; + use substrate_test_client::{AccountKeyring, runtime::{Extrinsic, Transfer}, TestClientBuilder}; + + #[test] + fn should_not_propagate_transactions_that_are_marked_as_such() { + // given + let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); + let client = Arc::new(client); + let pool = Arc::new(TransactionPool::new( + Default::default(), + transaction_pool::ChainApi::new(client.clone()) + )); + let best = longest_chain.best_chain().unwrap(); + let transaction = Transfer { + amount: 5, + nonce: 0, + from: AccountKeyring::Alice.into(), + to: Default::default(), + }.into_signed_tx(); + pool.submit_one(&BlockId::hash(best.hash()), transaction.clone()).unwrap(); + pool.submit_one(&BlockId::hash(best.hash()), Extrinsic::IncludeData(vec![1])).unwrap(); + assert_eq!(pool.status().ready, 2); + + // when + let transactions = transactions_to_propagate(&pool); + + // then + assert_eq!(transactions.len(), 1); + assert!(transactions[0].1.clone().check().is_ok()); + // this should not panic + let _ = transactions[0].1.transfer(); + } +} diff --git a/core/service/test/Cargo.toml b/core/service/test/Cargo.toml index b06e7fcb08eabd4b4ade423a8d7e3655efc7c952..38cdd042d6b22cd6cfce80027547c46ef83bcd10 100644 --- a/core/service/test/Cargo.toml +++ b/core/service/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-service-test" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index 95cd0173b48ab73666731b616529d44591f517e1..c31196af97ff34ba04cdd50394a2bc99c8882ffc 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -24,7 +24,7 @@ use std::collections::HashMap; use log::info; use futures::{Future, Stream}; use tempdir::TempDir; -use tokio::runtime::Runtime; +use tokio::{runtime::Runtime, prelude::FutureExt}; use tokio::timer::Interval; use service::{ ServiceFactory, @@ -36,31 +36,56 @@ use service::{ }; use network::{multiaddr, Multiaddr, SyncProvider, ManageNetwork}; use network::config::{NetworkConfiguration, NodeKeyConfig, Secret, NonReservedPeerMode}; -use sr_primitives::traits::As; use sr_primitives::generic::BlockId; use consensus::{ImportBlock, BlockImport}; +/// Maximum duration of single wait call. +const MAX_WAIT_TIME: Duration = Duration::from_secs(60 * 3); + struct TestNet { runtime: Runtime, authority_nodes: Vec<(u32, Arc, Multiaddr)>, full_nodes: Vec<(u32, Arc, Multiaddr)>, - _light_nodes: Vec<(u32, Arc)>, + light_nodes: Vec<(u32, Arc, Multiaddr)>, chain_spec: FactoryChainSpec, base_port: u16, nodes: usize, } impl TestNet { - pub fn run_until_all_full bool + 'static>(&mut self, predicate: P) { + pub fn run_until_all_full( + &mut self, + full_predicate: FP, + light_predicate: LP, + ) + where + FP: Send + Sync + Fn(u32, &F::FullService) -> bool + 'static, + LP: Send + Sync + Fn(u32, &F::LightService) -> bool + 'static, + { let full_nodes = self.full_nodes.clone(); - let interval = Interval::new_interval(Duration::from_millis(100)).map_err(|_| ()).for_each(move |_| { - if full_nodes.iter().all(|&(ref id, ref service, _)| predicate(*id, service)) { + let light_nodes = self.light_nodes.clone(); + let interval = Interval::new_interval(Duration::from_millis(100)) + .map_err(|_| ()) + .for_each(move |_| { + let full_ready = full_nodes.iter().all(|&(ref id, ref service, _)| full_predicate(*id, service)); + if !full_ready { + return Ok(()); + } + + let light_ready = light_nodes.iter().all(|&(ref id, ref service, _)| light_predicate(*id, service)); + if !light_ready { + return Ok(()); + } + Err(()) - } else { - Ok(()) - } - }); - self.runtime.block_on(interval).ok(); + }) + .timeout(MAX_WAIT_TIME); + + match self.runtime.block_on(interval) { + Ok(()) => unreachable!("interval always fails; qed"), + Err(ref err) if err.is_inner() => (), + Err(_) => panic!("Waited for too long"), + } } } @@ -100,6 +125,7 @@ fn node_config ( client_version: "network/test/0.1".to_owned(), node_name: "unknown".to_owned(), enable_mdns: false, + wasm_external_transport: None, }; Configuration { @@ -121,12 +147,14 @@ fn node_config ( execution_strategies: Default::default(), rpc_http: None, rpc_ws: None, + rpc_ws_max_connections: None, rpc_cors: None, telemetry_endpoints: None, default_heap_pages: None, offchain_worker: false, force_authoring: false, disable_grandpa: false, + password: "".to_string(), } } @@ -139,7 +167,7 @@ impl TestNet { runtime, authority_nodes: Default::default(), full_nodes: Default::default(), - _light_nodes: Default::default(), + light_nodes: Default::default(), chain_spec: spec.clone(), base_port, nodes: 0, @@ -173,28 +201,46 @@ impl TestNet { })); nodes += full as usize; - self._light_nodes.extend((nodes..nodes + light as usize).map(|index| (index as u32, - Arc::new(F::new_light(node_config::(index as u32, &spec, Roles::LIGHT, None, base_port, &temp), executor.clone()) - .expect("Error creating test node service"))) - )); + self.light_nodes.extend((nodes..nodes + light as usize).map(|index| { + let node_config = node_config::(index as u32, &spec, Roles::LIGHT, None, base_port, &temp); + let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); + let service = Arc::new(F::new_light(node_config, executor.clone()) + .expect("Error creating test node service")); + let addr = addr.with(multiaddr::Protocol::P2p(service.network().local_peer_id().into())); + (index as u32, service, addr) + })); nodes += light as usize; + self.nodes = nodes; } } pub fn connectivity(spec: FactoryChainSpec) { - const NUM_NODES: u32 = 10; + const NUM_FULL_NODES: u32 = 5; + const NUM_LIGHT_NODES: u32 = 5; { let temp = TempDir::new("substrate-connectivity-test").expect("Error creating test dir"); let runtime = { - let mut network = TestNet::::new(&temp, spec.clone(), NUM_NODES, 0, vec![], 30400); + let mut network = TestNet::::new( + &temp, + spec.clone(), + NUM_FULL_NODES, + NUM_LIGHT_NODES, + vec![], + 30400, + ); info!("Checking star topology"); let first_address = network.full_nodes[0].2.clone(); for (_, service, _) in network.full_nodes.iter().skip(1) { service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } - network.run_until_all_full(|_index, service| - service.network().peers().len() == NUM_NODES as usize - 1 + for (_, service, _) in network.light_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); + } + network.run_until_all_full( + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize - 1 + + NUM_LIGHT_NODES as usize, + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize, ); network.runtime }; @@ -206,31 +252,62 @@ pub fn connectivity(spec: FactoryChainSpec) { { let temp = TempDir::new("substrate-connectivity-test").expect("Error creating test dir"); { - let mut network = TestNet::::new(&temp, spec, NUM_NODES, 0, vec![], 30400); + let mut network = TestNet::::new( + &temp, + spec, + NUM_FULL_NODES, + NUM_LIGHT_NODES, + vec![], + 30400, + ); info!("Checking linked topology"); let mut address = network.full_nodes[0].2.clone(); - for (_, service, node_id) in network.full_nodes.iter().skip(1) { - service.network().add_reserved_peer(address.to_string()).expect("Error adding reserved peer"); - address = node_id.clone(); + let max_nodes = ::std::cmp::max(NUM_FULL_NODES, NUM_LIGHT_NODES); + for i in 0..max_nodes { + if i != 0 { + if let Some((_, service, node_id)) = network.full_nodes.get(i as usize) { + service.network().add_reserved_peer(address.to_string()).expect("Error adding reserved peer"); + address = node_id.clone(); + } + } + + if let Some((_, service, node_id)) = network.light_nodes.get(i as usize) { + service.network().add_reserved_peer(address.to_string()).expect("Error adding reserved peer"); + address = node_id.clone(); + } } - network.run_until_all_full(|_index, service| { - service.network().peers().len() == NUM_NODES as usize - 1 - }); + network.run_until_all_full( + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize - 1 + + NUM_LIGHT_NODES as usize, + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize, + ); } temp.close().expect("Error removing temp dir"); } } -pub fn sync(spec: FactoryChainSpec, block_factory: B, extrinsic_factory: E) +pub fn sync( + spec: FactoryChainSpec, + mut block_factory: B, + mut extrinsic_factory: E, +) where F: ServiceFactory, - B: Fn(&F::FullService) -> ImportBlock, - E: Fn(&F::FullService) -> FactoryExtrinsic, + B: FnMut(&F::FullService) -> ImportBlock, + E: FnMut(&F::FullService) -> FactoryExtrinsic, { - const NUM_NODES: u32 = 10; - const NUM_BLOCKS: usize = 512; + const NUM_FULL_NODES: u32 = 10; + const NUM_LIGHT_NODES: u32 = 10; + const NUM_BLOCKS: u32 = 512; let temp = TempDir::new("substrate-sync-test").expect("Error creating test dir"); - let mut network = TestNet::::new(&temp, spec.clone(), NUM_NODES, 0, vec![], 30500); + let mut network = TestNet::::new( + &temp, + spec.clone(), + NUM_FULL_NODES, + NUM_LIGHT_NODES, + vec![], + 30500, + ); info!("Checking block sync"); let first_address = { let first_service = &network.full_nodes[0].1; @@ -247,15 +324,22 @@ where for (_, service, _) in network.full_nodes.iter().skip(1) { service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } - network.run_until_all_full(|_index, service| - service.client().info().unwrap().chain.best_number == As::sa(NUM_BLOCKS as u64) + for (_, service, _) in network.light_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); + } + network.run_until_all_full( + |_index, service| + service.client().info().chain.best_number == NUM_BLOCKS.into(), + |_index, service| + service.client().info().chain.best_number == NUM_BLOCKS.into(), ); info!("Checking extrinsic propagation"); let first_service = network.full_nodes[0].1.clone(); - let best_block = BlockId::number(first_service.client().info().unwrap().chain.best_number); + let best_block = BlockId::number(first_service.client().info().chain.best_number); first_service.transaction_pool().submit_one(&best_block, extrinsic_factory(&first_service)).unwrap(); - network.run_until_all_full(|_index, service| - service.transaction_pool().ready().count() == 1 + network.run_until_all_full( + |_index, service| service.transaction_pool().ready().count() == 1, + |_index, _service| true, ); } @@ -263,27 +347,47 @@ pub fn consensus(spec: FactoryChainSpec, authorities: Vec) where F: ServiceFactory, { - const NUM_NODES: u32 = 20; - const NUM_BLOCKS: u64 = 200; + const NUM_FULL_NODES: u32 = 10; + const NUM_LIGHT_NODES: u32 = 0; + const NUM_BLOCKS: u32 = 10; // 10 * 2 sec block production time = ~20 seconds let temp = TempDir::new("substrate-conensus-test").expect("Error creating test dir"); - let mut network = TestNet::::new(&temp, spec.clone(), NUM_NODES / 2, 0, authorities, 30600); + let mut network = TestNet::::new( + &temp, + spec.clone(), + NUM_FULL_NODES / 2, + NUM_LIGHT_NODES / 2, + authorities, + 30600, + ); info!("Checking consensus"); let first_address = network.authority_nodes[0].2.clone(); for (_, service, _) in network.full_nodes.iter() { service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } + for (_, service, _) in network.light_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); + } for (_, service, _) in network.authority_nodes.iter().skip(1) { service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } - network.run_until_all_full(|_index, service| { - service.client().info().unwrap().chain.finalized_number >= As::sa(NUM_BLOCKS / 2) - }); + network.run_until_all_full( + |_index, service| + service.client().info().chain.finalized_number >= (NUM_BLOCKS / 2).into(), + |_index, service| + service.client().info().chain.best_number >= (NUM_BLOCKS / 2).into(), + ); info!("Adding more peers"); - network.insert_nodes(&temp, NUM_NODES / 2, 0, vec![]); + network.insert_nodes(&temp, NUM_FULL_NODES / 2, NUM_LIGHT_NODES / 2, vec![]); for (_, service, _) in network.full_nodes.iter() { service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } - network.run_until_all_full(|_index, service| - service.client().info().unwrap().chain.finalized_number >= As::sa(NUM_BLOCKS) + for (_, service, _) in network.light_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); + } + network.run_until_all_full( + |_index, service| + service.client().info().chain.finalized_number >= NUM_BLOCKS.into(), + |_index, service| + service.client().info().chain.best_number >= NUM_BLOCKS.into(), ); } diff --git a/core/sr-api-macros/Cargo.toml b/core/sr-api-macros/Cargo.toml index eef8f8e11177c8cefc666ddee0f1b9caefca7043..a87b53b7327ae831e7e28e0e2e015b4d8dd039ee 100644 --- a/core/sr-api-macros/Cargo.toml +++ b/core/sr-api-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sr-api-macros" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -22,6 +22,9 @@ runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } sr-version = { path = "../sr-version" } substrate-primitives = { path = "../primitives" } criterion = "0.2" +consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } +codec = { package = "parity-codec", version = "3.5.1" } +trybuild = "1.0" [[bench]] name = "bench" diff --git a/core/sr-api-macros/benches/bench.rs b/core/sr-api-macros/benches/bench.rs index f4677217897924ef532adca0f2bac520f569c2ee..55399fb4d8b1fef2b40ec30a93041cb08b777e1d 100644 --- a/core/sr-api-macros/benches/bench.rs +++ b/core/sr-api-macros/benches/bench.rs @@ -23,14 +23,14 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("add one with same runtime api", |b| { let client = test_client::new(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| runtime_api.benchmark_add_one(&block_id, &1)) }); c.bench_function("add one with recreating runtime api", |b| { let client = test_client::new(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_add_one(&block_id, &1)) }); @@ -38,7 +38,7 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("vector add one with same runtime api", |b| { let client = test_client::new(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); let data = vec![0; 1000]; b.iter_with_large_drop(|| runtime_api.benchmark_vector_add_one(&block_id, &data)) @@ -46,7 +46,7 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("vector add one with recreating runtime api", |b| { let client = test_client::new(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); let data = vec![0; 1000]; b.iter_with_large_drop(|| client.runtime_api().benchmark_vector_add_one(&block_id, &data)) @@ -54,13 +54,13 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("calling function by function pointer in wasm", |b| { let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_indirect_call(&block_id).unwrap()) }); c.bench_function("calling function in wasm", |b| { let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_direct_call(&block_id).unwrap()) }); } diff --git a/core/sr-api-macros/src/compile_fail_tests.rs b/core/sr-api-macros/src/compile_fail_tests.rs deleted file mode 100644 index e562f8b2fe598a7e7a994b3c46748ec0952a0ad6..0000000000000000000000000000000000000000 --- a/core/sr-api-macros/src/compile_fail_tests.rs +++ /dev/null @@ -1,412 +0,0 @@ -// Copyright 2018-2019 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 . - -//! Compile fail tests. - -mod declaring_own_block { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - use runtime_primitives::traits::Block as BlockT; - - decl_runtime_apis! { - pub trait Api { - fn test(); - } - } - - fn main() {} - ``` - */ -} - -mod declaring_own_block_with_different_name { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - use runtime_primitives::traits::Block as BlockT; - - decl_runtime_apis! { - pub trait Api { - fn test(); - } - } - - fn main() {} - ``` - */ -} - -mod adding_self_parameter { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - pub trait Api { - fn test(&self); - } - } - - fn main() {} - ``` - */ -} - -mod adding_at_parameter { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - pub trait Api { - fn test(at: u64); - } - } - - fn main() {} - ``` - */ -} - -mod invalid_api_version { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - #[api_version] - pub trait Api { - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} - -mod invalid_api_version_2 { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - #[api_version("1")] - pub trait Api { - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} - -mod invalid_api_version_3 { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - #[api_version()] - pub trait Api { - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} - -mod missing_block_generic_parameter { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: u64) { - unimplemented!() - } - } - } - - fn main() {} - ``` - */ -} - -mod missing_path_for_trait { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl Api for Runtime { - fn test(data: u64) { - unimplemented!() - } - } - } - - fn main() {} - ``` - */ -} - -mod empty_impl_runtime_apis_call { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! {} - - fn main() {} - ``` - */ -} - -mod type_reference_in_impl_runtime_apis_call { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: &u64) { - unimplemented!() - } - } - } - - fn main() {} - ``` - */ -} - -mod impl_incorrect_method_signature { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: String) {} - } - } - - fn main() {} - ``` - */ -} - -mod impl_two_traits_with_same_name { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - mod second { - decl_runtime_apis! { - pub trait Api { - fn test2(data: u64); - } - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: u64) {} - } - - impl second::Api for Runtime { - fn test2(data: u64) {} - } - } - - fn main() {} - ``` - */ -} - -mod changed_at_unknown_version { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - #[changed_in(2)] - fn test(data: u64); - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} diff --git a/core/sr-api-macros/src/decl_runtime_apis.rs b/core/sr-api-macros/src/decl_runtime_apis.rs index 109b37d875dafd42ebc71624b4b8056608b4fc1b..c2501220b6193641467d4a0f081199dabed54d56 100644 --- a/core/sr-api-macros/src/decl_runtime_apis.rs +++ b/core/sr-api-macros/src/decl_runtime_apis.rs @@ -57,9 +57,21 @@ const CHANGED_IN_ATTRIBUTE: &str = "changed_in"; /// /// Is used when a trait method was renamed. const RENAMED_ATTRIBUTE: &str = "renamed"; +/// The `skip_initialize_block` attribute. +/// +/// Is used when a trait method does not require that the block is initialized +/// before being called. +const SKIP_INITIALIZE_BLOCK_ATTRIBUTE: &str = "skip_initialize_block"; +/// The `initialize_block` attribute. +/// +/// A trait method tagged with this attribute, initializes the runtime at +/// certain block. +const INITIALIZE_BLOCK_ATTRIBUTE: &str = "initialize_block"; /// All attributes that we support in the declaration of a runtime api trait. const SUPPORTED_ATTRIBUTE_NAMES: &[&str] = &[ - CORE_TRAIT_ATTRIBUTE, API_VERSION_ATTRIBUTE, CHANGED_IN_ATTRIBUTE, RENAMED_ATTRIBUTE + CORE_TRAIT_ATTRIBUTE, API_VERSION_ATTRIBUTE, CHANGED_IN_ATTRIBUTE, + RENAMED_ATTRIBUTE, SKIP_INITIALIZE_BLOCK_ATTRIBUTE, + INITIALIZE_BLOCK_ATTRIBUTE, ]; /// The structure used for parsing the runtime api declarations. @@ -338,7 +350,12 @@ fn generate_call_api_at_calls(decl: &ItemTrait) -> Result { if attrs.contains_key(RENAMED_ATTRIBUTE) && attrs.contains_key(CHANGED_IN_ATTRIBUTE) { return Err(Error::new( - fn_.span(), format!("`{}` and `{}` are not supported at once.", RENAMED_ATTRIBUTE, CHANGED_IN_ATTRIBUTE) + fn_.span(), + format!( + "`{}` and `{}` are not supported at once.", + RENAMED_ATTRIBUTE, + CHANGED_IN_ATTRIBUTE + ) )); } @@ -347,6 +364,15 @@ fn generate_call_api_at_calls(decl: &ItemTrait) -> Result { continue; } + let skip_initialize_block = attrs.contains_key(SKIP_INITIALIZE_BLOCK_ATTRIBUTE); + let update_initialized_block = if attrs.contains_key(INITIALIZE_BLOCK_ATTRIBUTE) { + quote!( + || *initialized_block.borrow_mut() = Some(*at) + ) + } else { + quote!(|| ()) + }; + // Parse the renamed attributes. let mut renames = Vec::new(); if let Some((_, a)) = attrs @@ -375,43 +401,63 @@ fn generate_call_api_at_calls(decl: &ItemTrait) -> Result { NC: FnOnce() -> ::std::result::Result + ::std::panic::UnwindSafe, Block: #crate_::runtime_api::BlockT, T: #crate_::runtime_api::CallRuntimeAt, + C: #crate_::runtime_api::Core, >( call_runtime_at: &T, + core_api: &C, at: &#crate_::runtime_api::BlockId, args: Vec, - changes: &mut #crate_::runtime_api::OverlayedChanges, - initialized_block: &mut Option<#crate_::runtime_api::BlockId>, + changes: &std::cell::RefCell<#crate_::runtime_api::OverlayedChanges>, + initialized_block: &std::cell::RefCell>>, native_call: Option, context: #crate_::runtime_api::ExecutionContext, + recorder: &Option>>>, ) -> #crate_::error::Result<#crate_::runtime_api::NativeOrEncoded> { let version = call_runtime_at.runtime_version_at(at)?; + use #crate_::runtime_api::InitializeBlock; + let initialize_block = if #skip_initialize_block { + InitializeBlock::Skip + } else { + InitializeBlock::Do(&initialized_block) + }; + let update_initialized_block = #update_initialized_block; #( // Check if we need to call the function by an old name. if version.apis.iter().any(|(s, v)| { s == &ID && *v < #versions }) { - return call_runtime_at.call_api_at:: _>( + let ret = call_runtime_at.call_api_at:: _, _>( + core_api, at, #old_names, args, changes, - initialized_block, + initialize_block, None, - context - ); + context, + recorder, + )?; + + update_initialized_block(); + return Ok(ret); } )* - call_runtime_at.call_api_at( + let ret = call_runtime_at.call_api_at( + core_api, at, #trait_fn_name, args, changes, - initialized_block, + initialize_block, native_call, - context - ) + context, + recorder, + )?; + + update_initialized_block(); + Ok(ret) } )); } diff --git a/core/sr-api-macros/src/impl_runtime_apis.rs b/core/sr-api-macros/src/impl_runtime_apis.rs index 903f3e4028754f3661a51ba9df7736bb105800aa..530405068a13d197161d86e750860431709a46a6 100644 --- a/core/sr-api-macros/src/impl_runtime_apis.rs +++ b/core/sr-api-macros/src/impl_runtime_apis.rs @@ -82,6 +82,7 @@ fn generate_impl_call( }; )* + #[allow(deprecated)] let output = <#runtime as #impl_trait>::#fn_name(#( #pborrow #pnames2 ),*); #c::runtime_api::Encode::encode(&output) ) @@ -263,9 +264,10 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result + 'static> { call: &'static C, - commit_on_success: ::std::cell::RefCell, - initialized_block: ::std::cell::RefCell>, - changes: ::std::cell::RefCell<#crate_::runtime_api::OverlayedChanges>, + commit_on_success: std::cell::RefCell, + initialized_block: std::cell::RefCell>, + changes: std::cell::RefCell<#crate_::runtime_api::OverlayedChanges>, + recorder: Option>>>, } // `RuntimeApi` itself is not threadsafe. However, an instance is only available in a @@ -299,6 +301,22 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result #crate_::error::Result<#crate_::runtime_api::RuntimeVersion> { self.call.runtime_version_at(at) } + + fn record_proof(&mut self) { + self.recorder = Some(Default::default()); + } + + fn extract_proof(&mut self) -> Option>> { + self.recorder + .take() + .map(|r| { + r.borrow_mut() + .drain() + .into_iter() + .map(|n| n.data.to_vec()) + .collect() + }) + } } #[cfg(any(feature = "std", test))] @@ -315,6 +333,7 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result Result>, - ) -> #crate_::error::Result<#crate_::runtime_api::NativeOrEncoded> + &Self, + &std::cell::RefCell<#crate_::runtime_api::OverlayedChanges>, + &std::cell::RefCell>>, + &Option>>>, + ) -> #crate_::error::Result<#crate_::runtime_api::NativeOrEncoded>, >( &self, call_api_at: F, @@ -335,8 +356,10 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result Fold for ApiRuntimeImplToApiRuntimeApiImpl<'a> { #( #error )* self.call_api_at( - |call_runtime_at, changes, initialized_block| { + |call_runtime_at, core_api, changes, initialized_block, recorder| { #runtime_mod_path #call_api_at_call( call_runtime_at, + core_api, at, params_encoded, changes, @@ -493,6 +517,7 @@ impl<'a> Fold for ApiRuntimeImplToApiRuntimeApiImpl<'a> { ) }), context, + recorder, ) } ) diff --git a/core/sr-api-macros/src/lib.rs b/core/sr-api-macros/src/lib.rs index 72e143eb1a0088a2e16dcae9ae955b6c4a3faf43..1a315f44ddd5d37e40f82e66da2fd5a121543d4a 100644 --- a/core/sr-api-macros/src/lib.rs +++ b/core/sr-api-macros/src/lib.rs @@ -24,7 +24,6 @@ use proc_macro::TokenStream; mod impl_runtime_apis; mod decl_runtime_apis; mod utils; -mod compile_fail_tests; /// Tags given trait implementations as runtime apis. /// @@ -55,11 +54,11 @@ mod compile_fail_tests; /// # extern crate substrate_primitives; /// # /// # use runtime_primitives::traits::GetNodeBlockType; -/// # use test_client::runtime::Block; +/// # use test_client::runtime::{Block, Header}; /// # /// # /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` /// # /// trait are done by the `construct_runtime!` macro in a real runtime. -/// # struct Runtime {} +/// # pub struct Runtime {} /// # impl GetNodeBlockType for Runtime { /// # type NodeBlock = Block; /// # } @@ -79,6 +78,14 @@ mod compile_fail_tests; /// /// /// All runtime api implementations need to be done in one call of the macro! /// impl_runtime_apis! { +/// # impl client::runtime_api::Core for Runtime { +/// # fn version() -> client::runtime_api::RuntimeVersion { +/// # unimplemented!() +/// # } +/// # fn execute_block(_block: Block) {} +/// # fn initialize_block(_header: &Header) {} +/// # } +/// /// impl self::Balance for Runtime { /// fn get_balance() -> u64 { /// 1 @@ -177,7 +184,7 @@ pub fn impl_runtime_apis(input: TokenStream) -> TokenStream { /// /// /// /// Is callable by `set_balance_before_version_2`. /// #[changed_in(2)] -/// fn set_balance(val: u8); +/// fn set_balance(val: u16); /// /// In version 2, we added this new function. /// fn increase_balance(val: u64); /// } diff --git a/core/sr-api-macros/tests/decl_and_impl.rs b/core/sr-api-macros/tests/decl_and_impl.rs index 51f95d51b16dd6be173af59806c459f2c6ecc2ce..ba7ef23b99c983c16e9850da0c8317887aa2e181 100644 --- a/core/sr-api-macros/tests/decl_and_impl.rs +++ b/core/sr-api-macros/tests/decl_and_impl.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use runtime_primitives::traits::{GetNodeBlockType, Block as BlockT, AuthorityIdFor}; +use runtime_primitives::traits::{GetNodeBlockType, Block as BlockT}; use runtime_primitives::generic::BlockId; use client::runtime_api::{self, RuntimeApiInfo}; use client::{error::Result, decl_runtime_apis, impl_runtime_apis}; @@ -74,9 +74,6 @@ impl_runtime_apis! { fn initialize_block(_: &::Header) { unimplemented!() } - fn authorities() -> Vec> { - unimplemented!() - } } } @@ -122,7 +119,7 @@ fn check_runtime_api_versions_contains() { #[test] fn check_runtime_api_versions() { - check_runtime_api_versions_contains::>(); - check_runtime_api_versions_contains::>(); - check_runtime_api_versions_contains::>(); + check_runtime_api_versions_contains::>(); + check_runtime_api_versions_contains::>(); + check_runtime_api_versions_contains::>(); } diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index d26bed134e5db518f5fc8088014cd47ca63d316e..0671c4f41dae48beb5b099c2c2f9880b4fd5b8ce 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -14,14 +14,26 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use test_client::runtime::{TestAPI, DecodeFails}; -use runtime_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; -use state_machine::ExecutionStrategy; +use test_client::{ + AccountKeyring, runtime::{TestAPI, DecodeFails, Transfer, Header}, + NativeExecutor, LocalExecutor, TestClientBuilder +}; +use runtime_primitives::{ + generic::BlockId, + traits::{ProvideRuntimeApi, Header as HeaderT, Hash as HashT}, +}; +use state_machine::{ + ExecutionStrategy, create_proof_check_backend, + execution_proof_check_on_trie_backend, +}; + +use consensus_common::SelectChain; +use codec::Encode; fn calling_function_with_strat(strat: ExecutionStrategy) { - let client = test_client::new_with_execution_strategy(strat); + let client = TestClientBuilder::new().set_execution_strategy(strat).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.benchmark_add_one(&block_id, &1).unwrap(), 2); } @@ -39,35 +51,35 @@ fn calling_wasm_runtime_function() { #[test] #[should_panic(expected = "Could not convert parameter `param` between node and runtime!")] fn calling_native_runtime_function_with_non_decodable_parameter() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeWhenPossible).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); runtime_api.fail_convert_parameter(&block_id, DecodeFails::new()).unwrap(); } #[test] #[should_panic(expected = "Could not convert return value from runtime to node!")] fn calling_native_runtime_function_with_non_decodable_return_value() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeWhenPossible).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); runtime_api.fail_convert_return_value(&block_id).unwrap(); } #[test] fn calling_native_runtime_signature_changed_function() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeWhenPossible).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.function_signature_changed(&block_id).unwrap(), 1); } #[test] fn calling_wasm_runtime_signature_changed_old_function() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); #[allow(deprecated)] let res = runtime_api.function_signature_changed_before_version_2(&block_id).unwrap(); @@ -76,41 +88,106 @@ fn calling_wasm_runtime_signature_changed_old_function() { #[test] fn calling_with_both_strategy_and_fail_on_wasm_should_return_error() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert!(runtime_api.fail_on_wasm(&block_id).is_err()); } #[test] fn calling_with_both_strategy_and_fail_on_native_should_work() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_native(&block_id).unwrap(), 1); } #[test] fn calling_with_native_else_wasm_and_faild_on_wasm_should_work() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeElseWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeElseWasm).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_wasm(&block_id).unwrap(), 1); } #[test] fn calling_with_native_else_wasm_and_fail_on_native_should_work() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeElseWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeElseWasm).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_native(&block_id).unwrap(), 1); } #[test] fn use_trie_function() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.use_trie(&block_id).unwrap(), 2); } + +#[test] +fn initialize_block_works() { + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); + let runtime_api = client.runtime_api(); + let block_id = BlockId::Number(client.info().chain.best_number); + assert_eq!(runtime_api.get_block_number(&block_id).unwrap(), 1); +} + +#[test] +fn initialize_block_is_called_only_once() { + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); + let runtime_api = client.runtime_api(); + let block_id = BlockId::Number(client.info().chain.best_number); + assert_eq!(runtime_api.take_block_number(&block_id).unwrap(), Some(1)); + assert_eq!(runtime_api.take_block_number(&block_id).unwrap(), None); +} + +#[test] +fn initialize_block_is_skipped() { + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); + let runtime_api = client.runtime_api(); + let block_id = BlockId::Number(client.info().chain.best_number); + assert!(runtime_api.without_initialize_block(&block_id).unwrap()); +} + +#[test] +fn record_proof_works() { + let (client, longest_chain) = TestClientBuilder::new() + .set_execution_strategy(ExecutionStrategy::Both) + .build_with_longest_chain(); + + let block_id = BlockId::Number(client.info().chain.best_number); + let storage_root = longest_chain.best_chain().unwrap().state_root().clone(); + + let transaction = Transfer { + amount: 1000, + nonce: 0, + from: AccountKeyring::Alice.into(), + to: Default::default(), + }.into_signed_tx(); + + // Build the block and record proof + let mut builder = client + .new_block_at_with_proof_recording(&block_id, Default::default()) + .expect("Creates block builder"); + builder.push(transaction.clone()).unwrap(); + let (block, proof) = builder.bake_and_extract_proof().expect("Bake block"); + + let backend = create_proof_check_backend::<<

::Hashing as HashT>::Hasher>( + storage_root, + proof.expect("Proof was generated"), + ).expect("Creates proof backend."); + + // Use the proof backend to execute `execute_block`. + let mut overlay = Default::default(); + let executor = NativeExecutor::::new(None); + execution_proof_check_on_trie_backend( + &backend, + &mut overlay, + &executor, + "Core_execute_block", + &block.encode(), + ).expect("Executes block while using the proof backend"); +} \ No newline at end of file diff --git a/core/sr-api-macros/tests/trybuild.rs b/core/sr-api-macros/tests/trybuild.rs new file mode 100644 index 0000000000000000000000000000000000000000..e04c67737a486835e7818aa98bfaea46d6b975c6 --- /dev/null +++ b/core/sr-api-macros/tests/trybuild.rs @@ -0,0 +1,5 @@ +#[test] +fn ui() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/ui/*.rs"); +} diff --git a/core/sr-api-macros/tests/ui/adding_at_parameter.rs b/core/sr-api-macros/tests/ui/adding_at_parameter.rs new file mode 100644 index 0000000000000000000000000000000000000000..d4757e256f024514613090300169440258d70ee3 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_at_parameter.rs @@ -0,0 +1,9 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(at: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/adding_at_parameter.stderr b/core/sr-api-macros/tests/ui/adding_at_parameter.stderr new file mode 100644 index 0000000000000000000000000000000000000000..1c7e07a418c0a250b57e5a758b8ec4678d415f34 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_at_parameter.stderr @@ -0,0 +1,5 @@ +error: `decl_runtime_apis!` adds automatically a parameter `at: &BlockId`. Please rename/remove your parameter. + --> $DIR/adding_at_parameter.rs:5:11 + | +5 | fn test(at: u64); + | ^^ diff --git a/core/sr-api-macros/tests/ui/adding_self_parameter.rs b/core/sr-api-macros/tests/ui/adding_self_parameter.rs new file mode 100644 index 0000000000000000000000000000000000000000..fb048211adac3792390926c6c2be2ecb9947e297 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_self_parameter.rs @@ -0,0 +1,9 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(&self); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/adding_self_parameter.stderr b/core/sr-api-macros/tests/ui/adding_self_parameter.stderr new file mode 100644 index 0000000000000000000000000000000000000000..e7249e9f732f55fe84707266da3eac32d3835141 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_self_parameter.stderr @@ -0,0 +1,5 @@ +error: Self values are not supported. + --> $DIR/adding_self_parameter.rs:5:11 + | +5 | fn test(&self); + | ^ diff --git a/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs b/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs new file mode 100644 index 0000000000000000000000000000000000000000..27aa60c624e63be142bcc5fbe0cb9ddfcbe1dcc5 --- /dev/null +++ b/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs @@ -0,0 +1,20 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::decl_runtime_apis; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + #[changed_in(2)] + fn test(data: u64); + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/changed_in_unknown_version.stderr b/core/sr-api-macros/tests/ui/changed_in_unknown_version.stderr new file mode 100644 index 0000000000000000000000000000000000000000..c62befbab362a0b846624283d8f216857e92c991 --- /dev/null +++ b/core/sr-api-macros/tests/ui/changed_in_unknown_version.stderr @@ -0,0 +1,5 @@ +error: `changed_in` version can not be greater than the `api_version` + --> $DIR/changed_in_unknown_version.rs:15:3 + | +15 | fn test(data: u64); + | ^^ diff --git a/core/sr-api-macros/tests/ui/declaring_old_block.rs b/core/sr-api-macros/tests/ui/declaring_old_block.rs new file mode 100644 index 0000000000000000000000000000000000000000..6b7f380ef208a31ff0af5f6f0d7d4e9e485856bd --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_old_block.rs @@ -0,0 +1,10 @@ +use runtime_primitives::traits::Block as BlockT; +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/declaring_old_block.stderr b/core/sr-api-macros/tests/ui/declaring_old_block.stderr new file mode 100644 index 0000000000000000000000000000000000000000..2ab1cc675d109e146d766ea7f355e9cc16a54213 --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_old_block.stderr @@ -0,0 +1,19 @@ +error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! + --> $DIR/declaring_old_block.rs:5:16 + | +5 | pub trait Api { + | ^^^^^ + +error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! If you try to use a different trait than the substrate `Block` trait, please rename it locally. + --> $DIR/declaring_old_block.rs:5:23 + | +5 | pub trait Api { + | ^^^^^^ + +warning: unused import: `runtime_primitives::traits::Block as BlockT` + --> $DIR/declaring_old_block.rs:1:5 + | +1 | use runtime_primitives::traits::Block as BlockT; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[warn(unused_imports)] on by default diff --git a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs new file mode 100644 index 0000000000000000000000000000000000000000..1371295cc0ebb89f55ecc70d489502c807336b4b --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs @@ -0,0 +1,10 @@ +use runtime_primitives::traits::Block as BlockT; +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr new file mode 100644 index 0000000000000000000000000000000000000000..cf5fe0f53ff5af3425e9bb7da29767808f2ac9a3 --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr @@ -0,0 +1,13 @@ +error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! If you try to use a different trait than the substrate `Block` trait, please rename it locally. + --> $DIR/declaring_own_block_with_different_name.rs:5:19 + | +5 | pub trait Api { + | ^^^^^^ + +warning: unused import: `runtime_primitives::traits::Block as BlockT` + --> $DIR/declaring_own_block_with_different_name.rs:1:5 + | +1 | use runtime_primitives::traits::Block as BlockT; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[warn(unused_imports)] on by default diff --git a/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs new file mode 100644 index 0000000000000000000000000000000000000000..4cf56bf54bdd1d601bf20df6fc2c37a594e334c5 --- /dev/null +++ b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs @@ -0,0 +1,20 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! {} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.stderr b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.stderr new file mode 100644 index 0000000000000000000000000000000000000000..61527a34803613b50089674ef24540d48deb6336 --- /dev/null +++ b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.stderr @@ -0,0 +1,5 @@ +error: No api implementation given! + --> $DIR/empty_impl_runtime_apis_call.rs:18:1 + | +18 | impl_runtime_apis! {} + | ^^^^^^^^^^^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs new file mode 100644 index 0000000000000000000000000000000000000000..91ffdd798ad0499783ac21320ad6a19227adbd3e --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs @@ -0,0 +1,24 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: String) {} + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.stderr b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.stderr new file mode 100644 index 0000000000000000000000000000000000000000..6d5d484efe0954ff752b865ec78788b63a2c5f6c --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.stderr @@ -0,0 +1,13 @@ +error[E0053]: method `test` has an incompatible type for trait + --> $DIR/impl_incorrect_method_signature.rs:20:17 + | +14 | fn test(data: u64); + | --- type in trait +... +20 | fn test(data: String) {} + | ^^^^^^ expected u64, found struct `std::string::String` + | + = note: expected type `fn(u64)` + found type `fn(std::string::String)` + +For more information about this error, try `rustc --explain E0053`. diff --git a/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs new file mode 100644 index 0000000000000000000000000000000000000000..0871b0ff3398eeb80c82fccdbc4534a6c3c36f3c --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs @@ -0,0 +1,36 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +mod second { + decl_runtime_apis! { + pub trait Api { + fn test2(data: u64); + } + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: u64) {} + } + + impl second::Api for Runtime { + fn test2(data: u64) {} + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.stderr b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.stderr new file mode 100644 index 0000000000000000000000000000000000000000..355db2864bb784a7011b5c0b8376a713371f88b2 --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.stderr @@ -0,0 +1,25 @@ +error: Two traits with the same name detected! The trait name is used to generate its ID. Please rename one trait at the declaration! + --> $DIR/impl_two_traits_with_same_name.rs:31:15 + | +31 | impl second::Api for Runtime { + | ^^^ + +error: cannot find macro `decl_runtime_apis!` in this scope + --> $DIR/impl_two_traits_with_same_name.rs:19:2 + | +19 | decl_runtime_apis! { + | ^^^^^^^^^^^^^^^^^ + +error[E0433]: failed to resolve: could not find `runtime_decl_for_Api` in `second` + --> $DIR/impl_two_traits_with_same_name.rs:26:1 + | +26 | / impl_runtime_apis! { +27 | | impl self::Api for Runtime { +28 | | fn test(data: u64) {} +29 | | } +... | +33 | | } +34 | | } + | |_^ could not find `runtime_decl_for_Api` in `second` + +For more information about this error, try `rustc --explain E0433`. diff --git a/core/sr-api-macros/tests/ui/invalid_api_version.rs b/core/sr-api-macros/tests/ui/invalid_api_version.rs new file mode 100644 index 0000000000000000000000000000000000000000..b5afa1d6998efe374fb67cf268aed23f2102a554 --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version.rs @@ -0,0 +1,10 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + #[api_version] + pub trait Api { + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/invalid_api_version.stderr b/core/sr-api-macros/tests/ui/invalid_api_version.stderr new file mode 100644 index 0000000000000000000000000000000000000000..e7d6aa0ed133f64453b675fb552504ceb6895bc1 --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version.stderr @@ -0,0 +1,29 @@ +error: can't qualify macro invocation with `pub` + --> $DIR/invalid_api_version.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + | + = help: try adjusting the macro to put `pub` inside the invocation + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version.rs:4:4 + | +4 | #[api_version] + | ^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_2.rs b/core/sr-api-macros/tests/ui/invalid_api_version_2.rs new file mode 100644 index 0000000000000000000000000000000000000000..b8870838009bf2132318ebd7b2a97b547f63b9dc --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_2.rs @@ -0,0 +1,10 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + #[api_version("1")] + pub trait Api { + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_2.stderr b/core/sr-api-macros/tests/ui/invalid_api_version_2.stderr new file mode 100644 index 0000000000000000000000000000000000000000..3e46efb258052c873240a42e92fd23d42627b9bc --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_2.stderr @@ -0,0 +1,29 @@ +error: can't qualify macro invocation with `pub` + --> $DIR/invalid_api_version_2.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version("1")] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + | + = help: try adjusting the macro to put `pub` inside the invocation + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_2.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version("1")] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_2.rs:4:4 + | +4 | #[api_version("1")] + | ^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_3.rs b/core/sr-api-macros/tests/ui/invalid_api_version_3.rs new file mode 100644 index 0000000000000000000000000000000000000000..6f365b146b222c906881eb40225f4140efa2c75c --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_3.rs @@ -0,0 +1,10 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + #[api_version()] + pub trait Api { + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_3.stderr b/core/sr-api-macros/tests/ui/invalid_api_version_3.stderr new file mode 100644 index 0000000000000000000000000000000000000000..661221f28e89290f792ea2c227195bc8920132d4 --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_3.stderr @@ -0,0 +1,29 @@ +error: can't qualify macro invocation with `pub` + --> $DIR/invalid_api_version_3.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version()] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + | + = help: try adjusting the macro to put `pub` inside the invocation + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_3.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version()] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_3.rs:4:4 + | +4 | #[api_version()] + | ^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs new file mode 100644 index 0000000000000000000000000000000000000000..eafe53e23b875e5728a22b4f9fa20c743206aab1 --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs @@ -0,0 +1,26 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: u64) { + unimplemented!() + } + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/missing_block_generic_parameter.stderr b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.stderr new file mode 100644 index 0000000000000000000000000000000000000000..5c8563a8b89d01d12e904380e7c4e62a1138a042 --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.stderr @@ -0,0 +1,13 @@ +error: Missing `Block` generic parameter. + --> $DIR/missing_block_generic_parameter.rs:19:13 + | +19 | impl self::Api for Runtime { + | ^^^ + +error[E0107]: wrong number of type arguments: expected 1, found 0 + --> $DIR/missing_block_generic_parameter.rs:19:7 + | +19 | impl self::Api for Runtime { + | ^^^^^^^^^ expected 1 type argument + +For more information about this error, try `rustc --explain E0107`. diff --git a/core/sr-api-macros/tests/ui/missing_path_for_trait.rs b/core/sr-api-macros/tests/ui/missing_path_for_trait.rs new file mode 100644 index 0000000000000000000000000000000000000000..cbf339e73bd3b3b9adcc58b1f233cd1995c75469 --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_path_for_trait.rs @@ -0,0 +1,26 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl Api for Runtime { + fn test(data: u64) { + unimplemented!() + } + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/missing_path_for_trait.stderr b/core/sr-api-macros/tests/ui/missing_path_for_trait.stderr new file mode 100644 index 0000000000000000000000000000000000000000..4018712e3f5b3be57316b3001a74eab66b5828aa --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_path_for_trait.stderr @@ -0,0 +1,5 @@ +error: The implemented trait has to be referenced with a path, e.g. `impl client::Core for Runtime`. + --> $DIR/missing_path_for_trait.rs:19:7 + | +19 | impl Api for Runtime { + | ^^^ diff --git a/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs new file mode 100644 index 0000000000000000000000000000000000000000..014b7bd1e84f51e63298314c35024cab83d98e0c --- /dev/null +++ b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs @@ -0,0 +1,26 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: &u64) { + unimplemented!() + } + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.stderr b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.stderr new file mode 100644 index 0000000000000000000000000000000000000000..12ec399972efa763784b24e5243368cd10ae6641 --- /dev/null +++ b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.stderr @@ -0,0 +1,13 @@ +error[E0053]: method `test` has an incompatible type for trait + --> $DIR/type_reference_in_impl_runtime_apis_call.rs:20:17 + | +14 | fn test(data: u64); + | --- type in trait +... +20 | fn test(data: &u64) { + | ^^^^ expected u64, found &u64 + | + = note: expected type `fn(u64)` + found type `fn(&u64)` + +For more information about this error, try `rustc --explain E0053`. diff --git a/core/sr-io/Cargo.toml b/core/sr-io/Cargo.toml index 68da47893ffb94a14359cee1b192e0b1751c7684..0c97ba8050d2d8f9990ee540f40dfca4ceef7da9 100644 --- a/core/sr-io/Cargo.toml +++ b/core/sr-io/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sr-io" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] build = "build.rs" edition = "2018" @@ -11,7 +11,7 @@ rustc_version = "0.2" [dependencies] rstd = { package = "sr-std", path = "../sr-std", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } -parity-codec = { version = "3.3", default-features = false } +codec = { package = "parity-codec", version = "3.5.1", default-features = false } hash-db = { version = "0.12", default-features = false } libsecp256k1 = { version = "0.2.1", optional = true } tiny-keccak = { version = "1.4.2", optional = true } @@ -19,11 +19,14 @@ environmental = { version = "1.0.1", optional = true } substrate-state-machine = { path = "../state-machine", optional = true } trie = { package = "substrate-trie", path = "../trie", optional = true } +[dev-dependencies] +substrate-offchain = { path = "../offchain" } + [features] default = ["std"] std = [ "primitives/std", - "parity-codec/std", + "codec/std", "rstd/std", "hash-db/std", "trie", @@ -34,4 +37,6 @@ std = [ ] nightly = [] strict = [] -wasm-nice-panic-message = [] \ No newline at end of file +wasm-nice-panic-message = [] +no_panic_handler = [] +no_oom = [] diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 6a00e6ca2734d1b73fe7ec6e7063b9bf2e03b3f2..cd9b43798b3d1d7f59ea13ed2e1464ef949fb0de 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -16,23 +16,376 @@ //! This is part of the Substrate runtime. +#![warn(missing_docs)] + #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(lang_items))] #![cfg_attr(not(feature = "std"), feature(alloc_error_handler))] #![cfg_attr(not(feature = "std"), feature(core_intrinsics))] -#![cfg_attr(not(feature = "std"), feature(alloc))] #![cfg_attr(feature = "std", doc = "Substrate runtime standard library as compiled when linked with Rust's standard library.")] #![cfg_attr(not(feature = "std"), doc = "Substrate's runtime standard library as compiled without Rust's standard library.")] +use hash_db::Hasher; +use rstd::vec::Vec; + +#[doc(hidden)] +pub use codec; + +pub use primitives::Blake2Hasher; +use primitives::offchain::{Timestamp, HttpRequestId, HttpRequestStatus, HttpError, CryptoKind, CryptoKeyId}; + +/// Error verifying ECDSA signature pub enum EcdsaVerifyError { + /// Incorrect value of R or S BadRS, + /// Incorrect value of V BadV, + /// Invalid signature BadSignature, } -#[cfg(feature = "std")] -include!("../with_std.rs"); +pub mod offchain; + +/// Trait for things which can be printed. +pub trait Printable { + /// Print the object. + fn print(self); +} + +/// Converts a public trait definition into a private trait and set of public functions +/// that assume the trait is implemented for `()` for ease of calling. +macro_rules! export_api { + ( + $( #[$trait_attr:meta] )* + pub(crate) trait $trait_name:ident { + $( + $( #[$attr:meta] )* + fn $name:ident + $(< $( $g_name:ident $( : $g_ty:path )? ),+ >)? + ( $( $arg:ident : $arg_ty:ty ),* ) + $( -> $ret:ty )? + $( where $( $w_name:path : $w_ty:path ),+ )?; + )* + } + ) => { + $( #[$trait_attr] )* + pub(crate) trait $trait_name { + $( + $( #[$attr] )* + fn $name $(< $( $g_name $( : $g_ty )? ),+ >)? ( $($arg : $arg_ty ),* ) $( -> $ret )? + $( where $( $w_name : $w_ty ),+ )?; + )* + } + + $( + $( #[$attr] )* + pub fn $name $(< $( $g_name $( : $g_ty )? ),+ >)? ( $($arg : $arg_ty ),* ) $( -> $ret )? + $( where $( $w_name : $w_ty ),+ )? + { + #[allow(deprecated)] + <()>:: $name $(::< $( $g_name ),+ > )? ( $( $arg ),* ) + } + )* + } +} + +export_api! { + pub(crate) trait StorageApi { + /// Get `key` from storage and return a `Vec`, empty if there's a problem. + fn storage(key: &[u8]) -> Option>; + + /// Get `key` from child storage and return a `Vec`, empty if there's a problem. + fn child_storage(storage_key: &[u8], key: &[u8]) -> Option>; + + /// Get `key` from storage, placing the value into `value_out` (as much of it as possible) and return + /// the number of bytes that the entry in storage had beyond the offset or None if the storage entry + /// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned + /// number of bytes is not equal to the number of bytes written to the `value_out`. + fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option; + + /// Get `key` from child storage, placing the value into `value_out` (as much of it as possible) and return + /// the number of bytes that the entry in storage had beyond the offset or None if the storage entry + /// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned + /// number of bytes is not equal to the number of bytes written to the `value_out`. + fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option; + + /// Set the storage of some particular key to Some value. + fn set_storage(key: &[u8], value: &[u8]); + + /// Set the child storage of some particular key to Some value. + fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]); + + /// Clear the storage of a key. + fn clear_storage(key: &[u8]); + + /// Clear the storage of a key. + fn clear_child_storage(storage_key: &[u8], key: &[u8]); + + /// Clear an entire child storage. + fn kill_child_storage(storage_key: &[u8]); + + /// Check whether a given `key` exists in storage. + fn exists_storage(key: &[u8]) -> bool; + + /// Check whether a given `key` exists in storage. + fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool; + + /// Clear the storage entries with a key that starts with the given prefix. + fn clear_prefix(prefix: &[u8]); + + /// "Commit" all existing operations and compute the resultant storage root. + fn storage_root() -> [u8; 32]; + + /// "Commit" all existing operations and compute the resultant child storage root. + fn child_storage_root(storage_key: &[u8]) -> Vec; + + /// "Commit" all existing operations and get the resultant storage change root. + fn storage_changes_root(parent_hash: [u8; 32]) -> Option<[u8; 32]>; + + /// A trie root formed from the enumerated items. + /// TODO [#2382] remove (just use `ordered_trie_root` (NOTE currently not implemented for without_std)) + fn enumerated_trie_root(input: &[&[u8]]) -> H::Out + where + H: Hasher, + H: self::imp::HasherBounds, + H::Out: Ord + ; + + /// A trie root formed from the iterated items. + fn trie_root(input: I) -> H::Out + where + I: IntoIterator, + A: AsRef<[u8]>, + A: Ord, + B: AsRef<[u8]>, + H: Hasher, + H: self::imp::HasherBounds, + H::Out: Ord + ; + + /// A trie root formed from the enumerated items. + fn ordered_trie_root(input: I) -> H::Out + where + I: IntoIterator, + A: AsRef<[u8]>, + H: Hasher, + H: self::imp::HasherBounds, + H::Out: Ord + ; + } +} + +export_api! { + pub(crate) trait OtherApi { + /// The current relay chain identifier. + fn chain_id() -> u64; + + /// Print a printable value. + fn print(value: T) + where + T: Printable, + T: Sized + ; + } +} + +export_api! { + pub(crate) trait CryptoApi { + /// Verify a ed25519 signature. + fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool; + + /// Verify an sr25519 signature. + fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool; + + /// Verify and recover a SECP256k1 ECDSA signature. + /// - `sig` is passed in RSV format. V should be either 0/1 or 27/28. + /// - returns `Err` if the signature is bad, otherwise the 64-byte pubkey (doesn't include the 0x04 prefix). + fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError>; + } +} + +export_api! { + pub(crate) trait HashingApi { + /// Conduct a 256-bit Keccak hash. + fn keccak_256(data: &[u8]) -> [u8; 32] ; + + /// Conduct a 128-bit Blake2 hash. + fn blake2_128(data: &[u8]) -> [u8; 16]; + + /// Conduct a 256-bit Blake2 hash. + fn blake2_256(data: &[u8]) -> [u8; 32]; + + /// Conduct four XX hashes to give a 256-bit result. + fn twox_256(data: &[u8]) -> [u8; 32]; + + /// Conduct two XX hashes to give a 128-bit result. + fn twox_128(data: &[u8]) -> [u8; 16]; + + /// Conduct two XX hashes to give a 64-bit result. + fn twox_64(data: &[u8]) -> [u8; 8]; + } +} + +export_api! { + pub(crate) trait OffchainApi { + /// Submit transaction to the pool. + /// + /// The transaction will end up in the pool. + fn submit_transaction(data: &T) -> Result<(), ()>; + + /// Create new key(pair) for signing/encryption/decryption. + /// + /// Returns an error if given crypto kind is not supported. + fn new_crypto_key(crypto: CryptoKind) -> Result; + + /// Encrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn encrypt(key: Option, data: &[u8]) -> Result, ()>; + + /// Decrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist. + fn decrypt(key: Option, data: &[u8]) -> Result, ()>; + + /// Sign a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn sign(key: Option, data: &[u8]) -> Result, ()>; + + /// Verifies that `signature` for `msg` matches given `key`. + /// + /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. + /// Returns an error in case the key is not available or does not exist or the parameters + /// lengths are incorrect. + fn verify(key: Option, msg: &[u8], signature: &[u8]) -> Result; + + /// Returns current UNIX timestamp (in millis) + fn timestamp() -> Timestamp; + + /// Pause the execution until `deadline` is reached. + fn sleep_until(deadline: Timestamp); + + /// Returns a random seed. + /// + /// This is a trully random non deterministic seed generated by host environment. + /// Obviously fine in the off-chain worker context. + fn random_seed() -> [u8; 32]; + + /// Sets a value in the local storage. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_set(key: &[u8], value: &[u8]); + /// Sets a value in the local storage if it matches current value. + /// + /// Since multiple offchain workers may be running concurrently, to prevent + /// data races use CAS to coordinate between them. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_compare_and_set(key: &[u8], old_value: &[u8], new_value: &[u8]); + + /// Gets a value from the local storage. + /// + /// If the value does not exist in the storage `None` will be returned. + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_get(key: &[u8]) -> Option>; + + /// Initiaties a http request given HTTP verb and the URL. + /// + /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. + /// Returns the id of newly started request. + fn http_request_start( + method: &str, + uri: &str, + meta: &[u8] + ) -> Result; + + /// Append header to the request. + fn http_request_add_header( + request_id: HttpRequestId, + name: &str, + value: &str + ) -> Result<(), ()>; + + /// Write a chunk of request body. + /// + /// Writing an empty chunks finalises the request. + /// Passing `None` as deadline blocks forever. + /// + /// Returns an error in case deadline is reached or the chunk couldn't be written. + fn http_request_write_body( + request_id: HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), HttpError>; + + /// Block and wait for the responses for given requests. + /// + /// Returns a vector of request statuses (the len is the same as ids). + /// Note that if deadline is not provided the method will block indefinitely, + /// otherwise unready responses will produce `DeadlineReached` status. + /// + /// Passing `None` as deadline blocks forever. + fn http_response_wait( + ids: &[HttpRequestId], + deadline: Option + ) -> Vec; + + /// Read all response headers. + /// + /// Returns a vector of pairs `(HeaderKey, HeaderValue)`. + /// NOTE response headers have to be read before response body. + fn http_response_headers( + request_id: HttpRequestId + ) -> Vec<(Vec, Vec)>; + + /// Read a chunk of body response to given buffer. + /// + /// Returns the number of bytes written or an error in case a deadline + /// is reached or server closed the connection. + /// If `0` is returned it means that the response has been fully consumed + /// and the `request_id` is now invalid. + /// NOTE this implies that response headers must be read before draining the body. + /// Passing `None` as a deadline blocks forever. + fn http_response_read_body( + request_id: HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result; + } +} + +/// API trait that should cover all other APIs. +/// +/// Implement this to make sure you implement all APIs. +trait Api: StorageApi + OtherApi + CryptoApi + HashingApi + OffchainApi {} + +mod imp { + use super::*; + + #[cfg(feature = "std")] + include!("../with_std.rs"); + + #[cfg(not(feature = "std"))] + include!("../without_std.rs"); +} + +#[cfg(feature = "std")] +pub use self::imp::{StorageOverlay, ChildrenStorageOverlay, with_storage, with_externalities}; #[cfg(not(feature = "std"))] -include!("../without_std.rs"); +pub use self::imp::ext::*; + +/// Type alias for Externalities implementation used in tests. +#[cfg(feature = "std")] +pub type TestExternalities = self::imp::TestExternalities; diff --git a/core/sr-io/src/offchain/http.rs b/core/sr-io/src/offchain/http.rs new file mode 100644 index 0000000000000000000000000000000000000000..0708f837179ed3072001e5308050dd318c9fe0ad --- /dev/null +++ b/core/sr-io/src/offchain/http.rs @@ -0,0 +1,571 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! A non-std set of HTTP types. + +use rstd::str; +use rstd::prelude::Vec; +#[cfg(not(feature = "std"))] +use rstd::prelude::vec; +use primitives::offchain::{ + Timestamp, + HttpRequestId as RequestId, + HttpRequestStatus as RequestStatus, + HttpError, +}; + +/// Request method (HTTP verb) +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Method { + /// GET request + Get, + /// POST request + Post, + /// PUT request + Put, + /// PATCH request + Patch, + /// DELETE request + Delete, + /// Custom verb + Other(&'static str), +} + +impl AsRef for Method { + fn as_ref(&self) -> &str { + match *self { + Method::Get => "GET", + Method::Post => "POST", + Method::Put => "PUT", + Method::Patch => "PATCH", + Method::Delete => "DELETE", + Method::Other(m) => m, + } + } +} + +mod header { + use super::*; + + /// A header type. + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug))] + pub struct Header { + name: Vec, + value: Vec, + } + + impl Header { + /// Creates new header given it's name and value. + pub fn new(name: &str, value: &str) -> Self { + Header { + name: name.as_bytes().to_vec(), + value: value.as_bytes().to_vec(), + } + } + + /// Returns the name of this header. + pub fn name(&self) -> &str { + // Header keys are always produced from `&str` so this is safe. + // we don't store them as `Strings` to avoid bringing `alloc::String` to rstd + // or here. + unsafe { str::from_utf8_unchecked(&self.name) } + } + + /// Returns the value of this header. + pub fn value(&self) -> &str { + // Header values are always produced from `&str` so this is safe. + // we don't store them as `Strings` to avoid bringing `alloc::String` to rstd + // or here. + unsafe { str::from_utf8_unchecked(&self.value) } + } + } +} + +/// An HTTP request builder. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Request<'a, T = Vec<&'static [u8]>> { + /// Request method + pub method: Method, + /// Request URL + pub url: &'a str, + /// Body of the request + pub body: T, + /// Deadline to finish sending the request + pub deadline: Option, + /// Request list of headers. + headers: Vec, +} + +impl Default for Request<'static, T> { + fn default() -> Self { + Request { + method: Method::Get, + url: "http://localhost", + headers: Vec::new(), + body: Default::default(), + deadline: None, + } + } +} + +impl<'a> Request<'a> { + /// Start a simple GET request + pub fn get(url: &'a str) -> Self { + Self::new(url) + } +} + +impl<'a, T> Request<'a, T> { + /// Create new POST request with given body. + pub fn post(url: &'a str, body: T) -> Self { + let req: Request = Request::default(); + + Request { + url, + body, + method: Method::Post, + headers: req.headers, + deadline: req.deadline, + } + } +} + +impl<'a, T: Default> Request<'a, T> { + /// Create new Request builder with given URL and body. + pub fn new(url: &'a str) -> Self { + Request::default().url(url) + } + + /// Change the method of the request + pub fn method(mut self, method: Method) -> Self { + self.method = method; + self + } + + /// Change the URL of the request. + pub fn url(mut self, url: &'a str) -> Self { + self.url = url; + self + } + + /// Set the body of the request. + pub fn body(mut self, body: T) -> Self { + self.body = body; + self + } + + /// Add a header. + pub fn add_header(mut self, name: &str, value: &str) -> Self { + self.headers.push(header::Header::new(name, value)); + self + } + + /// Set the deadline of the request. + pub fn deadline(mut self, deadline: Timestamp) -> Self { + self.deadline = Some(deadline); + self + } +} + +impl<'a, I: AsRef<[u8]>, T: IntoIterator> Request<'a, T> { + /// Send the request and return a handle. + /// + /// Err is returned in case the deadline is reached + /// or the request timeouts. + pub fn send(self) -> Result { + let meta = &[]; + + // start an http request. + let id = crate::http_request_start(self.method.as_ref(), self.url, meta).map_err(|_| HttpError::IoError)?; + + // add custom headers + for header in &self.headers { + crate::http_request_add_header( + id, + header.name(), + header.value(), + ).map_err(|_| HttpError::IoError)? + } + + // write body + for chunk in self.body { + crate::http_request_write_body(id, chunk.as_ref(), self.deadline)?; + } + + // finalise the request + crate::http_request_write_body(id, &[], self.deadline)?; + + Ok(PendingRequest { + id, + }) + } +} + +/// A request error +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Error { + /// Deadline has been reached. + DeadlineReached, + /// Request had timed out. + Timeout, + /// Unknown error has been ecountered. + Unknown, +} + +/// A struct representing an uncompleted http request. +#[derive(PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct PendingRequest { + /// Request ID + pub id: RequestId, +} + +/// A result of waiting for a pending request. +pub type HttpResult = Result; + +impl PendingRequest { + /// Wait for the request to complete. + /// + /// NOTE this waits for the request indefinitely. + pub fn wait(self) -> HttpResult { + match self.try_wait(None) { + Ok(res) => res, + Err(_) => panic!("Since `None` is passed we will never get a deadline error; qed"), + } + } + + /// Attempts to wait for the request to finish, + /// but will return `Err` in case the deadline is reached. + pub fn try_wait(self, deadline: impl Into>) -> Result { + Self::try_wait_all(vec![self], deadline).pop().expect("One request passed, one status received; qed") + } + + /// Wait for all provided requests. + pub fn wait_all(requests: Vec) -> Vec { + Self::try_wait_all(requests, None) + .into_iter() + .map(|r| match r { + Ok(r) => r, + Err(_) => panic!("Since `None` is passed we will never get a deadline error; qed"), + }) + .collect() + } + + /// Attempt to wait for all provided requests, but up to given deadline. + /// + /// Requests that are complete will resolve to an `Ok` others will return a `DeadlineReached` error. + pub fn try_wait_all( + requests: Vec, + deadline: impl Into> + ) -> Vec> { + let ids = requests.iter().map(|r| r.id).collect::>(); + let statuses = crate::http_response_wait(&ids, deadline.into()); + + statuses + .into_iter() + .zip(requests.into_iter()) + .map(|(status, req)| match status { + RequestStatus::DeadlineReached => Err(req), + RequestStatus::Timeout => Ok(Err(Error::Timeout)), + RequestStatus::Unknown => Ok(Err(Error::Unknown)), + RequestStatus::Finished(code) => Ok(Ok(Response::new(req.id, code))), + }) + .collect() + } +} + +/// A HTTP response. +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Response { + /// Request id + pub id: RequestId, + /// Response status code + pub code: u16, + /// A collection of headers. + headers: Option, +} + +impl Response { + fn new(id: RequestId, code: u16) -> Self { + Self { + id, + code, + headers: None, + } + } + + /// Retrieve the headers for this response. + pub fn headers(&mut self) -> &Headers { + if self.headers.is_none() { + self.headers = Some(Headers { raw: crate::http_response_headers(self.id) }); + } + self.headers.as_ref().expect("Headers were just set; qed") + } + + /// Retrieve the body of this response. + pub fn body(&self) -> ResponseBody { + ResponseBody::new(self.id) + } +} + +/// A buffered byte iterator over response body. +/// +/// Note that reading the body may return `None` in following cases: +/// 1. Either the deadline you've set is reached (check via `#error`; +/// In such case you can resume the reader by setting a new deadline) +/// 2. Or because of IOError. In such case the reader is not resumable and will keep +/// returning `None`. +/// 3. The body has been returned. The reader will keep returning `None`. +#[derive(Clone)] +pub struct ResponseBody { + id: RequestId, + error: Option, + buffer: [u8; 4096], + filled_up_to: Option, + position: usize, + deadline: Option, +} + +#[cfg(feature = "std")] +impl std::fmt::Debug for ResponseBody { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.debug_struct("ResponseBody") + .field("id", &self.id) + .field("error", &self.error) + .field("buffer", &self.buffer.len()) + .field("filled_up_to", &self.filled_up_to) + .field("position", &self.position) + .field("deadline", &self.deadline) + .finish() + } +} + +impl ResponseBody { + fn new(id: RequestId) -> Self { + ResponseBody { + id, + error: None, + buffer: [0_u8; 4096], + filled_up_to: None, + position: 0, + deadline: None, + } + } + + /// Set the deadline for reading the body. + pub fn deadline(&mut self, deadline: impl Into>) { + self.deadline = deadline.into(); + self.error = None; + } + + /// Return an error that caused the iterator to return `None`. + /// + /// If the error is `DeadlineReached` you can resume the iterator by setting + /// a new deadline. + pub fn error(&self) -> &Option { + &self.error + } +} + +impl Iterator for ResponseBody { + type Item = u8; + + fn next(&mut self) -> Option { + if self.error.is_some() { + return None; + } + + if self.filled_up_to.is_none() { + let result = crate::http_response_read_body(self.id, &mut self.buffer, self.deadline); + match result { + Err(e) => { + self.error = Some(e); + return None; + } + Ok(0) => { + return None; + } + Ok(size) => { + self.position = 0; + self.filled_up_to = Some(size); + } + } + } + + if Some(self.position) == self.filled_up_to { + self.filled_up_to = None; + return self.next(); + } + + let result = self.buffer[self.position]; + self.position += 1; + Some(result) + } +} + +/// A collection of Headers in the response. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Headers { + /// Raw headers + pub raw: Vec<(Vec, Vec)>, +} + +impl Headers { + /// Retrieve a single header from the list of headers. + /// + /// Note this method is linearly looking from all the headers + /// comparing them with the needle byte-by-byte. + /// If you want to consume multiple headers it's better to iterate + /// and collect them on your own. + pub fn find(&self, name: &str) -> Option<&str> { + let raw = name.as_bytes(); + for &(ref key, ref val) in &self.raw { + if &**key == raw { + return str::from_utf8(&val).ok() + } + } + None + } + + /// Convert this headers into an iterator. + pub fn into_iter(&self) -> HeadersIterator { + HeadersIterator { collection: &self.raw, index: None } + } +} + +/// A custom iterator traversing all the headers. +#[derive(Clone)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct HeadersIterator<'a> { + collection: &'a [(Vec, Vec)], + index: Option, +} + +impl<'a> HeadersIterator<'a> { + /// Move the iterator to the next position. + /// + /// Returns `true` is `current` has been set by this call. + pub fn next(&mut self) -> bool { + let index = self.index.map(|x| x + 1).unwrap_or(0); + self.index = Some(index); + index < self.collection.len() + } + + /// Returns current element (if any). + /// + /// Note that you have to call `next` prior to calling this + pub fn current(&self) -> Option<(&str, &str)> { + self.collection.get(self.index?) + .map(|val| (str::from_utf8(&val.0).unwrap_or(""), str::from_utf8(&val.1).unwrap_or(""))) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{TestExternalities, with_externalities}; + use substrate_offchain::testing; + + #[test] + fn should_send_a_basic_request_and_get_response() { + let offchain = testing::TestOffchainExt::default(); + let mut t = TestExternalities::default(); + let state = offchain.0.clone(); + t.set_offchain_externalities(offchain); + + with_externalities(&mut t, || { + let request: Request = Request::get("http://localhost:1234"); + let pending = request + .add_header("X-Auth", "hunter2") + .send() + .unwrap(); + // make sure it's sent correctly + state.write().fulfill_pending_request( + 0, + testing::PendingRequest { + method: "GET".into(), + uri: "http://localhost:1234".into(), + headers: vec![("X-Auth".into(), "hunter2".into())], + sent: true, + ..Default::default() + }, + b"1234".to_vec(), + None, + ); + + // wait + let mut response = pending.wait().unwrap(); + + // then check the response + let mut headers = response.headers().into_iter(); + assert_eq!(headers.current(), None); + assert_eq!(headers.next(), false); + assert_eq!(headers.current(), None); + + let body = response.body(); + assert_eq!(body.clone().collect::>(), b"1234".to_vec()); + assert_eq!(body.error(), &None); + }) + } + + #[test] + fn should_send_a_post_request() { + let offchain = testing::TestOffchainExt::default(); + let mut t = TestExternalities::default(); + let state = offchain.0.clone(); + t.set_offchain_externalities(offchain); + + with_externalities(&mut t, || { + let pending = Request::default() + .method(Method::Post) + .url("http://localhost:1234") + .body(vec![b"1234"]) + .send() + .unwrap(); + // make sure it's sent correctly + state.write().fulfill_pending_request( + 0, + testing::PendingRequest { + method: "POST".into(), + uri: "http://localhost:1234".into(), + body: b"1234".to_vec(), + sent: true, + ..Default::default() + }, + b"1234".to_vec(), + Some(("Test".to_owned(), "Header".to_owned())), + ); + + // wait + let mut response = pending.wait().unwrap(); + + // then check the response + let mut headers = response.headers().into_iter(); + assert_eq!(headers.current(), None); + assert_eq!(headers.next(), true); + assert_eq!(headers.current(), Some(("Test", "Header"))); + + let body = response.body(); + assert_eq!(body.clone().collect::>(), b"1234".to_vec()); + assert_eq!(body.error(), &None); + }) + } +} diff --git a/node/cli/src/error.rs b/core/sr-io/src/offchain/mod.rs similarity index 63% rename from node/cli/src/error.rs rename to core/sr-io/src/offchain/mod.rs index dd5448ac8ad6366813387e7694a4f69872117ff7..6b82f771119997afd17924dc93e23122a9c5cd79 100644 --- a/node/cli/src/error.rs +++ b/core/sr-io/src/offchain/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2019 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify @@ -14,19 +14,6 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Initialization errors. +//! A collection of higher lever helpers for offchain workers. -use client; -use error_chain::{ - error_chain, error_chain_processing, impl_error_chain_processed -}; - -error_chain! { - foreign_links { - Io(::std::io::Error) #[doc="IO error"]; - Cli(::clap::Error) #[doc="CLI error"]; - } - links { - Client(client::error::Error, client::error::ErrorKind) #[doc="Client error"]; - } -} +pub mod http; diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 3148cf2842ff03b2e6c9459bc22881c5aadd5959..0ba833bd9f6026b49f2445edff41498d187e2e15 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -14,14 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -#[doc(hidden)] -pub use parity_codec as codec; -// re-export hashing functions. -pub use primitives::{ +use primitives::{ blake2_128, blake2_256, twox_128, twox_256, twox_64, ed25519, Blake2Hasher, sr25519, Pair }; -pub use tiny_keccak::keccak256 as keccak_256; // Switch to this after PoC-3 // pub use primitives::BlakeHasher; pub use substrate_state_machine::{ @@ -32,19 +28,16 @@ pub use substrate_state_machine::{ }; use environmental::environmental; -use primitives::{hexdisplay::HexDisplay, H256}; -use hash_db::Hasher; +use primitives::{offchain, hexdisplay::HexDisplay, H256}; #[cfg(feature = "std")] use std::collections::HashMap; environmental!(ext: trait Externalities); -/// A set of key value pairs for storage. -pub type StorageOverlay = HashMap, Vec>; - -/// A set of key value pairs for children storage; -pub type ChildrenStorageOverlay = HashMap, StorageOverlay>; +/// Additional bounds for `Hasher` trait for with_std. +pub trait HasherBounds {} +impl HasherBounds for T {} /// Returns a `ChildStorageKey` if the given `storage_key` slice is a valid storage /// key or panics otherwise. @@ -58,216 +51,360 @@ fn child_storage_key_or_panic(storage_key: &[u8]) -> ChildStorageKey Option> { - ext::with(|ext| ext.storage(key).map(|s| s.to_vec())) +impl StorageApi for () { + fn storage(key: &[u8]) -> Option> { + ext::with(|ext| ext.storage(key).map(|s| s.to_vec())) + .expect("storage cannot be called outside of an Externalities-provided environment.") + } + + fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { + ext::with(|ext| ext.storage(key).map(|value| { + let value = &value[value_offset..]; + let written = std::cmp::min(value.len(), value_out.len()); + value_out[..written].copy_from_slice(&value[..written]); + value.len() + })).expect("read_storage cannot be called outside of an Externalities-provided environment.") + } + + fn child_storage(storage_key: &[u8], key: &[u8]) -> Option> { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.child_storage(storage_key, key).map(|s| s.to_vec()) + }) .expect("storage cannot be called outside of an Externalities-provided environment.") -} + } -/// Get `key` from child storage and return a `Vec`, empty if there's a problem. -pub fn child_storage(storage_key: &[u8], key: &[u8]) -> Option> { - ext::with(|ext| { - let storage_key = child_storage_key_or_panic(storage_key); - ext.child_storage(storage_key, key).map(|s| s.to_vec()) - }) - .expect("storage cannot be called outside of an Externalities-provided environment.") -} + fn set_storage(key: &[u8], value: &[u8]) { + ext::with(|ext| + ext.set_storage(key.to_vec(), value.to_vec()) + ); + } -/// Get `key` from storage, placing the value into `value_out` (as much of it as possible) and return -/// the number of bytes that the entry in storage had beyond the offset or None if the storage entry -/// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned -/// number of bytes is not equal to the number of bytes written to the `value_out`. -pub fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { - ext::with(|ext| ext.storage(key).map(|value| { - let value = &value[value_offset..]; - let written = ::std::cmp::min(value.len(), value_out.len()); - value_out[..written].copy_from_slice(&value[..written]); - value.len() - })).expect("read_storage cannot be called outside of an Externalities-provided environment.") -} + fn read_child_storage( + storage_key: &[u8], + key: &[u8], + value_out: &mut [u8], + value_offset: usize, + ) -> Option { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.child_storage(storage_key, key) + .map(|value| { + let value = &value[value_offset..]; + let written = std::cmp::min(value.len(), value_out.len()); + value_out[..written].copy_from_slice(&value[..written]); + value.len() + }) + }) + .expect("read_child_storage cannot be called outside of an Externalities-provided environment.") + } -/// Get `key` from child storage, placing the value into `value_out` (as much of it as possible) and return -/// the number of bytes that the entry in storage had beyond the offset or None if the storage entry -/// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned -/// number of bytes is not equal to the number of bytes written to the `value_out`. -pub fn read_child_storage( - storage_key: &[u8], - key: &[u8], - value_out: &mut [u8], - value_offset: usize, -) -> Option { - ext::with(|ext| { - let storage_key = child_storage_key_or_panic(storage_key); - ext.child_storage(storage_key, key) - .map(|value| { - let value = &value[value_offset..]; - let written = ::std::cmp::min(value.len(), value_out.len()); - value_out[..written].copy_from_slice(&value[..written]); - value.len() - }) - }) - .expect("read_child_storage cannot be called outside of an Externalities-provided environment.") -} + fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]) { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.set_child_storage(storage_key, key.to_vec(), value.to_vec()) + }); + } -/// Set the storage of a key to some value. -pub fn set_storage(key: &[u8], value: &[u8]) { - ext::with(|ext| - ext.set_storage(key.to_vec(), value.to_vec()) - ); -} + fn clear_storage(key: &[u8]) { + ext::with(|ext| + ext.clear_storage(key) + ); + } -/// Set the child storage of a key to some value. -pub fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]) { - ext::with(|ext| { - let storage_key = child_storage_key_or_panic(storage_key); - ext.set_child_storage(storage_key, key.to_vec(), value.to_vec()) - }); -} + fn clear_child_storage(storage_key: &[u8], key: &[u8]) { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.clear_child_storage(storage_key, key) + }); + } -/// Clear the storage of a key. -pub fn clear_storage(key: &[u8]) { - ext::with(|ext| - ext.clear_storage(key) - ); -} + fn kill_child_storage(storage_key: &[u8]) { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.kill_child_storage(storage_key) + }); + } -/// Clear the storage of a key. -pub fn clear_child_storage(storage_key: &[u8], key: &[u8]) { - ext::with(|ext| { - let storage_key = child_storage_key_or_panic(storage_key); - ext.clear_child_storage(storage_key, key) - }); -} + fn exists_storage(key: &[u8]) -> bool { + ext::with(|ext| + ext.exists_storage(key) + ).unwrap_or(false) + } -/// Check whether a given `key` exists in storage. -pub fn exists_storage(key: &[u8]) -> bool { - ext::with(|ext| - ext.exists_storage(key) - ).unwrap_or(false) -} + fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.exists_child_storage(storage_key, key) + }).unwrap_or(false) + } -/// Check whether a given `key` exists in storage. -pub fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool { - ext::with(|ext| { - let storage_key = child_storage_key_or_panic(storage_key); - ext.exists_child_storage(storage_key, key) - }).unwrap_or(false) -} + fn clear_prefix(prefix: &[u8]) { + ext::with(|ext| + ext.clear_prefix(prefix) + ); + } -/// Clear the storage entries with a key that starts with the given prefix. -pub fn clear_prefix(prefix: &[u8]) { - ext::with(|ext| - ext.clear_prefix(prefix) - ); -} + fn storage_root() -> [u8; 32] { + ext::with(|ext| + ext.storage_root() + ).unwrap_or(H256::zero()).into() + } -/// Clear an entire child storage. -pub fn kill_child_storage(storage_key: &[u8]) { - ext::with(|ext| { - let storage_key = child_storage_key_or_panic(storage_key); - ext.kill_child_storage(storage_key) - }); -} + fn child_storage_root(storage_key: &[u8]) -> Vec { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.child_storage_root(storage_key) + }).expect("child_storage_root cannot be called outside of an Externalities-provided environment.") + } -/// The current relay chain identifier. -pub fn chain_id() -> u64 { - ext::with(|ext| - ext.chain_id() - ).unwrap_or(0) -} + fn storage_changes_root(parent_hash: [u8; 32]) -> Option<[u8; 32]> { + ext::with(|ext| + ext.storage_changes_root(parent_hash.into()).map(|h| h.map(|h| h.into())) + ).unwrap_or(Ok(None)).expect("Invalid parent hash passed to storage_changes_root") + } -/// "Commit" all existing operations and compute the resultant storage root. -pub fn storage_root() -> H256 { - ext::with(|ext| - ext.storage_root() - ).unwrap_or(H256::zero()) -} + fn enumerated_trie_root(input: &[&[u8]]) -> H::Out + where + H: Hasher, + H::Out: Ord, + { + trie::ordered_trie_root::(input.iter()) + } -/// "Commit" all existing operations and compute the resultant child storage root. -pub fn child_storage_root(storage_key: &[u8]) -> Vec { - ext::with(|ext| { - let storage_key = child_storage_key_or_panic(storage_key); - ext.child_storage_root(storage_key) - }).expect("child_storage_root cannot be called outside of an Externalities-provided environment.") -} + fn trie_root(input: I) -> H::Out + where + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, + H: Hasher, + H::Out: Ord, + { + trie::trie_root::(input) + } -/// "Commit" all existing operations and get the resultant storage change root. -pub fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option { - ext::with(|ext| - ext.storage_changes_root(parent_hash.into(), parent_num) - ).unwrap_or(None) + fn ordered_trie_root(input: I) -> H::Out + where + I: IntoIterator, + A: AsRef<[u8]>, + H: Hasher, + H::Out: Ord, + { + trie::ordered_trie_root::(input) + } } -/// A trie root formed from the enumerated items. -// TODO: remove (just use `ordered_trie_root`) -pub fn enumerated_trie_root(input: &[&[u8]]) -> H::Out -where - H: Hasher, - H::Out: Ord, -{ - trie::ordered_trie_root::(input.iter()) -} +impl OtherApi for () { + fn chain_id() -> u64 { + ext::with(|ext| + ext.chain_id() + ).unwrap_or(0) + } -/// A trie root formed from the iterated items. -pub fn trie_root(input: I) -> H::Out -where - I: IntoIterator, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, - H: Hasher, - ::Out: Ord, -{ - trie::trie_root::(input) + fn print(value: T) { + value.print() + } } -/// A trie root formed from the enumerated items. -pub fn ordered_trie_root(input: I) -> H::Out -where - I: IntoIterator + Iterator, - A: AsRef<[u8]>, - H: Hasher, - ::Out: Ord, -{ - trie::ordered_trie_root::(input) -} +impl CryptoApi for () { + fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + ed25519::Pair::verify_weak(sig, msg, pubkey) + } -/// Verify a ed25519 signature. -pub fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - ed25519::Pair::verify_weak(sig, msg, pubkey) -} + fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + sr25519::Pair::verify_weak(sig, msg, pubkey) + } -/// Verify an sr25519 signature. -pub fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - sr25519::Pair::verify_weak(sig, msg, pubkey) + fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { + let rs = secp256k1::Signature::parse_slice(&sig[0..64]).map_err(|_| EcdsaVerifyError::BadRS)?; + let v = secp256k1::RecoveryId::parse(if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8).map_err(|_| EcdsaVerifyError::BadV)?; + let pubkey = secp256k1::recover(&secp256k1::Message::parse(msg), &rs, &v).map_err(|_| EcdsaVerifyError::BadSignature)?; + let mut res = [0u8; 64]; + res.copy_from_slice(&pubkey.serialize()[1..65]); + Ok(res) + } } -/// Verify and recover a SECP256k1 ECDSA signature. -/// - `sig` is passed in RSV format. V should be either 0/1 or 27/28. -/// - returns `Err` if the signature is bad, otherwise the 64-byte pubkey (doesn't include the 0x04 prefix). -pub fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { - let rs = secp256k1::Signature::parse_slice(&sig[0..64]).map_err(|_| EcdsaVerifyError::BadRS)?; - let v = secp256k1::RecoveryId::parse(if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8).map_err(|_| EcdsaVerifyError::BadV)?; - let pubkey = secp256k1::recover(&secp256k1::Message::parse(msg), &rs, &v).map_err(|_| EcdsaVerifyError::BadSignature)?; - let mut res = [0u8; 64]; - res.copy_from_slice(&pubkey.serialize()[1..65]); - Ok(res) +impl HashingApi for () { + fn keccak_256(data: &[u8]) -> [u8; 32] { + tiny_keccak::keccak256(data) + } + + fn blake2_128(data: &[u8]) -> [u8; 16] { + blake2_128(data) + } + + fn blake2_256(data: &[u8]) -> [u8; 32] { + blake2_256(data) + } + + fn twox_256(data: &[u8]) -> [u8; 32] { + twox_256(data) + } + + fn twox_128(data: &[u8]) -> [u8; 16] { + twox_128(data) + } + + fn twox_64(data: &[u8]) -> [u8; 8] { + twox_64(data) + } } -/// Submit extrinsic. -pub fn submit_extrinsic(data: &T) { +fn with_offchain(f: impl FnOnce(&mut dyn offchain::Externalities) -> R, msg: &'static str) -> R { ext::with(|ext| ext - .submit_extrinsic(codec::Encode::encode(data)) - .expect("submit_extrinsic can be called only in offchain worker context") - ).expect("submit_extrinsic cannot be called outside of an Externalities-provided environment.") + .offchain() + .map(|ext| f(ext)) + .expect(msg) + ).expect("offchain-worker functions cannot be called outside of an Externalities-provided environment.") } +impl OffchainApi for () { + fn submit_transaction(data: &T) -> Result<(), ()> { + with_offchain(|ext| { + ext.submit_transaction(codec::Encode::encode(data)) + }, "submit_transaction can be called only in the offchain worker context") + } + + fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { + with_offchain(|ext| { + ext.new_crypto_key(crypto) + }, "new_crypto_key can be called only in the offchain worker context") + } + + fn encrypt(key: Option, data: &[u8]) -> Result, ()> { + with_offchain(|ext| { + ext.encrypt(key, data) + }, "encrypt can be called only in the offchain worker context") + } + + fn decrypt(key: Option, data: &[u8]) -> Result, ()> { + with_offchain(|ext| { + ext.decrypt(key, data) + }, "decrypt can be called only in the offchain worker context") + } + + fn sign(key: Option, data: &[u8]) -> Result, ()> { + with_offchain(|ext| { + ext.sign(key, data) + }, "sign can be called only in the offchain worker context") + } + + fn verify(key: Option, msg: &[u8], signature: &[u8]) -> Result { + with_offchain(|ext| { + ext.verify(key, msg, signature) + }, "verify can be called only in the offchain worker context") + } + + fn timestamp() -> offchain::Timestamp { + with_offchain(|ext| { + ext.timestamp() + }, "timestamp can be called only in the offchain worker context") + } + + fn sleep_until(deadline: Timestamp) { + with_offchain(|ext| { + ext.sleep_until(deadline) + }, "sleep_until can be called only in the offchain worker context") + } + + fn random_seed() -> [u8; 32] { + with_offchain(|ext| { + ext.random_seed() + }, "random_seed can be called only in the offchain worker context") + } + + fn local_storage_set(key: &[u8], value: &[u8]) { + with_offchain(|ext| { + ext.local_storage_set(key, value) + }, "local_storage_set can be called only in the offchain worker context") + } + + fn local_storage_compare_and_set(key: &[u8], old_value: &[u8], new_value: &[u8]) { + with_offchain(|ext| { + ext.local_storage_compare_and_set(key, old_value, new_value) + }, "local_storage_compare_and_set can be called only in the offchain worker context") + } + + fn local_storage_get(key: &[u8]) -> Option> { + with_offchain(|ext| { + ext.local_storage_get(key) + }, "local_storage_get can be called only in the offchain worker context") + } + + fn http_request_start( + method: &str, + uri: &str, + meta: &[u8] + ) -> Result { + with_offchain(|ext| { + ext.http_request_start(method, uri, meta) + }, "http_request_start can be called only in the offchain worker context") + } + + fn http_request_add_header( + request_id: offchain::HttpRequestId, + name: &str, + value: &str + ) -> Result<(), ()> { + with_offchain(|ext| { + ext.http_request_add_header(request_id, name, value) + }, "http_request_add_header can be called only in the offchain worker context") + } + + fn http_request_write_body( + request_id: offchain::HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), offchain::HttpError> { + with_offchain(|ext| { + ext.http_request_write_body(request_id, chunk, deadline) + }, "http_request_write_body can be called only in the offchain worker context") + } + + fn http_response_wait( + ids: &[offchain::HttpRequestId], + deadline: Option + ) -> Vec { + with_offchain(|ext| { + ext.http_response_wait(ids, deadline) + }, "http_response_wait can be called only in the offchain worker context") + } + + fn http_response_headers( + request_id: offchain::HttpRequestId + ) -> Vec<(Vec, Vec)> { + with_offchain(|ext| { + ext.http_response_headers(request_id) + }, "http_response_headers can be called only in the offchain worker context") + } + + fn http_response_read_body( + request_id: offchain::HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result { + with_offchain(|ext| { + ext.http_response_read_body(request_id, buffer, deadline) + }, "http_response_read_body can be called only in the offchain worker context") + } +} + +impl Api for () {} + /// Execute the given closure with global function available whose functionality routes into the /// externalities `ext`. Forwards the value that the closure returns. // NOTE: need a concrete hasher here due to limitations of the `environmental!` macro, otherwise a type param would have been fine I think. -pub fn with_externalities R>(ext: &mut Externalities, f: F) -> R { +pub fn with_externalities R>(ext: &mut dyn Externalities, f: F) -> R { ext::using(ext, f) } +/// A set of key value pairs for storage. +pub type StorageOverlay = HashMap, Vec>; + +/// A set of key value pairs for children storage; +pub type ChildrenStorageOverlay = HashMap, StorageOverlay>; + /// Execute the given closure with global functions available whose functionality routes into /// externalities that draw from and populate `storage`. Forwards the value that the closure returns. pub fn with_storage R>(storage: &mut StorageOverlay, f: F) -> R { @@ -279,11 +416,6 @@ pub fn with_storage R>(storage: &mut StorageOverlay, f: F) -> r } -/// Trait for things which can be printed. -pub trait Printable { - fn print(self); -} - impl<'a> Printable for &'a [u8] { fn print(self) { println!("Runtime: {}", HexDisplay::from(&self)); @@ -302,11 +434,6 @@ impl Printable for u64 { } } -/// Print a printable value. -pub fn print(value: T) { - value.print(); -} - #[cfg(test)] mod std_tests { use super::*; diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 66ad5541df06152820c3b709d7329d760e405d71..84e717ffaea08b15212ce989ec2c030f477262a5 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -14,17 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -#[doc(hidden)] -pub use parity_codec as codec; #[doc(hidden)] pub use rstd; pub use rstd::{mem, slice}; use core::{intrinsics, panic::PanicInfo}; -use rstd::{vec::Vec, cell::Cell}; -use hash_db::Hasher; -use primitives::Blake2Hasher; +use rstd::{vec::Vec, cell::Cell, convert::TryInto}; +use primitives::{offchain, Blake2Hasher}; +#[cfg(not(feature = "no_panic_handler"))] #[panic_handler] #[no_mangle] pub fn panic(info: &PanicInfo) -> ! { @@ -46,6 +44,7 @@ pub fn panic(info: &PanicInfo) -> ! { } } +#[cfg(not(feature = "no_oom"))] #[alloc_error_handler] pub extern fn oom(_: ::core::alloc::Layout) -> ! { static OOM_MSG: &str = "Runtime memory exhausted. Aborting"; @@ -56,588 +55,1026 @@ pub extern fn oom(_: ::core::alloc::Layout) -> ! { } } -/// The state of an exchangeable function. -#[derive(Clone, Copy)] -enum ExchangeableFunctionState { - Original, - Replaced, -} +/// External (Host) APIs +pub mod ext { + use super::*; + + /// The state of an exchangeable function. + #[derive(Clone, Copy)] + enum ExchangeableFunctionState { + /// Original function is present + Original, + /// The function has been replaced. + Replaced, + } -/// A function which implementation can be exchanged. -/// -/// Internally this works by swapping function pointers. -pub struct ExchangeableFunction(Cell<(T, ExchangeableFunctionState)>); + /// A function which implementation can be exchanged. + /// + /// Internally this works by swapping function pointers. + pub struct ExchangeableFunction(Cell<(T, ExchangeableFunctionState)>); -impl ExchangeableFunction { - /// Create a new instance of `ExchangeableFunction`. - pub const fn new(impl_: T) -> Self { - Self(Cell::new((impl_, ExchangeableFunctionState::Original))) + impl ExchangeableFunction { + /// Create a new instance of `ExchangeableFunction`. + pub const fn new(impl_: T) -> Self { + Self(Cell::new((impl_, ExchangeableFunctionState::Original))) + } } -} -impl ExchangeableFunction { - /// Replace the implementation with `new_impl`. - /// - /// # Panics - /// - /// Panics when trying to replace an already replaced implementation. - /// - /// # Returns + impl ExchangeableFunction { + /// Replace the implementation with `new_impl`. + /// + /// # Panics + /// + /// Panics when trying to replace an already replaced implementation. + /// + /// # Returns + /// + /// Returns the original implementation wrapped in [`RestoreImplementation`]. + pub fn replace_implementation(&'static self, new_impl: T) -> RestoreImplementation { + if let ExchangeableFunctionState::Replaced = self.0.get().1 { + panic!("Trying to replace an already replaced implementation!") + } + + let old = self.0.replace((new_impl, ExchangeableFunctionState::Replaced)); + + RestoreImplementation(self, Some(old.0)) + } + + /// Restore the original implementation. + fn restore_orig_implementation(&self, orig: T) { + self.0.set((orig, ExchangeableFunctionState::Original)); + } + + /// Returns the internal function pointer. + pub fn get(&self) -> T { + self.0.get().0 + } + } + + // WASM does not support threads, so this is safe; qed. + unsafe impl Sync for ExchangeableFunction {} + + /// Restores a function implementation on drop. /// - /// Returns the original implementation wrapped in [`RestoreImplementation`]. - pub fn replace_implementation(&'static self, new_impl: T) -> RestoreImplementation { - if let ExchangeableFunctionState::Replaced = self.0.get().1 { - panic!("Trying to replace an already replaced implementation!") + /// Stores a static reference to the function object and the original implementation. + pub struct RestoreImplementation(&'static ExchangeableFunction, Option); + + impl Drop for RestoreImplementation { + fn drop(&mut self) { + self.0.restore_orig_implementation(self.1.take().expect("Value is only taken on drop; qed")); } + } - let old = self.0.replace((new_impl, ExchangeableFunctionState::Replaced)); + /// Ensures we use the right crypto when calling into native + pub trait ExternTrieCrypto: Hasher { + /// Calculate enumerated trie root. + fn enumerated_trie_root(values: &[&[u8]]) -> Self::Out; + } - RestoreImplementation(self, Some(old.0)) + /// Additional bounds for Hasher trait for without_std. + pub trait HasherBounds: ExternTrieCrypto {} + impl HasherBounds for T {} + + // Ensures we use a Blake2_256-flavored Hasher when calling into native + impl ExternTrieCrypto for Blake2Hasher { + fn enumerated_trie_root(values: &[&[u8]]) -> Self::Out { + let lengths = values.iter().map(|v| (v.len() as u32).to_le()).collect::>(); + let values = values.iter().fold(Vec::new(), |mut acc, sl| { acc.extend_from_slice(sl); acc }); + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_blake2_256_enumerated_trie_root.get()( + values.as_ptr(), + lengths.as_ptr(), + lengths.len() as u32, + result.as_mut_ptr() + ); + } + result.into() + } } - /// Restore the original implementation. - fn restore_orig_implementation(&self, orig: T) { - self.0.set((orig, ExchangeableFunctionState::Original)); + /// Declare extern functions + macro_rules! extern_functions { + ( + $( + $( #[$attr:meta] )* + fn $name:ident ( $( $arg:ident : $arg_ty:ty ),* ) $( -> $ret:ty )?; + )* + ) => { + $( + $( #[$attr] )* + #[allow(non_upper_case_globals)] + pub static $name: ExchangeableFunction $ret )?> = + ExchangeableFunction::new(extern_functions_host_impl::$name); + )* + + /// The exchangeable extern functions host implementations. + pub(crate) mod extern_functions_host_impl { + $( + pub unsafe fn $name ( $( $arg : $arg_ty ),* ) $( -> $ret )? { + implementation::$name ( $( $arg ),* ) + } + )* + + mod implementation { + extern "C" { + $( + pub fn $name ( $( $arg : $arg_ty ),* ) $( -> $ret )?; + )* + } + } + } + }; } - /// Returns the internal function pointer. - pub fn get(&self) -> T { - self.0.get().0 + /// Host functions, provided by the executor. + /// A WebAssembly runtime module would "import" these to access the execution environment + /// (most importantly, storage) or perform heavy hash calculations. + /// See also "ext_" functions in sr-sandbox and sr-std + extern_functions! { + /// Host functions for printing, useful for debugging. + fn ext_print_utf8(utf8_data: *const u8, utf8_len: u32); + /// Print data as hex. + fn ext_print_hex(data: *const u8, len: u32); + /// Print a number + fn ext_print_num(value: u64); + + /// Set value for key in storage. + fn ext_set_storage(key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); + /// Remove key and value from storage. + fn ext_clear_storage(key_data: *const u8, key_len: u32); + /// Checks if the given key exists in the storage. + /// + /// # Returns + /// + /// - `1` if the value exists. + /// - `0` if the value does not exists. + fn ext_exists_storage(key_data: *const u8, key_len: u32) -> u32; + /// Remove storage entries which key starts with given prefix. + fn ext_clear_prefix(prefix_data: *const u8, prefix_len: u32); + /// Gets the value of the given key from storage. + /// + /// The host allocates the memory for storing the value. + /// + /// # Returns + /// + /// - `0` if no value exists to the given key. `written_out` is set to `u32::max_value()`. + /// - Otherwise, pointer to the value in memory. `written_out` contains the length of the value. + fn ext_get_allocated_storage(key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8; + /// Gets the value of the given key from storage. + /// + /// The value is written into `value` starting at `value_offset`. + /// + /// If the value length is greater than `value_len - value_offset`, the value is written partially. + /// + /// # Returns + /// + /// - `u32::max_value()` if the value does not exists. + /// + /// - Otherwise, the number of bytes written for value. + fn ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32; + /// Gets the trie root of the storage. + fn ext_storage_root(result: *mut u8); + /// Get the change trie root of the current storage overlay at a block with given parent. + /// + /// # Returns + /// + /// - `1` if the change trie root was found. + /// - `0` if the change trie root was not found. + fn ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, result: *mut u8) -> u32; + + /// A child storage function. + /// + /// See [`ext_set_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_set_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); + /// A child storage function. + /// + /// See [`ext_clear_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_clear_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32); + /// A child storage function. + /// + /// See [`ext_exists_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_exists_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) -> u32; + /// A child storage function. + /// + /// See [`ext_kill_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_kill_child_storage(storage_key_data: *const u8, storage_key_len: u32); + /// A child storage function. + /// + /// See [`ext_get_allocated_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_get_allocated_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32, + written_out: *mut u32 + ) -> *mut u8; + /// A child storage function. + /// + /// See [`ext_get_storage_into`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_get_child_storage_into( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32, + value_data: *mut u8, + value_len: u32, + value_offset: u32 + ) -> u32; + /// Commits all changes and calculates the child-storage root. + /// + /// A child storage is used e.g. by a contract. + /// + /// # Returns + /// + /// - The pointer to the result vector and `written_out` contains its length. + fn ext_child_storage_root(storage_key_data: *const u8, storage_key_len: u32, written_out: *mut u32) -> *mut u8; + + /// The current relay chain identifier. + fn ext_chain_id() -> u64; + + /// Calculate a blake2_256 merkle trie root. + fn ext_blake2_256_enumerated_trie_root(values_data: *const u8, lens_data: *const u32, lens_len: u32, result: *mut u8); + /// BLAKE2_128 hash + fn ext_blake2_128(data: *const u8, len: u32, out: *mut u8); + /// BLAKE2_256 hash + fn ext_blake2_256(data: *const u8, len: u32, out: *mut u8); + /// XX64 hash + fn ext_twox_64(data: *const u8, len: u32, out: *mut u8); + /// XX128 hash + fn ext_twox_128(data: *const u8, len: u32, out: *mut u8); + /// XX256 hash + fn ext_twox_256(data: *const u8, len: u32, out: *mut u8); + /// Keccak256 hash + fn ext_keccak_256(data: *const u8, len: u32, out: *mut u8); + /// Note: ext_ed25519_verify returns 0 if the signature is correct, nonzero otherwise. + fn ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; + /// Note: ext_sr25519_verify returns 0 if the signature is correct, nonzero otherwise. + fn ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; + /// Note: ext_secp256k1_ecdsa_recover returns 0 if the signature is correct, nonzero otherwise. + fn ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32; + + //================================ + // Offchain-worker Context + //================================ + + /// Submit transaction. + /// + /// # Returns + /// + /// - 0 if it was successfuly added to the pool + /// - nonzero otherwise. + fn ext_submit_transaction(data: *const u8, len: u32) -> u32; + + /// Create new key(pair) for signing/encryption/decryption. + /// + /// # Returns + /// + /// - A crypto key id (if the value is less than u16::max_value) + /// - `u32::max_value` in case the crypto is not supported + fn ext_new_crypto_key(crypto: u32) -> u32; + + /// Encrypt a piece of data using given crypto key. + /// + /// If `key` is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// + /// - `0` in case the key is invalid, `msg_len` is set to `u32::max_value` + /// - Otherwise, pointer to the encrypted message in memory, + /// `msg_len` contains the length of the message. + fn ext_encrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8; + + /// Decrypt a piece of data using given crypto key. + /// + /// If `key `is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// + /// - `0` in case the key is invalid or data couldn't be decrypted, + /// `msg_len` is set to `u32::max_value` + /// - Otherwise, pointer to the decrypted message in memory, + /// `msg_len` contains the length of the message. + fn ext_decrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8; + + /// Sign a piece of data using given crypto key. + /// + /// If `key` is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// + /// - `0` in case the key is invalid, + /// `sig_data_len` is set to `u32::max_value` + /// - Otherwise, pointer to the signature in memory, + /// `sig_data_len` contains the length of the signature. + fn ext_sign(key: u32, data: *const u8, data_len: u32, sig_data_len: *mut u32) -> *mut u8; + + /// Verifies that `signature` for `msg` matches given `key`. + /// + /// If `key` is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// - `0` in case the signature is correct + /// - `1` in case it doesn't match the key + /// - `u32::max_value` if the key is invalid. + fn ext_verify( + key: u32, + msg: *const u8, + msg_len: u32, + signature: *const u8, + signature_len: u32 + ) -> u32; + + /// Returns current UNIX timestamp (milliseconds) + fn ext_timestamp() -> u64; + + /// Pause execution until given timestamp (milliseconds; `deadline`) is reached. + /// + /// The deadline is obtained by querying the current timestamp via `ext_timestamp` + /// and then adding some time to it. + fn ext_sleep_until(deadline: u64); + + /// Generate a random seed + /// + /// `data` has to be a pointer to a slice of 32 bytes. + fn ext_random_seed(data: *mut u8); + + /// Write a value to local storage. + fn ext_local_storage_set(key: *const u8, key_len: u32, value: *const u8, value_len: u32); + + /// Write a value to local storage in atomic fashion. + fn ext_local_storage_compare_and_set( + key: *const u8, + key_len: u32, + old_value: *const u8, + old_value_len: u32, + new_value: *const u8, + new_value_len: u32 + ); + + /// Read a value from local storage. + /// + /// + /// # Returns + /// + /// - 0 if the value has not been found, the `value_len` is set to `u32::max_value`. + /// - Otherwise, pointer to the value in memory. `value_len` contains the length of the value. + fn ext_local_storage_get(key: *const u8, key_len: u32, value_len: *mut u32) -> *mut u8; + + /// Initiaties a http request. + /// + /// `meta` is parity-codec encoded additional parameters to the request (like redirection policy, + /// timeouts, certificates policy, etc). The format is not yet specified and the field is currently + /// only reserved for future use. + /// + /// # Returns + /// + /// `RequestId(u16)` of initiated request, any value beyond `u16::max_value` + /// signifies an error. + fn ext_http_request_start( + method: *const u8, + method_len: u32, + url: *const u8, + url_len: u32, + meta: *const u8, + meta_len: u32 + ) -> u32; + + /// Add a header to the request. + /// + /// # Returns + /// + /// - `0` if successful (and the request id exists) + /// - nonzero otherwise + fn ext_http_request_add_header( + request_id: u32, + name: *const u8, + name_len: u32, + value: *const u8, + value_len: u32 + ) -> u32; + + /// Write a chunk of request body. + /// + /// Writing an empty chunks finalises the request. + /// Passing `0` as deadline blocks forever. + /// + /// # Returns + /// + /// - `0` if successful, + /// - nonzero otherwise (see HttpError for the codes) + fn ext_http_request_write_body( + request_id: u32, + chunk: *const u8, + chunk_len: u32, + deadline: u64 + ) -> u32; + + /// Block and wait for the responses for given requests. + /// + /// Note that if deadline is 0 the method will block indefinitely, + /// otherwise unready responses will produce `DeadlineReached` status. + /// (see #primitives::offchain::HttpRequestStatus) + /// + /// Make sure that `statuses` have the same length as ids. + fn ext_http_response_wait( + ids: *const u32, + ids_len: u32, + statuses: *mut u32, + deadline: u64 + ); + + /// Read all response headers. + /// + /// Note the headers are only available before response body is fully consumed. + /// + /// # Returns + /// + /// - A pointer to parity-codec encoded vector of pairs `(HeaderKey, HeaderValue)`. + /// - In case invalid `id` is passed it returns a pointer to parity-encoded empty vector. + fn ext_http_response_headers( + id: u32, + written_out: *mut u32 + ) -> *mut u8; + + /// Read a chunk of body response to given buffer. + /// + /// Passing `0` as deadline blocks forever. + /// + /// # Returns + /// + /// The number of bytes written if successful, + /// - if it's `0` it means response has been fully consumed, + /// - if it's greater than `u32::max_value() - 255` it means reading body failed. + /// + /// In case of failure, the error code should be mapped to `HttpError` + /// in a following manner: + /// - `u32::max_value()` HttpError code 1 (DeadlineReached) + /// - `u32::max_value() - 1` HttpError code 2 (IoError) + /// The rest is reserved for potential future errors. + fn ext_http_response_read_body( + id: u32, + buffer: *mut u8, + buffer_len: u32, + deadline: u64 + ) -> u32; } } -// WASM does not support threads, so this is safe; qed. -unsafe impl Sync for ExchangeableFunction {} +pub use self::ext::*; -/// Restores a function implementation on drop. -/// -/// Stores a static reference to the function object and the original implementation. -pub struct RestoreImplementation(&'static ExchangeableFunction, Option); +impl StorageApi for () { + fn storage(key: &[u8]) -> Option> { + let mut length: u32 = 0; + unsafe { + let ptr = ext_get_allocated_storage.get()(key.as_ptr(), key.len() as u32, &mut length); + from_raw_parts(ptr, length) + } + } -impl Drop for RestoreImplementation { - fn drop(&mut self) { - self.0.restore_orig_implementation(self.1.take().expect("Value is only taken on drop; qed")); + fn child_storage(storage_key: &[u8], key: &[u8]) -> Option> { + let mut length: u32 = 0; + unsafe { + let ptr = ext_get_allocated_child_storage.get()( + storage_key.as_ptr(), + storage_key.len() as u32, + key.as_ptr(), + key.len() as u32, + &mut length + ); + from_raw_parts(ptr, length) + } } -} -/// Declare extern functions -macro_rules! extern_functions { - ( - $( - $( #[$attr:meta] )* - fn $name:ident ( $( $arg:ident : $arg_ty:ty ),* ) $( -> $ret:ty )?; - )* - ) => { - $( - $( #[$attr] )* - #[allow(non_upper_case_globals)] - pub static $name: ExchangeableFunction $ret )?> = - ExchangeableFunction::new(extern_functions_host_impl::$name); - )* - - /// The exchangeable extern functions host implementations. - mod extern_functions_host_impl { - $( - pub unsafe fn $name ( $( $arg : $arg_ty ),* ) $( -> $ret )? { - implementation::$name ( $( $arg ),* ) - } - )* + fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { + unsafe { + match ext_get_storage_into.get()( + key.as_ptr(), + key.len() as u32, + value_out.as_mut_ptr(), + value_out.len() as u32, + value_offset as u32, + ) { + none if none == u32::max_value() => None, + length => Some(length as usize), + } + } + } - mod implementation { - extern "C" { - $( - pub fn $name ( $( $arg : $arg_ty ),* ) $( -> $ret )?; - )* - } + fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { + unsafe { + match ext_get_child_storage_into.get()( + storage_key.as_ptr(), storage_key.len() as u32, + key.as_ptr(), key.len() as u32, + value_out.as_mut_ptr(), value_out.len() as u32, + value_offset as u32 + ) { + none if none == u32::max_value() => None, + length => Some(length as usize), } } - }; -} + } -/// Host functions, provided by the executor. -/// A WebAssembly runtime module would "import" these to access the execution environment -/// (most importantly, storage) or perform heavy hash calculations. -/// See also "ext_" functions in sr-sandbox and sr-std -extern_functions! { - /// Host functions for printing, useful for debugging. - fn ext_print_utf8(utf8_data: *const u8, utf8_len: u32); - fn ext_print_hex(data: *const u8, len: u32); - fn ext_print_num(value: u64); - - /// Set value for key in storage. - fn ext_set_storage(key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); - /// Remove key and value from storage. - fn ext_clear_storage(key_data: *const u8, key_len: u32); - /// Checks if the given key exists in the storage. - /// - /// # Returns - /// - /// - `1` if the value exists. - /// - `0` if the value does not exists. - fn ext_exists_storage(key_data: *const u8, key_len: u32) -> u32; - /// Remove storage entries which key starts with given prefix. - fn ext_clear_prefix(prefix_data: *const u8, prefix_len: u32); - /// Gets the value of the given key from storage. - /// - /// The host allocates the memory for storing the value. - /// - /// # Returns - /// - /// - `0` if no value exists to the given key. `written_out` is set to `u32::max_value()`. - /// - /// - Otherwise, pointer to the value in memory. `written_out` contains the length of the value. - fn ext_get_allocated_storage(key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8; - /// Gets the value of the given key from storage. - /// - /// The value is written into `value` starting at `value_offset`. - /// - /// If the value length is greater than `value_len - value_offset`, the value is written partially. - /// - /// # Returns - /// - /// - `u32::max_value()` if the value does not exists. - /// - /// - Otherwise, the number of bytes written for value. - fn ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32; - /// Gets the trie root of the storage. - fn ext_storage_root(result: *mut u8); - /// Get the change trie root of the current storage overlay at a block with given parent. - /// - /// # Returns - /// - /// - `1` if the change trie root was found. - /// - `0` if the change trie root was not found. - fn ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, parent_num: u64, result: *mut u8) -> u32; + fn set_storage(key: &[u8], value: &[u8]) { + unsafe { + ext_set_storage.get()( + key.as_ptr(), key.len() as u32, + value.as_ptr(), value.len() as u32 + ); + } + } - /// A child storage function. - /// - /// See [`ext_set_storage`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_set_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); - /// A child storage function. - /// - /// See [`ext_clear_storage`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_clear_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32); - /// A child storage function. - /// - /// See [`ext_exists_storage`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_exists_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) -> u32; - /// A child storage function. - /// - /// See [`ext_kill_storage`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_kill_child_storage(storage_key_data: *const u8, storage_key_len: u32); - /// A child storage function. - /// - /// See [`ext_get_allocated_storage`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_get_allocated_child_storage( - storage_key_data: *const u8, - storage_key_len: u32, - key_data: *const u8, - key_len: u32, - written_out: *mut u32 - ) -> *mut u8; - /// A child storage function. - /// - /// See [`ext_get_storage_into`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_get_child_storage_into( - storage_key_data: *const u8, - storage_key_len: u32, - key_data: *const u8, - key_len: u32, - value_data: *mut u8, - value_len: u32, - value_offset: u32 - ) -> u32; - /// Commits all changes and calculates the child-storage root. - /// - /// A child storage is used e.g. by a contract. - /// - /// # Returns - /// - /// - The pointer to the result vector and `written_out` contains its length. - fn ext_child_storage_root(storage_key_data: *const u8, storage_key_len: u32, written_out: *mut u32) -> *mut u8; - - /// The current relay chain identifier. - fn ext_chain_id() -> u64; - - /// Hash calculation and verification - fn ext_blake2_256_enumerated_trie_root(values_data: *const u8, lens_data: *const u32, lens_len: u32, result: *mut u8); - fn ext_blake2_128(data: *const u8, len: u32, out: *mut u8); - fn ext_blake2_256(data: *const u8, len: u32, out: *mut u8); - fn ext_twox_64(data: *const u8, len: u32, out: *mut u8); - fn ext_twox_128(data: *const u8, len: u32, out: *mut u8); - fn ext_twox_256(data: *const u8, len: u32, out: *mut u8); - fn ext_keccak_256(data: *const u8, len: u32, out: *mut u8); - /// Note: ext_ed25519_verify returns 0 if the signature is correct, nonzero otherwise. - fn ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; - /// Note: ext_sr25519_verify returns 0 if the signature is correct, nonzero otherwise. - fn ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; - /// Note: ext_secp256k1_ecdsa_recover returns 0 if the signature is correct, nonzero otherwise. - fn ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32; - - //================================ - // Offchain-worker Context - //================================ - - /// Submit extrinsic. - fn ext_submit_extrinsic(data: *const u8, len: u32); -} + fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]) { + unsafe { + ext_set_child_storage.get()( + storage_key.as_ptr(), storage_key.len() as u32, + key.as_ptr(), key.len() as u32, + value.as_ptr(), value.len() as u32 + ); + } + } -/// Ensures we use the right crypto when calling into native -pub trait ExternTrieCrypto { - fn enumerated_trie_root(values: &[&[u8]]) -> [u8; 32]; -} + fn clear_storage(key: &[u8]) { + unsafe { + ext_clear_storage.get()( + key.as_ptr(), key.len() as u32 + ); + } + } -// Ensures we use a Blake2_256-flavored Hasher when calling into native -impl ExternTrieCrypto for Blake2Hasher { - fn enumerated_trie_root(values: &[&[u8]]) -> [u8; 32] { - let lengths = values.iter().map(|v| (v.len() as u32).to_le()).collect::>(); - let values = values.iter().fold(Vec::new(), |mut acc, sl| { acc.extend_from_slice(sl); acc }); - let mut result: [u8; 32] = Default::default(); + fn clear_child_storage(storage_key: &[u8], key: &[u8]) { + unsafe { + ext_clear_child_storage.get()( + storage_key.as_ptr(), storage_key.len() as u32, + key.as_ptr(), key.len() as u32 + ); + } + } + + fn exists_storage(key: &[u8]) -> bool { + unsafe { + ext_exists_storage.get()( + key.as_ptr(), key.len() as u32 + ) != 0 + } + } + + fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool { unsafe { - ext_blake2_256_enumerated_trie_root.get()( - values.as_ptr(), - lengths.as_ptr(), - lengths.len() as u32, - result.as_mut_ptr() + ext_exists_child_storage.get()( + storage_key.as_ptr(), storage_key.len() as u32, + key.as_ptr(), key.len() as u32 + ) != 0 + } + } + + fn clear_prefix(prefix: &[u8]) { + unsafe { + ext_clear_prefix.get()( + prefix.as_ptr(), + prefix.len() as u32 + ); + } + } + + fn kill_child_storage(storage_key: &[u8]) { + unsafe { + ext_kill_child_storage.get()( + storage_key.as_ptr(), + storage_key.len() as u32 ); } + } + + fn storage_root() -> [u8; 32] { + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_storage_root.get()(result.as_mut_ptr()); + } result } -} -/// Get `key` from storage and return a `Vec`, empty if there's a problem. -pub fn storage(key: &[u8]) -> Option> { - let mut length: u32 = 0; - unsafe { - let ptr = ext_get_allocated_storage.get()(key.as_ptr(), key.len() as u32, &mut length); - if length == u32::max_value() { - None - } else { - // Invariants required by Vec::from_raw_parts are not formally fulfilled. - // We don't allocate via String/Vec, but use a custom allocator instead. - // See #300 for more details. - Some(>::from_raw_parts(ptr, length as usize, length as usize)) + fn child_storage_root(storage_key: &[u8]) -> Vec { + let mut length: u32 = 0; + unsafe { + let ptr = ext_child_storage_root.get()( + storage_key.as_ptr(), + storage_key.len() as u32, + &mut length + ); + from_raw_parts(ptr, length).expect("ext_child_storage_root never returns u32::max_value; qed") } } -} -/// Get `key` from child storage and return a `Vec`, empty if there's a problem. -pub fn child_storage(storage_key: &[u8], key: &[u8]) -> Option> { - let mut length: u32 = 0; - unsafe { - let ptr = ext_get_allocated_child_storage.get()( - storage_key.as_ptr(), - storage_key.len() as u32, - key.as_ptr(), - key.len() as u32, - &mut length - ); - if length == u32::max_value() { - None + fn storage_changes_root(parent_hash: [u8; 32]) -> Option<[u8; 32]> { + let mut result: [u8; 32] = Default::default(); + let is_set = unsafe { + ext_storage_changes_root.get()(parent_hash.as_ptr(), parent_hash.len() as u32, result.as_mut_ptr()) + }; + + if is_set != 0 { + Some(result) } else { - // Invariants required by Vec::from_raw_parts are not formally fulfilled. - // We don't allocate via String/Vec, but use a custom allocator instead. - // See #300 for more details. - Some(>::from_raw_parts(ptr, length as usize, length as usize)) + None } } -} -/// Set the storage of some particular key to Some value. -pub fn set_storage(key: &[u8], value: &[u8]) { - unsafe { - ext_set_storage.get()( - key.as_ptr(), key.len() as u32, - value.as_ptr(), value.len() as u32 - ); + fn enumerated_trie_root(values: &[&[u8]]) -> H::Out { + H::enumerated_trie_root(values) } -} -/// Set the child storage of some particular key to Some value. -pub fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]) { - unsafe { - ext_set_child_storage.get()( - storage_key.as_ptr(), storage_key.len() as u32, - key.as_ptr(), key.len() as u32, - value.as_ptr(), value.len() as u32 - ); + fn trie_root< + H: Hasher + ExternTrieCrypto, + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, + >(_input: I) -> H::Out { + unimplemented!() } -} -/// Clear the storage of some particular key. -pub fn clear_storage(key: &[u8]) { - unsafe { - ext_clear_storage.get()( - key.as_ptr(), key.len() as u32 - ); + fn ordered_trie_root< + H: Hasher + ExternTrieCrypto, + I: IntoIterator, + A: AsRef<[u8]> + >(_input: I) -> H::Out { + unimplemented!() } } -/// Clear the storage of some particular key. -pub fn clear_child_storage(storage_key: &[u8], key: &[u8]) { - unsafe { - ext_clear_child_storage.get()( - storage_key.as_ptr(), storage_key.len() as u32, - key.as_ptr(), key.len() as u32 - ); +impl OtherApi for () { + fn chain_id() -> u64 { + unsafe { + ext_chain_id.get()() + } } -} -/// Determine whether a particular key exists in storage. -pub fn exists_storage(key: &[u8]) -> bool { - unsafe { - ext_exists_storage.get()( - key.as_ptr(), key.len() as u32 - ) != 0 + fn print(value: T) { + value.print() } + } -/// Determine whether a particular key exists in storage. -pub fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool { - unsafe { - ext_exists_child_storage.get()( - storage_key.as_ptr(), storage_key.len() as u32, - key.as_ptr(), key.len() as u32 - ) != 0 +impl HashingApi for () { + fn keccak_256(data: &[u8]) -> [u8; 32] { + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_keccak_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + } + result } -} -/// Clear the storage entries key of which starts with the given prefix. -pub fn clear_prefix(prefix: &[u8]) { - unsafe { - ext_clear_prefix.get()( - prefix.as_ptr(), - prefix.len() as u32 - ); + fn blake2_128(data: &[u8]) -> [u8; 16] { + let mut result: [u8; 16] = Default::default(); + unsafe { + ext_blake2_128.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + } + result } -} -/// Clear an entire child storage. -pub fn kill_child_storage(storage_key: &[u8]) { - unsafe { - ext_kill_child_storage.get()( - storage_key.as_ptr(), - storage_key.len() as u32 - ); + fn blake2_256(data: &[u8]) -> [u8; 32] { + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_blake2_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + } + result } -} -/// Get `key` from storage, placing the value into `value_out` (as much as possible) and return -/// the number of bytes that the key in storage was beyond the offset. -pub fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { - unsafe { - match ext_get_storage_into.get()( - key.as_ptr(), - key.len() as u32, - value_out.as_mut_ptr(), - value_out.len() as u32, - value_offset as u32, - ) { - none if none == u32::max_value() => None, - length => Some(length as usize), + fn twox_256(data: &[u8]) -> [u8; 32] { + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_twox_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); } + result } -} -/// Get `key` from child storage, placing the value into `value_out` (as much as possible) and return -/// the number of bytes that the key in storage was beyond the offset. -pub fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { - unsafe { - match ext_get_child_storage_into.get()( - storage_key.as_ptr(), storage_key.len() as u32, - key.as_ptr(), key.len() as u32, - value_out.as_mut_ptr(), value_out.len() as u32, - value_offset as u32 - ) { - none if none == u32::max_value() => None, - length => Some(length as usize), + fn twox_128(data: &[u8]) -> [u8; 16] { + let mut result: [u8; 16] = Default::default(); + unsafe { + ext_twox_128.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); } + result } -} -/// The current storage's root. -pub fn storage_root() -> [u8; 32] { - let mut result: [u8; 32] = Default::default(); - unsafe { - ext_storage_root.get()(result.as_mut_ptr()); + fn twox_64(data: &[u8]) -> [u8; 8] { + let mut result: [u8; 8] = Default::default(); + unsafe { + ext_twox_64.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + } + result } - result } -/// "Commit" all existing operations and compute the resultant child storage root. -pub fn child_storage_root(storage_key: &[u8]) -> Vec { - let mut length: u32 = 0; - unsafe { - let ptr = ext_child_storage_root.get()( - storage_key.as_ptr(), - storage_key.len() as u32, - &mut length - ); - // Invariants required by Vec::from_raw_parts are not formally fulfilled. - // We don't allocate via String/Vec, but use a custom allocator instead. - // See #300 for more details. - >::from_raw_parts(ptr, length as usize, length as usize) +impl CryptoApi for () { + fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + unsafe { + ext_ed25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + } } -} -/// The current storage' changes root. -pub fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]> { - let mut result: [u8; 32] = Default::default(); - let is_set = unsafe { - ext_storage_changes_root.get()(parent_hash.as_ptr(), parent_hash.len() as u32, parent_num, result.as_mut_ptr()) - }; + fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + unsafe { + ext_sr25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + } + } - if is_set != 0 { - Some(result) - } else { - None + fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { + let mut pubkey = [0u8; 64]; + match unsafe { + ext_secp256k1_ecdsa_recover.get()(msg.as_ptr(), sig.as_ptr(), pubkey.as_mut_ptr()) + } { + 0 => Ok(pubkey), + 1 => Err(EcdsaVerifyError::BadRS), + 2 => Err(EcdsaVerifyError::BadV), + 3 => Err(EcdsaVerifyError::BadSignature), + _ => unreachable!("`ext_secp256k1_ecdsa_recover` only returns 0, 1, 2 or 3; qed"), + } } } -/// A trie root calculated from enumerated values. -pub fn enumerated_trie_root(values: &[&[u8]]) -> [u8; 32] { - H::enumerated_trie_root(values) -} +impl OffchainApi for () { + fn submit_transaction(data: &T) -> Result<(), ()> { + let encoded_data = codec::Encode::encode(data); + let ret = unsafe { + ext_submit_transaction.get()(encoded_data.as_ptr(), encoded_data.len() as u32) + }; -/// A trie root formed from the iterated items. -pub fn trie_root< - H: Hasher + ExternTrieCrypto, - I: IntoIterator, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, ->(_input: I) -> [u8; 32] { - unimplemented!() -} + if ret == 0 { + Ok(()) + } else { + Err(()) + } + } -/// A trie root formed from the enumerated items. -pub fn ordered_trie_root< - H: Hasher + ExternTrieCrypto, - I: IntoIterator, - A: AsRef<[u8]> ->(_input: I) -> [u8; 32] { - unimplemented!() -} + fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { + let crypto = crypto as u8 as u32; + let ret = unsafe { + ext_new_crypto_key.get()(crypto) + }; -/// The current relay chain identifier. -pub fn chain_id() -> u64 { - unsafe { - ext_chain_id.get()() + if ret > u16::max_value() as u32 { + Err(()) + } else { + Ok(offchain::CryptoKeyId(ret as u16)) + } } -} -/// Conduct a 256-bit Blake2 hash. -pub fn blake2_256(data: &[u8]) -> [u8; 32] { - let mut result: [u8; 32] = Default::default(); - unsafe { - ext_blake2_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + fn encrypt(key: Option, data: &[u8]) -> Result, ()> { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let mut len = 0_u32; + unsafe { + let ptr = ext_encrypt.get()(key, data.as_ptr(), data.len() as u32, &mut len); + + from_raw_parts(ptr, len).ok_or(()) + } } - result -} -/// Conduct a 128-bit Blake2 hash. -pub fn blake2_128(data: &[u8]) -> [u8; 16] { - let mut result: [u8; 16] = Default::default(); - unsafe { - ext_blake2_128.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + fn decrypt(key: Option, data: &[u8]) -> Result, ()> { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let mut len = 0_u32; + unsafe { + let ptr = ext_decrypt.get()(key, data.as_ptr(), data.len() as u32, &mut len); + + from_raw_parts(ptr, len).ok_or(()) + } } - result -} -/// Conduct a 256-bit Keccak hash. -pub fn keccak_256(data: &[u8]) -> [u8; 32] { - let mut result: [u8; 32] = Default::default(); - unsafe { - ext_keccak_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + fn sign(key: Option, data: &[u8]) -> Result, ()> { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let mut len = 0_u32; + unsafe { + let ptr = ext_sign.get()(key, data.as_ptr(), data.len() as u32, &mut len); + + from_raw_parts(ptr, len).ok_or(()) + } } - result -} -/// Conduct four XX hashes to give a 256-bit result. -pub fn twox_256(data: &[u8]) -> [u8; 32] { - let mut result: [u8; 32] = Default::default(); - unsafe { - ext_twox_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + fn verify(key: Option, msg: &[u8], signature: &[u8]) -> Result { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let val = unsafe { + ext_verify.get()( + key, + msg.as_ptr(), + msg.len() as u32, + signature.as_ptr(), + signature.len() as u32, + ) + }; + + match val { + 0 => Ok(true), + 1 => Ok(false), + _ => Err(()), + } } - result -} -/// Conduct two XX hashes to give a 128-bit result. -pub fn twox_128(data: &[u8]) -> [u8; 16] { - let mut result: [u8; 16] = Default::default(); - unsafe { - ext_twox_128.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + fn timestamp() -> offchain::Timestamp { + offchain::Timestamp::from_unix_millis(unsafe { + ext_timestamp.get()() + }) } - result -} -/// Conduct two XX hashes to give a 64-bit result. -pub fn twox_64(data: &[u8]) -> [u8; 8] { - let mut result: [u8; 8] = Default::default(); - unsafe { - ext_twox_64.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + fn sleep_until(deadline: Timestamp) { + unsafe { + ext_sleep_until.get()(deadline.unix_millis()) + } } - result -} -/// Verify a ed25519 signature. -pub fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - unsafe { - ext_ed25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + fn random_seed() -> [u8; 32] { + let mut result = [0_u8; 32]; + unsafe { + ext_random_seed.get()(result.as_mut_ptr()) + } + result } -} -/// Verify a sr25519 signature. -pub fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - unsafe { - ext_sr25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + fn local_storage_set(key: &[u8], value: &[u8]) { + unsafe { + ext_local_storage_set.get()( + key.as_ptr(), + key.len() as u32, + value.as_ptr(), + value.len() as u32, + ) + } } -} -/// Verify and recover a SECP256k1 ECDSA signature. -/// - `sig` is passed in RSV format. V should be either 0/1 or 27/28. -/// - returns `None` if the signature is bad, the 64-byte pubkey (doesn't include the 0x04 prefix). -pub fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { - let mut pubkey = [0u8; 64]; - match unsafe { - ext_secp256k1_ecdsa_recover.get()(msg.as_ptr(), sig.as_ptr(), pubkey.as_mut_ptr()) - } { - 0 => Ok(pubkey), - 1 => Err(EcdsaVerifyError::BadRS), - 2 => Err(EcdsaVerifyError::BadV), - 3 => Err(EcdsaVerifyError::BadSignature), - _ => unreachable!("`ext_secp256k1_ecdsa_recover` only returns 0, 1, 2 or 3; qed"), + fn local_storage_compare_and_set(key: &[u8], old_value: &[u8], new_value: &[u8]) { + unsafe { + ext_local_storage_compare_and_set.get()( + key.as_ptr(), + key.len() as u32, + old_value.as_ptr(), + old_value.len() as u32, + new_value.as_ptr(), + new_value.len() as u32, + ) + } } -} -/// Submit extrinsic from the runtime. -/// -/// Depending on the kind of extrinsic it will either be: -/// 1. scheduled to be included in the next produced block (inherent) -/// 2. added to the pool and propagated (transaction) -pub fn submit_extrinsic(data: &T) { - let encoded_data = codec::Encode::encode(data); - unsafe { - ext_submit_extrinsic.get()(encoded_data.as_ptr(), encoded_data.len() as u32) + fn local_storage_get(key: &[u8]) -> Option> { + let mut len = 0u32; + unsafe { + let ptr = ext_local_storage_get.get()( + key.as_ptr(), + key.len() as u32, + &mut len, + ); + + from_raw_parts(ptr, len) + } + } + + fn http_request_start(method: &str, url: &str, meta: &[u8]) -> Result { + let method = method.as_bytes(); + let url = url.as_bytes(); + + let result = unsafe { + ext_http_request_start.get()( + method.as_ptr(), + method.len() as u32, + url.as_ptr(), + url.len() as u32, + meta.as_ptr(), + meta.len() as u32, + ) + }; + + if result > u16::max_value() as u32 { + Err(()) + } else { + Ok(offchain::HttpRequestId(result as u16)) + } + } + + fn http_request_add_header(request_id: offchain::HttpRequestId, name: &str, value: &str) -> Result<(), ()> { + let name = name.as_bytes(); + let value = value.as_bytes(); + + let result = unsafe { + ext_http_request_add_header.get()( + request_id.0 as u32, + name.as_ptr(), + name.len() as u32, + value.as_ptr(), + value.len() as u32, + ) + }; + + if result == 0 { + Ok(()) + } else { + Err(()) + } + } + + fn http_request_write_body( + request_id: offchain::HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), offchain::HttpError> { + let res = unsafe { + ext_http_request_write_body.get()( + request_id.0 as u32, + chunk.as_ptr(), + chunk.len() as u32, + deadline.map_or(0, |x| x.unix_millis()), + ) + }; + + if res == 0 { + Ok(()) + } else { + Err(res.try_into().unwrap_or(offchain::HttpError::IoError)) + } + } + + fn http_response_wait( + ids: &[offchain::HttpRequestId], + deadline: Option + ) -> Vec { + let ids = ids.iter().map(|x| x.0 as u32).collect::>(); + let mut statuses = Vec::new(); + statuses.resize(ids.len(), 0u32); + + unsafe { + ext_http_response_wait.get()( + ids.as_ptr(), + ids.len() as u32, + statuses.as_mut_ptr(), + deadline.map_or(0, |x| x.unix_millis()), + ) + } + + statuses + .into_iter() + .map(|status| status.try_into().unwrap_or(offchain::HttpRequestStatus::Unknown)) + .collect() + } + + fn http_response_headers( + request_id: offchain::HttpRequestId, + ) -> Vec<(Vec, Vec)> { + let mut len = 0u32; + let raw_result = unsafe { + let ptr = ext_http_response_headers.get()( + request_id.0 as u32, + &mut len, + ); + + from_raw_parts(ptr, len).expect("ext_http_response_headers never return u32::max_value; qed") + }; + + codec::Decode::decode(&mut &*raw_result).unwrap_or_default() + } + + fn http_response_read_body( + request_id: offchain::HttpRequestId, + buffer: &mut [u8], + deadline: Option, + ) -> Result { + let res = unsafe { + ext_http_response_read_body.get()( + request_id.0 as u32, + buffer.as_mut_ptr(), + buffer.len() as u32, + deadline.map_or(0, |x| x.unix_millis()), + ) + }; + + if res >= u32::max_value() - 255 { + let code = (u32::max_value() - res) + 1; + code.try_into().map_err(|_| offchain::HttpError::IoError) + } else { + Ok(res as usize) + } } } -/// Trait for things which can be printed. -pub trait Printable { - fn print(self); +unsafe fn from_raw_parts(ptr: *mut u8, len: u32) -> Option> { + if len == u32::max_value() { + None + } else { + // Invariants required by Vec::from_raw_parts are not formally fulfilled. + // We don't allocate via String/Vec, but use a custom allocator instead. + // See #300 for more details. + Some(>::from_raw_parts(ptr, len as usize, len as usize)) + } } +impl Api for () {} + impl<'a> Printable for &'a [u8] { fn print(self) { unsafe { @@ -659,8 +1096,3 @@ impl Printable for u64 { unsafe { ext_print_num.get()(self); } } } - -/// Print a printable value. -pub fn print(value: T) { - value.print(); -} diff --git a/core/sr-primitives/Cargo.toml b/core/sr-primitives/Cargo.toml index 0f32940b5a923ad7131f6cefde73fde0c33ce77a..98f6688932b895ad8075508714d6362bd041db7b 100644 --- a/core/sr-primitives/Cargo.toml +++ b/core/sr-primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sr-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -17,6 +17,7 @@ paste = { version = "0.1", optional = true } [dev-dependencies] serde_json = "1.0" +primitive-types = "0.2" [features] default = ["std"] diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index 265ceb5941a3d71ae30278dff781c467ebabb542..c0724bb134e7a2f50f4540050a11afc7972f0d04 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -58,29 +58,151 @@ impl traits::Digest for Digest where } } -/// Digest item that is able to encode/decode 'system' digest items and -/// provide opaque access to other items. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug))] -#[allow(deprecated)] -pub enum DigestItem { - /// System digest item announcing that authorities set has been changed - /// in the block. Contains the new set of authorities. - AuthoritiesChange(Vec), - /// System digest item that contains the root of changes trie at given - /// block. It is created for every block iff runtime supports changes - /// trie creation. - ChangesTrieRoot(Hash), - /// The old way to put a Seal on it. Deprecated. - #[deprecated( - since = "1.0", - note = "New versions of Substrate will never generate this, and it will be rejected on new blockchains.", - )] - Seal(u64, SealSignature), - /// Put a Seal on it - Consensus(ConsensusEngineId, Vec), - /// Any 'non-system' digest item, opaque to the native code. - Other(Vec), +// Macro black magic. +macro_rules! gen_digest_type { + ( + $( #[doc = $main_docs:tt] )* + pub enum $main:ident $(<$($main_params: tt),+>)? { } + $( + $( #[doc = $doc_attr:tt] )* + pub enum $n:ident $(<$($t: tt),+>)? { + $( + $( #[doc = $variant_doc:tt] )* + $variant:ident(($($interior: ty),*), $q: tt), + )* + } + )+ + ) => { + $( #[doc = $main_docs] )* + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Debug))] + pub enum $main $(<$($main_params),+>)? { + $( + $( + $( #[doc = $variant_doc] )* + $variant($($interior),*), + )* + )* + } + + gen_digest_type! { + @internal + $main : $main $(<$($main_params),+>)? => $( + $( #[doc = $doc_attr] )* + pub enum $n $(<$($t),+>)? { + $( + $( #[doc = $variant_doc] )* + $variant(($($interior),*), $q), + )* + } + )+ + } + }; + ( + @internal + $main_id:tt : $main:ty => $( + $( #[doc = $doc_attr:tt] )* + pub enum $n:ident $(<$($t: tt),+>)? { + $( + $( #[doc = $variant_doc:tt] )* + $variant:ident(($($interior: ty),*), $q: tt), + )* + } + )+ + ) => { + $( + $( #[doc = $doc_attr] )* + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Debug))] + pub enum $n $(<$($t),+>)? { + $( + $( #[doc = $variant_doc] )* + $variant($($interior),*), + )* + } + + impl From<$n $(<$($t),*>)?> + for $main { + fn from(digest: $n $(<$($t),+>)?) -> Self { + match digest { + $( + $n::$variant $q => $main_id::$variant $q, + )* + } + } + } + )* + }; +} + +gen_digest_type! { + /// Digest item that is able to encode/decode 'system' digest items and + /// provide opaque access to other items. + /// + /// For all variants that include a `ConsensusEngineId`, consensus engine + /// implementations **MUST** ignore digests that have a `ConsensusEngineId` + /// that is not theirs. Node implementations **MUST** reject digests that + /// have a `ConsensusEngineId` that corresponds to a consensus engine not in + /// use. Node implementations **MUST** reject blocks as malformed if they + /// reject any of the block’s digest. If the runtime supports this, the + /// node that issued the block **SHOULD** be reported as having committed + /// severe misbehavior and punished accordingly. The invalid block, or its + /// hash, **SHOULD** constitute adequate proof of such misbehavior. + pub enum DigestItem {} + + /// A digest item that can be produced by consensus engines. Consensus + /// engine implementations **MUST NOT** push digests not in this variant. + /// This **SHOULD** be detected at compile time. If it is not, the behavior + /// of the blockchain is undefined. + pub enum ConsensusDigest { + /// Put a Seal on it. This **MUST** come after all other `DigestItem` + /// variants. There **MUST** be exactly one `Seal` per consensus engine, + /// and its `ConsensusEngineId` **MUST** be that of the consensus engine + /// that produced it. Runtimes will not see this variant. + Seal((ConsensusEngineId, SealSignature), (a, b)), + /// An inherent digest. + /// + /// These are messages from the consensus engine to the runtime, + /// although the consensus engine can (and should) read them itself to + /// avoid code and state duplication. It is erroneous for a runtime to + /// produce these, but this is checked at compile time. Runtimes can + /// (and should) trust these, as with any other inherent. Consensus + /// engines MUST verify them. + PreRuntime((ConsensusEngineId, Vec), (a, b)), + } + + /// A digest item that can be produced by runtimes. Runtime mplementations + /// **MUST NOT** push digests not in this variant. This **SHOULD** be + /// detected at compile time. If it is not, the behavior of the blockchain + /// is undefined. + pub enum RuntimeDigest { + /// A message from the runtime to the consensus engine. This MUST NOT be + /// generated by the native code of any consensus engine, but this is + /// caught at compile time. The `ConsensusEngineId` is that of the + /// consensus engine for which this digest is intended. Consensus + /// engines MUST ignore digests with `ConsensusEngineId`s other than + /// their own. + Consensus((ConsensusEngineId, Vec), (a, b)), + /// Any 'non-system' digest item, opaque to the native code. Runtimes + /// MUST verify these, and reject any they did not produce. These MUST + /// NOT be produced by native code. + Other((Vec), (a)), + } + + /// A digest item that is reserved for the SRML. Only the SRML is allowed to + /// push these digests. Consensus engines and third-party runtime code + /// **MUST NOT** push digests in this variant. This **SHOULD** be detected + /// at compile time. If it is not, the behavior of the blockchain is + /// undefined. + pub enum SystemDigest { + /// System digest item announcing that authorities set has been changed + /// in the block. Contains the new set of authorities. + AuthoritiesChange((Vec), (a)), + /// System digest item that contains the root of changes trie at given + /// block. It is created for every block iff runtime supports changes + /// trie creation. + ChangesTrieRoot((Hash), (a)), + } } #[cfg(feature = "std")] @@ -97,20 +219,27 @@ impl ::serde::Serializ /// final runtime implementations for encoding/decoding its log items. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -#[allow(deprecated)] pub enum DigestItemRef<'a, Hash: 'a, AuthorityId: 'a, SealSignature: 'a> { /// Reference to `DigestItem::AuthoritiesChange`. AuthoritiesChange(&'a [AuthorityId]), /// Reference to `DigestItem::ChangesTrieRoot`. ChangesTrieRoot(&'a Hash), - /// A deprecated sealed signature for testing - #[deprecated] - Seal(&'a u64, &'a SealSignature), - /// A sealed signature for testing - Consensus(&'a ConsensusEngineId, &'a [u8]), + /// A message from the runtime to the consensus engine. This should *never* + /// be generated by the native code of any consensus engine, but this is not + /// checked (yet). + Consensus(&'a ConsensusEngineId, &'a Vec), + /// Put a Seal on it. This is only used by native code, and is never seen + /// by runtimes. + Seal(&'a ConsensusEngineId, &'a SealSignature), + /// A pre-runtime digest. + /// + /// These are messages from the consensus engine to the runtime, although + /// the consensus engine can (and should) read them itself to avoid + /// code and state duplication. It is erroneous for a runtime to produce + /// these, but this is not (yet) checked. + PreRuntime(&'a ConsensusEngineId, &'a Vec), /// Any 'non-system' digest item, opaque to the native code. - /// Reference to `DigestItem::Other`. - Other(&'a [u8]), + Other(&'a Vec), } /// Type of the digest item. Used to gain explicit control over `DigestItem` encoding @@ -123,8 +252,9 @@ enum DigestItemType { Other = 0, AuthoritiesChange = 1, ChangesTrieRoot = 2, - Seal = 3, Consensus = 4, + Seal = 5, + PreRuntime = 6, } impl DigestItem { @@ -137,13 +267,13 @@ impl DigestItem(&'a self) -> DigestItemRef<'a, Hash, AuthorityId, SealSignature> { match *self { DigestItem::AuthoritiesChange(ref v) => DigestItemRef::AuthoritiesChange(v), DigestItem::ChangesTrieRoot(ref v) => DigestItemRef::ChangesTrieRoot(v), - DigestItem::Seal(ref v, ref s) => DigestItemRef::Seal(v, s), DigestItem::Consensus(ref v, ref s) => DigestItemRef::Consensus(v, s), + DigestItem::Seal(ref v, ref s) => DigestItemRef::Seal(v, s), + DigestItem::PreRuntime(ref v, ref s) => DigestItemRef::PreRuntime(v, s), DigestItem::Other(ref v) => DigestItemRef::Other(v), } } @@ -164,6 +294,10 @@ impl< fn as_changes_trie_root(&self) -> Option<&Self::Hash> { self.dref().as_changes_trie_root() } + + fn as_pre_runtime(&self) -> Option<(ConsensusEngineId, &[u8])> { + self.dref().as_pre_runtime() + } } impl Encode for DigestItem { @@ -183,14 +317,18 @@ impl Decode for Digest DigestItemType::ChangesTrieRoot => Some(DigestItem::ChangesTrieRoot( Decode::decode(input)?, )), - DigestItemType::Seal => { - let vals: (u64, SealSignature) = Decode::decode(input)?; - Some(DigestItem::Seal(vals.0, vals.1)) - }, DigestItemType::Consensus => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; Some(DigestItem::Consensus(vals.0, vals.1)) } + DigestItemType::Seal => { + let vals: (ConsensusEngineId, SealSignature) = Decode::decode(input)?; + Some(DigestItem::Seal(vals.0, vals.1)) + }, + DigestItemType::PreRuntime => { + let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; + Some(DigestItem::PreRuntime(vals.0, vals.1)) + }, DigestItemType::Other => Some(DigestItem::Other( Decode::decode(input)?, )), @@ -214,9 +352,16 @@ impl<'a, Hash: Codec + Member, AuthorityId: Codec + Member, SealSignature: Codec _ => None, } } + + /// Cast this digest item into `PreRuntime` + pub fn as_pre_runtime(&self) -> Option<(ConsensusEngineId, &'a [u8])> { + match *self { + DigestItemRef::PreRuntime(consensus_engine_id, ref data) => Some((*consensus_engine_id, data)), + _ => None, + } + } } -#[allow(deprecated)] impl<'a, Hash: Encode, AuthorityId: Encode, SealSignature: Encode> Encode for DigestItemRef<'a, Hash, AuthorityId, SealSignature> { fn encode(&self) -> Vec { let mut v = Vec::new(); @@ -230,13 +375,17 @@ impl<'a, Hash: Encode, AuthorityId: Encode, SealSignature: Encode> Encode for Di DigestItemType::ChangesTrieRoot.encode_to(&mut v); changes_trie_root.encode_to(&mut v); }, + DigestItemRef::Consensus(val, data) => { + DigestItemType::Consensus.encode_to(&mut v); + (val, data).encode_to(&mut v); + }, DigestItemRef::Seal(val, sig) => { DigestItemType::Seal.encode_to(&mut v); (val, sig).encode_to(&mut v); }, - DigestItemRef::Consensus(val, sig) => { - DigestItemType::Consensus.encode_to(&mut v); - (val, sig).encode_to(&mut v); + DigestItemRef::PreRuntime(val, data) => { + DigestItemType::PreRuntime.encode_to(&mut v); + (val, data).encode_to(&mut v); }, DigestItemRef::Other(val) => { DigestItemType::Other.encode_to(&mut v); @@ -254,20 +403,19 @@ mod tests { use substrate_primitives::hash::H512 as Signature; #[test] - #[allow(deprecated)] fn should_serialize_digest() { let digest = Digest { logs: vec![ DigestItem::AuthoritiesChange(vec![1]), DigestItem::ChangesTrieRoot(4), - DigestItem::Seal(1, Signature::from_low_u64_be(15)), DigestItem::Other(vec![1, 2, 3]), + DigestItem::Seal(Default::default(), Signature::default()) ], }; assert_eq!( ::serde_json::to_string(&digest).unwrap(), - r#"{"logs":["0x010401000000","0x0204000000","0x0301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f","0x000c010203"]}"# + "{\"logs\":[\"0x010401000000\",\"0x0204000000\",\"0x000c010203\",\"0x050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"]}", ); } } diff --git a/core/sr-primitives/src/generic/era.rs b/core/sr-primitives/src/generic/era.rs index 22f47b6769df403549da754d50c115065b892367..c41d3eedfc24ecb7c64906ce67778618e87faad8 100644 --- a/core/sr-primitives/src/generic/era.rs +++ b/core/sr-primitives/src/generic/era.rs @@ -21,7 +21,10 @@ use serde::{Serialize, Deserialize}; use crate::codec::{Decode, Encode, Input, Output}; +/// Era period pub type Period = u64; + +/// Era phase pub type Phase = u64; /// An era to describe the longevity of a transaction. diff --git a/core/sr-primitives/src/generic/header.rs b/core/sr-primitives/src/generic/header.rs index efcc7614ed7c8e725f57796691b2ba3bf5c5ed4a..fa94d97c64c4cd25562955ef3d8444d0482c4bb9 100644 --- a/core/sr-primitives/src/generic/header.rs +++ b/core/sr-primitives/src/generic/header.rs @@ -18,9 +18,12 @@ #[cfg(feature = "std")] use serde::Serialize; +#[cfg(feature = "std")] +use log::debug; use crate::codec::{Decode, Encode, Codec, Input, Output, HasCompact, EncodeAsRef}; use crate::traits::{self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, - Hash as HashT, DigestItem as DigestItemT, MaybeSerializeDebug, MaybeSerializeDebugButNotDeserialize}; + Hash as HashT, DigestItem as DigestItemT, MaybeSerializeDebug, + MaybeSerializeDebugButNotDeserialize}; use crate::generic::Digest; /// Abstraction over a block header for a substrate chain. @@ -107,22 +110,29 @@ impl traits::Header for Header &Self::Digest { &self.digest } + + #[cfg(feature = "std")] + fn digest_mut(&mut self) -> &mut Self::Digest { + debug!(target: "header", "Retrieving mutable reference to digest"); + &mut self.digest + } + + #[cfg(not(feature = "std"))] fn digest_mut(&mut self) -> &mut Self::Digest { &mut self.digest } - fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, - digest: Self::Digest + digest: Self::Digest, ) -> Self { Header { number, extrinsics_root, state_root, parent_hash, - digest + digest, } } } diff --git a/core/sr-primitives/src/generic/mod.rs b/core/sr-primitives/src/generic/mod.rs index 47ce3cb25184f7b2c44d4cb1d4837247d981027f..d9c53c5fd4b27f344920e7a42baa5578256a30e4 100644 --- a/core/sr-primitives/src/generic/mod.rs +++ b/core/sr-primitives/src/generic/mod.rs @@ -32,11 +32,13 @@ mod tests; pub use self::unchecked_extrinsic::UncheckedExtrinsic; pub use self::unchecked_mortal_extrinsic::UncheckedMortalExtrinsic; pub use self::unchecked_mortal_compact_extrinsic::UncheckedMortalCompactExtrinsic; -pub use self::era::Era; +pub use self::era::{Era, Phase}; pub use self::checked_extrinsic::CheckedExtrinsic; pub use self::header::Header; pub use self::block::{Block, SignedBlock, BlockId}; -pub use self::digest::{Digest, DigestItem, DigestItemRef}; +pub use self::digest::{ + Digest, DigestItem, DigestItemRef, ConsensusDigest, RuntimeDigest, SystemDigest, +}; use crate::codec::Encode; use rstd::prelude::*; @@ -44,15 +46,15 @@ use rstd::prelude::*; fn encode_with_vec_prefix)>(encoder: F) -> Vec { let size = ::rstd::mem::size_of::(); let reserve = match size { - 0...0b00111111 => 1, - 0...0b00111111_11111111 => 2, + 0..=0b00111111 => 1, + 0..=0b00111111_11111111 => 2, _ => 4, }; let mut v = Vec::with_capacity(reserve + size); v.resize(reserve, 0); encoder(&mut v); - // need to prefix with the total length to ensure it's binary comptible with + // need to prefix with the total length to ensure it's binary compatible with // Vec. let mut length: Vec<()> = Vec::new(); length.resize(v.len() - reserve, ()); diff --git a/core/sr-primitives/src/generic/tests.rs b/core/sr-primitives/src/generic/tests.rs index 91fc8f3faf90486b67174463e2993a73caa10ac9..b42c05ea4cd4293960a241fd2f325df074bb28f2 100644 --- a/core/sr-primitives/src/generic/tests.rs +++ b/core/sr-primitives/src/generic/tests.rs @@ -27,7 +27,7 @@ fn system_digest_item_encoding() { assert_eq!(encoded, vec![ // type = DigestItemType::AuthoritiesChange 1, - // number of items in athorities set + // number of items in authorities set 12, // authorities 10, 0, 0, 0, diff --git a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs index ea9dad2a5023b5f09eb4b2cfe5a99d39848a61e6..36e17fc277cdeed0ef742cb1da20e3203263739e 100644 --- a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs @@ -22,8 +22,8 @@ use std::fmt; use rstd::prelude::*; use runtime_io::blake2_256; use crate::codec::{Decode, Encode, Input, Compact}; -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, Lookup, - Checkable, Extrinsic}; +use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, + Lookup, Checkable, Extrinsic, SaturatedConversion}; use super::{CheckedExtrinsic, Era}; const TRANSACTION_VERSION: u8 = 1; @@ -84,7 +84,8 @@ where fn check(self, context: &Context) -> Result { Ok(match self.signature { Some((signed, signature, index, era)) => { - let h = context.block_number_to_hash(BlockNumber::sa(era.birth(context.current_height().as_()))) + let current_u64 = context.current_height().saturated_into::(); + let h = context.block_number_to_hash(era.birth(current_u64).saturated_into()) .ok_or("transaction birth block ancient")?; let signed = context.lookup(signed)?; let raw_payload = (index, self.function, era, h); diff --git a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs index a91f4461fffa2796942524e4087c45ceec06b161..7f92b20edd0c3143e3b35d1dc47327d9f575ec62 100644 --- a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs @@ -22,8 +22,10 @@ use std::fmt; use rstd::prelude::*; use runtime_io::blake2_256; use crate::codec::{Decode, Encode, Input}; -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, Lookup, - Checkable, Extrinsic}; +use crate::traits::{ + self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, + Lookup, Checkable, Extrinsic, SaturatedConversion +}; use super::{CheckedExtrinsic, Era}; const TRANSACTION_VERSION: u8 = 1; @@ -83,7 +85,8 @@ where fn check(self, context: &Context) -> Result { Ok(match self.signature { Some((signed, signature, index, era)) => { - let h = context.block_number_to_hash(BlockNumber::sa(era.birth(context.current_height().as_()))) + let current_u64 = context.current_height().saturated_into::(); + let h = context.block_number_to_hash(era.birth(current_u64).saturated_into()) .ok_or("transaction birth block ancient")?; let signed = context.lookup(signed)?; let raw_payload = (index, self.function, era, h); diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 07fdc135b690e2f7fe4272136f1e9d0ca2bc53e8..5ad12376fc77e00d9be51c92cfe71e78c3688abb 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -25,6 +25,8 @@ pub use parity_codec as codec; #[cfg(feature = "std")] #[doc(hidden)] pub use serde; +#[doc(hidden)] +pub use rstd; #[cfg(feature = "std")] #[doc(hidden)] @@ -33,17 +35,16 @@ pub use paste; #[cfg(feature = "std")] pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; -use rstd::prelude::*; +use rstd::{prelude::*, ops}; use substrate_primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; use codec::{Encode, Decode}; -#[cfg(feature = "std")] -use substrate_primitives::hexdisplay::ascii_format; - #[cfg(feature = "std")] pub mod testing; pub mod traits; +use traits::{SaturatedConversion, UniqueSaturatedInto}; + pub mod generic; pub mod transaction_validity; @@ -122,7 +123,6 @@ impl BuildStorage for StorageOverlay { fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { Ok((self, Default::default())) } - fn assimilate_storage( self, storage: &mut StorageOverlay, @@ -133,6 +133,22 @@ impl BuildStorage for StorageOverlay { } } +#[cfg(feature = "std")] +impl BuildStorage for (StorageOverlay, ChildrenStorageOverlay) { + fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { + Ok(self) + } + fn assimilate_storage( + self, + storage: &mut StorageOverlay, + child_storage: &mut ChildrenStorageOverlay + )-> Result<(), String> { + storage.extend(self.0); + child_storage.extend(self.1); + Ok(()) + } +} + /// Consensus engine unique ID. pub type ConsensusEngineId = [u8; 4]; @@ -142,24 +158,55 @@ pub type ConsensusEngineId = [u8; 4]; pub struct Permill(u32); impl Permill { - /// Wraps the argument into `Permill` type. - pub fn from_millionths(x: u32) -> Permill { Permill(x) } + /// Nothing. + pub fn zero() -> Self { Self(0) } + + /// `true` if this is nothing. + pub fn is_zero(&self) -> bool { self.0 == 0 } + + /// Everything. + pub fn one() -> Self { Self(1_000_000) } + + /// From an explicitly defined number of parts per maximum of the type. + pub fn from_parts(x: u32) -> Self { Self(x.min(1_000_000)) } - /// Converts percents into `Permill`. - pub fn from_percent(x: u32) -> Permill { Permill(x * 10_000) } + /// Converts from a percent. Equal to `x / 100`. + pub fn from_percent(x: u32) -> Self { Self(x.min(100) * 10_000) } /// Converts a fraction into `Permill`. #[cfg(feature = "std")] - pub fn from_fraction(x: f64) -> Permill { Permill((x * 1_000_000.0) as u32) } + pub fn from_fraction(x: f64) -> Self { Self((x * 1_000_000.0) as u32) } } -impl ::rstd::ops::Mul for Permill +impl ops::Mul for Permill where - N: traits::As + N: Clone + From + UniqueSaturatedInto + ops::Rem + + ops::Div + ops::Mul + ops::Add, { type Output = N; fn mul(self, b: N) -> Self::Output { - >::sa(b.as_().saturating_mul(self.0 as u64) / 1_000_000) + let million: N = 1_000_000.into(); + let part: N = self.0.into(); + + let rem_multiplied_divided = { + let rem = b.clone().rem(million.clone()); + + // `rem` is inferior to one million, thus it fits into u32 + let rem_u32 = rem.saturated_into::(); + + // `self` and `rem` are inferior to one million, thus the product is less than 10^12 + // and fits into u64 + let rem_multiplied_u64 = rem_u32 as u64 * self.0 as u64; + + // `rem_multiplied_u64` is less than 10^12 therefore divided by a million it fits into + // u32 + let rem_multiplied_divided_u32 = (rem_multiplied_u64 / 1_000_000) as u32; + + // `rem_multiplied_divided` is inferior to b, thus it can be converted back to N type + rem_multiplied_divided_u32.into() + }; + + (b / million) * part + rem_multiplied_divided } } @@ -201,39 +248,57 @@ pub struct Perbill(u32); impl Perbill { /// Nothing. - pub fn zero() -> Perbill { Perbill(0) } + pub fn zero() -> Self { Self(0) } /// `true` if this is nothing. pub fn is_zero(&self) -> bool { self.0 == 0 } /// Everything. - pub fn one() -> Perbill { Perbill(1_000_000_000) } + pub fn one() -> Self { Self(1_000_000_000) } - /// Construct new instance where `x` is in billionths. Value equivalent to `x / 1,000,000,000`. - pub fn from_billionths(x: u32) -> Perbill { Perbill(x.min(1_000_000_000)) } + /// From an explicitly defined number of parts per maximum of the type. + pub fn from_parts(x: u32) -> Self { Self(x.min(1_000_000_000)) } - /// Construct new instance where `x` is in millionths. Value equivalent to `x / 1,000,000`. - pub fn from_millionths(x: u32) -> Perbill { Perbill(x.min(1_000_000) * 1000) } + /// Converts from a percent. Equal to `x / 100`. + pub fn from_percent(x: u32) -> Self { Self(x.min(100) * 10_000_000) } - /// Construct new instance where `x` is a percent. Value equivalent to `x%`. - pub fn from_percent(x: u32) -> Perbill { Perbill(x.min(100) * 10_000_000) } + /// Construct new instance where `x` is in millionths. Value equivalent to `x / 1,000,000`. + pub fn from_millionths(x: u32) -> Self { Self(x.min(1_000_000) * 1000) } #[cfg(feature = "std")] /// Construct new instance whose value is equal to `x` (between 0 and 1). - pub fn from_fraction(x: f64) -> Perbill { Perbill((x.max(0.0).min(1.0) * 1_000_000_000.0) as u32) } - - #[cfg(feature = "std")] - /// Construct new instance whose value is equal to `n / d` (between 0 and 1). - pub fn from_rational(n: f64, d: f64) -> Perbill { Perbill(((n / d).max(0.0).min(1.0) * 1_000_000_000.0) as u32) } + pub fn from_fraction(x: f64) -> Self { Self((x.max(0.0).min(1.0) * 1_000_000_000.0) as u32) } } -impl ::rstd::ops::Mul for Perbill +impl ops::Mul for Perbill where - N: traits::As + N: Clone + From + UniqueSaturatedInto + ops::Rem + + ops::Div + ops::Mul + ops::Add, { type Output = N; fn mul(self, b: N) -> Self::Output { - >::sa(b.as_().saturating_mul(self.0 as u64) / 1_000_000_000) + let billion: N = 1_000_000_000.into(); + let part: N = self.0.into(); + + let rem_multiplied_divided = { + let rem = b.clone().rem(billion.clone()); + + // `rem` is inferior to one billion, thus it fits into u32 + let rem_u32 = rem.saturated_into::(); + + // `self` and `rem` are inferior to one billion, thus the product is less than 10^18 + // and fits into u64 + let rem_multiplied_u64 = rem_u32 as u64 * self.0 as u64; + + // `rem_multiplied_u64` is less than 10^18 therefore divided by a billion it fits into + // u32 + let rem_multiplied_divided_u32 = (rem_multiplied_u64 / 1_000_000_000) as u32; + + // `rem_multiplied_divided` is inferior to b, thus it can be converted back to N type + rem_multiplied_divided_u32.into() + }; + + (b / billion) * part + rem_multiplied_divided } } @@ -279,11 +344,14 @@ impl PerU128 { /// Nothing. pub fn zero() -> Self { Self(0) } + /// `true` if this is nothing. + pub fn is_zero(&self) -> bool { self.0 == 0 } + /// Everything. pub fn one() -> Self { Self(U128) } - /// Construct new instance where `x` is parts in u128::max_value. Equal to x/U128::max_value. - pub fn from_max_value(x: u128) -> Self { Self(x) } + /// From an explicitly defined number of parts per maximum of the type. + pub fn from_parts(x: u128) -> Self { Self(x) } /// Construct new instance where `x` is denominator and the nominator is 1. pub fn from_xth(x: u128) -> Self { Self(U128/x.max(1)) } @@ -293,8 +361,8 @@ impl ::rstd::ops::Deref for PerU128 { type Target = u128; fn deref(&self) -> &u128 { - &self.0 - } + &self.0 + } } impl codec::CompactAs for PerU128 { @@ -615,6 +683,69 @@ macro_rules! impl_outer_config { } } +// NOTE [`PreRuntime` and `Consensus` are special] +// +// We MUST treat `PreRuntime` and `Consensus` variants specially, as they: +// +// * have more parameters (both in `generic::DigestItem` and in runtimes) +// * have a `PhantomData` parameter in the runtime, but not in `generic::DigestItem` + +#[macro_export] +#[doc(hidden)] +macro_rules! __parse_pattern_2 { + (PreRuntime $module:ident $variant:ident $internal:ident $v1:ident $v2:ident) => { + $internal::$variant($module::RawLog::PreRuntime(ref $v1, ref $v2, $crate::rstd::marker::PhantomData)) + }; + (Consensus $module:ident $variant:ident $internal:ident $v1:ident $v2:ident) => { + $internal::$variant($module::RawLog::Consensus(ref $v1, ref $v2, $crate::rstd::marker::PhantomData)) + }; + ($name:ident $module:ident $variant:ident $internal:ident $v1:ident $v2:ident) => { + $internal::$variant($module::RawLog::$name(ref $v1)) + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __parse_pattern { + (PreRuntime $engine_id:pat, $binder:pat) => { + $crate::generic::DigestItem::PreRuntime($engine_id, $binder) + }; + (Consensus $engine_id:pat, $binder:pat) => { + $crate::generic::DigestItem::Consensus($engine_id, $binder) + }; + ($name:ident $engine_id:pat, $binder:pat) => { + $crate::generic::DigestItem::$name($binder) + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __parse_expr { + (PreRuntime $engine_id:expr, $module:ident $variant:ident $internal:ident $binder:expr) => { + $internal::$variant($module::RawLog::PreRuntime($engine_id, $binder, Default::default())) + }; + (Consensus $engine_id:expr, $module:ident $variant:ident $internal:ident $binder:expr) => { + $internal::$variant($module::RawLog::Consensus($engine_id, $binder, Default::default())) + }; + ($name:ident $engine_id:expr, $module:ident $variant:ident $internal:ident $binder:expr) => { + $internal::$variant($module::RawLog::$name($binder)) + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __parse_expr_2 { + (PreRuntime $module:ident $internal:ident $v1:ident $v2:ident) => { + $crate::generic::DigestItemRef::PreRuntime($v1, $v2) + }; + (Consensus $module:ident $internal:ident $v1:ident $v2:ident) => { + $crate::generic::DigestItemRef::Consensus($v1, $v2) + }; + ($name:ident $module:ident $internal:ident $v1:ident $v2:ident) => { + $crate::generic::DigestItemRef::$name($v1) + }; +} + /// Generates enum that contains all possible log entries for the runtime. /// Every individual module of the runtime that is mentioned, must /// expose a `Log` and `RawLog` enums. @@ -667,15 +798,12 @@ macro_rules! impl_outer_log { fn dref<'a>(&'a self) -> Option<$crate::generic::DigestItemRef<'a, $($genarg),*>> { match &self.0 { $( - $internal::[< $module $( _ $instance )? >] (item) => { - match item { - $( - $module::RawLog::$sitem(ref v) => - Some($crate::generic::DigestItemRef::$sitem(v)), - )* - _ => None, - } - } + $( + $crate::__parse_pattern_2!( + $sitem $module [< $module $( _ $instance )? >] $internal a b + ) => + Some($crate::__parse_expr_2!($sitem $module $internal a b)), + )* )* _ => None, } @@ -697,23 +825,37 @@ macro_rules! impl_outer_log { } } - impl From<$crate::generic::DigestItem<$($genarg),*>> for $name { - /// Converts `generic::DigestItem` into `$name`. If `generic::DigestItem` represents - /// a system item which is supported by the runtime, it is returned. - /// Otherwise we expect a `Other` log item. Trying to convert from anything other - /// will lead to panic in runtime, since the runtime does not supports this 'system' - /// log item. - #[allow(unreachable_patterns)] - fn from(gen: $crate::generic::DigestItem<$($genarg),*>) -> Self { - $crate::impl_outer_log! { - @GEN_FROM_DIGESTITEM_MATCH - gen - $name - $internal - {} + fn as_pre_runtime(&self) -> Option<($crate::ConsensusEngineId, &[u8])> { + self.dref().and_then(|dref| dref.as_pre_runtime()) + } + } + + impl From<$crate::generic::DigestItem<$($genarg),*>> for $name { + #[allow(unreachable_patterns)] + fn from(gen: $crate::generic::DigestItem<$($genarg),*>) -> Self { + match gen { + $( $( - $module $( $instance )? { $( $sitem ),* }; + $crate::__parse_pattern!($sitem b, a) => + $name( + $crate::__parse_expr!( + $sitem b, $module [< $module $( _ $instance )? >] $internal a + ) + ), )* + )* + _ => { + if let Some(s) = gen.as_other() + .and_then(|value| $crate::codec::Decode::decode(&mut &value[..])) + .map($name) + { + s + } else { + panic!( + "We only reach here if the runtime did not handle a digest; \ + runtimes are required to handle all digests they receive; qed" + ) + } } } } @@ -758,78 +900,6 @@ macro_rules! impl_outer_log { )* } }; - // With Instance - (@GEN_FROM_DIGESTITEM_MATCH - $gen:ident - $name:ident - $internal:ident - { $( $generated:tt )* } - $module:ident $instance:ident { $( $sitem:ident ),* }; - $( $impl_outer_log_match_instance_rest:tt )* - ) => { - $crate::impl_outer_log! { - @GEN_FROM_DIGESTITEM_MATCH - $gen - $name - $internal - { - $( $generated )* - $( - $crate::generic::DigestItem::$sitem(value) => - $name( - $internal::[< $module _ $instance >]( - $module::RawLog::$sitem(value) - ) - ), - )* - } - $( $impl_outer_log_match_instance_rest )* - } - }; - // Without Instance - (@GEN_FROM_DIGESTITEM_MATCH - $gen:ident - $name:ident - $internal:ident - { $( $generated:tt )* } - $module:ident { $( $sitem:ident ),* }; - $( $impl_outer_log_match_rest:tt )* - ) => { - $crate::impl_outer_log! { - @GEN_FROM_DIGESTITEM_MATCH - $gen - $name - $internal - { - $( $generated )* - $( - $crate::generic::DigestItem::$sitem(value) => - $name( - $internal::$module( - $module::RawLog::$sitem(value) - ) - ), - )* - } - $( $impl_outer_log_match_rest )* - } - }; - // Final step, generate match - (@GEN_FROM_DIGESTITEM_MATCH - $gen:ident - $name:ident - $internal:ident - { $( $generated:tt )* } - ) => { - match $gen { - $( $generated )* - _ => $gen.as_other() - .and_then(|value| $crate::codec::Decode::decode(&mut &value[..])) - .map($name) - .expect("not allowed to fail in runtime"), - } - }; - } /// Simple blob to hold an extrinsic without committing to its format and ensure it is serialized @@ -899,6 +969,24 @@ mod tests { } } + macro_rules! per_thing_mul_upper_test { + ($num_type:tt, $per:tt) => { + // all sort of from_percent + assert_eq!($per::from_percent(100) * $num_type::max_value(), $num_type::max_value()); + assert_eq!( + $per::from_percent(99) * $num_type::max_value(), + ((Into::::into($num_type::max_value()) * 99u32) / 100u32).as_u128() as $num_type + ); + assert_eq!($per::from_percent(50) * $num_type::max_value(), $num_type::max_value() / 2); + assert_eq!($per::from_percent(1) * $num_type::max_value(), $num_type::max_value() / 100); + assert_eq!($per::from_percent(0) * $num_type::max_value(), 0); + + // bounds + assert_eq!($per::one() * $num_type::max_value(), $num_type::max_value()); + assert_eq!($per::zero() * $num_type::max_value(), 0); + } + } + #[test] fn impl_outer_log_works() { // encode/decode regular item @@ -980,8 +1068,36 @@ mod tests { } #[test] - fn saturating_mul() { - assert_eq!(super::Perbill::one() * std::u64::MAX, std::u64::MAX/1_000_000_000); - assert_eq!(super::Permill::from_percent(100) * std::u64::MAX, std::u64::MAX/1_000_000); + fn per_things_should_work() { + use super::{Perbill, Permill}; + use primitive_types::U256; + + per_thing_mul_upper_test!(u32, Perbill); + per_thing_mul_upper_test!(u64, Perbill); + per_thing_mul_upper_test!(u128, Perbill); + + per_thing_mul_upper_test!(u32, Permill); + per_thing_mul_upper_test!(u64, Permill); + per_thing_mul_upper_test!(u128, Permill); + } + + #[test] + fn per_things_operate_in_output_type() { + assert_eq!(super::Perbill::one() * 255_u64, 255); + } + + #[test] + fn per_things_one_minus_one_part() { + use primitive_types::U256; + + assert_eq!( + super::Perbill::from_parts(999_999_999) * std::u128::MAX, + ((Into::::into(std::u128::MAX) * 999_999_999u32) / 1_000_000_000u32).as_u128() + ); + + assert_eq!( + super::Permill::from_parts(999_999) * std::u128::MAX, + ((Into::::into(std::u128::MAX) * 999_999u32) / 1_000_000u32).as_u128() + ); } } diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index 763b68b180338c652b07c70e908ae2c2d2d13f01..18c65d011e657804401a374717b355e8af1616ae 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -23,7 +23,7 @@ use crate::traits::{self, Checkable, Applyable, BlakeTwo256, Convert}; use crate::generic::DigestItem as GenDigestItem; pub use substrate_primitives::H256; use substrate_primitives::U256; -use substrate_primitives::ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; +use substrate_primitives::sr25519::{Public as AuthorityId, Signature as AuthoritySignature}; /// Authority Id #[derive(Default, PartialEq, Eq, Clone, Encode, Decode, Debug)] @@ -107,21 +107,20 @@ impl traits::Header for Header { fn digest(&self) -> &Self::Digest { &self.digest } fn digest_mut(&mut self) -> &mut Self::Digest { &mut self.digest } - fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, - digest: Self::Digest + digest: Self::Digest, ) -> Self { Header { number, - extrinsics_root: extrinsics_root, + extrinsics_root, state_root, parent_hash, - digest + digest, } } } @@ -199,7 +198,10 @@ impl<'a, Xt> Deserialize<'a> for Block where Block: Decode { } } -/// Test transaction +/// Test transaction, tuple of (sender, index, call) +/// with index only used if sender is some. +/// +/// If sender is some then the transaction is signed otherwise it is unsigned. #[derive(PartialEq, Eq, Clone, Encode, Decode)] pub struct TestXt(pub Option, pub u64, pub Call); @@ -222,7 +224,7 @@ impl Checkable for TestXt { } impl traits::Extrinsic for TestXt { fn is_signed(&self) -> Option { - None + Some(self.0.is_some()) } } impl Applyable for TestXt where diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 3004a5e06974c25a57b88daf141a952041bdabc4..f412ede0afb9bf1bbf5591b471c4c97c73d51f3c 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -17,16 +17,17 @@ //! Primitives for the runtime modules. use rstd::prelude::*; -use rstd::{self, result, marker::PhantomData}; +use rstd::{self, result, marker::PhantomData, convert::{TryFrom, TryInto}}; use runtime_io; #[cfg(feature = "std")] use std::fmt::{Debug, Display}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize, de::DeserializeOwned}; use substrate_primitives::{self, Hasher, Blake2Hasher}; use crate::codec::{Codec, Encode, HasCompact}; +use crate::transaction_validity::TransactionValidity; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{ Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, - CheckedShl, CheckedShr, Saturating + CheckedShl, CheckedShr }; use rstd::ops::{ Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, @@ -72,7 +73,11 @@ pub trait EnsureOrigin { /// A return type. type Success; /// Perform the origin check. - fn ensure_origin(o: OuterOrigin) -> result::Result; + fn ensure_origin(o: OuterOrigin) -> result::Result { + Self::try_origin(o).map_err(|_| "Invalid origin") + } + /// Perform the origin check. + fn try_origin(o: OuterOrigin) -> result::Result; } /// Means of changing one type into another in a manner dependent on the source type. @@ -150,106 +155,149 @@ impl Convert for () { fn convert(_: A) -> B { Default::default() } } -/// A structure that converts the currency type into a lossy u64 -/// And back from u128 -pub struct CurrencyToVoteHandler; - -impl Convert for CurrencyToVoteHandler { - fn convert(x: u128) -> u64 { - if x >> 96 == 0 { - // Remove dust; divide by 2^32 - (x >> 32) as u64 - } else { - u64::max_value() - } - } -} - -impl Convert for CurrencyToVoteHandler { - fn convert(x: u128) -> u128 { - // if it practically fits in u64 - if x >> 64 == 0 { - // Add zero dust; multiply by 2^32 - x << 32 - } - else { - // 0000_0000_FFFF_FFFF_FFFF_FFFF_0000_0000 - (u64::max_value() << 32) as u128 - } - } -} - /// A structure that performs identity conversion. pub struct Identity; impl Convert for Identity { fn convert(a: T) -> T { a } } -/// Simple trait similar to `Into`, except that it can be used to convert numerics between each -/// other. -pub trait As { - /// Convert forward (ala `Into::into`). - fn as_(self) -> T; - /// Convert backward (ala `From::from`). - fn sa(_: T) -> Self; -} - -macro_rules! impl_numerics { - ( $( $t:ty ),* ) => { - $( - impl_numerics!($t: u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize,); - )* - }; - ( $f:ty : $t:ty, $( $rest:ty, )* ) => { - impl As<$t> for $f { - fn as_(self) -> $t { self as $t } - fn sa(t: $t) -> Self { t as Self } - } - impl_numerics!($f: $( $rest, )*); - }; - ( $f:ty : ) => {} -} - -impl_numerics!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize); - /// A meta trait for arithmetic. +/// +/// Arithmetic types do all the usual stuff you'd expect numbers to do. They are guaranteed to +/// be able to represent at least `u32` values without loss, hence the trait implies `From` +/// and smaller ints. All other conversions are fallible. pub trait SimpleArithmetic: - Zero + One + IntegerSquareRoot + As + + Zero + One + IntegerSquareRoot + + From + From + From + TryInto + TryInto + TryInto + + TryFrom + TryInto + TryFrom + TryInto + TryFrom + TryInto + + UniqueSaturatedInto + UniqueSaturatedInto + UniqueSaturatedInto + + UniqueSaturatedFrom + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + Div + DivAssign + Rem + RemAssign + Shl + Shr + - CheckedShl + - CheckedShr + - CheckedAdd + - CheckedSub + - CheckedMul + - CheckedDiv + - Saturating + - PartialOrd + Ord + Bounded + - HasCompact + CheckedShl + CheckedShr + CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + + Saturating + PartialOrd + Ord + Bounded + + HasCompact + Sized {} impl + + Zero + One + IntegerSquareRoot + + From + From + From + TryInto + TryInto + TryInto + + TryFrom + TryInto + TryFrom + TryInto + TryFrom + TryInto + + UniqueSaturatedInto + UniqueSaturatedInto + UniqueSaturatedInto + + UniqueSaturatedFrom + UniqueSaturatedInto + UniqueSaturatedFrom + + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + Div + DivAssign + Rem + RemAssign + Shl + Shr + - CheckedShl + - CheckedShr + - CheckedAdd + - CheckedSub + - CheckedMul + - CheckedDiv + - Saturating + - PartialOrd + Ord + Bounded + - HasCompact + CheckedShl + CheckedShr + CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + + Saturating + PartialOrd + Ord + Bounded + + HasCompact + Sized > SimpleArithmetic for T {} +/// Just like `From` except that if the source value is too big to fit into the destination type +/// then it'll saturate the destination. +pub trait UniqueSaturatedFrom: Sized { + /// Convert from a value of `T` into an equivalent instance of `Self`. + fn unique_saturated_from(t: T) -> Self; +} + +/// Just like `Into` except that if the source value is too big to fit into the destination type +/// then it'll saturate the destination. +pub trait UniqueSaturatedInto: Sized { + /// Consume self to return an equivalent value of `T`. + fn unique_saturated_into(self) -> T; +} + +impl + Bounded + Sized> UniqueSaturatedFrom for S { + fn unique_saturated_from(t: T) -> Self { + S::try_from(t).unwrap_or_else(|_| Bounded::max_value()) + } +} + +impl + Sized> UniqueSaturatedInto for S { + fn unique_saturated_into(self) -> T { + self.try_into().unwrap_or_else(|_| Bounded::max_value()) + } +} + +/// Simple trait to use checked mul and max value to give a saturated mul operation over +/// supported types. +pub trait Saturating { + /// Saturated addition - if the product can't fit in the type then just use max-value. + fn saturating_add(self, o: Self) -> Self; + + /// Saturated subtraction - if the product can't fit in the type then just use max-value. + fn saturating_sub(self, o: Self) -> Self; + + /// Saturated multiply - if the product can't fit in the type then just use max-value. + fn saturating_mul(self, o: Self) -> Self; +} + +impl Saturating for T { + fn saturating_add(self, o: Self) -> Self { + ::saturating_add(self, o) + } + fn saturating_sub(self, o: Self) -> Self { + ::saturating_sub(self, o) + } + fn saturating_mul(self, o: Self) -> Self { + self.checked_mul(&o).unwrap_or_else(Bounded::max_value) + } +} + +/// Convenience type to work around the highly unergonomic syntax needed +/// to invoke the functions of overloaded generic traits, in this case +/// `SaturatedFrom` and `SaturatedInto`. +pub trait SaturatedConversion { + /// Convert from a value of `T` into an equivalent instance of `Self`. + /// + /// This just uses `UniqueSaturatedFrom` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn saturated_from(t: T) -> Self where Self: UniqueSaturatedFrom { + >::unique_saturated_from(t) + } + + /// Consume self to return an equivalent value of `T`. + /// + /// This just uses `UniqueSaturatedInto` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn saturated_into(self) -> T where Self: UniqueSaturatedInto { + >::unique_saturated_into(self) + } +} +impl SaturatedConversion for T {} + +/// Convenience type to work around the highly unergonomic syntax needed +/// to invoke the functions of overloaded generic traits, in this case +/// `TryFrom` and `TryInto`. +pub trait CheckedConversion { + /// Convert from a value of `T` into an equivalent instance of `Option`. + /// + /// This just uses `TryFrom` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn checked_from(t: T) -> Option where Self: TryFrom { + >::try_from(t).ok() + } + /// Consume self to return `Some` equivalent value of `Option`. + /// + /// This just uses `TryInto` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn checked_into(self) -> Option where Self: TryInto { + >::try_into(self).ok() + } +} +impl CheckedConversion for T {} + /// Trait for things that can be clear (have no bits set). For numeric types, essentially the same /// as `Zero`. pub trait Clear { @@ -316,56 +364,39 @@ pub trait OffchainWorker { impl OffchainWorker for () {} macro_rules! tuple_impl { - ($one:ident,) => { - impl> OnFinalize for ($one,) { - fn on_finalize(n: Number) { - $one::on_finalize(n); - } - } - impl> OnInitialize for ($one,) { - fn on_initialize(n: Number) { - $one::on_initialize(n); - } - } - impl> OffchainWorker for ($one,) { - fn generate_extrinsics(n: Number) { - $one::generate_extrinsics(n); - } - } - }; ($first:ident, $($rest:ident,)+) => { + tuple_impl!([$first] [$first] [$($rest)+]); + }; + ([$($direct:ident)+] [$($reverse:ident)+] []) => { impl< Number: Copy, - $first: OnFinalize, - $($rest: OnFinalize),+ - > OnFinalize for ($first, $($rest),+) { + $($direct: OnFinalize),+ + > OnFinalize for ($($direct),+,) { fn on_finalize(n: Number) { - $first::on_finalize(n); - $($rest::on_finalize(n);)+ + $($reverse::on_finalize(n);)+ } } impl< Number: Copy, - $first: OnInitialize, - $($rest: OnInitialize),+ - > OnInitialize for ($first, $($rest),+) { + $($direct: OnInitialize),+ + > OnInitialize for ($($direct),+,) { fn on_initialize(n: Number) { - $first::on_initialize(n); - $($rest::on_initialize(n);)+ + $($direct::on_initialize(n);)+ } } impl< Number: Copy, - $first: OffchainWorker, - $($rest: OffchainWorker),+ - > OffchainWorker for ($first, $($rest),+) { + $($direct: OffchainWorker),+ + > OffchainWorker for ($($direct),+,) { fn generate_extrinsics(n: Number) { - $first::generate_extrinsics(n); - $($rest::generate_extrinsics(n);)+ + $($direct::generate_extrinsics(n);)+ } } - tuple_impl!($($rest,)+); - } + }; + ([$($direct:ident)+] [$($reverse:ident)+] [$first:ident $($rest:ident)*]) => { + tuple_impl!([$($direct)+] [$($reverse)+] []); + tuple_impl!([$($direct)+ $first] [$first $($reverse)+] [$($rest)*]); + }; } #[allow(non_snake_case)] @@ -408,7 +439,7 @@ pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stup fn storage_root() -> Self::Output; /// Acquire the global storage changes root. - fn storage_changes_root(parent_hash: Self::Output, parent_number: u64) -> Option; + fn storage_changes_root(parent_hash: Self::Output) -> Option; } /// Blake2-256 Hash implementation. @@ -441,8 +472,8 @@ impl Hash for BlakeTwo256 { fn storage_root() -> Self::Output { runtime_io::storage_root().into() } - fn storage_changes_root(parent_hash: Self::Output, parent_number: u64) -> Option { - runtime_io::storage_changes_root(parent_hash.into(), parent_number).map(Into::into) + fn storage_changes_root(parent_hash: Self::Output) -> Option { + runtime_io::storage_changes_root(parent_hash.into()).map(Into::into) } } @@ -614,8 +645,6 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebugButNotDe fn digest(&self) -> &Self::Digest; /// Get a mutable reference to the digest. fn digest_mut(&mut self) -> &mut Self::Digest; - /// Sets the digest. - fn set_digest(&mut self, digest: Self::Digest); /// Returns the hash of the header. fn hash(&self) -> Self::Hash { @@ -753,11 +782,14 @@ pub trait DigestItem: Codec + Member + MaybeSerializeDebugButNotDeserialize { /// `AuthorityChange` payload. type AuthorityId: Member + MaybeHash + crate::codec::Encode + crate::codec::Decode; - /// Returns Some if the entry is the `AuthoritiesChange` entry. + /// Returns `Some` if the entry is the `AuthoritiesChange` entry. fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]>; - /// Returns Some if the entry is the `ChangesTrieRoot` entry. + /// Returns `Some` if the entry is the `ChangesTrieRoot` entry. fn as_changes_trie_root(&self) -> Option<&Self::Hash>; + + /// Returns `Some` if this entry is the `PreRuntime` entry. + fn as_pre_runtime(&self) -> Option<(super::ConsensusEngineId, &[u8])>; } /// Auxiliary wrapper that holds an api instance and binds it to the given lifetime. @@ -777,6 +809,12 @@ impl<'a, T> rstd::ops::Deref for ApiRef<'a, T> { } } +impl<'a, T> rstd::ops::DerefMut for ApiRef<'a, T> { + fn deref_mut(&mut self) -> &mut T { + &mut self.0 + } +} + /// Something that provides a runtime api. pub trait ProvideRuntimeApi { /// The concrete type that provides the api. @@ -809,3 +847,17 @@ pub trait RuntimeApiInfo { /// The version of the runtime api. const VERSION: u32; } + +/// Something that can validate unsigned extrinsics. +pub trait ValidateUnsigned { + /// The call to validate + type Call; + + /// Return the validity of the call + /// + /// This doesn't execute any side-effects; it merely checks + /// whether the transaction would panic if it were included or not. + /// + /// Changes made to storage should be discarded by caller. + fn validate_unsigned(call: &Self::Call) -> TransactionValidity; +} diff --git a/core/sr-primitives/src/transaction_validity.rs b/core/sr-primitives/src/transaction_validity.rs index 7cf3aa1d6d6a1bb62f1f94a90ff523c48bdb4a28..f36599b67b42c35c52752ed9e9dfd3dee6e22e27 100644 --- a/core/sr-primitives/src/transaction_validity.rs +++ b/core/sr-primitives/src/transaction_validity.rs @@ -30,7 +30,7 @@ pub type TransactionLongevity = u64; pub type TransactionTag = Vec; /// Information on a transaction's validity and, if valid, on how it relates to other transactions. -#[derive(Clone, PartialEq, Eq, Encode, Decode)] +#[derive(Clone, PartialEq, Eq, Encode)] #[cfg_attr(feature = "std", derive(Debug))] pub enum TransactionValidity { /// Transaction is invalid. Details are described by the error code. @@ -49,9 +49,9 @@ pub enum TransactionValidity { requires: Vec, /// Provided tags /// - /// A list of tags this transaction provides. Successfuly importing the transaction + /// A list of tags this transaction provides. Successfully importing the transaction /// will enable other transactions that depend on (require) those tags to be included as well. - /// Provided and requried tags allow Substrate to build a dependency graph of transactions + /// Provided and required tags allow Substrate to build a dependency graph of transactions /// and import them in the right (linear) order. provides: Vec, /// Transaction longevity @@ -59,7 +59,74 @@ pub enum TransactionValidity { /// Longevity describes minimum number of blocks the validity is correct. /// After this period transaction should be removed from the pool or revalidated. longevity: TransactionLongevity, + /// A flag indicating if the transaction should be propagated to other peers. + /// + /// By setting `false` here the transaction will still be considered for + /// including in blocks that are authored on the current node, but will + /// never be sent to other peers. + propagate: bool, }, /// Transaction validity can't be determined. Unknown(i8), } + +impl Decode for TransactionValidity { + fn decode(value: &mut I) -> Option { + match value.read_byte()? { + 0 => Some(TransactionValidity::Invalid(i8::decode(value)?)), + 1 => { + let priority = TransactionPriority::decode(value)?; + let requires = Vec::decode(value)?; + let provides = Vec::decode(value)?; + let longevity = TransactionLongevity::decode(value)?; + let propagate = bool::decode(value).unwrap_or(true); + + Some(TransactionValidity::Valid { + priority, requires, provides, longevity, propagate, + }) + }, + 2 => Some(TransactionValidity::Unknown(i8::decode(value)?)), + _ => None, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn should_decode_with_backward_compat() { + let old_encoding = vec![ + 1, 5, 0, 0, 0, 0, 0, 0, 0, 4, 16, 1, 2, 3, 4, 4, 12, 4, 5, 6, 42, 0, 0, 0, 0, 0, 0, 0 + ]; + + assert_eq!(TransactionValidity::decode(&mut &*old_encoding), Some(TransactionValidity::Valid { + priority: 5, + requires: vec![vec![1, 2, 3, 4]], + provides: vec![vec![4, 5, 6]], + longevity: 42, + propagate: true, + })); + } + + #[test] + fn should_encode_and_decode() { + let v = TransactionValidity::Valid { + priority: 5, + requires: vec![vec![1, 2, 3, 4]], + provides: vec![vec![4, 5, 6]], + longevity: 42, + propagate: false, + }; + + let encoded = v.encode(); + assert_eq!( + encoded, + vec![1, 5, 0, 0, 0, 0, 0, 0, 0, 4, 16, 1, 2, 3, 4, 4, 12, 4, 5, 6, 42, 0, 0, 0, 0, 0, 0, 0, 0] + ); + + // decode back + assert_eq!(TransactionValidity::decode(&mut &*encoded), Some(v)); + } +} diff --git a/core/sr-sandbox/Cargo.toml b/core/sr-sandbox/Cargo.toml index eac21de9527a40712975a2f1a680f1eaced5e09a..f8d98253ad7143e083a4dc039d5da81f2a1f7224 100755 --- a/core/sr-sandbox/Cargo.toml +++ b/core/sr-sandbox/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sr-sandbox" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] build = "build.rs" edition = "2018" diff --git a/core/sr-sandbox/src/lib.rs b/core/sr-sandbox/src/lib.rs index e8bdd5727ea8795ea16efeae71426aecc014e73f..1e8b2b3f1df5e63f76012f7e642f8dd04422aabf 100755 --- a/core/sr-sandbox/src/lib.rs +++ b/core/sr-sandbox/src/lib.rs @@ -37,7 +37,6 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(core_intrinsics))] -#![cfg_attr(not(feature = "std"), feature(alloc))] use rstd::prelude::*; diff --git a/core/sr-sandbox/without_std.rs b/core/sr-sandbox/without_std.rs index 070ca1ddf15cfd9f08e9275f57cea6567c8b3e11..894ba43eb0ccc39795ef89590835591fcfd4d50d 100755 --- a/core/sr-sandbox/without_std.rs +++ b/core/sr-sandbox/without_std.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use rstd::prelude::*; -use rstd::{slice, marker, mem}; +use rstd::{slice, marker, mem, vec}; use rstd::rc::Rc; use codec::{Decode, Encode}; use primitives::sandbox as sandbox_primitives; diff --git a/core/sr-std/Cargo.toml b/core/sr-std/Cargo.toml index 2c4a63af1b88644ef5253700cfe6bdcc5f94bf91..2a8b7d37ca27295194b1139e07c8f5d85efc1fde 100644 --- a/core/sr-std/Cargo.toml +++ b/core/sr-std/Cargo.toml @@ -1,15 +1,16 @@ [package] name = "sr-std" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] build = "build.rs" edition = "2018" [build-dependencies] -rustc_version = "0.2" +rustc_version = "0.2.3" [features] default = ["std"] std = [] nightly = [] strict = [] +no_global_allocator = [] diff --git a/core/sr-std/src/lib.rs b/core/sr-std/src/lib.rs index 45857b33eda784a3107bc162a3c12c1b610d0342..b9874bcc2018d5e680fdf51025ffaa77165700ac 100644 --- a/core/sr-std/src/lib.rs +++ b/core/sr-std/src/lib.rs @@ -19,7 +19,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(core_intrinsics))] -#![cfg_attr(not(feature = "std"), feature(alloc))] #![cfg_attr(feature = "std", doc = "Substrate runtime standard library as compiled when linked with Rust's standard library.")] #![cfg_attr(not(feature = "std"), doc = "Substrate's runtime standard library as compiled without Rust's standard library.")] diff --git a/core/sr-std/with_std.rs b/core/sr-std/with_std.rs index 9d8a7342f38221b95a21ef4b534756c1a5e8bcc1..5824e26241675e80336a96bf7570f128b909ed88 100644 --- a/core/sr-std/with_std.rs +++ b/core/sr-std/with_std.rs @@ -19,6 +19,8 @@ pub use std::boxed; pub use std::cell; pub use std::clone; pub use std::cmp; +pub use std::convert; +pub use std::default; pub use std::fmt; pub use std::hash; pub use std::iter; @@ -28,11 +30,12 @@ pub use std::num; pub use std::ops; pub use std::ptr; pub use std::rc; +pub use std::result; pub use std::slice; +pub use std::str; pub use std::vec; -pub use std::default; -pub use std::result; pub mod collections { pub use std::collections::btree_map; + pub use std::collections::btree_set; } diff --git a/core/sr-std/without_std.rs b/core/sr-std/without_std.rs old mode 100644 new mode 100755 index b9287c00d5743d41cacaa7c93c1b1c89a9f91e58..db81372c2f0708e6f8e86ea171860f06efd2b539 --- a/core/sr-std/without_std.rs +++ b/core/sr-std/without_std.rs @@ -26,6 +26,7 @@ extern "C" { /// Wasm allocator pub struct WasmAllocator; +#[cfg(not(feature = "no_global_allocator"))] #[global_allocator] static ALLOCATOR: WasmAllocator = WasmAllocator; @@ -52,6 +53,8 @@ pub use core::borrow; pub use core::cell; pub use core::clone; pub use core::cmp; +pub use core::convert; +pub use core::default; pub use core::hash; pub use core::intrinsics; pub use core::iter; @@ -60,13 +63,15 @@ pub use core::mem; pub use core::num; pub use core::ops; pub use core::ptr; -pub use core::slice; -pub use core::default; pub use core::result; +pub use core::slice; +// Allow intepreting vectors of bytes as strings, but not constructing them. +pub use core::str; // We are trying to avoid certain things here, such as `core::string` // (if you need `String` you most probably doing something wrong, since // runtime doesn't require anything human readable). pub mod collections { pub use alloc::collections::btree_map; + pub use alloc::collections::btree_set; } diff --git a/core/sr-version/Cargo.toml b/core/sr-version/Cargo.toml index b35052e1091f2342c899731452aef52504a73cbc..b4810b8457d81271d44264f1cae48172b277d12c 100644 --- a/core/sr-version/Cargo.toml +++ b/core/sr-version/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sr-version" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/sr-version/src/lib.rs b/core/sr-version/src/lib.rs index 071b8934040609c4ef6d1fcd9556039064b66e74..179146cc8464d110cb0fab6d4cc53a0c63e0bc9d 100644 --- a/core/sr-version/src/lib.rs +++ b/core/sr-version/src/lib.rs @@ -19,7 +19,7 @@ #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] -use serde::Serialize; +use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] use std::fmt; #[cfg(feature = "std")] @@ -63,7 +63,7 @@ macro_rules! create_apis_vec { /// In particular: bug fixes should result in an increment of `spec_version` and possibly `authoring_version`, /// absolutely not `impl_version` since they change the semantics of the runtime. #[derive(Clone, PartialEq, Eq, Encode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Decode))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize, Decode))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] pub struct RuntimeVersion { /// Identifies the different Substrate runtimes. There'll be at least polkadot and node. diff --git a/core/state-db/Cargo.toml b/core/state-db/Cargo.toml index e283f72541bc0cbcf63dfe2f863979dd5be151a1..8c02dbc450fb82989e45f864ca710611d30ed0d5 100644 --- a/core/state-db/Cargo.toml +++ b/core/state-db/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "substrate-state-db" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.7.1" +parking_lot = "0.8.0" log = "0.4" primitives = { package = "substrate-primitives", path = "../../core/primitives" } parity-codec = { version = "3.3", features = ["derive"] } diff --git a/core/state-db/src/lib.rs b/core/state-db/src/lib.rs index 8d9cf9c965f5a21d1a9b0064de4c5ce1dc846055..8986dda32d7ca007a3c2e678e62faebf288ee0d5 100644 --- a/core/state-db/src/lib.rs +++ b/core/state-db/src/lib.rs @@ -37,7 +37,7 @@ use std::fmt; use parking_lot::RwLock; use parity_codec as codec; use codec::Codec; -use std::collections::HashSet; +use std::collections::{VecDeque, HashMap, hash_map::Entry}; use noncanonical::NonCanonicalOverlay; use pruning::RefWindow; use log::trace; @@ -78,6 +78,8 @@ pub enum Error { InvalidBlockNumber, /// Trying to insert block with unknown parent. InvalidParent, + /// Canonicalization would discard pinned state. + DiscardingPinned, } impl fmt::Debug for Error { @@ -88,6 +90,7 @@ impl fmt::Debug for Error { Error::InvalidBlock => write!(f, "Trying to canonicalize invalid block"), Error::InvalidBlockNumber => write!(f, "Trying to insert block with invalid number"), Error::InvalidParent => write!(f, "Trying to insert block with unknown parent"), + Error::DiscardingPinned => write!(f, "Trying to discard pinned state"), } } } @@ -112,7 +115,7 @@ pub struct CommitSet { } /// Pruning constraints. If none are specified pruning is -#[derive(Default, Debug, Clone)] +#[derive(Default, Debug, Clone, Eq, PartialEq)] pub struct Constraints { /// Maximum blocks. Defaults to 0 when unspecified, effectively keeping only non-canonical states. pub max_blocks: Option, @@ -121,7 +124,7 @@ pub struct Constraints { } /// Pruning mode. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Eq, PartialEq)] pub enum PruningMode { /// Maintain a pruning window. Constrained(Constraints), @@ -165,13 +168,14 @@ fn to_meta_key(suffix: &[u8], data: &S) -> Vec { struct StateDbSync { mode: PruningMode, non_canonical: NonCanonicalOverlay, + canonicalization_queue: VecDeque, pruning: Option>, - pinned: HashSet, + pinned: HashMap, } impl StateDbSync { pub fn new(mode: PruningMode, db: &D) -> Result, Error> { - trace!("StateDb settings: {:?}", mode); + trace!(target: "state-db", "StateDb settings: {:?}", mode); let non_canonical: NonCanonicalOverlay = NonCanonicalOverlay::new(db)?; let pruning: Option> = match mode { PruningMode::Constrained(Constraints { @@ -186,6 +190,7 @@ impl StateDbSync { non_canonical, pruning, pinned: Default::default(), + canonicalization_queue: Default::default(), }) } @@ -206,21 +211,30 @@ impl StateDbSync { } pub fn canonicalize_block(&mut self, hash: &BlockHash) -> Result, Error> { - let mut commit = match self.mode { - PruningMode::ArchiveAll => { - CommitSet::default() - }, - PruningMode::ArchiveCanonical => { - let mut commit = self.non_canonical.canonicalize(hash)?; - commit.data.deleted.clear(); - commit - }, - PruningMode::Constrained(_) => { - self.non_canonical.canonicalize(hash)? - }, - }; - if let Some(ref mut pruning) = self.pruning { - pruning.note_canonical(hash, &mut commit); + let mut commit = CommitSet::default(); + if self.mode == PruningMode::ArchiveAll { + return Ok(commit) + } + self.canonicalization_queue.push_back(hash.clone()); + while let Some(hash) = self.canonicalization_queue.front().cloned() { + if self.pinned.contains_key(&hash) { + break; + } + match self.non_canonical.canonicalize(&hash, &self.pinned, &mut commit) { + Ok(()) => { + self.canonicalization_queue.pop_front(); + if self.mode == PruningMode::ArchiveCanonical { + commit.data.deleted.clear(); + } + } + Err(Error::DiscardingPinned) => { + break; + } + Err(e) => return Err(e), + }; + if let Some(ref mut pruning) = self.pruning { + pruning.note_canonical(&hash, &mut commit); + } } self.prune(&mut commit); Ok(commit) @@ -255,7 +269,7 @@ impl StateDbSync { } let pinned = &self.pinned; - if pruning.next_hash().map_or(false, |h| pinned.contains(&h)) { + if pruning.next_hash().map_or(false, |h| pinned.contains_key(&h)) { break; } pruning.prune_one(commit); @@ -278,11 +292,23 @@ impl StateDbSync { } pub fn pin(&mut self, hash: &BlockHash) { - self.pinned.insert(hash.clone()); + trace!(target: "state-db", "Pinned block: {:?}", hash); + *self.pinned.entry(hash.clone()).or_default() += 1; } pub fn unpin(&mut self, hash: &BlockHash) { - self.pinned.remove(hash); + match self.pinned.entry(hash.clone()) { + Entry::Occupied(mut entry) => { + *entry.get_mut() -= 1; + if *entry.get() == 0 { + trace!(target: "state-db", "Unpinned block: {:?}", hash); + entry.remove(); + } else { + trace!(target: "state-db", "Releasing reference for {:?}", hash); + } + }, + Entry::Vacant(_) => {}, + } } pub fn get(&self, key: &Key, db: &D) -> Result, Error> diff --git a/core/state-db/src/noncanonical.rs b/core/state-db/src/noncanonical.rs index da957335ba30f4e7d59e5fe7f5eda6613b9943d7..0d43389a0be975f1f7b502536aedb0edc622d6ef 100644 --- a/core/state-db/src/noncanonical.rs +++ b/core/state-db/src/noncanonical.rs @@ -230,13 +230,20 @@ impl NonCanonicalOverlay { Ok(commit) } - fn discard_journals(&self, level_index: usize, discarded_journals: &mut Vec>, hash: &BlockHash) { + fn discard_journals( + &self, + level_index: usize, + discarded_journals: &mut Vec>, + discarded_blocks: &mut Vec, + hash: &BlockHash + ) { if let Some(level) = self.levels.get(level_index) { level.iter().for_each(|overlay| { let parent = self.parents.get(&overlay.hash).expect("there is a parent entry for each entry in levels; qed").clone(); if parent == *hash { discarded_journals.push(overlay.journal_key.clone()); - self.discard_journals(level_index + 1, discarded_journals, &overlay.hash); + discarded_blocks.push(overlay.hash.clone()); + self.discard_journals(level_index + 1, discarded_journals, discarded_blocks, &overlay.hash); } }); } @@ -268,7 +275,12 @@ impl NonCanonicalOverlay { /// Select a top-level root and canonicalized it. Discards all sibling subtrees and the root. /// Returns a set of changes that need to be added to the DB. - pub fn canonicalize(&mut self, hash: &BlockHash) -> Result, Error> { + pub fn canonicalize( + &mut self, + hash: &BlockHash, + pinned: &HashMap, + commit: &mut CommitSet, + ) -> Result<(), Error> { trace!(target: "state-db", "Canonicalizing {:?}", hash); let level = self.levels.get(self.pending_canonicalizations.len()).ok_or_else(|| Error::InvalidBlock)?; let index = level @@ -276,26 +288,40 @@ impl NonCanonicalOverlay { .position(|overlay| overlay.hash == *hash) .ok_or_else(|| Error::InvalidBlock)?; - let mut commit = CommitSet::default(); let mut discarded_journals = Vec::new(); - for (i, overlay) in level.into_iter().enumerate() { - if i == index { - // that's the one we need to canonicalize - commit.data.inserted = overlay.inserted.iter() - .map(|k| (k.clone(), self.values.get(k).expect("For each key in verlays there's a value in values").1.clone())) - .collect(); - commit.data.deleted = overlay.deleted.clone(); - } else { - self.discard_journals(self.pending_canonicalizations.len() + 1, &mut discarded_journals, &overlay.hash); + let mut discarded_blocks = Vec::new(); + for (i, overlay) in level.iter().enumerate() { + if i != index { + self.discard_journals( + self.pending_canonicalizations.len() + 1, + &mut discarded_journals, + &mut discarded_blocks, + &overlay.hash + ); } discarded_journals.push(overlay.journal_key.clone()); + discarded_blocks.push(overlay.hash.clone()); } + + for hash in discarded_blocks.into_iter() { + if pinned.contains_key(&hash) { + trace!(target: "state-db", "Refusing to discard pinned state {:?}", hash); + return Err(Error::DiscardingPinned) + } + } + + // get the one we need to canonicalize + let overlay = &level[index]; + commit.data.inserted.extend(overlay.inserted.iter() + .map(|k| (k.clone(), self.values.get(k).expect("For each key in overlays there's a value in values").1.clone()))); + commit.data.deleted.extend(overlay.deleted.clone()); + commit.meta.deleted.append(&mut discarded_journals); let canonicalized = (hash.clone(), self.front_block_number() + self.pending_canonicalizations.len() as u64); commit.meta.inserted.push((to_meta_key(LAST_CANONICAL, &()), canonicalized.encode())); trace!(target: "state-db", "Discarding {} records", commit.meta.deleted.len()); self.pending_canonicalizations.push(hash.clone()); - Ok(commit) + Ok(()) } fn apply_canonicalizations(&mut self) { @@ -385,10 +411,10 @@ impl NonCanonicalOverlay { #[cfg(test)] mod tests { - use std::io; + use std::{collections::HashMap, io}; use primitives::H256; use super::{NonCanonicalOverlay, to_journal_key}; - use crate::ChangeSet; + use crate::{ChangeSet, CommitSet}; use crate::test::{make_db, make_changeset}; fn contains(overlay: &NonCanonicalOverlay, key: u64) -> bool { @@ -409,7 +435,8 @@ mod tests { fn canonicalize_empty_panics() { let db = make_db(&[]); let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); - overlay.canonicalize::(&H256::default()).unwrap(); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&H256::default(), &HashMap::default(), &mut commit).unwrap(); } #[test] @@ -453,7 +480,8 @@ mod tests { let db = make_db(&[]); let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); overlay.insert::(&h1, 1, &H256::default(), ChangeSet::default()).unwrap(); - overlay.canonicalize::(&h2).unwrap(); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); } #[test] @@ -468,7 +496,8 @@ mod tests { assert_eq!(insertion.meta.inserted.len(), 2); assert_eq!(insertion.meta.deleted.len(), 0); db.commit(&insertion); - let finalization = overlay.canonicalize::(&h1).unwrap(); + let mut finalization = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut finalization).unwrap(); assert_eq!(finalization.data.inserted.len(), changeset.inserted.len()); assert_eq!(finalization.data.deleted.len(), changeset.deleted.len()); assert_eq!(finalization.meta.inserted.len(), 1); @@ -501,7 +530,9 @@ mod tests { let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); db.commit(&overlay.insert::(&h1, 10, &H256::default(), make_changeset(&[3, 4], &[2])).unwrap()); db.commit(&overlay.insert::(&h2, 11, &h1, make_changeset(&[5], &[3])).unwrap()); - db.commit(&overlay.canonicalize::(&h1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); @@ -526,7 +557,9 @@ mod tests { assert!(contains(&overlay, 5)); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 2); - db.commit(&overlay.canonicalize::(&h1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); assert!(contains(&overlay, 5)); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 2); @@ -535,7 +568,9 @@ mod tests { assert_eq!(overlay.parents.len(), 1); assert!(!contains(&overlay, 5)); assert!(contains(&overlay, 7)); - db.commit(&overlay.canonicalize::(&h2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); assert_eq!(overlay.parents.len(), 0); @@ -552,7 +587,9 @@ mod tests { db.commit(&overlay.insert::(&h_1, 1, &H256::default(), c_1).unwrap()); db.commit(&overlay.insert::(&h_2, 1, &H256::default(), c_2).unwrap()); assert!(contains(&overlay, 1)); - db.commit(&overlay.canonicalize::(&h_1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); assert!(contains(&overlay, 1)); overlay.apply_pending(); assert!(!contains(&overlay, 1)); @@ -569,8 +606,10 @@ mod tests { db.commit(&overlay.insert::(&h1, 1, &H256::default(), changeset.clone()).unwrap()); db.commit(&overlay.insert::(&h2, 2, &h1, changeset.clone()).unwrap()); overlay.apply_pending(); - db.commit(&overlay.canonicalize::(&h1).unwrap()); - db.commit(&overlay.canonicalize::(&h2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); db.commit(&overlay.insert::(&h3, 3, &h2, changeset.clone()).unwrap()); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); @@ -639,7 +678,9 @@ mod tests { assert_eq!(overlay.last_canonicalized, overlay2.last_canonicalized); // canonicalize 1. 2 and all its children should be discarded - db.commit(&overlay.canonicalize::(&h_1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 6); @@ -657,8 +698,15 @@ mod tests { assert!(db.get_meta(&to_journal_key(2, 2)).unwrap().is_none()); assert!(db.get_meta(&to_journal_key(2, 3)).unwrap().is_none()); + // check that discarding pinned state produces an error. + let mut commit = CommitSet::default(); + let pinned = vec![(h_1_1_1, 1)].into_iter().collect(); + assert!(overlay.canonicalize::(&h_1_2, &pinned, &mut commit).is_err()); + // canonicalize 1_2. 1_1 and all its children should be discarded - db.commit(&overlay.canonicalize::(&h_1_2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1_2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); assert_eq!(overlay.parents.len(), 3); @@ -673,7 +721,9 @@ mod tests { assert!(!overlay.have_block(&h_1_1_1)); // canonicalize 1_2_2 - db.commit(&overlay.canonicalize::(&h_1_2_2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1_2_2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); assert_eq!(overlay.parents.len(), 0); diff --git a/core/state-machine/Cargo.toml b/core/state-machine/Cargo.toml index eed53d49c3e3fa4905b05f79ec9e5955f24d322c..b1cb98ae808875bd8a9d28fc6a38063979c361f3 100644 --- a/core/state-machine/Cargo.toml +++ b/core/state-machine/Cargo.toml @@ -1,15 +1,13 @@ [package] name = "substrate-state-machine" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate State Machine" edition = "2018" [dependencies] -hex-literal = "0.1.0" log = "0.4" -parking_lot = "0.7.1" -heapsize = "0.4" +parking_lot = "0.8.0" hash-db = "0.12" trie-db = "0.12" trie-root = "0.12" @@ -17,3 +15,7 @@ trie = { package = "substrate-trie", path = "../trie" } primitives = { package = "substrate-primitives", path = "../primitives" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } parity-codec = "3.3" +num-traits = "0.2" + +[dev-dependencies] +hex-literal = "0.2.0" diff --git a/core/state-machine/src/backend.rs b/core/state-machine/src/backend.rs index 14e60b140a0e8a0ea8224f15c0371b70608c84f4..81529c6da3beac67342c0fc185d6aff5d0973c48 100644 --- a/core/state-machine/src/backend.rs +++ b/core/state-machine/src/backend.rs @@ -25,7 +25,6 @@ use hash_db::Hasher; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::TrieBackendStorage; use trie::{TrieDBMut, TrieMut, MemoryDB, trie_root, child_trie_root, default_child_trie_root}; -use heapsize::HeapSizeOf; /// A state backend is used to read state data and can have changes committed /// to it. @@ -71,6 +70,7 @@ pub trait Backend { /// Calculate the storage root, with given delta over what is already stored in /// the backend, and produce a "transaction" that can be used to commit. + /// Does not include child storage updates. fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)>, @@ -88,10 +88,60 @@ pub trait Backend { fn pairs(&self) -> Vec<(Vec, Vec)>; /// Get all keys with given prefix - fn keys(&self, prefix: &Vec) -> Vec>; + fn keys(&self, prefix: &[u8]) -> Vec> { + let mut all = Vec::new(); + self.for_keys_with_prefix(prefix, |k| all.push(k.to_vec())); + all + } + + /// Get all keys of child storage with given prefix + fn child_keys(&self, child_storage_key: &[u8], prefix: &[u8]) -> Vec> { + let mut all = Vec::new(); + self.for_keys_in_child_storage(child_storage_key, |k| { + if k.starts_with(prefix) { + all.push(k.to_vec()); + } + }); + all + } /// Try convert into trie backend. - fn try_into_trie_backend(self) -> Option>; + fn as_trie_backend(&mut self) -> Option<&TrieBackend>; + + /// Calculate the storage root, with given delta over what is already stored + /// in the backend, and produce a "transaction" that can be used to commit. + /// Does include child storage updates. + fn full_storage_root( + &self, + delta: I1, + child_deltas: I2) + -> (H::Out, Self::Transaction) + where + I1: IntoIterator, Option>)>, + I2i: IntoIterator, Option>)>, + I2: IntoIterator, I2i)>, + ::Out: Ord, + { + let mut txs: Self::Transaction = Default::default(); + let mut child_roots: Vec<_> = Default::default(); + // child first + for (storage_key, child_delta) in child_deltas { + let (child_root, empty, child_txs) = + self.child_storage_root(&storage_key[..], child_delta); + txs.consolidate(child_txs); + if empty { + child_roots.push((storage_key, None)); + } else { + child_roots.push((storage_key, Some(child_root))); + } + } + let (root, parent_txs) = self.storage_root( + delta.into_iter().chain(child_roots.into_iter()) + ); + txs.consolidate(parent_txs); + (root, txs) + } + } /// Trait that allows consolidate two transactions together. @@ -135,37 +185,39 @@ impl error::Error for Void { /// In-memory backend. Fully recomputes tries on each commit but useful for /// tests. -#[derive(Eq)] -pub struct InMemory { +pub struct InMemory { inner: HashMap>, HashMap, Vec>>, + trie: Option, H>>, _hasher: PhantomData, } -impl Default for InMemory { +impl Default for InMemory { fn default() -> Self { InMemory { inner: Default::default(), + trie: None, _hasher: PhantomData, } } } -impl Clone for InMemory { +impl Clone for InMemory { fn clone(&self) -> Self { InMemory { inner: self.inner.clone(), + trie: None, _hasher: PhantomData, } } } -impl PartialEq for InMemory { +impl PartialEq for InMemory { fn eq(&self, other: &Self) -> bool { self.inner.eq(&other.inner) } } -impl InMemory where H::Out: HeapSizeOf { +impl InMemory { /// Copy the state, with applied updates pub fn update(&self, changes: >::Transaction) -> Self { let mut inner: HashMap<_, _> = self.inner.clone(); @@ -180,27 +232,29 @@ impl InMemory where H::Out: HeapSizeOf { } } -impl From>, HashMap, Vec>>> for InMemory { +impl From>, HashMap, Vec>>> for InMemory { fn from(inner: HashMap>, HashMap, Vec>>) -> Self { InMemory { inner: inner, + trie: None, _hasher: PhantomData, } } } -impl From, Vec>> for InMemory { +impl From, Vec>> for InMemory { fn from(inner: HashMap, Vec>) -> Self { let mut expanded = HashMap::new(); expanded.insert(None, inner); InMemory { inner: expanded, + trie: None, _hasher: PhantomData, } } } -impl From>, Vec, Option>)>> for InMemory { +impl From>, Vec, Option>)>> for InMemory { fn from(inner: Vec<(Option>, Vec, Option>)>) -> Self { let mut expanded: HashMap>, HashMap, Vec>> = HashMap::new(); for (child_key, key, value) in inner { @@ -214,7 +268,14 @@ impl From>, Vec, Option>)>> for InMemory { impl super::Error for Void {} -impl Backend for InMemory where H::Out: HeapSizeOf { +impl InMemory { + /// child storage key iterator + pub fn child_storage_keys(&self) -> impl Iterator { + self.inner.iter().filter_map(|item| item.0.as_ref().map(|v|&v[..])) + } +} + +impl Backend for InMemory { type Error = Void; type Transaction = Vec<(Option>, Vec, Option>)>; type TrieBackendStorage = MemoryDB; @@ -244,7 +305,9 @@ impl Backend for InMemory where H::Out: HeapSizeOf { I: IntoIterator, Option>)>, ::Out: Ord, { - let existing_pairs = self.inner.get(&None).into_iter().flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); + let existing_pairs = self.inner.get(&None) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); let transaction: Vec<_> = delta.into_iter().collect(); let root = trie_root::(existing_pairs.chain(transaction.iter().cloned()) @@ -265,7 +328,9 @@ impl Backend for InMemory where H::Out: HeapSizeOf { { let storage_key = storage_key.to_vec(); - let existing_pairs = self.inner.get(&Some(storage_key.clone())).into_iter().flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); + let existing_pairs = self.inner.get(&Some(storage_key.clone())) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); let transaction: Vec<_> = delta.into_iter().collect(); let root = child_trie_root::( @@ -284,28 +349,52 @@ impl Backend for InMemory where H::Out: HeapSizeOf { } fn pairs(&self) -> Vec<(Vec, Vec)> { - self.inner.get(&None).into_iter().flat_map(|map| map.iter().map(|(k, v)| (k.clone(), v.clone()))).collect() + self.inner.get(&None) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), v.clone()))) + .collect() + } + + fn keys(&self, prefix: &[u8]) -> Vec> { + self.inner.get(&None) + .into_iter() + .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) + .collect() } - fn keys(&self, prefix: &Vec) -> Vec> { - self.inner.get(&None).into_iter().flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()).collect() + fn child_keys(&self, storage_key: &[u8], prefix: &[u8]) -> Vec> { + self.inner.get(&Some(storage_key.to_vec())) + .into_iter() + .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) + .collect() } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self)-> Option<&TrieBackend> { let mut mdb = MemoryDB::default(); let mut root = None; - for (storage_key, map) in self.inner { - if storage_key != None { - let _ = insert_into_memory_db::(&mut mdb, map.into_iter())?; + let mut new_child_roots = Vec::new(); + let mut root_map = None; + for (storage_key, map) in &self.inner { + if let Some(storage_key) = storage_key.as_ref() { + let ch = insert_into_memory_db::(&mut mdb, map.clone().into_iter())?; + new_child_roots.push((storage_key.clone(), ch.as_ref().into())); } else { - root = Some(insert_into_memory_db::(&mut mdb, map.into_iter())?); + root_map = Some(map); } } + // root handling + if let Some(map) = root_map.take() { + root = Some(insert_into_memory_db::( + &mut mdb, + map.clone().into_iter().chain(new_child_roots.into_iter()) + )?); + } let root = match root { Some(root) => root, None => insert_into_memory_db::(&mut mdb, ::std::iter::empty())?, }; - Some(TrieBackend::new(mdb, root)) + self.trie = Some(TrieBackend::new(mdb, root)); + self.trie.as_ref() } } @@ -313,7 +402,6 @@ impl Backend for InMemory where H::Out: HeapSizeOf { pub(crate) fn insert_into_memory_db(mdb: &mut MemoryDB, input: I) -> Option where H: Hasher, - H::Out: HeapSizeOf, I: IntoIterator, Vec)>, { let mut root = ::Out::default(); diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index 0c95de61cbff15d172b4e41101196a8193cdbec4..e9939711f1e47e9d86c5f751ab4ee2389046113c 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -19,8 +19,8 @@ use std::collections::HashMap; use std::iter::FromIterator; use hash_db::Hasher; -use heapsize::HeapSizeOf; use trie::trie_root; +use primitives::offchain; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; use parity_codec::Encode; use super::{ChildStorageKey, Externalities, OverlayedChanges}; @@ -103,7 +103,7 @@ impl From< HashMap, Vec> > for BasicExternalities { } } -impl Externalities for BasicExternalities where H::Out: Ord + HeapSizeOf { +impl Externalities for BasicExternalities where H::Out: Ord { fn storage(&self, key: &[u8]) -> Option> { match key { CODE => self.code.clone(), @@ -152,13 +152,13 @@ impl Externalities for BasicExternalities where H::Out: Ord + Heap vec![42] } - fn storage_changes_root(&mut self, _parent: H::Out, _parent_num: u64) -> Option { - None + fn storage_changes_root(&mut self, _parent: H::Out) -> Result, ()> { + Ok(None) } - fn submit_extrinsic(&mut self, _extrinsic: Vec) -> Result<(), ()> { - warn!("Call to submit_extrinsic without offchain externalities set."); - Err(()) + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { + warn!("Call to non-existent out offchain externalities set."); + None } } @@ -166,12 +166,12 @@ impl Externalities for BasicExternalities where H::Out: Ord + Heap mod tests { use super::*; use primitives::{Blake2Hasher, H256}; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; #[test] fn commit_should_work() { let mut ext = BasicExternalities::default(); - let ext = &mut ext as &mut Externalities; + let ext = &mut ext as &mut dyn Externalities; ext.set_storage(b"doe".to_vec(), b"reindeer".to_vec()); ext.set_storage(b"dog".to_vec(), b"puppy".to_vec()); ext.set_storage(b"dogglesworth".to_vec(), b"cat".to_vec()); @@ -182,7 +182,7 @@ mod tests { #[test] fn set_and_retrieve_code() { let mut ext = BasicExternalities::default(); - let ext = &mut ext as &mut Externalities; + let ext = &mut ext as &mut dyn Externalities; let code = vec![1, 2, 3]; ext.set_storage(CODE.to_vec(), code.clone()); diff --git a/core/state-machine/src/changes_trie/build.rs b/core/state-machine/src/changes_trie/build.rs index 9cb766874d8f847136093f334199c92046181d83..487fde2e3528c434c23303126a22ab1aca1a06a0 100644 --- a/core/state-machine/src/changes_trie/build.rs +++ b/core/state-machine/src/changes_trie/build.rs @@ -19,13 +19,13 @@ use std::collections::{BTreeMap, BTreeSet}; use parity_codec::Decode; use hash_db::Hasher; -use heapsize::HeapSizeOf; +use num_traits::One; use crate::backend::Backend; use crate::overlayed_changes::OverlayedChanges; -use crate::trie_backend_essence::{TrieBackendStorage, TrieBackendEssence}; +use crate::trie_backend_essence::TrieBackendEssence; use crate::changes_trie::build_iterator::digest_build_iterator; use crate::changes_trie::input::{InputKey, InputPair, DigestIndex, ExtrinsicIndex}; -use crate::changes_trie::{AnchorBlockId, Configuration, Storage}; +use crate::changes_trie::{AnchorBlockId, Configuration, Storage, BlockNumber}; /// Prepare input pairs for building a changes trie of given block. /// @@ -33,30 +33,25 @@ use crate::changes_trie::{AnchorBlockId, Configuration, Storage}; /// required data. /// Returns Ok(None) data required to prepare input pairs is not collected /// or storage is not provided. -pub fn prepare_input<'a, B, S, H>( +pub fn prepare_input<'a, B, S, H, Number>( backend: &B, - storage: Option<&'a S>, + storage: &'a S, + config: &'a Configuration, changes: &OverlayedChanges, - parent: &'a AnchorBlockId, -) -> Result>, String> + parent: &'a AnchorBlockId, +) -> Result>>, String> where B: Backend, - S: Storage, - &'a S: TrieBackendStorage, + S: Storage, H: Hasher, - H::Out: HeapSizeOf, + Number: BlockNumber, { - let (storage, config) = match (storage, changes.changes_trie_config.as_ref()) { - (Some(storage), Some(config)) => (storage, config), - _ => return Ok(None), - }; - let mut input = Vec::new(); input.extend(prepare_extrinsics_input( backend, - parent.number + 1, + parent.number.clone() + 1.into(), changes)?); - input.extend(prepare_digest_input::<_, H>( + input.extend(prepare_digest_input::<_, H, Number>( parent, config, storage)?); @@ -65,14 +60,15 @@ pub fn prepare_input<'a, B, S, H>( } /// Prepare ExtrinsicIndex input pairs. -fn prepare_extrinsics_input( +fn prepare_extrinsics_input( backend: &B, - block: u64, + block: Number, changes: &OverlayedChanges, -) -> Result, String> +) -> Result>, String> where B: Backend, H: Hasher, + Number: BlockNumber, { let mut extrinsic_map = BTreeMap::, BTreeSet>::new(); for (key, val) in changes.prospective.top.iter().chain(changes.committed.top.iter()) { @@ -95,47 +91,50 @@ fn prepare_extrinsics_input( Ok(extrinsic_map.into_iter() .map(move |(key, extrinsics)| InputPair::ExtrinsicIndex(ExtrinsicIndex { - block, + block: block.clone(), key, }, extrinsics.iter().cloned().collect()))) } /// Prepare DigestIndex input pairs. -fn prepare_digest_input<'a, S, H>( - parent: &'a AnchorBlockId, +fn prepare_digest_input<'a, S, H, Number>( + parent: &'a AnchorBlockId, config: &Configuration, storage: &'a S -) -> Result + 'a, String> +) -> Result> + 'a, String> where - S: Storage, - &'a S: TrieBackendStorage, + S: Storage, H: Hasher, - H::Out: 'a + HeapSizeOf, + H::Out: 'a, + Number: BlockNumber, { - let mut digest_map = BTreeMap::, BTreeSet>::new(); - for digest_build_block in digest_build_iterator(config, parent.number + 1) { - let trie_root = storage.root(parent, digest_build_block)?; - let trie_root = trie_root.ok_or_else(|| format!("No changes trie root for block {}", digest_build_block))?; - let trie_storage = TrieBackendEssence::<_, H>::new(storage, trie_root); + let mut digest_map = BTreeMap::, BTreeSet>::new(); + for digest_build_block in digest_build_iterator(config, parent.number.clone() + One::one()) { + let trie_root = storage.root(parent, digest_build_block.clone())?; + let trie_root = trie_root.ok_or_else(|| format!("No changes trie root for block {}", digest_build_block.clone()))?; + let trie_storage = TrieBackendEssence::<_, H>::new( + crate::changes_trie::TrieBackendStorageAdapter(storage), + trie_root, + ); - let extrinsic_prefix = ExtrinsicIndex::key_neutral_prefix(digest_build_block); + let extrinsic_prefix = ExtrinsicIndex::key_neutral_prefix(digest_build_block.clone()); trie_storage.for_keys_with_prefix(&extrinsic_prefix, |key| - if let Some(InputKey::ExtrinsicIndex(trie_key)) = Decode::decode(&mut &key[..]) { + if let Some(InputKey::ExtrinsicIndex::(trie_key)) = Decode::decode(&mut &key[..]) { digest_map.entry(trie_key.key).or_default() - .insert(digest_build_block); + .insert(digest_build_block.clone()); }); - let digest_prefix = DigestIndex::key_neutral_prefix(digest_build_block); + let digest_prefix = DigestIndex::key_neutral_prefix(digest_build_block.clone()); trie_storage.for_keys_with_prefix(&digest_prefix, |key| - if let Some(InputKey::DigestIndex(trie_key)) = Decode::decode(&mut &key[..]) { + if let Some(InputKey::DigestIndex::(trie_key)) = Decode::decode(&mut &key[..]) { digest_map.entry(trie_key.key).or_default() - .insert(digest_build_block); + .insert(digest_build_block.clone()); }); } Ok(digest_map.into_iter() .map(move |(key, set)| InputPair::DigestIndex(DigestIndex { - block: parent.number + 1, + block: parent.number.clone() + One::one(), key }, set.into_iter().collect()))) } @@ -150,7 +149,7 @@ mod test { use crate::overlayed_changes::OverlayedValue; use super::*; - fn prepare_for_build() -> (InMemory, InMemoryStorage, OverlayedChanges) { + fn prepare_for_build() -> (InMemory, InMemoryStorage, OverlayedChanges) { let backend: InMemory<_> = vec![ (vec![100], vec![255]), (vec![101], vec![255]), @@ -227,7 +226,14 @@ mod test { #[test] fn build_changes_trie_nodes_on_non_digest_block() { let (backend, storage, changes) = prepare_for_build(); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 4 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 4 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 5, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 5, key: vec![101] }, vec![1]), @@ -238,7 +244,14 @@ mod test { #[test] fn build_changes_trie_nodes_on_digest_block_l1() { let (backend, storage, changes) = prepare_for_build(); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 3 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 3 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![101] }, vec![1]), @@ -254,7 +267,14 @@ mod test { #[test] fn build_changes_trie_nodes_on_digest_block_l2() { let (backend, storage, changes) = prepare_for_build(); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 15 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 15 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 16, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 16, key: vec![101] }, vec![1]), @@ -278,7 +298,14 @@ mod test { extrinsics: Some(vec![1].into_iter().collect()) }); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 3 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 3 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![101] }, vec![1]), diff --git a/core/state-machine/src/changes_trie/build_iterator.rs b/core/state-machine/src/changes_trie/build_iterator.rs index f9c6ba6e7b397021ca0c856499de012217815867..5d8a8318abf849739be1f94290bac006165e7677 100644 --- a/core/state-machine/src/changes_trie/build_iterator.rs +++ b/core/state-machine/src/changes_trie/build_iterator.rs @@ -17,13 +17,16 @@ //! Structures and functions to return blocks whose changes are to be included //! in given block' changes trie. -use crate::changes_trie::Configuration; +use crate::changes_trie::{Configuration, BlockNumber}; /// Returns iterator of OTHER blocks that are required for inclusion into /// changes trie of given block. -pub fn digest_build_iterator(config: &Configuration, block: u64) -> DigestBuildIterator { +pub fn digest_build_iterator( + config: &Configuration, + block: Number, +) -> DigestBuildIterator { // prepare digest build parameters - let (_, _, digest_step) = match config.digest_level_at_block(block) { + let (_, _, digest_step) = match config.digest_level_at_block(block.clone()) { Some((current_level, digest_interval, digest_step)) => (current_level, digest_interval, digest_step), None => return DigestBuildIterator::empty(), @@ -35,24 +38,26 @@ pub fn digest_build_iterator(config: &Configuration, block: u64) -> DigestBuildI /// Changes trie build iterator that returns numbers of OTHER blocks that are /// required for inclusion into changes trie of given block. #[derive(Debug)] -pub struct DigestBuildIterator { +pub struct DigestBuildIterator { /// Block we're building changes trie for. - block: u64, + block: Number, /// Interval for creation digest blocks. - digest_interval: u64, + digest_interval: u32, + /// Max step of blocks range. + max_step: u32, /// Step of current blocks range. - current_step: u64, + current_step: u32, /// Current blocks range. - current_range: Option<::std::iter::StepBy<::std::ops::Range>>, - /// Max step of blocks range. - max_step: u64, + current_range: Option>, } -impl DigestBuildIterator { +impl DigestBuildIterator { /// Create new digest build iterator. - pub fn new(block: u64, digest_interval: u64, max_step: u64) -> Self { + pub fn new(block: Number, digest_interval: u32, max_step: u32) -> Self { DigestBuildIterator { - block, digest_interval, max_step, + block, + digest_interval, + max_step, current_step: 0, current_range: None, } @@ -60,12 +65,12 @@ impl DigestBuildIterator { /// Create empty digest build iterator. pub fn empty() -> Self { - Self::new(0, 0, 0) + Self::new(0.into(), 0, 0) } } -impl Iterator for DigestBuildIterator { - type Item = u64; +impl Iterator for DigestBuildIterator { + type Item = Number; fn next(&mut self) -> Option { if let Some(next) = self.current_range.as_mut().and_then(|iter| iter.next()) { @@ -82,10 +87,11 @@ impl Iterator for DigestBuildIterator { } self.current_step = next_step; - self.current_range = Some( - ((self.block - self.current_step * self.digest_interval + self.current_step)..self.block) - .step_by(self.current_step as usize) - ); + self.current_range = Some(BlocksRange::new( + self.block.clone() - (self.current_step * self.digest_interval - self.current_step).into(), + self.block.clone(), + self.current_step.into(), + )); Some(self.current_range.as_mut() .expect("assigned one line above; qed") @@ -94,20 +100,52 @@ impl Iterator for DigestBuildIterator { } } +/// Blocks range iterator with builtin step_by support. +#[derive(Debug)] +struct BlocksRange { + current: Number, + end: Number, + step: Number, +} + +impl BlocksRange { + pub fn new(begin: Number, end: Number, step: Number) -> Self { + BlocksRange { + current: begin, + end, + step, + } + } +} + +impl Iterator for BlocksRange { + type Item = Number; + + fn next(&mut self) -> Option { + if self.current >= self.end { + return None; + } + + let current = Some(self.current.clone()); + self.current += self.step.clone(); + current + } +} + #[cfg(test)] mod tests { use super::*; - fn digest_build_iterator(digest_interval: u64, digest_levels: u32, block: u64) -> DigestBuildIterator { + fn digest_build_iterator(digest_interval: u32, digest_levels: u32, block: u64) -> DigestBuildIterator { super::digest_build_iterator(&Configuration { digest_interval, digest_levels }, block) } - fn digest_build_iterator_basic(digest_interval: u64, digest_levels: u32, block: u64) -> (u64, u64, u64) { + fn digest_build_iterator_basic(digest_interval: u32, digest_levels: u32, block: u64) -> (u64, u32, u32) { let iter = digest_build_iterator(digest_interval, digest_levels, block); (iter.block, iter.digest_interval, iter.max_step) } - fn digest_build_iterator_blocks(digest_interval: u64, digest_levels: u32, block: u64) -> Vec { + fn digest_build_iterator_blocks(digest_interval: u32, digest_levels: u32, block: u64) -> Vec { digest_build_iterator(digest_interval, digest_levels, block).collect() } @@ -122,7 +160,11 @@ mod tests { assert_eq!(digest_build_iterator_basic(4, 16, 2), empty, "digest is not required for this block"); assert_eq!(digest_build_iterator_basic(4, 16, 15), empty, "digest is not required for this block"); assert_eq!(digest_build_iterator_basic(4, 16, 17), empty, "digest is not required for this block"); - assert_eq!(digest_build_iterator_basic(::std::u64::MAX / 2 + 1, 16, ::std::u64::MAX), empty, "digest_interval * 2 is greater than u64::MAX"); + assert_eq!(digest_build_iterator_basic( + ::std::u32::MAX / 2 + 1, + 16, + ::std::u64::MAX, + ), empty, "digest_interval * 2 is greater than u64::MAX"); } #[test] diff --git a/core/state-machine/src/changes_trie/changes_iterator.rs b/core/state-machine/src/changes_trie/changes_iterator.rs index ad70117984989bb9d022855b29f7cea87927c368..0e4716ccab98a44028d44aa104ac9cc98ae3b8fb 100644 --- a/core/state-machine/src/changes_trie/changes_iterator.rs +++ b/core/state-machine/src/changes_trie/changes_iterator.rs @@ -21,9 +21,9 @@ use std::cell::RefCell; use std::collections::VecDeque; use parity_codec::{Decode, Encode}; use hash_db::{HashDB, Hasher}; -use heapsize::HeapSizeOf; +use num_traits::One; use trie::{Recorder, MemoryDB}; -use crate::changes_trie::{AnchorBlockId, Configuration, RootsStorage, Storage}; +use crate::changes_trie::{AnchorBlockId, Configuration, RootsStorage, Storage, BlockNumber}; use crate::changes_trie::input::{DigestIndex, ExtrinsicIndex, DigestIndexValue, ExtrinsicIndexValue}; use crate::changes_trie::storage::{TrieBackendAdapter, InMemoryStorage}; use crate::proving_backend::ProvingBackendEssence; @@ -32,25 +32,25 @@ use crate::trie_backend_essence::{TrieBackendEssence}; /// Return changes of given key at given blocks range. /// `max` is the number of best known block. /// Changes are returned in descending order (i.e. last block comes first). -pub fn key_changes<'a, S: Storage, H: Hasher>( +pub fn key_changes<'a, S: Storage, H: Hasher, Number: BlockNumber>( config: &'a Configuration, storage: &'a S, - begin: u64, - end: &'a AnchorBlockId, - max: u64, + begin: Number, + end: &'a AnchorBlockId, + max: Number, key: &'a [u8], -) -> Result, String> where H::Out: HeapSizeOf { +) -> Result, String> { // we can't query any roots before root - let max = ::std::cmp::min(max, end.number); + let max = ::std::cmp::min(max.clone(), end.number.clone()); Ok(DrilldownIterator { essence: DrilldownIteratorEssence { key, roots_storage: storage, storage, - begin, + begin: begin.clone(), end, - surface: surface_iterator(config, max, begin, end.number)?, + surface: surface_iterator(config, max, begin, end.number.clone())?, extrinsics: Default::default(), blocks: Default::default(), @@ -62,25 +62,25 @@ pub fn key_changes<'a, S: Storage, H: Hasher>( /// Returns proof of changes of given key at given blocks range. /// `max` is the number of best known block. -pub fn key_changes_proof, H: Hasher>( +pub fn key_changes_proof, H: Hasher, Number: BlockNumber>( config: &Configuration, storage: &S, - begin: u64, - end: &AnchorBlockId, - max: u64, + begin: Number, + end: &AnchorBlockId, + max: Number, key: &[u8], -) -> Result>, String> where H::Out: HeapSizeOf { +) -> Result>, String> { // we can't query any roots before root - let max = ::std::cmp::min(max, end.number); + let max = ::std::cmp::min(max.clone(), end.number.clone()); let mut iter = ProvingDrilldownIterator { essence: DrilldownIteratorEssence { key, roots_storage: storage.clone(), storage, - begin, + begin: begin.clone(), end, - surface: surface_iterator(config, max, begin, end.number)?, + surface: surface_iterator(config, max, begin, end.number.clone())?, extrinsics: Default::default(), blocks: Default::default(), @@ -101,17 +101,17 @@ pub fn key_changes_proof, H: Hasher>( /// Check key changes proog and return changes of the key at given blocks range. /// `max` is the number of best known block. /// Changes are returned in descending order (i.e. last block comes first). -pub fn key_changes_proof_check, H: Hasher>( +pub fn key_changes_proof_check, H: Hasher, Number: BlockNumber>( config: &Configuration, roots_storage: &S, proof: Vec>, - begin: u64, - end: &AnchorBlockId, - max: u64, + begin: Number, + end: &AnchorBlockId, + max: Number, key: &[u8] -) -> Result, String> where H::Out: HeapSizeOf { +) -> Result, String> { // we can't query any roots before root - let max = ::std::cmp::min(max, end.number); + let max = ::std::cmp::min(max.clone(), end.number.clone()); let mut proof_db = MemoryDB::::default(); for item in proof { @@ -124,9 +124,9 @@ pub fn key_changes_proof_check, H: Hasher>( key, roots_storage, storage: &proof_db, - begin, + begin: begin.clone(), end, - surface: surface_iterator(config, max, begin, end.number)?, + surface: surface_iterator(config, max, begin, end.number.clone())?, extrinsics: Default::default(), blocks: Default::default(), @@ -138,36 +138,36 @@ pub fn key_changes_proof_check, H: Hasher>( /// Surface iterator - only traverses top-level digests from given range and tries to find /// all digest changes for the key. -pub struct SurfaceIterator<'a> { +pub struct SurfaceIterator<'a, Number: BlockNumber> { config: &'a Configuration, - begin: u64, - max: u64, - current: Option, - current_begin: u64, - digest_step: u64, + begin: Number, + max: Number, + current: Option, + current_begin: Number, + digest_step: u32, digest_level: u32, } -impl<'a> Iterator for SurfaceIterator<'a> { - type Item = Result<(u64, u32), String>; +impl<'a, Number: BlockNumber> Iterator for SurfaceIterator<'a, Number> { + type Item = Result<(Number, u32), String>; fn next(&mut self) -> Option { - let current = self.current?; + let current = self.current.clone()?; let digest_level = self.digest_level; - if current < self.digest_step { + if current < self.digest_step.into() { self.current = None; } else { - let next = current - self.digest_step; - if next == 0 || next < self.begin { + let next = current.clone() - self.digest_step.into(); + if next.is_zero() || next < self.begin { self.current = None; } else if next > self.current_begin { self.current = Some(next); } else { let (current, current_begin, digest_step, digest_level) = match - lower_bound_max_digest(self.config, self.max, self.begin, next) { + lower_bound_max_digest(self.config, self.max.clone(), self.begin.clone(), next) { Err(err) => return Some(Err(err)), Ok(range) => range, }; @@ -185,22 +185,36 @@ impl<'a> Iterator for SurfaceIterator<'a> { /// Drilldown iterator - receives 'digest points' from surface iterator and explores /// every point until extrinsic is found. -pub struct DrilldownIteratorEssence<'a, RS: 'a + RootsStorage, S: 'a + Storage, H: Hasher> where H::Out: 'a { +pub struct DrilldownIteratorEssence<'a, RS, S, H, Number> + where + RS: 'a + RootsStorage, + S: 'a + Storage, + H: Hasher, + Number: BlockNumber, + H::Out: 'a, +{ key: &'a [u8], roots_storage: &'a RS, storage: &'a S, - begin: u64, - end: &'a AnchorBlockId, - surface: SurfaceIterator<'a>, + begin: Number, + end: &'a AnchorBlockId, + surface: SurfaceIterator<'a, Number>, - extrinsics: VecDeque<(u64, u32)>, - blocks: VecDeque<(u64, u32)>, + extrinsics: VecDeque<(Number, u32)>, + blocks: VecDeque<(Number, u32)>, _hasher: ::std::marker::PhantomData, } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEssence<'a, RS, S, H> { - pub fn next(&mut self, trie_reader: F) -> Option> +impl<'a, RS, S, H, Number> DrilldownIteratorEssence<'a, RS, S, H, Number> + where + RS: 'a + RootsStorage, + S: 'a + Storage, + H: Hasher, + Number: BlockNumber, + H::Out: 'a, +{ + pub fn next(&mut self, trie_reader: F) -> Option> where F: FnMut(&S, H::Out, &[u8]) -> Result>, String>, { @@ -211,7 +225,7 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEs } } - fn do_next(&mut self, mut trie_reader: F) -> Result, String> + fn do_next(&mut self, mut trie_reader: F) -> Result, String> where F: FnMut(&S, H::Out, &[u8]) -> Result>, String>, { @@ -224,33 +238,33 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEs // not having a changes trie root is an error because: // we never query roots for future blocks // AND trie roots for old blocks are known (both on full + light node) - let trie_root = self.roots_storage.root(&self.end, block)? - .ok_or_else(|| format!("Changes trie root for block {} is not found", block))?; + let trie_root = self.roots_storage.root(&self.end, block.clone())? + .ok_or_else(|| format!("Changes trie root for block {} is not found", block.clone()))?; // only return extrinsics for blocks before self.max - // most of blocks will be filtered out beore pushing to `self.blocks` + // most of blocks will be filtered out before pushing to `self.blocks` // here we just throwing away changes at digest blocks we're processing debug_assert!(block >= self.begin, "We shall not touch digests earlier than a range' begin"); if block <= self.end.number { - let extrinsics_key = ExtrinsicIndex { block, key: self.key.to_vec() }.encode(); + let extrinsics_key = ExtrinsicIndex { block: block.clone(), key: self.key.to_vec() }.encode(); let extrinsics = trie_reader(&self.storage, trie_root, &extrinsics_key); if let Some(extrinsics) = extrinsics? { let extrinsics: Option = Decode::decode(&mut &extrinsics[..]); if let Some(extrinsics) = extrinsics { - self.extrinsics.extend(extrinsics.into_iter().rev().map(|e| (block, e))); + self.extrinsics.extend(extrinsics.into_iter().rev().map(|e| (block.clone(), e))); } } } - let blocks_key = DigestIndex { block, key: self.key.to_vec() }.encode(); + let blocks_key = DigestIndex { block: block.clone(), key: self.key.to_vec() }.encode(); let blocks = trie_reader(&self.storage, trie_root, &blocks_key); if let Some(blocks) = blocks? { - let blocks: Option = Decode::decode(&mut &blocks[..]); + let blocks: Option> = Decode::decode(&mut &blocks[..]); if let Some(blocks) = blocks { // filter level0 blocks here because we tend to use digest blocks, // AND digest block changes could also include changes for out-of-range blocks - let begin = self.begin; - let end = self.end.number; + let begin = self.begin.clone(); + let end = self.end.number.clone(); self.blocks.extend(blocks.into_iter() .rev() .filter(|b| level > 1 || (*b >= begin && *b <= end)) @@ -272,15 +286,21 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEs } /// Exploring drilldown operator. -pub struct DrilldownIterator<'a, RS: 'a + RootsStorage, S: 'a + Storage, H: Hasher> where H::Out: 'a { - essence: DrilldownIteratorEssence<'a, RS, S, H>, +pub struct DrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ + essence: DrilldownIteratorEssence<'a, RS, S, H, Number>, } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator - for DrilldownIterator<'a, RS, S, H> - where H::Out: HeapSizeOf +impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher, Number: BlockNumber> Iterator + for DrilldownIterator<'a, RS, S, H, Number> { - type Item = Result<(u64, u32), String>; + type Item = Result<(Number, u32), String>; fn next(&mut self) -> Option { self.essence.next(|storage, root, key| @@ -289,12 +309,26 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator } /// Proving drilldown iterator. -struct ProvingDrilldownIterator<'a, RS: 'a + RootsStorage, S: 'a + Storage, H: Hasher> where H::Out: 'a { - essence: DrilldownIteratorEssence<'a, RS, S, H>, +struct ProvingDrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ + essence: DrilldownIteratorEssence<'a, RS, S, H, Number>, proof_recorder: RefCell>, } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> ProvingDrilldownIterator<'a, RS, S, H> { +impl<'a, RS, S, H, Number> ProvingDrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ /// Consume the iterator, extracting the gathered proof in lexicographical order /// by value. pub fn extract_proof(self) -> Vec> { @@ -305,8 +339,15 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> ProvingDrilldownIte } } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator for ProvingDrilldownIterator<'a, RS, S, H> where H::Out: HeapSizeOf { - type Item = Result<(u64, u32), String>; +impl<'a, RS, S, H, Number> Iterator for ProvingDrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ + type Item = Result<(Number, u32), String>; fn next(&mut self) -> Option { let proof_recorder = &mut *self.proof_recorder.try_borrow_mut() @@ -320,8 +361,18 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator for Provin } /// Returns surface iterator for given range of blocks. -fn surface_iterator<'a>(config: &'a Configuration, max: u64, begin: u64, end: u64) -> Result, String> { - let (current, current_begin, digest_step, digest_level) = lower_bound_max_digest(config, max, begin, end)?; +fn surface_iterator<'a, Number: BlockNumber>( + config: &'a Configuration, + max: Number, + begin: Number, + end: Number, +) -> Result, String> { + let (current, current_begin, digest_step, digest_level) = lower_bound_max_digest( + config, + max.clone(), + begin.clone(), + end, + )?; Ok(SurfaceIterator { config, begin, @@ -335,31 +386,32 @@ fn surface_iterator<'a>(config: &'a Configuration, max: u64, begin: u64, end: u6 /// Returns parameters of highest level digest block that includes the end of given range /// and tends to include the whole range. -fn lower_bound_max_digest( +fn lower_bound_max_digest( config: &Configuration, - max: u64, - begin: u64, - end: u64, -) -> Result<(u64, u64, u64, u32), String> { + max: Number, + begin: Number, + end: Number, +) -> Result<(Number, Number, u32, u32), String> { if end > max || begin > end { return Err("invalid changes range".into()); } let mut digest_level = 0u32; - let mut digest_step = 1u64; - let mut digest_interval = 0u64; - let mut current = end; - let mut current_begin = begin; - if begin != end { + let mut digest_step = 1u32; + let mut digest_interval = 0u32; + let mut current = end.clone(); + let mut current_begin = begin.clone(); + if current_begin != current { while digest_level != config.digest_levels { let new_digest_level = digest_level + 1; let new_digest_step = digest_step * config.digest_interval; let new_digest_interval = config.digest_interval * { if digest_interval == 0 { 1 } else { digest_interval } }; - let new_digest_begin = ((current - 1) / new_digest_interval) * new_digest_interval; - let new_digest_end = new_digest_begin + new_digest_interval; - let new_current = new_digest_begin + new_digest_interval; + let new_digest_begin = ((current.clone() - One::one()) + / new_digest_interval.into()) * new_digest_interval.into(); + let new_digest_end = new_digest_begin.clone() + new_digest_interval.into(); + let new_current = new_digest_begin.clone() + new_digest_interval.into(); if new_digest_end > max { if begin < new_digest_begin { @@ -374,7 +426,7 @@ fn lower_bound_max_digest( current = new_current; current_begin = new_digest_begin; - if new_digest_begin <= begin && new_digest_end >= end { + if current_begin <= begin && new_digest_end >= end { break; } } @@ -396,7 +448,7 @@ mod tests { use crate::changes_trie::storage::InMemoryStorage; use super::*; - fn prepare_for_drilldown() -> (Configuration, InMemoryStorage) { + fn prepare_for_drilldown() -> (Configuration, InMemoryStorage) { let config = Configuration { digest_interval: 4, digest_levels: 2 }; let backend = InMemoryStorage::with_inputs(vec![ // digest: 1..4 => [(3, 0)] @@ -438,27 +490,27 @@ mod tests { #[test] fn drilldown_iterator_works() { let (config, storage) = prepare_for_drilldown(); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 16 }, 16, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(8, 2), (8, 1), (6, 3), (3, 0)])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 2 }, 4, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 3 }, 4, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(3, 0)])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 7, &AnchorBlockId { hash: Default::default(), number: 8 }, 8, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(8, 2), (8, 1)])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 5, &AnchorBlockId { hash: Default::default(), number: 7 }, 8, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(6, 3)])); @@ -469,7 +521,7 @@ mod tests { let (config, storage) = prepare_for_drilldown(); storage.clear_storage(); - assert!(key_changes::, Blake2Hasher>( + assert!(key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 100 }, 1000, &[42]) .and_then(|i| i.collect::, _>>()).is_err()); } @@ -477,9 +529,9 @@ mod tests { #[test] fn drilldown_iterator_fails_when_range_is_invalid() { let (config, storage) = prepare_for_drilldown(); - assert!(key_changes::, Blake2Hasher>( + assert!(key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 100 }, 50, &[42]).is_err()); - assert!(key_changes::, Blake2Hasher>( + assert!(key_changes::, Blake2Hasher, u64>( &config, &storage, 20, &AnchorBlockId { hash: Default::default(), number: 10 }, 100, &[42]).is_err()); } @@ -490,7 +542,7 @@ mod tests { // create drilldown iterator that records all trie nodes during drilldown let (remote_config, remote_storage) = prepare_for_drilldown(); - let remote_proof = key_changes_proof::, Blake2Hasher>( + let remote_proof = key_changes_proof::, Blake2Hasher, u64>( &remote_config, &remote_storage, 0, &AnchorBlockId { hash: Default::default(), number: 16 }, 16, &[42]).unwrap(); @@ -499,7 +551,7 @@ mod tests { // create drilldown iterator that works the same, but only depends on trie let (local_config, local_storage) = prepare_for_drilldown(); local_storage.clear_storage(); - let local_result = key_changes_proof_check::, Blake2Hasher>( + let local_result = key_changes_proof_check::, Blake2Hasher, u64>( &local_config, &local_storage, remote_proof, 0, &AnchorBlockId { hash: Default::default(), number: 16 }, 16, &[42]); diff --git a/core/state-machine/src/changes_trie/input.rs b/core/state-machine/src/changes_trie/input.rs index 3154aff715c2ba79070b6ecd6dd3c49a77c0729b..ae939c028b3e1e02aaf4e504eb5e8db3820a459e 100644 --- a/core/state-machine/src/changes_trie/input.rs +++ b/core/state-machine/src/changes_trie/input.rs @@ -17,12 +17,13 @@ //! Different types of changes trie input pairs. use parity_codec::{Decode, Encode, Input, Output}; +use crate::changes_trie::BlockNumber; /// Key of { changed key => set of extrinsic indices } mapping. #[derive(Clone, Debug, PartialEq, Eq)] -pub struct ExtrinsicIndex { +pub struct ExtrinsicIndex { /// Block at which this key has been inserted in the trie. - pub block: u64, + pub block: Number, /// Storage key this node is responsible for. pub key: Vec, } @@ -32,35 +33,35 @@ pub type ExtrinsicIndexValue = Vec; /// Key of { changed key => block/digest block numbers } mapping. #[derive(Clone, Debug, PartialEq, Eq)] -pub struct DigestIndex { +pub struct DigestIndex { /// Block at which this key has been inserted in the trie. - pub block: u64, + pub block: Number, /// Storage key this node is responsible for. pub key: Vec, } /// Value of { changed key => block/digest block numbers } mapping. -pub type DigestIndexValue = Vec; +pub type DigestIndexValue = Vec; /// Single input pair of changes trie. #[derive(Clone, Debug, PartialEq, Eq)] -pub enum InputPair { +pub enum InputPair { /// Element of { key => set of extrinsics where key has been changed } element mapping. - ExtrinsicIndex(ExtrinsicIndex, ExtrinsicIndexValue), + ExtrinsicIndex(ExtrinsicIndex, ExtrinsicIndexValue), /// Element of { key => set of blocks/digest blocks where key has been changed } element mapping. - DigestIndex(DigestIndex, DigestIndexValue), + DigestIndex(DigestIndex, DigestIndexValue), } /// Single input key of changes trie. #[derive(Clone, Debug, PartialEq, Eq)] -pub enum InputKey { +pub enum InputKey { /// Key of { key => set of extrinsics where key has been changed } element mapping. - ExtrinsicIndex(ExtrinsicIndex), + ExtrinsicIndex(ExtrinsicIndex), /// Key of { key => set of blocks/digest blocks where key has been changed } element mapping. - DigestIndex(DigestIndex), + DigestIndex(DigestIndex), } -impl Into<(Vec, Vec)> for InputPair { +impl Into<(Vec, Vec)> for InputPair { fn into(self) -> (Vec, Vec) { match self { InputPair::ExtrinsicIndex(key, value) => (key.encode(), value.encode()), @@ -69,8 +70,8 @@ impl Into<(Vec, Vec)> for InputPair { } } -impl Into for InputPair { - fn into(self) -> InputKey { +impl Into> for InputPair { + fn into(self) -> InputKey { match self { InputPair::ExtrinsicIndex(key, _) => InputKey::ExtrinsicIndex(key), InputPair::DigestIndex(key, _) => InputKey::DigestIndex(key), @@ -78,15 +79,15 @@ impl Into for InputPair { } } -impl ExtrinsicIndex { - pub fn key_neutral_prefix(block: u64) -> Vec { +impl ExtrinsicIndex { + pub fn key_neutral_prefix(block: Number) -> Vec { let mut prefix = vec![1]; prefix.extend(block.encode()); prefix } } -impl Encode for ExtrinsicIndex { +impl Encode for ExtrinsicIndex { fn encode_to(&self, dest: &mut W) { dest.push_byte(1); self.block.encode_to(dest); @@ -94,8 +95,8 @@ impl Encode for ExtrinsicIndex { } } -impl DigestIndex { - pub fn key_neutral_prefix(block: u64) -> Vec { +impl DigestIndex { + pub fn key_neutral_prefix(block: Number) -> Vec { let mut prefix = vec![2]; prefix.extend(block.encode()); prefix @@ -103,7 +104,7 @@ impl DigestIndex { } -impl Encode for DigestIndex { +impl Encode for DigestIndex { fn encode_to(&self, dest: &mut W) { dest.push_byte(2); self.block.encode_to(dest); @@ -111,7 +112,7 @@ impl Encode for DigestIndex { } } -impl Decode for InputKey { +impl Decode for InputKey { fn decode(input: &mut I) -> Option { match input.read_byte()? { 1 => Some(InputKey::ExtrinsicIndex(ExtrinsicIndex { @@ -133,17 +134,17 @@ mod tests { #[test] fn extrinsic_index_serialized_and_deserialized() { - let original = ExtrinsicIndex { block: 777, key: vec![42] }; + let original = ExtrinsicIndex { block: 777u64, key: vec![42] }; let serialized = original.encode(); - let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); + let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); assert_eq!(InputKey::ExtrinsicIndex(original), deserialized); } #[test] fn digest_index_serialized_and_deserialized() { - let original = DigestIndex { block: 777, key: vec![42] }; + let original = DigestIndex { block: 777u64, key: vec![42] }; let serialized = original.encode(); - let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); + let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); assert_eq!(InputKey::DigestIndex(original), deserialized); } } diff --git a/core/state-machine/src/changes_trie/mod.rs b/core/state-machine/src/changes_trie/mod.rs index c29131cc0c5d8bd82724a02b0a2b072c59f2fd81..7dc95fb5a7ba7350e930d93366ceb5cd1d695cfb 100644 --- a/core/state-machine/src/changes_trie/mod.rs +++ b/core/state-machine/src/changes_trie/mod.rs @@ -33,7 +33,7 @@ //! to the set of lower-level digest blocks. //! //! Changes trie only contains the top level storage changes. Sub-level changes -//! are propogated through its storage root on the top level storage. +//! are propagated through its storage root on the top level storage. mod build; mod build_iterator; @@ -47,60 +47,117 @@ pub use self::changes_iterator::{key_changes, key_changes_proof, key_changes_pro pub use self::prune::{prune, oldest_non_pruned_trie}; use hash_db::Hasher; -use heapsize::HeapSizeOf; use crate::backend::Backend; +use num_traits::{One, Zero}; +use parity_codec::{Decode, Encode}; use primitives; use crate::changes_trie::build::prepare_input; use crate::overlayed_changes::OverlayedChanges; -use crate::trie_backend_essence::TrieBackendStorage; use trie::{DBValue, trie_root}; /// Changes that are made outside of extrinsics are marked with this index; pub const NO_EXTRINSIC_INDEX: u32 = 0xffffffff; +/// Requirements for block number that can be used with changes tries. +pub trait BlockNumber: + Send + Sync + 'static + + ::std::fmt::Display + + Clone + + From + One + Zero + + PartialEq + Ord + + ::std::ops::Add + ::std::ops::Sub + + ::std::ops::Mul + ::std::ops::Div + + ::std::ops::Rem + + ::std::ops::AddAssign + + num_traits::CheckedMul + num_traits::CheckedSub + + Decode + Encode +{} + +impl BlockNumber for T where T: + Send + Sync + 'static + + ::std::fmt::Display + + Clone + + From + One + Zero + + PartialEq + Ord + + ::std::ops::Add + ::std::ops::Sub + + ::std::ops::Mul + ::std::ops::Div + + ::std::ops::Rem + + ::std::ops::AddAssign + + num_traits::CheckedMul + num_traits::CheckedSub + + Decode + Encode, +{} + /// Block identifier that could be used to determine fork of this block. #[derive(Debug)] -pub struct AnchorBlockId { +pub struct AnchorBlockId { /// Hash of this block. pub hash: Hash, /// Number of this block. - pub number: u64, + pub number: Number, } /// Changes trie storage. Provides access to trie roots and trie nodes. -pub trait RootsStorage: Send + Sync { +pub trait RootsStorage: Send + Sync { + /// Resolve hash of the block into anchor. + fn build_anchor(&self, hash: H::Out) -> Result, String>; /// Get changes trie root for the block with given number which is an ancestor (or the block /// itself) of the anchor_block (i.e. anchor_block.number >= block). - fn root(&self, anchor: &AnchorBlockId, block: u64) -> Result, String>; + fn root(&self, anchor: &AnchorBlockId, block: Number) -> Result, String>; } /// Changes trie storage. Provides access to trie roots and trie nodes. -pub trait Storage: RootsStorage { +pub trait Storage: RootsStorage { /// Get a trie node. fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; } +/// Changes trie storage -> trie backend essence adapter. +pub struct TrieBackendStorageAdapter<'a, H: Hasher, Number: BlockNumber>(pub &'a dyn Storage); + +impl<'a, H: Hasher, N: BlockNumber> crate::TrieBackendStorage for TrieBackendStorageAdapter<'a, H, N> { + type Overlay = trie::MemoryDB; + + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + self.0.get(key, prefix) + } +} + /// Changes trie configuration. pub type Configuration = primitives::ChangesTrieConfiguration; /// Compute the changes trie root and transaction for given block. -/// Returns None if there's no data to perform computation. -pub fn compute_changes_trie_root<'a, B: Backend, S: Storage, H: Hasher>( +/// Returns Err(()) if unknown `parent_hash` has been passed. +/// Returns Ok(None) if there's no data to perform computation. +/// Panics if background storage returns an error. +pub fn compute_changes_trie_root<'a, B: Backend, S: Storage, H: Hasher, Number: BlockNumber>( backend: &B, storage: Option<&'a S>, changes: &OverlayedChanges, - parent: &'a AnchorBlockId, -) -> Option<(H::Out, Vec<(Vec, Vec)>)> + parent_hash: H::Out, +) -> Result, Vec)>)>, ()> where - &'a S: TrieBackendStorage, - H::Out: Ord + HeapSizeOf, + H::Out: Ord + 'static, { - let input_pairs = prepare_input::(backend, storage, changes, parent) - .expect("storage is not allowed to fail within runtime")?; - let transaction = input_pairs.into_iter() - .map(Into::into) - .collect::>(); - let root = trie_root::(transaction.iter().map(|(k, v)| (&*k, &*v))); - - Some((root, transaction)) + let (storage, config) = match (storage, changes.changes_trie_config.as_ref()) { + (Some(storage), Some(config)) => (storage, config), + _ => return Ok(None), + }; + + // build_anchor error should not be considered fatal + let parent = storage.build_anchor(parent_hash).map_err(|_| ())?; + + // storage errors are considered fatal (similar to situations when runtime fetches values from storage) + let input_pairs = prepare_input::(backend, storage, config, changes, &parent) + .expect("storage is not allowed to fail within runtime"); + match input_pairs { + Some(input_pairs) => { + let transaction = input_pairs.into_iter() + .map(Into::into) + .collect::>(); + let root = trie_root::(transaction.iter().map(|(k, v)| (&*k, &*v))); + + Ok(Some((root, transaction))) + }, + None => Ok(None), + } } diff --git a/core/state-machine/src/changes_trie/prune.rs b/core/state-machine/src/changes_trie/prune.rs index de872a325589e9854b135ab1c3acce981edac994..3aedf66f757129081c7c2417598ead6219968c96 100644 --- a/core/state-machine/src/changes_trie/prune.rs +++ b/core/state-machine/src/changes_trie/prune.rs @@ -17,55 +17,62 @@ //! Changes trie pruning-related functions. use hash_db::Hasher; -use heapsize::HeapSizeOf; use trie::Recorder; use log::warn; +use num_traits::One; use crate::proving_backend::ProvingBackendEssence; use crate::trie_backend_essence::TrieBackendEssence; -use crate::changes_trie::{AnchorBlockId, Configuration, Storage}; +use crate::changes_trie::{AnchorBlockId, Configuration, Storage, BlockNumber}; use crate::changes_trie::storage::TrieBackendAdapter; /// Get number of oldest block for which changes trie is not pruned /// given changes trie configuration, pruning parameter and number of /// best finalized block. -pub fn oldest_non_pruned_trie( +pub fn oldest_non_pruned_trie( config: &Configuration, - min_blocks_to_keep: u64, - best_finalized_block: u64, -) -> u64 { + min_blocks_to_keep: Number, + best_finalized_block: Number, +) -> Number { let max_digest_interval = config.max_digest_interval(); - let max_digest_block = best_finalized_block - best_finalized_block % max_digest_interval; + let best_finalized_block_rem = best_finalized_block.clone() % max_digest_interval.into(); + let max_digest_block = best_finalized_block - best_finalized_block_rem; match pruning_range(config, min_blocks_to_keep, max_digest_block) { - Some((_, last_pruned_block)) => last_pruned_block + 1, - None => 1, + Some((_, last_pruned_block)) => last_pruned_block + One::one(), + None => One::one(), } } -/// Prune obslete changes tries. Puning happens at the same block, where highest +/// Prune obsolete changes tries. Pruning happens at the same block, where highest /// level digest is created. Pruning guarantees to save changes tries for last -/// `min_blocks_to_keep` blocks. We only prune changes tries at `max_digest_iterval` +/// `min_blocks_to_keep` blocks. We only prune changes tries at `max_digest_interval` /// ranges. /// Returns MemoryDB that contains all deleted changes tries nodes. -pub fn prune, H: Hasher, F: FnMut(H::Out)>( +pub fn prune, H: Hasher, Number: BlockNumber, F: FnMut(H::Out)>( config: &Configuration, storage: &S, - min_blocks_to_keep: u64, - current_block: &AnchorBlockId, + min_blocks_to_keep: Number, + current_block: &AnchorBlockId, mut remove_trie_node: F, -) - where - H::Out: HeapSizeOf, -{ +) { // select range for pruning - let (first, last) = match pruning_range(config, min_blocks_to_keep, current_block.number) { + let (first, last) = match pruning_range(config, min_blocks_to_keep, current_block.number.clone()) { Some((first, last)) => (first, last), None => return, }; // delete changes trie for every block in range // FIXME: limit `max_digest_interval` so that this cycle won't involve huge ranges - for block in first..last+1 { - let root = match storage.root(current_block, block) { + let mut block = first; + loop { + if block >= last.clone() + One::one() { + break; + } + + let prev_block = block.clone(); + block += One::one(); + + let block = prev_block; + let root = match storage.root(current_block, block.clone()) { Ok(Some(root)) => root, Ok(None) => continue, Err(error) => { @@ -95,11 +102,15 @@ pub fn prune, H: Hasher, F: FnMut(H::Out)>( } /// Select blocks range (inclusive from both ends) for pruning changes tries in. -fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> Option<(u64, u64)> { +fn pruning_range( + config: &Configuration, + min_blocks_to_keep: Number, + block: Number, +) -> Option<(Number, Number)> { // compute number of changes tries we actually want to keep let (prune_interval, blocks_to_keep) = if config.is_digest_build_enabled() { // we only CAN prune at block where max-level-digest is created - let max_digest_interval = match config.digest_level_at_block(block) { + let max_digest_interval = match config.digest_level_at_block(block.clone()) { Some((digest_level, digest_interval, _)) if digest_level == config.digest_levels => digest_interval, _ => return None, @@ -111,7 +122,7 @@ fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> // number of blocks BEFORE current block where changes tries are not pruned ( max_digest_interval, - max_digest_intervals_to_keep.checked_mul(max_digest_interval) + max_digest_intervals_to_keep.checked_mul(&max_digest_interval.into()) ) } else { ( @@ -121,11 +132,11 @@ fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> }; // last block for which changes trie is pruned - let last_block_to_prune = blocks_to_keep.and_then(|b| block.checked_sub(b)); - let first_block_to_prune = last_block_to_prune.clone().and_then(|b| b.checked_sub(prune_interval)); + let last_block_to_prune = blocks_to_keep.and_then(|b| block.checked_sub(&b)); + let first_block_to_prune = last_block_to_prune.clone().and_then(|b| b.checked_sub(&prune_interval.into())); last_block_to_prune - .and_then(|last| first_block_to_prune.map(|first| (first + 1, last))) + .and_then(|last| first_block_to_prune.map(|first| (first + One::one(), last))) } /// Select pruning delay for the changes tries. To make sure we could build a changes @@ -136,13 +147,16 @@ fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> /// 0 or 1: means that only last changes trie is guaranteed to exists; /// 2: the last chnages trie + previous changes trie /// ... -fn max_digest_intervals_to_keep(min_blocks_to_keep: u64, max_digest_interval: u64) -> u64 { +fn max_digest_intervals_to_keep( + min_blocks_to_keep: Number, + max_digest_interval: u32, +) -> Number { // config.digest_level_at_block ensures that it is not zero debug_assert!(max_digest_interval != 0); - let max_digest_intervals_to_keep = min_blocks_to_keep / max_digest_interval; - if max_digest_intervals_to_keep == 0 { - 1 + let max_digest_intervals_to_keep = min_blocks_to_keep / max_digest_interval.into(); + if max_digest_intervals_to_keep.is_zero() { + One::one() } else { max_digest_intervals_to_keep } @@ -157,22 +171,19 @@ mod tests { use crate::changes_trie::storage::InMemoryStorage; use super::*; - fn config(interval: u64, levels: u32) -> Configuration { + fn config(interval: u32, levels: u32) -> Configuration { Configuration { digest_interval: interval, digest_levels: levels, } } - fn prune_by_collect, H: Hasher>( + fn prune_by_collect, H: Hasher>( config: &Configuration, storage: &S, min_blocks_to_keep: u64, current_block: u64, - ) -> HashSet - where - H::Out: HeapSizeOf, - { + ) -> HashSet { let mut pruned_trie_nodes = HashSet::new(); prune(config, storage, min_blocks_to_keep, &AnchorBlockId { hash: Default::default(), number: current_block }, |node| { pruned_trie_nodes.insert(node); }); @@ -181,7 +192,7 @@ mod tests { #[test] fn prune_works() { - fn prepare_storage() -> InMemoryStorage { + fn prepare_storage() -> InMemoryStorage { let mut mdb1 = MemoryDB::::default(); let root1 = insert_into_memory_db::(&mut mdb1, vec![(vec![10], vec![20])]).unwrap(); let mut mdb2 = MemoryDB::::default(); @@ -248,60 +259,60 @@ mod tests { #[test] fn pruning_range_works() { // DIGESTS ARE NOT CREATED + NO TRIES ARE PRUNED - assert_eq!(pruning_range(&config(10, 0), 2, 2), None); + assert_eq!(pruning_range(&config(10, 0), 2u64, 2u64), None); // DIGESTS ARE NOT CREATED + SOME TRIES ARE PRUNED - assert_eq!(pruning_range(&config(10, 0), 100, 110), Some((10, 10))); - assert_eq!(pruning_range(&config(10, 0), 100, 210), Some((110, 110))); + assert_eq!(pruning_range(&config(10, 0), 100u64, 110u64), Some((10, 10))); + assert_eq!(pruning_range(&config(10, 0), 100u64, 210u64), Some((110, 110))); // DIGESTS ARE CREATED + NO TRIES ARE PRUNED - assert_eq!(pruning_range(&config(10, 2), 2, 0), None); - assert_eq!(pruning_range(&config(10, 2), 30, 100), None); - assert_eq!(pruning_range(&config(::std::u64::MAX, 2), 1, 1024), None); - assert_eq!(pruning_range(&config(::std::u64::MAX, 2), ::std::u64::MAX, 1024), None); - assert_eq!(pruning_range(&config(32, 2), 2048, 512), None); - assert_eq!(pruning_range(&config(32, 2), 2048, 1024), None); + assert_eq!(pruning_range(&config(10, 2), 2u64, 0u64), None); + assert_eq!(pruning_range(&config(10, 2), 30u64, 100u64), None); + assert_eq!(pruning_range(&config(::std::u32::MAX, 2), 1u64, 1024u64), None); + assert_eq!(pruning_range(&config(::std::u32::MAX, 2), ::std::u64::MAX, 1024u64), None); + assert_eq!(pruning_range(&config(32, 2), 2048u64, 512u64), None); + assert_eq!(pruning_range(&config(32, 2), 2048u64, 1024u64), None); // DIGESTS ARE CREATED + SOME TRIES ARE PRUNED // when we do not want to keep any highest-level-digests // (system forces to keep at least one) - assert_eq!(pruning_range(&config(4, 2), 0, 32), Some((1, 16))); - assert_eq!(pruning_range(&config(4, 2), 0, 64), Some((33, 48))); + assert_eq!(pruning_range(&config(4, 2), 0u64, 32u64), Some((1, 16))); + assert_eq!(pruning_range(&config(4, 2), 0u64, 64u64), Some((33, 48))); // when we want to keep 1 (last) highest-level-digest - assert_eq!(pruning_range(&config(4, 2), 16, 32), Some((1, 16))); - assert_eq!(pruning_range(&config(4, 2), 16, 64), Some((33, 48))); + assert_eq!(pruning_range(&config(4, 2), 16u64, 32u64), Some((1, 16))); + assert_eq!(pruning_range(&config(4, 2), 16u64, 64u64), Some((33, 48))); // when we want to keep 1 (last) + 1 additional level digests - assert_eq!(pruning_range(&config(32, 2), 4096, 5120), Some((1, 1024))); - assert_eq!(pruning_range(&config(32, 2), 4096, 6144), Some((1025, 2048))); + assert_eq!(pruning_range(&config(32, 2), 4096u64, 5120u64), Some((1, 1024))); + assert_eq!(pruning_range(&config(32, 2), 4096u64, 6144u64), Some((1025, 2048))); } #[test] fn max_digest_intervals_to_keep_works() { - assert_eq!(max_digest_intervals_to_keep(1024, 1025), 1); - assert_eq!(max_digest_intervals_to_keep(1024, 1023), 1); - assert_eq!(max_digest_intervals_to_keep(1024, 512), 2); - assert_eq!(max_digest_intervals_to_keep(1024, 511), 2); - assert_eq!(max_digest_intervals_to_keep(1024, 100), 10); + assert_eq!(max_digest_intervals_to_keep(1024u64, 1025), 1u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 1023), 1u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 512), 2u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 511), 2u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 100), 10u64); } #[test] fn oldest_non_pruned_trie_works() { // when digests are not created at all - assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100, 10), 1); - assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100, 110), 11); + assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100u64, 10u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100u64, 110u64), 11); // when only l1 digests are created - assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100, 50), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100, 110), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100, 210), 101); + assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100u64, 50u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100u64, 110u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100u64, 210u64), 101); // when l2 digests are created - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 50), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 110), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 210), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 10110), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 20110), 10001); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 50u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 110u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 210u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 10110u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 20110u64), 10001); } } diff --git a/core/state-machine/src/changes_trie/storage.rs b/core/state-machine/src/changes_trie/storage.rs index decc332c1a6187ea364eb4db2a2fb5e75a38a82c..8da205251532c595b986a71d54f65873f12382f9 100644 --- a/core/state-machine/src/changes_trie/storage.rs +++ b/core/state-machine/src/changes_trie/storage.rs @@ -16,13 +16,12 @@ //! Changes trie storage utilities. -use std::collections::HashMap; +use std::collections::BTreeMap; use hash_db::Hasher; use trie::DBValue; -use heapsize::HeapSizeOf; use trie::MemoryDB; use parking_lot::RwLock; -use crate::changes_trie::{AnchorBlockId, RootsStorage, Storage}; +use crate::changes_trie::{RootsStorage, Storage, AnchorBlockId, BlockNumber}; use crate::trie_backend_essence::TrieBackendStorage; #[cfg(test)] @@ -33,27 +32,27 @@ use crate::backend::insert_into_memory_db; use crate::changes_trie::input::InputPair; /// In-memory implementation of changes trie storage. -pub struct InMemoryStorage where H::Out: HeapSizeOf { - data: RwLock>, +pub struct InMemoryStorage { + data: RwLock>, } /// Adapter for using changes trie storage as a TrieBackendEssence' storage. -pub struct TrieBackendAdapter<'a, H: Hasher, S: 'a + Storage> { +pub struct TrieBackendAdapter<'a, H: Hasher, Number: BlockNumber, S: 'a + Storage> { storage: &'a S, - _hasher: ::std::marker::PhantomData, + _hasher: ::std::marker::PhantomData<(H, Number)>, } -struct InMemoryStorageData where H::Out: HeapSizeOf { - roots: HashMap, +struct InMemoryStorageData { + roots: BTreeMap, mdb: MemoryDB, } -impl InMemoryStorage where H::Out: HeapSizeOf { +impl InMemoryStorage { /// Create the storage from given in-memory database. pub fn with_db(mdb: MemoryDB) -> Self { Self { data: RwLock::new(InMemoryStorageData { - roots: HashMap::new(), + roots: BTreeMap::new(), mdb, }), } @@ -64,10 +63,20 @@ impl InMemoryStorage where H::Out: HeapSizeOf { Self::with_db(Default::default()) } + /// Create the storage with given blocks. + pub fn with_blocks(blocks: Vec<(Number, H::Out)>) -> Self { + Self { + data: RwLock::new(InMemoryStorageData { + roots: blocks.into_iter().collect(), + mdb: MemoryDB::default(), + }), + } + } + #[cfg(test)] - pub fn with_inputs(inputs: Vec<(u64, Vec)>) -> Self { + pub fn with_inputs(inputs: Vec<(Number, Vec>)>) -> Self { let mut mdb = MemoryDB::default(); - let mut roots = HashMap::new(); + let mut roots = BTreeMap::new(); for (block, pairs) in inputs { let root = insert_into_memory_db::(&mut mdb, pairs.into_iter().map(Into::into)); if let Some(root) = root { @@ -102,32 +111,44 @@ impl InMemoryStorage where H::Out: HeapSizeOf { } /// Insert changes trie for given block. - pub fn insert(&self, block: u64, changes_trie_root: H::Out, trie: MemoryDB) { + pub fn insert(&self, block: Number, changes_trie_root: H::Out, trie: MemoryDB) { let mut data = self.data.write(); data.roots.insert(block, changes_trie_root); data.mdb.consolidate(trie); } } -impl RootsStorage for InMemoryStorage where H::Out: HeapSizeOf { - fn root(&self, _anchor_block: &AnchorBlockId, block: u64) -> Result, String> { +impl RootsStorage for InMemoryStorage { + fn build_anchor(&self, parent_hash: H::Out) -> Result, String> { + self.data.read().roots.iter() + .find(|(_, v)| **v == parent_hash) + .map(|(k, _)| AnchorBlockId { hash: parent_hash, number: k.clone() }) + .ok_or_else(|| format!("Can't find associated number for block {:?}", parent_hash)) + } + + fn root(&self, _anchor_block: &AnchorBlockId, block: Number) -> Result, String> { Ok(self.data.read().roots.get(&block).cloned()) } } -impl Storage for InMemoryStorage where H::Out: HeapSizeOf { +impl Storage for InMemoryStorage { fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { MemoryDB::::get(&self.data.read().mdb, key, prefix) } } -impl<'a, H: Hasher, S: 'a + Storage> TrieBackendAdapter<'a, H, S> { +impl<'a, H: Hasher, Number: BlockNumber, S: 'a + Storage> TrieBackendAdapter<'a, H, Number, S> { pub fn new(storage: &'a S) -> Self { Self { storage, _hasher: Default::default() } } } -impl<'a, H: Hasher, S: 'a + Storage> TrieBackendStorage for TrieBackendAdapter<'a, H, S> { +impl<'a, H, Number, S> TrieBackendStorage for TrieBackendAdapter<'a, H, Number, S> + where + S: 'a + Storage, + Number: BlockNumber, + H: Hasher, +{ type Overlay = MemoryDB; fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index c88798f37f19b8b2278574fc0fd84f34e762df78..5a0daeb3488b9179345b9c5c09b92bf4e71e1aaa 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -18,13 +18,13 @@ use std::{error, fmt, cmp::Ord}; use log::warn; -use crate::backend::{Backend, Consolidate}; -use crate::changes_trie::{AnchorBlockId, Storage as ChangesTrieStorage, compute_changes_trie_root}; -use crate::{Externalities, OverlayedChanges, OffchainExt, ChildStorageKey}; +use crate::backend::Backend; +use crate::changes_trie::{Storage as ChangesTrieStorage, compute_changes_trie_root}; +use crate::{Externalities, OverlayedChanges, ChildStorageKey}; use hash_db::Hasher; +use primitives::offchain; use primitives::storage::well_known_keys::is_child_storage_key; use trie::{MemoryDB, TrieDBMut, TrieMut, default_child_trie_root}; -use heapsize::HeapSizeOf; const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within runtime"; @@ -58,10 +58,9 @@ impl error::Error for Error { } /// Wraps a read-only backend, call executor, and current overlayed changes. -pub struct Ext<'a, H, B, T, O> +pub struct Ext<'a, H, N, B, T, O> where H: Hasher, - B: 'a + Backend, { /// The overlayed changes to write to. @@ -79,20 +78,23 @@ where /// This differs from `storage_transaction` behavior, because the moment when /// `storage_changes_root` is called matters + we need to remember additional /// data at this moment (block number). - changes_trie_transaction: Option<(u64, MemoryDB, H::Out)>, + changes_trie_transaction: Option<(MemoryDB, H::Out)>, /// Additional externalities for offchain workers. /// /// If None, some methods from the trait might not supported. offchain_externalities: Option<&'a mut O>, + /// Dummy usage of N arg. + _phantom: ::std::marker::PhantomData, } -impl<'a, H, B, T, O> Ext<'a, H, B, T, O> +impl<'a, H, N, B, T, O> Ext<'a, H, N, B, T, O> where H: Hasher, B: 'a + Backend, - T: 'a + ChangesTrieStorage, - O: 'a + OffchainExt, - H::Out: Ord + HeapSizeOf, + T: 'a + ChangesTrieStorage, + O: 'a + offchain::Externalities, + H::Out: Ord + 'static, + N: crate::changes_trie::BlockNumber, { /// Create a new `Ext` from overlayed changes and read-only backend pub fn new( @@ -108,6 +110,7 @@ where changes_trie_storage, changes_trie_transaction: None, offchain_externalities, + _phantom: Default::default(), } } @@ -119,7 +122,7 @@ where self.storage_transaction .expect("storage_transaction always set after calling storage root; qed"), self.changes_trie_transaction - .map(|(_, tx, _)| tx), + .map(|(tx, _)| tx), ); ( @@ -135,40 +138,16 @@ where self.storage_transaction = None; } - /// Fetch child storage root together with its transaction. - fn child_storage_root_transaction(&mut self, storage_key: &[u8]) -> (Vec, B::Transaction) { - self.mark_dirty(); - - let (root, is_default, transaction) = { - let delta = self.overlay.committed.children.get(storage_key) - .into_iter() - .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) - .chain(self.overlay.prospective.children.get(storage_key) - .into_iter() - .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone())))); - - self.backend.child_storage_root(storage_key, delta) - }; - - let root_val = if is_default { - None - } else { - Some(root.clone()) - }; - self.overlay.sync_child_storage_root(storage_key, root_val); - - (root, transaction) - } } #[cfg(test)] -impl<'a, H, B, T, O> Ext<'a, H, B, T, O> +impl<'a, H, N, B, T, O> Ext<'a, H, N, B, T, O> where H: Hasher, - B: 'a + Backend, - T: 'a + ChangesTrieStorage, - O: 'a + OffchainExt, + T: 'a + ChangesTrieStorage, + O: 'a + offchain::Externalities, + N: crate::changes_trie::BlockNumber, { pub fn storage_pairs(&self) -> Vec<(Vec, Vec)> { use std::collections::HashMap; @@ -184,13 +163,14 @@ where } } -impl<'a, B, T, H, O> Externalities for Ext<'a, H, B, T, O> +impl<'a, B, T, H, N, O> Externalities for Ext<'a, H, N, B, T, O> where H: Hasher, B: 'a + Backend, - T: 'a + ChangesTrieStorage, - O: 'a + OffchainExt, - H::Out: Ord + HeapSizeOf, + T: 'a + ChangesTrieStorage, + O: 'a + offchain::Externalities, + H::Out: Ord + 'static, + N: crate::changes_trie::BlockNumber, { fn storage(&self, key: &[u8]) -> Option> { let _guard = panic_handler::AbortGuard::new(true); @@ -289,21 +269,24 @@ where return root.clone(); } - let mut transaction = B::Transaction::default(); - let child_storage_keys: std::collections::BTreeSet<_> = self.overlay.prospective.children.keys().cloned() - .chain(self.overlay.committed.children.keys().cloned()).collect(); + let child_storage_keys = + self.overlay.prospective.children.keys() + .chain(self.overlay.committed.children.keys()); + + let child_delta_iter = child_storage_keys.map(|storage_key| + (storage_key.clone(), self.overlay.committed.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) + .chain(self.overlay.prospective.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone())))))); - for key in child_storage_keys { - let (_, t) = self.child_storage_root_transaction(&key); - transaction.consolidate(t); - } // compute and memoize let delta = self.overlay.committed.top.iter().map(|(k, v)| (k.clone(), v.value.clone())) .chain(self.overlay.prospective.top.iter().map(|(k, v)| (k.clone(), v.value.clone()))); - let (root, t) = self.backend.storage_root(delta); - transaction.consolidate(t); + let (root, transaction) = self.backend.full_storage_root(delta, child_delta_iter); self.storage_transaction = Some((transaction, root)); root } @@ -317,18 +300,32 @@ where default_child_trie_root::(storage_key.as_ref()) ) } else { - self.child_storage_root_transaction(storage_key.as_ref()).0 + let storage_key = storage_key.as_ref(); + + let delta = self.overlay.committed.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) + .chain(self.overlay.prospective.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.clone().into_iter())); + + let root = self.backend.child_storage_root(storage_key, delta).0; + + self.overlay.set_storage(storage_key.to_vec(), Some(root.to_vec())); + + root + } } - fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option { + fn storage_changes_root(&mut self, parent_hash: H::Out) -> Result, ()> { let _guard = panic_handler::AbortGuard::new(true); - let root_and_tx = compute_changes_trie_root::<_, T, H>( + let root_and_tx = compute_changes_trie_root::<_, T, H, N>( self.backend, self.changes_trie_storage.clone(), self.overlay, - &AnchorBlockId { hash: parent, number: parent_num }, - ); + parent_hash, + )?; let root_and_tx = root_and_tx.map(|(root, changes)| { let mut calculated_root = Default::default(); let mut mdb = MemoryDB::default(); @@ -339,28 +336,21 @@ where } } - (parent_num + 1, mdb, root) + (mdb, root) }); - let root = root_and_tx.as_ref().map(|(_, _, root)| root.clone()); + let root = root_and_tx.as_ref().map(|(_, root)| root.clone()); self.changes_trie_transaction = root_and_tx; - root + Ok(root) } - fn submit_extrinsic(&mut self, extrinsic: Vec) -> Result<(), ()> { - let _guard = panic_handler::AbortGuard::new(true); - if let Some(ext) = self.offchain_externalities.as_mut() { - ext.submit_extrinsic(extrinsic); - Ok(()) - } else { - warn!("Call to submit_extrinsic without offchain externalities set."); - Err(()) - } + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { + self.offchain_externalities.as_mut().map(|x| &mut **x as _) } } #[cfg(test)] mod tests { - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; use parity_codec::Encode; use primitives::{Blake2Hasher}; use primitives::storage::well_known_keys::EXTRINSIC_INDEX; @@ -371,8 +361,8 @@ mod tests { use super::*; type TestBackend = InMemory; - type TestChangesTrieStorage = InMemoryChangesTrieStorage; - type TestExt<'a> = Ext<'a, Blake2Hasher, TestBackend, TestChangesTrieStorage, crate::NeverOffchainExt>; + type TestChangesTrieStorage = InMemoryChangesTrieStorage; + type TestExt<'a> = Ext<'a, Blake2Hasher, u64, TestBackend, TestChangesTrieStorage, crate::NeverOffchainExt>; fn prepare_overlay_with_changes() -> OverlayedChanges { OverlayedChanges { @@ -399,26 +389,26 @@ mod tests { let mut overlay = prepare_overlay_with_changes(); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, None, None); - assert_eq!(ext.storage_changes_root(Default::default(), 100), None); + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None); } #[test] fn storage_changes_root_is_none_when_extrinsic_changes_are_none() { let mut overlay = prepare_overlay_with_changes(); overlay.changes_trie_config = None; - let storage = TestChangesTrieStorage::new(); + let storage = TestChangesTrieStorage::with_blocks(vec![(100, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default(), 100), None); + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None); } #[test] fn storage_changes_root_is_some_when_extrinsic_changes_are_non_empty() { let mut overlay = prepare_overlay_with_changes(); - let storage = TestChangesTrieStorage::new(); + let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default(), 99), + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), Some(hex!("5b829920b9c8d554a19ee2a1ba593c4f2ee6fc32822d083e04236d693e8358d5").into())); } @@ -426,10 +416,10 @@ mod tests { fn storage_changes_root_is_some_when_extrinsic_changes_are_empty() { let mut overlay = prepare_overlay_with_changes(); overlay.prospective.top.get_mut(&vec![1]).unwrap().value = None; - let storage = TestChangesTrieStorage::new(); + let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default(), 99), + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), Some(hex!("bcf494e41e29a15c9ae5caa053fe3cb8b446ee3e02a254efbdec7a19235b76e4").into())); } } diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index bd9d9284e5cf798620009e9ad90f2e9e1d1d5eab..93d70423d5f3fa57ebe73468816a7f6eb54b0ea4 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -22,9 +22,10 @@ use std::{fmt, panic::UnwindSafe, result, marker::PhantomData}; use std::borrow::Cow; use log::warn; use hash_db::Hasher; -use heapsize::HeapSizeOf; use parity_codec::{Decode, Encode}; -use primitives::{storage::well_known_keys, NativeOrEncoded, NeverNativeValue, OffchainExt}; +use primitives::{ + storage::well_known_keys, NativeOrEncoded, NeverNativeValue, offchain +}; pub mod backend; mod changes_trie; @@ -52,7 +53,10 @@ pub use changes_trie::{ oldest_non_pruned_trie as oldest_non_pruned_changes_trie }; pub use overlayed_changes::OverlayedChanges; -pub use proving_backend::{create_proof_check_backend, create_proof_check_backend_storage}; +pub use proving_backend::{ + create_proof_check_backend, create_proof_check_backend_storage, + Recorder as ProofRecorder, ProvingBackend, +}; pub use trie_backend_essence::{TrieBackendStorage, Storage}; pub use trie_backend::TrieBackend; @@ -215,12 +219,10 @@ pub trait Externalities { fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec; /// Get the change trie root of the current storage overlay at a block with given parent. - fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option where H::Out: Ord; + fn storage_changes_root(&mut self, parent: H::Out) -> Result, ()> where H::Out: Ord; - /// Submit extrinsic. - /// - /// Returns an error in case the API is not available. - fn submit_extrinsic(&mut self, extrinsic: Vec) -> Result<(), ()>; + /// Returns offchain externalities extension if present. + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities>; } /// An implementation of offchain extensions that should never be triggered. @@ -233,8 +235,121 @@ impl NeverOffchainExt { } } -impl OffchainExt for NeverOffchainExt { - fn submit_extrinsic(&mut self, _extrinsic: Vec) { unreachable!() } +impl offchain::Externalities for NeverOffchainExt { + fn submit_transaction(&mut self, _extrinsic: Vec) -> Result<(), ()> { + unreachable!() + } + + fn new_crypto_key( + &mut self, + _crypto: offchain::CryptoKind, + ) -> Result { + unreachable!() + } + + fn encrypt( + &mut self, + _key: Option, + _data: &[u8], + ) -> Result, ()> { + unreachable!() + } + + fn decrypt( + &mut self, + _key: Option, + _data: &[u8], + ) -> Result, ()> { + unreachable!() + } + + fn sign(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unreachable!() + } + + fn verify( + &mut self, + _key: Option, + _msg: &[u8], + _signature: &[u8], + ) -> Result { + unreachable!() + } + + fn timestamp(&mut self) -> offchain::Timestamp { + unreachable!() + } + + fn sleep_until(&mut self, _deadline: offchain::Timestamp) { + unreachable!() + } + + fn random_seed(&mut self) -> [u8; 32] { + unreachable!() + } + + fn local_storage_set(&mut self, _key: &[u8], _value: &[u8]) { + unreachable!() + } + + fn local_storage_compare_and_set(&mut self, _key: &[u8], _old_value: &[u8], _new_value: &[u8]) { + unreachable!() + } + + fn local_storage_get(&mut self, _key: &[u8]) -> Option> { + unreachable!() + } + + fn http_request_start( + &mut self, + _method: &str, + _uri: &str, + _meta: &[u8] + ) -> Result { + unreachable!() + } + + fn http_request_add_header( + &mut self, + _request_id: offchain::HttpRequestId, + _name: &str, + _value: &str + ) -> Result<(), ()> { + unreachable!() + } + + fn http_request_write_body( + &mut self, + _request_id: offchain::HttpRequestId, + _chunk: &[u8], + _deadline: Option + ) -> Result<(), offchain::HttpError> { + unreachable!() + } + + fn http_response_wait( + &mut self, + _ids: &[offchain::HttpRequestId], + _deadline: Option + ) -> Vec { + unreachable!() + } + + fn http_response_headers( + &mut self, + _request_id: offchain::HttpRequestId + ) -> Vec<(Vec, Vec)> { + unreachable!() + } + + fn http_response_read_body( + &mut self, + _request_id: offchain::HttpRequestId, + _buffer: &mut [u8], + _deadline: Option + ) -> Result { + unreachable!() + } } /// Code execution engine. @@ -334,7 +449,7 @@ pub fn always_wasm() -> ExecutionManager> { } /// Creates new substrate state machine. -pub fn new<'a, H, B, T, O, Exec>( +pub fn new<'a, H, N, B, T, O, Exec>( backend: &'a B, changes_trie_storage: Option<&'a T>, offchain_ext: Option<&'a mut O>, @@ -342,7 +457,7 @@ pub fn new<'a, H, B, T, O, Exec>( exec: &'a Exec, method: &'a str, call_data: &'a [u8], -) -> StateMachine<'a, H, B, T, O, Exec> { +) -> StateMachine<'a, H, N, B, T, O, Exec> { StateMachine { backend, changes_trie_storage, @@ -356,7 +471,7 @@ pub fn new<'a, H, B, T, O, Exec>( } /// The substrate state machine. -pub struct StateMachine<'a, H, B, T, O, Exec> { +pub struct StateMachine<'a, H, N, B, T, O, Exec> { backend: &'a B, changes_trie_storage: Option<&'a T>, offchain_ext: Option<&'a mut O>, @@ -364,16 +479,17 @@ pub struct StateMachine<'a, H, B, T, O, Exec> { exec: &'a Exec, method: &'a str, call_data: &'a [u8], - _hasher: PhantomData, + _hasher: PhantomData<(H, N)>, } -impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where +impl<'a, H, N, B, T, O, Exec> StateMachine<'a, H, N, B, T, O, Exec> where H: Hasher, Exec: CodeExecutor, B: Backend, - T: ChangesTrieStorage, - O: OffchainExt, - H::Out: Ord + HeapSizeOf, + T: ChangesTrieStorage, + O: offchain::Externalities, + H::Out: Ord + 'static, + N: crate::changes_trie::BlockNumber, { /// Execute a call using the given state backend, overlayed changes, and call executor. /// Produces a state-backend-specific "transaction" which can be used to apply the changes @@ -386,7 +502,7 @@ impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where pub fn execute( &mut self, strategy: ExecutionStrategy, - ) -> Result<(Vec, B::Transaction, Option>), Box> { + ) -> Result<(Vec, B::Transaction, Option>), Box> { // We are not giving a native call and thus we are sure that the result can never be a native // value. self.execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( @@ -410,12 +526,11 @@ impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where R: Decode + Encode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, { - let offchain = self.offchain_ext.as_mut(); let mut externalities = ext::Ext::new( self.overlay, self.backend, self.changes_trie_storage, - offchain.map(|x| &mut **x), + self.offchain_ext.as_mut().map(|x| &mut **x), ); let (result, was_native) = self.exec.call( &mut externalities, @@ -498,7 +613,7 @@ impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where manager: ExecutionManager, compute_tx: bool, mut native_call: Option, - ) -> Result<(NativeOrEncoded, Option, Option>), Box> where + ) -> Result<(NativeOrEncoded, Option, Option>), Box> where R: Decode + Encode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, Handler: FnOnce( @@ -554,21 +669,21 @@ impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where /// Prove execution using the given state backend, overlayed changes, and call executor. pub fn prove_execution( - backend: B, + mut backend: B, overlay: &mut OverlayedChanges, exec: &Exec, method: &str, call_data: &[u8], -) -> Result<(Vec, Vec>), Box> +) -> Result<(Vec, Vec>), Box> where B: Backend, H: Hasher, Exec: CodeExecutor, - H::Out: Ord + HeapSizeOf, + H::Out: Ord + 'static, { - let trie_backend = backend.try_into_trie_backend() - .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; - prove_execution_on_trie_backend(&trie_backend, overlay, exec, method, call_data) + let trie_backend = backend.as_trie_backend() + .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; + prove_execution_on_trie_backend(trie_backend, overlay, exec, method, call_data) } /// Prove execution using the given trie backend, overlayed changes, and call executor. @@ -586,17 +701,17 @@ pub fn prove_execution_on_trie_backend( exec: &Exec, method: &str, call_data: &[u8], -) -> Result<(Vec, Vec>), Box> +) -> Result<(Vec, Vec>), Box> where S: trie_backend_essence::TrieBackendStorage, H: Hasher, Exec: CodeExecutor, - H::Out: Ord + HeapSizeOf, + H::Out: Ord + 'static, { let proving_backend = proving_backend::ProvingBackend::new(trie_backend); let mut sm = StateMachine { backend: &proving_backend, - changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, + changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, offchain_ext: NeverOffchainExt::new(), overlay, exec, @@ -621,13 +736,13 @@ pub fn execution_proof_check( exec: &Exec, method: &str, call_data: &[u8], -) -> Result, Box> +) -> Result, Box> where H: Hasher, Exec: CodeExecutor, - H::Out: Ord + HeapSizeOf, + H::Out: Ord + 'static, { - let trie_backend = proving_backend::create_proof_check_backend::(root.into(), proof)?; + let trie_backend = create_proof_check_backend::(root.into(), proof)?; execution_proof_check_on_trie_backend(&trie_backend, overlay, exec, method, call_data) } @@ -638,15 +753,15 @@ pub fn execution_proof_check_on_trie_backend( exec: &Exec, method: &str, call_data: &[u8], -) -> Result, Box> +) -> Result, Box> where H: Hasher, Exec: CodeExecutor, - H::Out: Ord + HeapSizeOf, + H::Out: Ord + 'static, { let mut sm = StateMachine { backend: trie_backend, - changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, + changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, offchain_ext: NeverOffchainExt::new(), overlay, exec, @@ -663,31 +778,66 @@ where /// Generate storage read proof. pub fn prove_read( - backend: B, + mut backend: B, key: &[u8] -) -> Result<(Option>, Vec>), Box> +) -> Result<(Option>, Vec>), Box> +where + B: Backend, + H: Hasher, + H::Out: Ord +{ + let trie_backend = backend.as_trie_backend() + .ok_or_else( + ||Box::new(ExecutionError::UnableToGenerateProof) as Box + )?; + prove_read_on_trie_backend(trie_backend, key) +} + +/// Generate child storage read proof. +pub fn prove_child_read( + mut backend: B, + storage_key: &[u8], + key: &[u8], +) -> Result<(Option>, Vec>), Box> where B: Backend, H: Hasher, - H::Out: Ord + HeapSizeOf + H::Out: Ord { - let trie_backend = backend.try_into_trie_backend() - .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; - prove_read_on_trie_backend(&trie_backend, key) + let trie_backend = backend.as_trie_backend() + .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; + prove_child_read_on_trie_backend(trie_backend, storage_key, key) } + /// Generate storage read proof on pre-created trie backend. pub fn prove_read_on_trie_backend( trie_backend: &TrieBackend, key: &[u8] -) -> Result<(Option>, Vec>), Box> +) -> Result<(Option>, Vec>), Box> +where + S: trie_backend_essence::TrieBackendStorage, + H: Hasher, + H::Out: Ord +{ + let proving_backend = proving_backend::ProvingBackend::<_, H>::new(trie_backend); + let result = proving_backend.storage(key).map_err(|e| Box::new(e) as Box)?; + Ok((result, proving_backend.extract_proof())) +} + +/// Generate storage read proof on pre-created trie backend. +pub fn prove_child_read_on_trie_backend( + trie_backend: &TrieBackend, + storage_key: &[u8], + key: &[u8] +) -> Result<(Option>, Vec>), Box> where S: trie_backend_essence::TrieBackendStorage, H: Hasher, - H::Out: Ord + HeapSizeOf + H::Out: Ord { let proving_backend = proving_backend::ProvingBackend::<_, H>::new(trie_backend); - let result = proving_backend.storage(key).map_err(|e| Box::new(e) as Box)?; + let result = proving_backend.child_storage(storage_key, key).map_err(|e| Box::new(e) as Box)?; Ok((result, proving_backend.extract_proof())) } @@ -696,33 +846,66 @@ pub fn read_proof_check( root: H::Out, proof: Vec>, key: &[u8], -) -> Result>, Box> +) -> Result>, Box> where H: Hasher, - H::Out: Ord + HeapSizeOf + H::Out: Ord { - let proving_backend = proving_backend::create_proof_check_backend::(root, proof)?; + let proving_backend = create_proof_check_backend::(root, proof)?; read_proof_check_on_proving_backend(&proving_backend, key) } +/// Check child storage read proof, generated by `prove_child_read` call. +pub fn read_child_proof_check( + root: H::Out, + proof: Vec>, + storage_key: &[u8], + key: &[u8], +) -> Result>, Box> +where + H: Hasher, + H::Out: Ord +{ + let proving_backend = create_proof_check_backend::(root, proof)?; + read_child_proof_check_on_proving_backend(&proving_backend, storage_key, key) +} + + /// Check storage read proof on pre-created proving backend. pub fn read_proof_check_on_proving_backend( proving_backend: &TrieBackend, H>, key: &[u8], -) -> Result>, Box> +) -> Result>, Box> where H: Hasher, - H::Out: Ord + HeapSizeOf + H::Out: Ord { - proving_backend.storage(key).map_err(|e| Box::new(e) as Box) + proving_backend.storage(key).map_err(|e| Box::new(e) as Box) +} + +/// Check child storage read proof on pre-created proving backend. +pub fn read_child_proof_check_on_proving_backend( + proving_backend: &TrieBackend, H>, + storage_key: &[u8], + key: &[u8], +) -> Result>, Box> +where + H: Hasher, + H::Out: Ord +{ + proving_backend.child_storage(storage_key, key).map_err(|e| Box::new(e) as Box) } /// Sets overlayed changes' changes trie configuration. Returns error if configuration /// differs from previous OR config decode has failed. -pub(crate) fn set_changes_trie_config(overlay: &mut OverlayedChanges, config: Option>, final_check: bool) -> Result<(), Box> { +pub(crate) fn set_changes_trie_config( + overlay: &mut OverlayedChanges, + config: Option>, + final_check: bool, +) -> Result<(), Box> { let config = match config { Some(v) => Some(Decode::decode(&mut &v[..]) - .ok_or_else(|| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), + .ok_or_else(|| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), None => None, }; @@ -740,16 +923,16 @@ pub(crate) fn set_changes_trie_config(overlay: &mut OverlayedChanges, config: Op /// Reads storage value from overlay or from the backend. fn try_read_overlay_value(overlay: &OverlayedChanges, backend: &B, key: &[u8]) - -> Result>, Box> + -> Result>, Box> where H: Hasher, - B: Backend, { match overlay.storage(key).map(|x| x.map(|x| x.to_vec())) { Some(value) => Ok(value), - None => backend.storage(key) - .map_err(|err| Box::new(ExecutionError::Backend(format!("{}", err))) as Box), + None => backend + .storage(key) + .map_err(|err| Box::new(ExecutionError::Backend(format!("{}", err))) as Box), } } @@ -823,7 +1006,7 @@ mod tests { fn execute_works() { assert_eq!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -844,7 +1027,7 @@ mod tests { fn execute_works_with_native_else_wasm() { assert_eq!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -865,7 +1048,7 @@ mod tests { let mut consensus_failed = false; assert!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -920,7 +1103,8 @@ mod tests { b"abc".to_vec() => b"2".to_vec(), b"bbb".to_vec() => b"3".to_vec() ]; - let backend = InMemory::::from(initial).try_into_trie_backend().unwrap(); + let mut state = InMemory::::from(initial); + let backend = state.as_trie_backend().unwrap(); let mut overlay = OverlayedChanges { committed: map![ b"aba".to_vec() => OverlayedValue::from(Some(b"1312".to_vec())), @@ -934,8 +1118,8 @@ mod tests { }; { - let changes_trie_storage = InMemoryChangesTrieStorage::new(); - let mut ext = Ext::new(&mut overlay, &backend, Some(&changes_trie_storage), NeverOffchainExt::new()); + let changes_trie_storage = InMemoryChangesTrieStorage::::new(); + let mut ext = Ext::new(&mut overlay, backend, Some(&changes_trie_storage), NeverOffchainExt::new()); ext.clear_prefix(b"ab"); } overlay.commit_prospective(); @@ -956,12 +1140,13 @@ mod tests { #[test] fn set_child_storage_works() { - let backend = InMemory::::default().try_into_trie_backend().unwrap(); - let changes_trie_storage = InMemoryChangesTrieStorage::new(); + let mut state = InMemory::::default(); + let backend = state.as_trie_backend().unwrap(); + let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut overlay = OverlayedChanges::default(); let mut ext = Ext::new( &mut overlay, - &backend, + backend, Some(&changes_trie_storage), NeverOffchainExt::new() ); @@ -997,18 +1182,47 @@ mod tests { let remote_root = remote_backend.storage_root(::std::iter::empty()).0; let remote_proof = prove_read(remote_backend, b"value2").unwrap().1; // check proof locally - let local_result1 = read_proof_check::(remote_root, remote_proof.clone(), b"value2").unwrap(); - let local_result2 = read_proof_check::(remote_root, remote_proof.clone(), &[0xff]).is_ok(); + let local_result1 = read_proof_check::( + remote_root, + remote_proof.clone(), + b"value2" + ).unwrap(); + let local_result2 = read_proof_check::( + remote_root, + remote_proof.clone(), + &[0xff] + ).is_ok(); // check that results are correct assert_eq!(local_result1, Some(vec![24])); assert_eq!(local_result2, false); + // on child trie + let remote_backend = trie_backend::tests::test_trie(); + let remote_root = remote_backend.storage_root(::std::iter::empty()).0; + let remote_proof = prove_child_read( + remote_backend, + b":child_storage:default:sub1", + b"value3" + ).unwrap().1; + let local_result1 = read_child_proof_check::( + remote_root, + remote_proof.clone(), + b":child_storage:default:sub1",b"value3" + ).unwrap(); + let local_result2 = read_child_proof_check::( + remote_root, + remote_proof.clone(), + b":child_storage:default:sub1", + b"value2" + ).unwrap(); + assert_eq!(local_result1, Some(vec![142])); + assert_eq!(local_result2, None); } #[test] fn cannot_change_changes_trie_config() { assert!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -1028,7 +1242,7 @@ mod tests { fn cannot_change_changes_trie_config_with_native_else_wasm() { assert!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index 56e69323e878ccb98b180907b8f41618dc480b57..663e4ff72e7c943b9bdf4affec780867609bb428 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -159,19 +159,6 @@ impl OverlayedChanges { } } - /// Sync the child storage root. - pub(crate) fn sync_child_storage_root(&mut self, storage_key: &[u8], root: Option>) { - let entry = self.prospective.top.entry(storage_key.to_vec()).or_default(); - entry.value = root; - - if let Some((Some(extrinsics), _)) = self.prospective.children.get(storage_key) { - for extrinsic in extrinsics { - entry.extrinsics.get_or_insert_with(Default::default) - .insert(*extrinsic); - } - } - } - /// Clear child storage of given storage key. /// /// NOTE that this doesn't take place immediately but written into the prospective @@ -309,7 +296,7 @@ impl From>> for OverlayedValue { #[cfg(test)] mod tests { - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; use primitives::{Blake2Hasher, H256}; use primitives::storage::well_known_keys::EXTRINSIC_INDEX; use crate::backend::InMemory; @@ -374,7 +361,7 @@ mod tests { ..Default::default() }; - let changes_trie_storage = InMemoryChangesTrieStorage::new(); + let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut ext = Ext::new( &mut overlay, &backend, diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index 4d85791faf681afbaaa94cef9090aad7ce98bd3f..60178ff8996d33b35e5989c461d70df9d5fb2de3 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -16,12 +16,15 @@ //! Proving state machine backend. -use std::cell::RefCell; +use std::{cell::RefCell, rc::Rc}; use log::debug; use hash_db::Hasher; -use heapsize::HeapSizeOf; use hash_db::HashDB; -use trie::{Recorder, MemoryDB, PrefixedMemoryDB, TrieError, default_child_trie_root, read_trie_value_with, read_child_trie_value_with, record_all_keys}; +use trie::{ + MemoryDB, PrefixedMemoryDB, TrieError, default_child_trie_root, + read_trie_value_with, read_child_trie_value_with, record_all_keys +}; +pub use trie::Recorder; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::{Ephemeral, TrieBackendEssence, TrieBackendStorage}; use crate::{Error, ExecutionError, Backend}; @@ -37,7 +40,6 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> where S: TrieBackendStorage, H: Hasher, - H::Out: HeapSizeOf, { pub fn storage(&mut self, key: &[u8]) -> Result>, String> { let mut read_overlay = S::Overlay::default(); @@ -87,7 +89,7 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> /// These can be sent to remote node and used as a proof of execution. pub struct ProvingBackend<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> { backend: &'a TrieBackend, - proof_recorder: RefCell>, + proof_recorder: Rc>>, } impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> ProvingBackend<'a, S, H> { @@ -95,14 +97,27 @@ impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> ProvingBackend<'a, S, H> pub fn new(backend: &'a TrieBackend) -> Self { ProvingBackend { backend, - proof_recorder: RefCell::new(Recorder::new()), + proof_recorder: Rc::new(RefCell::new(Recorder::new())), + } + } + + /// Create new proving backend with the given recorder. + pub fn new_with_recorder( + backend: &'a TrieBackend, + proof_recorder: Rc>>, + ) -> Self { + ProvingBackend { + backend, + proof_recorder, } } /// Consume the backend, extracting the gathered proof in lexicographical order /// by value. pub fn extract_proof(self) -> Vec> { - self.proof_recorder.into_inner().drain() + self.proof_recorder + .borrow_mut() + .drain() .into_iter() .map(|n| n.data.to_vec()) .collect() @@ -113,7 +128,7 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> where S: 'a + TrieBackendStorage, H: 'a + Hasher, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { type Error = String; type Transaction = S::Overlay; @@ -147,10 +162,14 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.backend.pairs() } - fn keys(&self, prefix: &Vec) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { self.backend.keys(prefix) } + fn child_keys(&self, child_storage_key: &[u8], prefix: &[u8]) -> Vec> { + self.backend.child_keys(child_storage_key, prefix) + } + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)> { @@ -165,7 +184,7 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.backend.child_storage_root(storage_key, delta) } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { None } } @@ -174,18 +193,17 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> pub fn create_proof_check_backend( root: H::Out, proof: Vec> -) -> Result, H>, Box> +) -> Result, H>, Box> where H: Hasher, - H::Out: HeapSizeOf, { let db = create_proof_check_backend_storage(proof); - if !db.contains(&root, &[]) { - return Err(Box::new(ExecutionError::InvalidProof) as Box); + if db.contains(&root, &[]) { + Ok(TrieBackend::new(db, root)) + } else { + Err(Box::new(ExecutionError::InvalidProof)) } - - Ok(TrieBackend::new(db, root)) } /// Create in-memory storage of proof check backend. @@ -194,7 +212,6 @@ pub fn create_proof_check_backend_storage( ) -> MemoryDB where H: Hasher, - H::Out: HeapSizeOf, { let mut db = MemoryDB::default(); for item in proof { @@ -209,6 +226,7 @@ mod tests { use crate::trie_backend::tests::test_trie; use super::*; use primitives::{Blake2Hasher}; + use crate::ChildStorageKey; fn test_proving<'a>(trie_backend: &'a TrieBackend, Blake2Hasher>) -> ProvingBackend<'a, PrefixedMemoryDB, Blake2Hasher> { ProvingBackend::new(trie_backend) @@ -251,16 +269,16 @@ mod tests { fn proof_recorded_and_checked() { let contents = (0..64).map(|i| (None, vec![i], Some(vec![i]))).collect::>(); let in_memory = InMemory::::default(); - let in_memory = in_memory.update(contents); + let mut in_memory = in_memory.update(contents); let in_memory_root = in_memory.storage_root(::std::iter::empty()).0; (0..64).for_each(|i| assert_eq!(in_memory.storage(&[i]).unwrap().unwrap(), vec![i])); - let trie = in_memory.try_into_trie_backend().unwrap(); + let trie = in_memory.as_trie_backend().unwrap(); let trie_root = trie.storage_root(::std::iter::empty()).0; assert_eq!(in_memory_root, trie_root); (0..64).for_each(|i| assert_eq!(trie.storage(&[i]).unwrap().unwrap(), vec![i])); - let proving = ProvingBackend::new(&trie); + let proving = ProvingBackend::new(trie); assert_eq!(proving.storage(&[42]).unwrap().unwrap(), vec![42]); let proof = proving.extract_proof(); @@ -268,4 +286,75 @@ mod tests { let proof_check = create_proof_check_backend::(in_memory_root.into(), proof).unwrap(); assert_eq!(proof_check.storage(&[42]).unwrap().unwrap(), vec![42]); } + + #[test] + fn proof_recorded_and_checked_with_child() { + let subtrie1 = ChildStorageKey::::from_slice( + b":child_storage:default:sub1" + ).unwrap(); + let subtrie2 = ChildStorageKey::::from_slice( + b":child_storage:default:sub2" + ).unwrap(); + let own1 = subtrie1.into_owned(); + let own2 = subtrie2.into_owned(); + let contents = (0..64).map(|i| (None, vec![i], Some(vec![i]))) + .chain((28..65).map(|i| (Some(own1.clone()), vec![i], Some(vec![i])))) + .chain((10..15).map(|i| (Some(own2.clone()), vec![i], Some(vec![i])))) + .collect::>(); + let in_memory = InMemory::::default(); + let mut in_memory = in_memory.update(contents); + let in_memory_root = in_memory.full_storage_root::<_, Vec<_>, _>( + ::std::iter::empty(), + in_memory.child_storage_keys().map(|k|(k.to_vec(), Vec::new())) + ).0; + (0..64).for_each(|i| assert_eq!( + in_memory.storage(&[i]).unwrap().unwrap(), + vec![i] + )); + (28..65).for_each(|i| assert_eq!( + in_memory.child_storage(&own1[..], &[i]).unwrap().unwrap(), + vec![i] + )); + (10..15).for_each(|i| assert_eq!( + in_memory.child_storage(&own2[..], &[i]).unwrap().unwrap(), + vec![i] + )); + + let trie = in_memory.as_trie_backend().unwrap(); + let trie_root = trie.storage_root(::std::iter::empty()).0; + assert_eq!(in_memory_root, trie_root); + (0..64).for_each(|i| assert_eq!( + trie.storage(&[i]).unwrap().unwrap(), + vec![i] + )); + + let proving = ProvingBackend::new(trie); + assert_eq!(proving.storage(&[42]).unwrap().unwrap(), vec![42]); + + let proof = proving.extract_proof(); + + let proof_check = create_proof_check_backend::( + in_memory_root.into(), + proof + ).unwrap(); + assert!(proof_check.storage(&[0]).is_err()); + assert_eq!(proof_check.storage(&[42]).unwrap().unwrap(), vec![42]); + // note that it is include in root because proof close + assert_eq!(proof_check.storage(&[41]).unwrap().unwrap(), vec![41]); + assert_eq!(proof_check.storage(&[64]).unwrap(), None); + + let proving = ProvingBackend::new(trie); + assert_eq!(proving.child_storage(&own1[..], &[64]), Ok(Some(vec![64]))); + + let proof = proving.extract_proof(); + let proof_check = create_proof_check_backend::( + in_memory_root.into(), + proof + ).unwrap(); + assert_eq!( + proof_check.child_storage(&own1[..], &[64]).unwrap().unwrap(), + vec![64] + ); + } + } diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index ac096c0c3ed3e5b617cbc97791f86f7d40c63540..68b9d28752c28215131c61e1c71f99f457d3dcda 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -16,26 +16,31 @@ //! Test implementation for Externalities. -use std::collections::HashMap; +use std::collections::{HashMap, BTreeMap}; use std::iter::FromIterator; use hash_db::Hasher; -use heapsize::HeapSizeOf; -use trie::trie_root; -use crate::backend::InMemory; -use crate::changes_trie::{compute_changes_trie_root, InMemoryStorage as ChangesTrieInMemoryStorage, AnchorBlockId}; +use crate::backend::{InMemory, Backend}; +use primitives::storage::well_known_keys::is_child_storage_key; +use crate::changes_trie::{ + compute_changes_trie_root, InMemoryStorage as ChangesTrieInMemoryStorage, + BlockNumber as ChangesTrieBlockNumber, +}; +use primitives::offchain; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; use parity_codec::Encode; use super::{ChildStorageKey, Externalities, OverlayedChanges}; +const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within runtime"; + /// Simple HashMap-based Externalities impl. -pub struct TestExternalities where H::Out: HeapSizeOf { - inner: HashMap, Vec>, - changes_trie_storage: ChangesTrieInMemoryStorage, - changes: OverlayedChanges, - code: Option>, +pub struct TestExternalities { + overlay: OverlayedChanges, + backend: InMemory, + changes_trie_storage: ChangesTrieInMemoryStorage, + offchain: Option>, } -impl TestExternalities where H::Out: HeapSizeOf { +impl TestExternalities { /// Create a new instance of `TestExternalities` pub fn new(inner: HashMap, Vec>) -> Self { Self::new_with_code(&[], inner) @@ -44,6 +49,7 @@ impl TestExternalities where H::Out: HeapSizeOf { /// Create a new instance of `TestExternalities` pub fn new_with_code(code: &[u8], mut inner: HashMap, Vec>) -> Self { let mut overlay = OverlayedChanges::default(); + super::set_changes_trie_config( &mut overlay, inner.get(&CHANGES_TRIE_CONFIG.to_vec()).cloned(), @@ -51,128 +57,187 @@ impl TestExternalities where H::Out: HeapSizeOf { ).expect("changes trie configuration is correct in test env; qed"); inner.insert(HEAP_PAGES.to_vec(), 8u64.encode()); + inner.insert(CODE.to_vec(), code.to_vec()); TestExternalities { - inner, + overlay, changes_trie_storage: ChangesTrieInMemoryStorage::new(), - changes: overlay, - code: Some(code.to_vec()), + backend: inner.into(), + offchain: None, } } - /// Insert key/value - pub fn insert(&mut self, k: Vec, v: Vec) -> Option> { - self.inner.insert(k, v) + /// Insert key/value into backend + pub fn insert(&mut self, k: Vec, v: Vec) { + self.backend = self.backend.update(vec![(None, k, Some(v))]); + } + + /// Iter to all pairs in key order + pub fn iter_pairs_in_order(&self) -> impl Iterator, Vec)> { + self.backend.pairs().iter() + .map(|&(ref k, ref v)| (k.to_vec(), Some(v.to_vec()))) + .chain(self.overlay.committed.top.clone().into_iter().map(|(k, v)| (k, v.value))) + .chain(self.overlay.prospective.top.clone().into_iter().map(|(k, v)| (k, v.value))) + .collect::>() + .into_iter() + .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) + } + + /// Set offchain externaltiies. + pub fn set_offchain_externalities(&mut self, offchain: impl offchain::Externalities + 'static) { + self.offchain = Some(Box::new(offchain)); + } + + /// Get mutable reference to changes trie storage. + pub fn changes_trie_storage(&mut self) -> &mut ChangesTrieInMemoryStorage { + &mut self.changes_trie_storage } } -impl ::std::fmt::Debug for TestExternalities where H::Out: HeapSizeOf { +impl ::std::fmt::Debug for TestExternalities { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "{:?}", self.inner) + write!(f, "overlay: {:?}\nbackend: {:?}", self.overlay, self.backend.pairs()) } } -impl PartialEq for TestExternalities where H::Out: HeapSizeOf { - fn eq(&self, other: &TestExternalities) -> bool { - self.inner.eq(&other.inner) +impl PartialEq for TestExternalities { + /// This doesn't test if they are in the same state, only if they contains the + /// same data at this state + fn eq(&self, other: &TestExternalities) -> bool { + self.iter_pairs_in_order().eq(other.iter_pairs_in_order()) } } -impl FromIterator<(Vec, Vec)> for TestExternalities where H::Out: HeapSizeOf { +impl FromIterator<(Vec, Vec)> for TestExternalities { fn from_iter, Vec)>>(iter: I) -> Self { let mut t = Self::new(Default::default()); - t.inner.extend(iter); + t.backend = t.backend.update(iter.into_iter().map(|(k, v)| (None, k, Some(v))).collect()); t } } -impl Default for TestExternalities where H::Out: HeapSizeOf { +impl Default for TestExternalities { fn default() -> Self { Self::new(Default::default()) } } -impl From> for HashMap, Vec> where H::Out: HeapSizeOf { - fn from(tex: TestExternalities) -> Self { - tex.inner.into() +impl From> for HashMap, Vec> { + fn from(tex: TestExternalities) -> Self { + tex.iter_pairs_in_order().collect() } } -impl From< HashMap, Vec> > for TestExternalities where H::Out: HeapSizeOf { +impl From< HashMap, Vec> > for TestExternalities { fn from(hashmap: HashMap, Vec>) -> Self { - TestExternalities { - inner: hashmap, - changes_trie_storage: ChangesTrieInMemoryStorage::new(), - changes: Default::default(), - code: None, - } + Self::from_iter(hashmap) } } -// TODO child test primitives are currently limited to `changes` (for non child the way -// things are defined seems utterly odd to (put changes in changes but never make them -// available for read through inner) -impl Externalities for TestExternalities where H::Out: Ord + HeapSizeOf { +impl Externalities for TestExternalities + where + H: Hasher, + N: ChangesTrieBlockNumber, + H::Out: Ord + 'static +{ fn storage(&self, key: &[u8]) -> Option> { - match key { - CODE => self.code.clone(), - _ => self.inner.get(key).cloned(), - } + self.overlay.storage(key).map(|x| x.map(|x| x.to_vec())).unwrap_or_else(|| + self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } fn original_storage(&self, key: &[u8]) -> Option> { - self.storage(key) + self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL) } fn child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { - self.changes.child_storage(storage_key.as_ref(), key)?.map(Vec::from) + self.overlay + .child_storage(storage_key.as_ref(), key) + .map(|x| x.map(|x| x.to_vec())) + .unwrap_or_else(|| self.backend + .child_storage(storage_key.as_ref(), key) + .expect(EXT_NOT_ALLOWED_TO_FAIL) + ) } fn place_storage(&mut self, key: Vec, maybe_value: Option>) { - self.changes.set_storage(key.clone(), maybe_value.clone()); - match key.as_ref() { - CODE => self.code = maybe_value, - _ => { - match maybe_value { - Some(value) => { self.inner.insert(key, value); } - None => { self.inner.remove(&key); } - } - } + if is_child_storage_key(&key) { + panic!("Refuse to directly set child storage key"); } + + self.overlay.set_storage(key, maybe_value); } - fn place_child_storage(&mut self, storage_key: ChildStorageKey, key: Vec, value: Option>) { - self.changes.set_child_storage(storage_key.into_owned(), key, value); + fn place_child_storage( + &mut self, + storage_key: ChildStorageKey, + key: Vec, + value: Option> + ) { + self.overlay.set_child_storage(storage_key.into_owned(), key, value); } fn kill_child_storage(&mut self, storage_key: ChildStorageKey) { - self.changes.clear_child_storage(storage_key.as_ref()); + let backend = &self.backend; + let overlay = &mut self.overlay; + + overlay.clear_child_storage(storage_key.as_ref()); + backend.for_keys_in_child_storage(storage_key.as_ref(), |key| { + overlay.set_child_storage(storage_key.as_ref().to_vec(), key.to_vec(), None); + }); } fn clear_prefix(&mut self, prefix: &[u8]) { - self.changes.clear_prefix(prefix); - self.inner.retain(|key, _| !key.starts_with(prefix)); + if is_child_storage_key(prefix) { + panic!("Refuse to directly clear prefix that is part of child storage key"); + } + + self.overlay.clear_prefix(prefix); + + let backend = &self.backend; + let overlay = &mut self.overlay; + backend.for_keys_with_prefix(prefix, |key| { + overlay.set_storage(key.to_vec(), None); + }); } fn chain_id(&self) -> u64 { 42 } fn storage_root(&mut self) -> H::Out { - trie_root::(self.inner.clone()) + // compute and memoize + let delta = self.overlay.committed.top.iter().map(|(k, v)| (k.clone(), v.value.clone())) + .chain(self.overlay.prospective.top.iter().map(|(k, v)| (k.clone(), v.value.clone()))); + + self.backend.storage_root(delta).0 } - fn child_storage_root(&mut self, _storage_key: ChildStorageKey) -> Vec { - unimplemented!() + fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec { + let storage_key = storage_key.as_ref(); + + let (root, _, _) = { + let delta = self.overlay.committed.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) + .chain(self.overlay.prospective.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.clone().into_iter())); + + self.backend.child_storage_root(storage_key, delta) + }; + self.overlay.set_storage(storage_key.into(), Some(root.clone())); + root } - fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option { - compute_changes_trie_root::<_, _, H>( - &InMemory::default(), + fn storage_changes_root(&mut self, parent: H::Out) -> Result, ()> { + Ok(compute_changes_trie_root::<_, _, H, N>( + &self.backend, Some(&self.changes_trie_storage), - &self.changes, - &AnchorBlockId { hash: parent, number: parent_num }, - ).map(|(root, _)| root.clone()) + &self.overlay, + parent, + )?.map(|(root, _)| root.clone())) } - fn submit_extrinsic(&mut self, _extrinsic: Vec) -> Result<(), ()> { - unimplemented!() + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { + self.offchain + .as_mut() + .map(|x| &mut **x as _) } } @@ -180,21 +245,21 @@ impl Externalities for TestExternalities where H::Out: Ord + He mod tests { use super::*; use primitives::{Blake2Hasher, H256}; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; #[test] fn commit_should_work() { - let mut ext = TestExternalities::::default(); + let mut ext = TestExternalities::::default(); ext.set_storage(b"doe".to_vec(), b"reindeer".to_vec()); ext.set_storage(b"dog".to_vec(), b"puppy".to_vec()); ext.set_storage(b"dogglesworth".to_vec(), b"cat".to_vec()); - const ROOT: [u8; 32] = hex!("0b33ed94e74e0f8e92a55923bece1ed02d16cf424e124613ddebc53ac3eeeabe"); + const ROOT: [u8; 32] = hex!("cc65c26c37ebd4abcdeb3f1ecd727527051620779a2f6c809bac0f8a87dbb816"); assert_eq!(ext.storage_root(), H256::from(ROOT)); } #[test] fn set_and_retrieve_code() { - let mut ext = TestExternalities::::default(); + let mut ext = TestExternalities::::default(); let code = vec![1, 2, 3]; ext.set_storage(CODE.to_vec(), code.clone()); diff --git a/core/state-machine/src/trie_backend.rs b/core/state-machine/src/trie_backend.rs index b152d7fea18578aedf032efb2ab482627d087f58..0c57cf3682fba175835b875634539da969aefa06 100644 --- a/core/state-machine/src/trie_backend.rs +++ b/core/state-machine/src/trie_backend.rs @@ -18,7 +18,6 @@ use log::{warn, debug}; use hash_db::Hasher; -use heapsize::HeapSizeOf; use trie::{TrieDB, TrieError, Trie, delta_trie_root, default_child_trie_root, child_delta_trie_root}; use crate::trie_backend_essence::{TrieBackendEssence, TrieBackendStorage, Ephemeral}; use crate::Backend; @@ -28,7 +27,7 @@ pub struct TrieBackend, H: Hasher> { essence: TrieBackendEssence, } -impl, H: Hasher> TrieBackend where H::Out: HeapSizeOf { +impl, H: Hasher> TrieBackend { /// Create new trie-based backend. pub fn new(storage: S, root: H::Out) -> Self { TrieBackend { @@ -60,7 +59,7 @@ impl, H: Hasher> TrieBackend where H::Out: HeapSi impl super::Error for String {} impl, H: Hasher> Backend for TrieBackend where - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { type Error = String; type Transaction = S::Overlay; @@ -106,7 +105,7 @@ impl, H: Hasher> Backend for TrieBackend where } } - fn keys(&self, prefix: &Vec) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); @@ -180,7 +179,7 @@ impl, H: Hasher> Backend for TrieBackend where (root, is_default, write_overlay) } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { Some(self) } } @@ -189,6 +188,7 @@ impl, H: Hasher> Backend for TrieBackend where pub mod tests { use std::collections::HashSet; use primitives::{Blake2Hasher, H256}; + use parity_codec::Encode; use trie::{TrieMut, TrieDBMut, PrefixedMemoryDB}; use super::*; @@ -197,6 +197,15 @@ pub mod tests { let mut mdb = PrefixedMemoryDB::::default(); { let mut trie = TrieDBMut::new(&mut mdb, &mut root); + trie.insert(b"value3", &[142]).expect("insert failed"); + trie.insert(b"value4", &[124]).expect("insert failed"); + }; + + { + let mut sub_root = Vec::new(); + root.encode_to(&mut sub_root); + let mut trie = TrieDBMut::new(&mut mdb, &mut root); + trie.insert(b":child_storage:default:sub1", &sub_root).expect("insert failed"); trie.insert(b"key", b"value").expect("insert failed"); trie.insert(b"value1", &[42]).expect("insert failed"); trie.insert(b"value2", &[24]).expect("insert failed"); diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index 8101126c39d78c7b386ae94a33a74195a8122d94..fc30f94f05ac4649b4b2c92a1c7a6564a224192d 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -21,9 +21,7 @@ use std::ops::Deref; use std::sync::Arc; use log::{debug, warn}; use hash_db::{self, Hasher}; -use heapsize::HeapSizeOf; use trie::{TrieDB, Trie, MemoryDB, PrefixedMemoryDB, DBValue, TrieError, default_child_trie_root, read_trie_value, read_child_trie_value, for_keys_in_child_trie}; -use crate::changes_trie::Storage as ChangesTrieStorage; use crate::backend::Consolidate; /// Patricia trie-based storage trait. @@ -38,7 +36,7 @@ pub struct TrieBackendEssence, H: Hasher> { root: H::Out, } -impl, H: Hasher> TrieBackendEssence where H::Out: HeapSizeOf { +impl, H: Hasher> TrieBackendEssence { /// Create new trie-based backend. pub fn new(storage: S, root: H::Out) -> Self { TrieBackendEssence { @@ -154,10 +152,9 @@ impl<'a, H: 'a + Hasher > hash_db::AsPlainDB for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { - fn as_plain_db<'b>(&'b self) -> &'b (hash_db::PlainDB + 'b) { self } - fn as_plain_db_mut<'b>(&'b mut self) -> &'b mut (hash_db::PlainDB + 'b) { self } + fn as_plain_db<'b>(&'b self) -> &'b (dyn hash_db::PlainDB + 'b) { self } + fn as_plain_db_mut<'b>(&'b mut self) -> &'b mut (dyn hash_db::PlainDB + 'b) { self } } impl<'a, @@ -165,10 +162,9 @@ impl<'a, H: 'a + Hasher > hash_db::AsHashDB for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { - fn as_hash_db<'b>(&'b self) -> &'b (hash_db::HashDB + 'b) { self } - fn as_hash_db_mut<'b>(&'b mut self) -> &'b mut (hash_db::HashDB + 'b) { self } + fn as_hash_db<'b>(&'b self) -> &'b (dyn hash_db::HashDB + 'b) { self } + fn as_hash_db_mut<'b>(&'b mut self) -> &'b mut (dyn hash_db::HashDB + 'b) { self } } impl<'a, S: TrieBackendStorage, H: Hasher> Ephemeral<'a, S, H> { @@ -185,7 +181,6 @@ impl<'a, H: Hasher > hash_db::PlainDB for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { fn get(&self, key: &H::Out) -> Option { if let Some(val) = hash_db::HashDB::get(self.overlay, key, &[]) { @@ -219,7 +214,6 @@ impl<'a, H: Hasher > hash_db::PlainDBRef for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { fn get(&self, key: &H::Out) -> Option { hash_db::PlainDB::get(self, key) } fn contains(&self, key: &H::Out) -> bool { hash_db::PlainDB::contains(self, key) } @@ -230,7 +224,6 @@ impl<'a, H: Hasher > hash_db::HashDB for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { if let Some(val) = hash_db::HashDB::get(self.overlay, key, prefix) { @@ -268,7 +261,6 @@ impl<'a, H: Hasher > hash_db::HashDBRef for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { hash_db::HashDB::get(self, key, prefix) } fn contains(&self, key: &H::Out, prefix: &[u8]) -> bool { hash_db::HashDB::contains(self, key, prefix) } @@ -283,7 +275,7 @@ pub trait TrieBackendStorage: Send + Sync { } // This implementation is used by normal storage trie clients. -impl TrieBackendStorage for Arc> { +impl TrieBackendStorage for Arc> { type Overlay = PrefixedMemoryDB; fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { @@ -307,12 +299,3 @@ impl TrieBackendStorage for MemoryDB { Ok(hash_db::HashDB::get(self, key, prefix)) } } - -// This implementation is used by changes trie clients. -impl<'a, S, H: Hasher> TrieBackendStorage for &'a S where S: ChangesTrieStorage { - type Overlay = MemoryDB; - - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { - ChangesTrieStorage::::get(*self, key, prefix) - } -} diff --git a/core/telemetry/Cargo.toml b/core/telemetry/Cargo.toml index d626e9fcdfa19f1d128d96602852799b50ff358d..1b19796836abb060f2911b30e4fc9411998254fb 100644 --- a/core/telemetry/Cargo.toml +++ b/core/telemetry/Cargo.toml @@ -1,19 +1,24 @@ [package] name = "substrate-telemetry" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Telemetry utils" edition = "2018" [dependencies] -parking_lot = "0.7.1" -lazy_static = "1.0" +bytes = "0.4" +parking_lot = "0.8.0" +futures = "0.1" +libp2p = { version = "0.9.1", default-features = false, features = ["libp2p-websocket"] } log = "0.4" rand = "0.6" serde = { version = "1.0.81", features = ["derive"] } -serde_json = "1.0" slog = { version = "^2", features = ["nested-values"] } slog-json = { version = "^2", features = ["nested-values"] } -slog-async = { version = "^2", features = ["nested-values"] } slog-scope = "^4" -ws = { version = "^0.7", features = ["ssl"] } +tokio-io = "0.1" +tokio-timer = "0.2" +void = "1.0" + +[dev-dependencies] +tokio = "0.1" diff --git a/core/telemetry/src/lib.rs b/core/telemetry/src/lib.rs index bc295f2a8cd721f59fa1a0dd102b6ff4b90a0f14..3e5d8278b06111ae2949b3066afa10b66666e48d 100644 --- a/core/telemetry/src/lib.rs +++ b/core/telemetry/src/lib.rs @@ -14,38 +14,95 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Telemetry utils. +//! Telemetry utilities. +//! +//! Calling `init_telemetry` registers a global `slog` logger using `slog_scope::set_global_logger`. +//! After that, calling `slog_scope::with_logger` will return a logger that sends information to +//! the telemetry endpoints. The `telemetry!` macro is a short-cut for calling +//! `slog_scope::with_logger` followed with `slog_log!`. +//! +//! Note that you are supposed to only ever use `telemetry!` and not `slog_scope::with_logger` at +//! the moment. Substate may eventually be reworked to get proper `slog` support, including sending +//! information to the telemetry. +//! +//! The `Telemetry` struct implements `Future` and must be polled regularly (or sent to a +//! background thread/task) in order for the telemetry to properly function. Dropping the object +//! will also deregister the global logger and replace it with a logger that discards messages. +//! +//! # Example +//! +//! ```no_run +//! let telemetry = substrate_telemetry::init_telemetry(substrate_telemetry::TelemetryConfig { +//! endpoints: substrate_telemetry::TelemetryEndpoints::new(vec![ +//! // The `0` is the maximum verbosity level of messages to send to this endpoint. +//! ("wss://example.com".into(), 0) +//! ]), +//! on_connect: Box::new(|| {}), +//! // Can be used to pass an external implementation of WebSockets. +//! wasm_external_transport: None, +//! }); +//! +//! // The `telemetry` object implements `Future` and must be processed. +//! std::thread::spawn(move || { +//! tokio::run(telemetry); +//! }); +//! +//! // Sends a message on the telemetry. +//! substrate_telemetry::telemetry!(substrate_telemetry::SUBSTRATE_INFO; "test"; +//! "foo" => "bar", +//! ) +//! ``` //! -//! `telemetry` macro may be used anywhere in the Substrate codebase -//! in order to send real-time logging information to the telemetry -//! server (if there is one). We use the async drain adapter of `slog` -//! so that the logging thread doesn't get held up at all. -use std::{io, time, thread}; -use std::sync::Arc; +use futures::{prelude::*, task::AtomicTask}; +use libp2p::{Multiaddr, wasm_ext}; +use log::{trace, warn}; use parking_lot::Mutex; -use slog::{Drain, o, OwnedKVList, Record}; -use log::trace; -use rand::{thread_rng, Rng}; +use serde::{Serialize, Deserialize}; +use std::sync::{Arc, Weak}; +use std::time::{Duration, Instant}; + pub use slog_scope::with_logger; pub use slog; -use serde::{Serialize, Deserialize}; -use core::result; + +mod worker; /// Configuration for telemetry. pub struct TelemetryConfig { /// Collection of telemetry WebSocket servers with a corresponding verbosity level. pub endpoints: TelemetryEndpoints, - /// What do do when we connect to the servers. - /// Note that this closure is executed each time we connect to a telemetry endpoint. - pub on_connect: Box, + + /// What to do when we connect to a server. + /// + /// This closure is executed each time we connect to a telemetry endpoint, either for the first + /// time or after being disconnected. + pub on_connect: Box, + + /// Optional external implementation of a libp2p transport. Used in WASM contexts where we need + /// some binding between the networking provided by the operating system or environment and + /// libp2p. + /// + /// This parameter exists whatever the target platform is, but it is expected to be set to + /// `Some` only when compiling for WASM. + /// + /// > **Important**: Each individual call to `write` corresponds to one message. There is no + /// > internal buffering going on. In the context of WebSockets, each `write` + /// > must be one individual WebSockets frame. + pub wasm_external_transport: Option, } -/// Telemetry service guard. -pub type Telemetry = slog_scope::GlobalLoggerGuard; +/// List of telemetry servers we want to talk to. Contains the URL of the server, and the +/// maximum verbosity level. +/// +/// The URL string can be either a URL or a multiaddress. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TelemetryEndpoints(Vec<(String, u8)>); -/// Size of the channel for passing messages to telemetry thread. -const CHANNEL_SIZE: usize = 262144; +impl TelemetryEndpoints { + pub fn new(endpoints: Vec<(String, u8)>) -> Self { + TelemetryEndpoints(endpoints) + } +} /// Log levels. pub const SUBSTRATE_DEBUG: &str = "9"; @@ -56,232 +113,145 @@ pub const CONSENSUS_DEBUG: &str = "5"; pub const CONSENSUS_WARN: &str = "4"; pub const CONSENSUS_INFO: &str = "0"; -/// Multiply logging to all drains. This is similar to `slog::Duplicate`, which is -/// limited to two drains though and doesn't support dynamic nesting at runtime. -#[derive(Debug, Clone)] -pub struct Multiply (pub Vec>); - -impl Multiply { - pub fn new(v: Vec>) -> Self { - Multiply(v) - } +/// Telemetry object. Implements `Future` and must be polled regularly. +/// Contains an `Arc` and can be cloned and pass around. Only one clone needs to be polled +/// regularly. +/// Dropping all the clones unregisters the telemetry. +#[derive(Clone)] +pub struct Telemetry { + inner: Arc, + /// Slog guard so that we don't get deregistered. + _guard: Arc, } -impl Drain for Multiply { - type Ok = Vec; - type Err = Vec; - - fn log(&self, record: &Record, logger_values: &OwnedKVList) -> result::Result { - let mut oks = Vec::new(); - let mut errs = Vec::new(); - - self.0.iter().for_each(|l| { - let res: Result<::Ok, ::Err> = (*l).log(record, logger_values); - match res { - Ok(o) => oks.push(o), - Err(e) => errs.push(e), - } - }); - - if !errs.is_empty() { - result::Result::Err(errs) - } else { - result::Result::Ok(oks) - } - } -} - -/// Initialize telemetry. -pub fn init_telemetry(config: TelemetryConfig) -> slog_scope::GlobalLoggerGuard { - let mut endpoint_drains: Vec>> = Vec::new(); - let mut out_syncs = Vec::new(); - - // Set up a filter/drain for each endpoint - config.endpoints.0.iter().for_each(|(url, verbosity)| { - let writer = TelemetryWriter::new(Arc::new(url.to_owned())); - let out_sync = writer.out.clone(); - out_syncs.push(out_sync); - - let until_verbosity = *verbosity; - let filter = slog::Filter( - slog_json::Json::default(writer).fuse(), - move |rec| { - let tag = rec.tag().parse::() - .expect("`telemetry!` macro requires tag."); - tag <= until_verbosity - }); - - let filter = Box::new(filter) as Box>; - endpoint_drains.push(filter); - }); - - // Set up logging to all endpoints - let drain = slog_async::Async::new(Multiply::new(endpoint_drains).fuse()); - let root = slog::Logger::root(drain.chan_size(CHANNEL_SIZE) - .overflow_strategy(slog_async::OverflowStrategy::DropAndReport) - .build().fuse(), o!() - ); - let logger_guard = slog_scope::set_global_logger(root); - - // Spawn a thread for each endpoint - let on_connect = Arc::new(config.on_connect); - config.endpoints.0.into_iter().for_each(|(url, verbosity)| { - let inner_verbosity = Arc::new(verbosity.to_owned()); - let inner_on_connect = Arc::clone(&on_connect); - - let out_sync = out_syncs.remove(0); - let out_sync = Arc::clone(&out_sync); - - thread::spawn(move || { - loop { - let on_connect = Arc::clone(&inner_on_connect); - let out_sync = Arc::clone(&out_sync); - let verbosity = Arc::clone(&inner_verbosity); - - trace!(target: "telemetry", - "Connecting to Telemetry at {} with verbosity {}", url, Arc::clone(&verbosity)); - - let _ = ws::connect(url.to_owned(), - |out| { - Connection::new(out, Arc::clone(&out_sync), Arc::clone(&on_connect), url.clone()) - }); - - // Sleep for a random time between 5-10 secs. If there are general connection - // issues not all threads should be synchronized in their re-connection time. - let random_sleep = thread_rng().gen_range(0, 5); - thread::sleep(time::Duration::from_secs(5) + time::Duration::from_secs(random_sleep)); - } - }); - }); - - return logger_guard; -} - -/// Translates to `slog_scope::info`, but contains an additional verbosity -/// parameter which the log record is tagged with. Additionally the verbosity -/// parameter is added to the record as a key-value pair. -#[macro_export] -macro_rules! telemetry { - ( $a:expr; $b:expr; $( $t:tt )* ) => { - $crate::with_logger(|l| { - $crate::slog::slog_info!(l, #$a, $b; $($t)* ) - }) - } +// Implementation notes: considering that logging can happen at any moment, we only have two +// options: locking a mutex (which we currently do), or using a channel (which we should do). +// At the moment, `slog` doesn't provide any easy way to serialize records in order to send them +// over a channel, but ideally that's what should be done. + +/// Shared between `Telemetry` and `TelemetryDrain`. +struct TelemetryInner { + /// Worker for the telemetry. + worker: Mutex, + /// Same field as in the configuration. Called when we connected to an endpoint. + on_connect: Box, + /// Task to wake up when we add a log entry to the worker. + polling_task: AtomicTask, } -struct Connection { - out: ws::Sender, - out_sync: Arc>>, - on_connect: Arc>, - url: String, +/// Implements `slog::Drain`. +struct TelemetryDrain { + inner: std::panic::AssertUnwindSafe>, } -impl Connection { - fn new( - out: ws::Sender, - out_sync: Arc>>, - on_connect: Arc>, - url: String - ) -> Self { - Connection { - out, - out_sync, - on_connect, - url, +/// Initializes the telemetry. See the crate root documentation for more information. +/// +/// Please be careful to not call this function twice in the same program. The `slog` crate +/// doesn't provide any way of knowing whether a global logger has already been registered. +pub fn init_telemetry(config: TelemetryConfig) -> Telemetry { + // Build the list of telemetry endpoints. + let mut endpoints = Vec::new(); + for &(ref url, verbosity) in &config.endpoints.0 { + match url_to_multiaddr(url) { + Ok(addr) => endpoints.push((addr, verbosity)), + Err(err) => warn!(target: "telemetry", "Invalid telemetry URL {}: {}", url, err), } } -} - -impl ws::Handler for Connection { - fn on_open(&mut self, _: ws::Handshake) -> ws::Result<()> { - trace!(target: "telemetry", "Connected to {}!", self.url); - - *self.out_sync.lock() = Some(self.out.clone()); - (self.on_connect)(); - Ok(()) - } - fn on_close(&mut self, code: ws::CloseCode, reason: &str) { - *self.out_sync.lock() = None; - - trace!(target: "telemetry", "Connection to {} closing due to ({:?}) {}", - self.url, code, reason); - } + let inner = Arc::new(TelemetryInner { + worker: Mutex::new(worker::TelemetryWorker::new(endpoints, config.wasm_external_transport)), + on_connect: config.on_connect, + polling_task: AtomicTask::new(), + }); - fn on_error(&mut self, _: ws::Error) { - *self.out_sync.lock() = None; + let guard = { + let logger = TelemetryDrain { inner: std::panic::AssertUnwindSafe(Arc::downgrade(&inner)) }; + let root = slog::Logger::root(slog::Drain::fuse(logger), slog::o!()); + slog_scope::set_global_logger(root) + }; - // Sleep to ensure that reconnecting isn't spamming logs. - // This happens in it's own thread so it won't block anything. - thread::sleep(time::Duration::from_millis(1000)); + Telemetry { + inner, + _guard: Arc::new(guard), } } -struct TelemetryWriter { - buffer: Vec, - out: Arc>>, - url: Arc, -} +impl Future for Telemetry { + type Item = (); + type Error = (); -impl TelemetryWriter { - fn new(url: Arc) -> Self { - let out = Arc::new(Mutex::new(None)); + fn poll(&mut self) -> Poll<(), ()> { + let before = Instant::now(); - TelemetryWriter { - buffer: Vec::new(), - out, - url, + let mut has_connected = false; + while let Async::Ready(event) = self.inner.worker.lock().poll() { + // Right now we only have one possible event. This line is here in order to not + // forget to handle any possible new event type. + let worker::TelemetryWorkerEvent::Connected = event; + has_connected = true; } - } -} -impl io::Write for TelemetryWriter { - fn write(&mut self, msg: &[u8]) -> io::Result { - let mut iter = msg.split(|x| *x == b'\n'); - let first = iter.next().expect("Split iterator always has at least one element; qed"); - - self.buffer.extend_from_slice(first); - - // Flush for each occurrence of new line character - for continued in iter { - let _ = self.flush(); - self.buffer.extend_from_slice(continued); + if before.elapsed() > Duration::from_millis(200) { + warn!(target: "telemetry", "Polling the telemetry took more than 200ms"); } - Ok(msg.len()) - } - - fn flush(&mut self) -> io::Result<()> { - if self.buffer.is_empty() { - return Ok(()); + // We use an intermediary variable `has_connected` so that the lock is released when we + // call `on_connect`. + if has_connected { + trace!(target: "telemetry", "Running on_connect handlers"); + (self.inner.on_connect)(); } - if let Ok(s) = ::std::str::from_utf8(&self.buffer[..]) { - let mut out = self.out.lock(); - - let error = if let Some(ref mut o) = *out { - let r = o.send(s); - trace!(target: "telemetry", "Sent to telemetry {}: {} -> {:?}", self.url, s, r); - r.is_err() - } else { - trace!(target: "telemetry", "Telemetry socket closed to {}, failed to send: {}", self.url, s); - false - }; + self.inner.polling_task.register(); + Ok(Async::NotReady) + } +} - if error { - *out = None; +impl slog::Drain for TelemetryDrain { + type Ok = (); + type Err = (); + + fn log(&self, record: &slog::Record, values: &slog::OwnedKVList) -> Result { + if let Some(inner) = self.inner.0.upgrade() { + let before = Instant::now(); + let result = inner.worker.lock().log(record, values); + inner.polling_task.notify(); + if before.elapsed() > Duration::from_millis(50) { + warn!(target: "telemetry", "Writing a telemetry log took more than 50ms"); } + result + } else { + Ok(()) } - self.buffer.clear(); - Ok(()) } } -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TelemetryEndpoints (Vec<(String, u8)>); +/// Parses a WebSocket URL into a libp2p `Multiaddr`. +fn url_to_multiaddr(url: &str) -> Result { + // First, assume that we have a `Multiaddr`. + let parse_error = match url.parse() { + Ok(ma) => return Ok(ma), + Err(err) => err, + }; + + // If not, try the `ws://path/url` format. + if let Ok(ma) = libp2p::multiaddr::from_url(url) { + return Ok(ma) + } -impl TelemetryEndpoints { - pub fn new(endpoints: Vec<(String, u8)>) -> Self { - TelemetryEndpoints(endpoints) + // If we have no clue about the format of that string, assume that we were expecting a + // `Multiaddr`. + Err(parse_error) +} + +/// Translates to `slog_scope::info`, but contains an additional verbosity +/// parameter which the log record is tagged with. Additionally the verbosity +/// parameter is added to the record as a key-value pair. +#[macro_export] +macro_rules! telemetry { + ( $a:expr; $b:expr; $( $t:tt )* ) => { + $crate::with_logger(|l| { + $crate::slog::slog_info!(l, #$a, $b; $($t)* ) + }) } } diff --git a/core/telemetry/src/worker.rs b/core/telemetry/src/worker.rs new file mode 100644 index 0000000000000000000000000000000000000000..87a3deb6ef9605793893ede5f9f5ddea8c4e279e --- /dev/null +++ b/core/telemetry/src/worker.rs @@ -0,0 +1,203 @@ +// Copyright 2017-2019 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 . + +//! Contains the object that makes the telemetry work. +//! +//! # Usage +//! +//! - Create a `TelemetryWorker` with `TelemetryWorker::new`. +//! - Send messages to the telemetry with `TelemetryWorker::send_message`. Messages will only be +//! sent to the appropriate targets. Messages may be ignored if the target happens to be +//! temporarily unreachable. +//! - You must appropriately poll the worker with `TelemetryWorker::poll`. Polling will/may produce +//! events indicating what happened since the latest polling. +//! + +use bytes::BytesMut; +use futures::prelude::*; +use libp2p::{core::transport::OptionalTransport, core::ConnectedPoint, Multiaddr, Transport, wasm_ext}; +use log::{trace, warn, error}; +use slog::Drain; +use std::{io, time}; +use tokio_io::AsyncWrite; + +mod node; + +/// Timeout after which a connection attempt is considered failed. Includes the WebSocket HTTP +/// upgrading. +const CONNECT_TIMEOUT: time::Duration = time::Duration::from_secs(20); + +/// Event generated when polling the worker. +#[derive(Debug)] +pub enum TelemetryWorkerEvent { + /// We have established a connection to one of the telemetry endpoint, either for the first + /// time or after having been disconnected earlier. + Connected, +} + +/// Telemetry processing machine. +#[derive(Debug)] +pub struct TelemetryWorker { + /// List of nodes with their maximum verbosity level. + nodes: Vec<(node::Node, u8)>, +} + +/// The pile of libp2p transports. +#[cfg(not(target_os = "unknown"))] +type WsTrans = libp2p::core::transport::timeout::TransportTimeout< + libp2p::core::transport::OrTransport< + libp2p::core::transport::map::Map< + OptionalTransport, + fn(wasm_ext::Connection, ConnectedPoint) -> StreamSink + >, + libp2p::websocket::framed::WsConfig> + > +>; +#[cfg(target_os = "unknown")] +type WsTrans = libp2p::core::transport::timeout::TransportTimeout< + libp2p::core::transport::map::Map< + OptionalTransport, + fn(wasm_ext::Connection, ConnectedPoint) -> StreamSink + > +>; + +impl TelemetryWorker { + /// Builds a new `TelemetryWorker`. + /// + /// The endpoints must be a list of targets, plus a verbosity level. When you send a message + /// to the telemetry, only the targets whose verbosity is higher than the verbosity of the + /// message will receive it. + pub fn new( + endpoints: impl IntoIterator, + wasm_external_transport: impl Into> + ) -> Self { + let transport = match wasm_external_transport.into() { + Some(t) => OptionalTransport::some(t), + None => OptionalTransport::none() + }.map((|inner, _| StreamSink(inner)) as fn(_, _) -> _); + + // The main transport is the `wasm_external_transport`, but if we're on desktop we add + // support for TCP+WebSocket+DNS as a fallback. In practice, you're not expected to pass + // an external transport on desktop and the fallback is used all the time. + #[cfg(not(target_os = "unknown"))] + let transport = transport.or_transport({ + let inner = libp2p::dns::DnsConfig::new(libp2p::tcp::TcpConfig::new()); + libp2p::websocket::framed::WsConfig::new(inner) + }); + + let transport = transport.with_timeout(CONNECT_TIMEOUT); + + TelemetryWorker { + nodes: endpoints.into_iter().map(|(addr, verbosity)| { + let node = node::Node::new(transport.clone(), addr); + (node, verbosity) + }).collect() + } + } + + /// Polls the worker for events that happened. + pub fn poll(&mut self) -> Async { + for (node, _) in &mut self.nodes { + loop { + match node.poll() { + Async::Ready(node::NodeEvent::Connected) => + return Async::Ready(TelemetryWorkerEvent::Connected), + Async::Ready(node::NodeEvent::Disconnected(_)) => continue, + Async::NotReady => break, + } + } + } + + Async::NotReady + } + + /// Equivalent to `slog::Drain::log`, but takes `self` by `&mut` instead, which is more convenient. + /// + /// Keep in mind that you should call `TelemetryWorker::poll` in order to process the messages. + /// You should call this function right after calling `slog::Drain::log`. + pub fn log(&mut self, record: &slog::Record, values: &slog::OwnedKVList) -> Result<(), ()> { + let msg_verbosity = match record.tag().parse::() { + Ok(v) => v, + Err(err) => { + warn!(target: "telemetry", "Failed to parse telemetry tag {:?}: {:?}", + record.tag(), err); + return Err(()) + } + }; + + // None of the nodes want that verbosity, so just return without doing any serialization. + if self.nodes.iter().all(|(_, node_max_verbosity)| msg_verbosity > *node_max_verbosity) { + trace!( + target: "telemetry", + "Skipping log entry because verbosity {:?} is too high for all endpoints", + msg_verbosity + ); + return Ok(()) + } + + // Turn the message into JSON. + let serialized = { + let mut out = Vec::new(); + slog_json::Json::default(&mut out).log(record, values).map_err(|_| ())?; + out + }; + + for (node, node_max_verbosity) in &mut self.nodes { + if msg_verbosity > *node_max_verbosity { + trace!(target: "telemetry", "Skipping {:?} for log entry with verbosity {:?}", + node.addr(), msg_verbosity); + continue; + } + + // `send_message` returns an error if we're not connected, which we silently ignore. + let _ = node.send_message(serialized.clone()); + } + + Ok(()) + } +} + +/// Wraps around an `AsyncWrite` and implements `Sink`. Guarantees that each item being sent maps +/// to one call of `write`. +/// +/// For some context, we put this object around the `wasm_ext::ExtTransport` in order to make sure +/// that each telemetry message maps to one single call to `write` in the WASM FFI. +struct StreamSink(T); +impl Sink for StreamSink { + type SinkItem = BytesMut; + type SinkError = io::Error; + + fn start_send(&mut self, item: Self::SinkItem) -> Result, io::Error> { + match self.0.write(&item[..]) { + Ok(n) if n == item.len() => Ok(AsyncSink::Ready), + Ok(_) => { + error!(target: "telemetry", + "Detected some internal buffering happening in the telemetry"); + Err(io::Error::new(io::ErrorKind::Other, "Internal buffering detected")) + }, + Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => Ok(AsyncSink::NotReady(item)), + Err(err) => Err(err), + } + } + + fn poll_complete(&mut self) -> Poll<(), io::Error> { + match self.0.flush() { + Ok(()) => Ok(Async::Ready(())), + Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => Ok(Async::NotReady), + Err(err) => Err(err), + } + } +} diff --git a/core/telemetry/src/worker/node.rs b/core/telemetry/src/worker/node.rs new file mode 100644 index 0000000000000000000000000000000000000000..a4d8f8d84e2cb22f0db900625e4fa4bf58af1fea --- /dev/null +++ b/core/telemetry/src/worker/node.rs @@ -0,0 +1,220 @@ +// Copyright 2017-2019 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 . + +//! Contains the `Node` struct, which handles communications with a single telemetry endpoint. + +use bytes::BytesMut; +use futures::prelude::*; +use libp2p::Multiaddr; +use libp2p::core::transport::Transport; +use log::{trace, debug, warn, error}; +use rand::Rng as _; +use std::{collections::VecDeque, fmt, mem, time::Duration, time::Instant}; +use tokio_timer::Delay; + +/// Maximum number of pending telemetry messages. +const MAX_PENDING: usize = 10; + +/// Handler for a single telemetry node. +pub struct Node { + /// Address of the node. + addr: Multiaddr, + /// State of the connection. + socket: NodeSocket, + /// Transport used to establish new connections. + transport: TTrans, +} + +enum NodeSocket { + /// We're connected to the node. This is the normal state. + Connected(NodeSocketConnected), + /// We are currently dialing the node. + Dialing(TTrans::Dial), + /// A new connection should be started as soon as possible. + ReconnectNow, + /// Waiting before attempting to dial again. + WaitingReconnect(Delay), + /// Temporary transition state. + Poisoned, +} + +struct NodeSocketConnected { + /// Where to send data. + sink: TTrans::Output, + /// Queue of packets to send. + pending: VecDeque, + /// If true, we need to flush the sink. + need_flush: bool, +} + +/// Event that can happen with this node. +#[derive(Debug)] +pub enum NodeEvent { + /// We are now connected to this node. + Connected, + /// We are now disconnected from this node. + Disconnected(TSinkErr), +} + +impl Node { + /// Builds a new node handler. + pub fn new(transport: TTrans, addr: Multiaddr) -> Self { + Node { + addr, + socket: NodeSocket::ReconnectNow, + transport, + } + } + + /// Returns the address that was passed to `new`. + pub fn addr(&self) -> &Multiaddr { + &self.addr + } +} + +impl Node +where TTrans: Clone, TTrans::Output: Sink, + TSinkErr: fmt::Debug { + /// Sends a WebSocket frame to the node. Returns an error if we are not connected to the node. + /// + /// After calling this method, you should call `poll` in order for it to be properly processed. + pub fn send_message(&mut self, payload: Vec) -> Result<(), ()> { + if let NodeSocket::Connected(NodeSocketConnected { pending, .. }) = &mut self.socket { + if pending.len() <= MAX_PENDING { + trace!(target: "telemetry", "Adding log entry to queue for {:?}", self.addr); + pending.push_back(payload.into()); + Ok(()) + } else { + warn!(target: "telemetry", "Rejected log entry because queue is full for {:?}", + self.addr); + Err(()) + } + } else { + Err(()) + } + } + + /// Polls the node for updates. Must be performed regularly. + pub fn poll(&mut self) -> Async> { + let mut socket = mem::replace(&mut self.socket, NodeSocket::Poisoned); + self.socket = loop { + match socket { + NodeSocket::Connected(mut conn) => match conn.poll(&self.addr) { + Ok(Async::Ready(v)) => void::unreachable(v), + Ok(Async::NotReady) => break NodeSocket::Connected(conn), + Err(err) => { + debug!(target: "telemetry", "Disconnected from {}: {:?}", self.addr, err); + let timeout = gen_rand_reconnect_delay(); + self.socket = NodeSocket::WaitingReconnect(timeout); + return Async::Ready(NodeEvent::Disconnected(err)) + } + } + NodeSocket::Dialing(mut s) => match s.poll() { + Ok(Async::Ready(sink)) => { + debug!(target: "telemetry", "Connected to {}", self.addr); + let conn = NodeSocketConnected { sink, pending: VecDeque::new(), need_flush: false }; + self.socket = NodeSocket::Connected(conn); + return Async::Ready(NodeEvent::Connected) + }, + Ok(Async::NotReady) => break NodeSocket::Dialing(s), + Err(err) => { + debug!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); + let timeout = gen_rand_reconnect_delay(); + socket = NodeSocket::WaitingReconnect(timeout); + } + } + NodeSocket::ReconnectNow => match self.transport.clone().dial(self.addr.clone()) { + Ok(d) => { + debug!(target: "telemetry", "Started dialing {}", self.addr); + socket = NodeSocket::Dialing(d); + } + Err(err) => { + debug!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); + let timeout = gen_rand_reconnect_delay(); + socket = NodeSocket::WaitingReconnect(timeout); + } + } + NodeSocket::WaitingReconnect(mut s) => if let Ok(Async::Ready(_)) = s.poll() { + socket = NodeSocket::ReconnectNow; + } else { + break NodeSocket::WaitingReconnect(s) + } + NodeSocket::Poisoned => { + error!(target: "telemetry", "Poisoned connection with {}", self.addr); + break NodeSocket::Poisoned + } + } + }; + + Async::NotReady + } +} + +/// Generates a `Delay` object with a random timeout. +/// +/// If there are general connection issues, not all endpoints should be synchronized in their +/// re-connection time. +fn gen_rand_reconnect_delay() -> Delay { + let random_delay = rand::thread_rng().gen_range(5, 10); + Delay::new(Instant::now() + Duration::from_secs(random_delay)) +} + +impl NodeSocketConnected +where TTrans::Output: Sink { + /// Processes the queue of messages for the connected socket. + /// + /// The address is passed for logging purposes only. + fn poll(&mut self, my_addr: &Multiaddr) -> Poll { + loop { + if let Some(item) = self.pending.pop_front() { + let item_len = item.len(); + if let AsyncSink::NotReady(item) = self.sink.start_send(item)? { + self.pending.push_front(item); + break + } else { + trace!(target: "telemetry", "Successfully sent {:?} bytes message to {}", + item_len, my_addr); + self.need_flush = true; + } + + } else if self.need_flush && self.sink.poll_complete()?.is_ready() { + self.need_flush = false; + + } else { + break + } + } + + Ok(Async::NotReady) + } +} + +impl fmt::Debug for Node { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let state = match self.socket { + NodeSocket::Connected(_) => "Connected", + NodeSocket::Dialing(_) => "Dialing", + NodeSocket::ReconnectNow => "Pending reconnect", + NodeSocket::WaitingReconnect(_) => "Pending reconnect", + NodeSocket::Poisoned => "Poisoned", + }; + + f.debug_struct("Node") + .field("addr", &self.addr) + .field("state", &state) + .finish() + } +} diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index 50031809a1c7418285c28e4c6e572b7e61ed9feb..8de313f9cb4e8dd31ec4fff4b83c960a1b986c68 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-client" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -8,11 +8,24 @@ edition = "2018" client = { package = "substrate-client", path = "../client" } client-db = { package = "substrate-client-db", path = "../client/db", features = ["test-helpers"] } futures = { version = "0.1.17" } -parity-codec = "3.3" +parity-codec = "3.5.1" executor = { package = "substrate-executor", path = "../executor" } consensus = { package = "substrate-consensus-common", path = "../consensus/common" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } primitives = { package = "substrate-primitives", path = "../primitives" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } -runtime = { package = "substrate-test-runtime", path = "../test-runtime" } +runtime = { package = "substrate-test-runtime", path = "../test-runtime", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } + +[features] +default = [ + "include-wasm-blob", + "std", +] +std = [ + "runtime/std", +] +# If enabled, the WASM blob is added to the `GenesisConfig`. +include-wasm-blob = [ + "runtime/include-wasm-blob", +] \ No newline at end of file diff --git a/core/test-client/src/client_ext.rs b/core/test-client/src/client_ext.rs index 70e7feb0788828bd398fc9b007e7c8c705c9b63d..d285bb726b75258210ed59d043313dc88a74d3c9 100644 --- a/core/test-client/src/client_ext.rs +++ b/core/test-client/src/client_ext.rs @@ -17,7 +17,10 @@ //! Client extension for tests. use client::{self, Client}; -use consensus::{ImportBlock, BlockImport, BlockOrigin, Error as ConsensusError, ForkChoiceStrategy}; +use consensus::{ + ImportBlock, BlockImport, BlockOrigin, Error as ConsensusError, + ForkChoiceStrategy, +}; use runtime_primitives::Justification; use runtime_primitives::generic::BlockId; use primitives::Blake2Hasher; @@ -31,11 +34,19 @@ pub trait TestClient: Sized { -> Result<(), ConsensusError>; /// Import block with justification, finalizes block. - fn import_justified(&self, origin: BlockOrigin, block: runtime::Block, justification: Justification) - -> Result<(), ConsensusError>; + fn import_justified( + &self, + origin: BlockOrigin, + block: runtime::Block, + justification: Justification + ) -> Result<(), ConsensusError>; /// Finalize a block. - fn finalize_block(&self, id: BlockId, justification: Option) -> client::error::Result<()>; + fn finalize_block( + &self, + id: BlockId, + justification: Option, + ) -> client::error::Result<()>; /// Returns hash of the genesis block. fn genesis_hash(&self) -> runtime::Hash; @@ -64,9 +75,12 @@ impl TestClient for Client self.import_block(import, HashMap::new()).map(|_| ()) } - fn import_justified(&self, origin: BlockOrigin, block: runtime::Block, justification: Justification) - -> Result<(), ConsensusError> - { + fn import_justified( + &self, + origin: BlockOrigin, + block: runtime::Block, + justification: Justification, + ) -> Result<(), ConsensusError> { let import = ImportBlock { origin, header: block.header, @@ -81,7 +95,11 @@ impl TestClient for Client self.import_block(import, HashMap::new()).map(|_| ()) } - fn finalize_block(&self, id: BlockId, justification: Option) -> client::error::Result<()> { + fn finalize_block( + &self, + id: BlockId, + justification: Option, + ) -> client::error::Result<()> { self.finalize_block(id, justification, true) } diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index 4a99df65a5467c07d7ce4a29c0a0253d232b39df..f39ad86b642cccfc43c3909de409f91e36b862d3 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -19,29 +19,31 @@ #![warn(missing_docs)] pub mod client_ext; +#[cfg(feature = "include-wasm-blob")] pub mod trait_tests; mod block_builder_ext; pub use client_ext::TestClient; pub use block_builder_ext::BlockBuilderExt; -pub use client; -pub use client::ExecutionStrategies; -pub use client::blockchain; -pub use client::backend; -pub use executor::NativeExecutor; +pub use client::{ExecutionStrategies, blockchain, backend, self}; +pub use executor::{NativeExecutor, self}; pub use runtime; pub use consensus; -pub use keyring::{AuthorityKeyring, AccountKeyring}; +pub use keyring::{sr25519::Keyring as AuthorityKeyring, AccountKeyring}; -use std::sync::Arc; +use std::{sync::Arc, collections::HashMap}; use futures::future::FutureResult; use primitives::Blake2Hasher; -use runtime_primitives::StorageOverlay; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, NumberFor}; +use primitives::storage::well_known_keys; +use runtime_primitives::{StorageOverlay, ChildrenStorageOverlay}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Hash as HashT, NumberFor +}; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; use state_machine::ExecutionStrategy; use client::LocalCallExecutor; +#[cfg(feature = "include-wasm-blob")] mod local_executor { #![allow(missing_docs)] use runtime; @@ -56,12 +58,14 @@ mod local_executor { } /// Native executor used for tests. +#[cfg(feature = "include-wasm-blob")] pub use local_executor::LocalExecutor; /// Test client database backend. pub type Backend = client_db::Backend; /// Test client executor. +#[cfg(feature = "include-wasm-blob")] pub type Executor = client::LocalCallExecutor< Backend, executor::NativeExecutor, @@ -78,6 +82,7 @@ pub type LightBackend = client::light::backend::Backend< pub struct LightFetcher; /// Test client light executor. +#[cfg(feature = "include-wasm-blob")] pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor< runtime::Block, LightBackend, @@ -98,12 +103,154 @@ pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor > >; +/// A builder for creating a test client instance. +pub struct TestClientBuilder { + execution_strategies: ExecutionStrategies, + genesis_extension: HashMap, Vec>, + support_changes_trie: bool, + backend: Arc, + _phantom: std::marker::PhantomData, +} + +#[cfg(feature = "include-wasm-blob")] +impl TestClientBuilder where + B: backend::LocalBackend, +{ + /// Create a new instance of the test client builder using the given backend. + pub fn new_with_backend(backend: Arc) -> Self { + TestClientBuilder { + execution_strategies: ExecutionStrategies::default(), + genesis_extension: HashMap::default(), + support_changes_trie: false, + backend, + _phantom: Default::default(), + } + } +} + +#[cfg(feature = "include-wasm-blob")] +impl TestClientBuilder { + /// Create a new instance of the test client builder. + pub fn new() -> Self { + TestClientBuilder { + execution_strategies: ExecutionStrategies::default(), + genesis_extension: HashMap::default(), + support_changes_trie: false, + backend: Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)), + _phantom: Default::default(), + } + } +} + +#[cfg(not(feature = "include-wasm-blob"))] +impl TestClientBuilder where + B: backend::LocalBackend, +{ + /// Create a new instance of the test client builder using the given backend. + pub fn new_with_backend(backend: Arc) -> Self { + TestClientBuilder { + execution_strategies: ExecutionStrategies::default(), + genesis_extension: HashMap::default(), + support_changes_trie: false, + backend, + _phantom: Default::default(), + } + } +} + +#[cfg(not(feature = "include-wasm-blob"))] +impl TestClientBuilder { + /// Create a new instance of the test client builder. + pub fn new() -> Self { + TestClientBuilder { + execution_strategies: ExecutionStrategies::default(), + genesis_extension: HashMap::default(), + support_changes_trie: false, + backend: Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)), + _phantom: Default::default(), + } + } +} + +impl TestClientBuilder where + B: backend::LocalBackend, + E: executor::NativeExecutionDispatch +{ + /// Set the execution strategy that should be used by all contexts. + pub fn set_execution_strategy( + mut self, + execution_strategy: ExecutionStrategy + ) -> Self { + self.execution_strategies = ExecutionStrategies { + syncing: execution_strategy, + importing: execution_strategy, + block_construction: execution_strategy, + offchain_worker: execution_strategy, + other: execution_strategy, + }; + self + } + + /// Set an extension of the genesis storage. + pub fn set_genesis_extension( + mut self, + extension: HashMap, Vec> + ) -> Self { + self.genesis_extension = extension; + self + } + + /// Enable/Disable changes trie support. + pub fn set_support_changes_trie(mut self, enable: bool) -> Self { + self.support_changes_trie = enable; + self + } + + /// Build the test client. + pub fn build(self) -> client::Client< + B, + client::LocalCallExecutor>, + runtime::Block, + runtime::RuntimeApi, + > { + self.build_with_longest_chain().0 + } + + /// Build the test client and longest chain as select chain. + pub fn build_with_longest_chain(self) -> ( + client::Client< + B, + client::LocalCallExecutor>, + runtime::Block, + runtime::RuntimeApi, + >, + client::LongestChain, + ) { + let executor = NativeExecutor::::new(None); + let executor = LocalCallExecutor::new(self.backend.clone(), executor); + + let client = client::Client::new( + self.backend.clone(), + executor, + genesis_storage(self.support_changes_trie, self.genesis_extension), + self.execution_strategies, + ).expect("Creates new client"); + + #[allow(deprecated)] + let longest_chain = client::LongestChain::new(self.backend); + + (client, longest_chain) + } +} + /// Creates new client instance used for tests. +#[cfg(feature = "include-wasm-blob")] pub fn new() -> client::Client { - new_with_backend(Arc::new(Backend::new_test(::std::u32::MAX, ::std::u64::MAX)), false) + TestClientBuilder::new().build() } /// Creates new light client instance used for tests. +#[cfg(feature = "include-wasm-blob")] pub fn new_light() -> client::Client { let storage = client_db::light::LightStorage::new_test(); let blockchain = Arc::new(client::light::blockchain::Blockchain::new(storage)); @@ -113,54 +260,7 @@ pub fn new_light() -> client::Client client::Client { - let backend = Arc::new(Backend::new_test(::std::u32::MAX, ::std::u64::MAX)); - let executor = NativeExecutor::new(None); - let executor = LocalCallExecutor::new(backend.clone(), executor); - - let execution_strategies = ExecutionStrategies { - syncing: execution_strategy, - importing: execution_strategy, - block_construction: execution_strategy, - offchain_worker: execution_strategy, - other: execution_strategy, - }; - - client::Client::new( - backend, - executor, - genesis_storage(false), - execution_strategies - ).expect("Creates new client") -} - -/// Creates new test client instance that suports changes trie creation. -pub fn new_with_changes_trie() - -> client::Client -{ - new_with_backend(Arc::new(Backend::new_test(::std::u32::MAX, ::std::u64::MAX)), true) -} - -/// Creates new client instance used for tests with an explicitly provided backend. -/// This is useful for testing backend implementations. -pub fn new_with_backend( - backend: Arc, - support_changes_trie: bool -) -> client::Client< - B, - client::LocalCallExecutor>, - runtime::Block, - runtime::RuntimeApi -> where B: backend::LocalBackend -{ - let executor = NativeExecutor::new(None); - client::new_with_backend(backend, executor, genesis_storage(support_changes_trie)).unwrap() + client::Client::new(backend, call_executor, genesis_storage(false, Default::default()), Default::default()).unwrap() } fn genesis_config(support_changes_trie: bool) -> GenesisConfig { @@ -177,12 +277,26 @@ fn genesis_config(support_changes_trie: bool) -> GenesisConfig { ) } -fn genesis_storage(support_changes_trie: bool) -> StorageOverlay { +fn genesis_storage( + support_changes_trie: bool, + extension: HashMap, Vec> +) -> (StorageOverlay, ChildrenStorageOverlay) { let mut storage = genesis_config(support_changes_trie).genesis_map(); - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root(storage.clone().into_iter()); + storage.extend(extension.into_iter()); + + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + storage.clone().into_iter() + ); let block: runtime::Block = client::genesis::construct_genesis_block(state_root); storage.extend(additional_storage_with_genesis(&block)); - storage + + let mut child_storage = ChildrenStorageOverlay::default(); + child_storage.insert( + well_known_keys::CHILD_STORAGE_KEY_PREFIX.iter().chain(b"test").cloned().collect(), + vec![(b"key".to_vec(), vec![42_u8])].into_iter().collect() + ); + + (storage, child_storage) } impl client::light::fetcher::Fetcher for LightFetcher { @@ -190,6 +304,7 @@ impl client::light::fetcher::Fetcher for LightFetcher { type RemoteReadResult = FutureResult>, client::error::Error>; type RemoteCallResult = FutureResult, client::error::Error>; type RemoteChangesResult = FutureResult, u32)>, client::error::Error>; + type RemoteBodyResult = FutureResult, client::error::Error>; fn remote_header( &self, @@ -205,6 +320,13 @@ impl client::light::fetcher::Fetcher for LightFetcher { unimplemented!("not (yet) used in tests") } + fn remote_read_child( + &self, + _request: client::light::fetcher::RemoteReadChildRequest, + ) -> Self::RemoteReadResult { + unimplemented!("not (yet) used in tests") + } + fn remote_call( &self, _request: client::light::fetcher::RemoteCallRequest, @@ -218,4 +340,11 @@ impl client::light::fetcher::Fetcher for LightFetcher { ) -> Self::RemoteChangesResult { unimplemented!("not (yet) used in tests") } + + fn remote_body( + &self, + _request: client::light::fetcher::RemoteBodyRequest, + ) -> Self::RemoteBodyResult { + unimplemented!("not (yet) used in tests") + } } diff --git a/core/test-client/src/trait_tests.rs b/core/test-client/src/trait_tests.rs index aa51f7d8bf9e33b24bad88060c5b8dca23a04018..f39d85a1caa3279f094abbdf398d86f509887eae 100644 --- a/core/test-client/src/trait_tests.rs +++ b/core/test-client/src/trait_tests.rs @@ -26,7 +26,7 @@ use crate::{TestClient, AccountKeyring}; use runtime_primitives::traits::Block as BlockT; use crate::backend; use crate::blockchain::{Backend as BlockChainBackendT, HeaderBackend}; -use crate::{BlockBuilderExt, new_with_backend}; +use crate::{BlockBuilderExt, TestClientBuilder}; use runtime::{self, Transfer}; use runtime_primitives::generic::BlockId; @@ -40,51 +40,54 @@ pub fn test_leaves_for_backend(backend: Arc) where // B2 -> C3 // A1 -> D2 - let client = new_with_backend(backend.clone(), false); + let client = TestClientBuilder::new_with_backend(backend.clone()).build(); + let blockchain = backend.blockchain(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; assert_eq!( - client.backend().blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![genesis_hash]); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a1.hash()]); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); + + #[allow(deprecated)] assert_eq!( - client.backend().blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a2.hash()]); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a3.hash()]); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a4.hash()]); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash()]); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -95,25 +98,25 @@ pub fn test_leaves_for_backend(backend: Arc) where let b2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, b2.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b2.hash()]); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b3.hash()]); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b4.hash()]); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -124,11 +127,11 @@ pub fn test_leaves_for_backend(backend: Arc) where let c3 = builder.bake().unwrap(); client.import(BlockOrigin::Own, c3.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b4.hash(), c3.hash()]); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -139,7 +142,7 @@ pub fn test_leaves_for_backend(backend: Arc) where let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b4.hash(), c3.hash(), d2.hash()]); } @@ -153,30 +156,31 @@ pub fn test_children_for_backend(backend: Arc) where // B2 -> C3 // A1 -> D2 - let client = new_with_backend(backend.clone(), false); + let client = TestClientBuilder::new_with_backend(backend.clone()).build(); + let blockchain = backend.blockchain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -188,15 +192,15 @@ pub fn test_children_for_backend(backend: Arc) where client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -208,7 +212,7 @@ pub fn test_children_for_backend(backend: Arc) where client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -219,18 +223,18 @@ pub fn test_children_for_backend(backend: Arc) where let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; - let children1 = backend.blockchain().children(a4.hash()).unwrap(); + let children1 = blockchain.children(a4.hash()).unwrap(); assert_eq!(vec![a5.hash()], children1); - let children2 = backend.blockchain().children(a1.hash()).unwrap(); + let children2 = blockchain.children(a1.hash()).unwrap(); assert_eq!(vec![a2.hash(), b2.hash(), d2.hash()], children2); - let children3 = backend.blockchain().children(genesis_hash).unwrap(); + let children3 = blockchain.children(genesis_hash).unwrap(); assert_eq!(vec![a1.hash()], children3); - let children4 = backend.blockchain().children(b2.hash()).unwrap(); + let children4 = blockchain.children(b2.hash()).unwrap(); assert_eq!(vec![b3.hash(), c3.hash()], children4); } @@ -242,30 +246,31 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let client = new_with_backend(backend, false); + let client = TestClientBuilder::new_with_backend(backend.clone()).build(); + let blockchain = backend.blockchain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -277,15 +282,15 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -297,7 +302,7 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -308,23 +313,23 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc"] edition = "2018" [dependencies] log = { version = "0.4", optional = true } -hex-literal = { version = "0.1.0", optional = true } serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } keyring = { package = "substrate-keyring", path = "../keyring", optional = true } @@ -14,6 +13,7 @@ substrate-client = { path = "../client", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } inherents = { package = "substrate-inherents", path = "../inherents", default-features = false } consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../consensus/aura/primitives", default-features = false } +consensus_babe = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } @@ -32,10 +32,12 @@ substrate-executor = { path = "../executor" } substrate-test-client = { path = "../test-client" } [features] -default = ["std"] +default = [ + "std", + "include-wasm-blob" +] std = [ "log", - "hex-literal", "serde", "substrate-client/std", "keyring", @@ -48,6 +50,7 @@ std = [ "runtime_primitives/std", "runtime_version/std", "consensus_aura/std", + "consensus_babe/std", "primitives/std", "substrate-trie/std", "trie-db/std", @@ -56,3 +59,5 @@ std = [ "executive/std", "consensus_authorities/std", ] +# If enabled, the WASM blob is added to the `GenesisConfig`. +include-wasm-blob = [] diff --git a/core/test-runtime/src/genesismap.rs b/core/test-runtime/src/genesismap.rs index be1c784a52778819fac20db2de25a700f81f6314..cf7682102fb83ae9400c7217fcb26bd42f6af81f 100644 --- a/core/test-runtime/src/genesismap.rs +++ b/core/test-runtime/src/genesismap.rs @@ -22,7 +22,7 @@ use super::AccountId; use parity_codec::{Encode, KeyedVec, Joiner}; use primitives::{ChangesTrieConfiguration, map, storage::well_known_keys}; use runtime_primitives::traits::Block; -use primitives::ed25519::Public as AuthorityId; +use primitives::sr25519::Public as AuthorityId; /// Configuration of a general Substrate test genesis block. pub struct GenesisConfig { @@ -32,7 +32,12 @@ pub struct GenesisConfig { } impl GenesisConfig { - pub fn new(support_changes_trie: bool, authorities: Vec, endowed_accounts: Vec, balance: u64) -> Self { + pub fn new( + support_changes_trie: bool, + authorities: Vec, + endowed_accounts: Vec, + balance: u64 + ) -> Self { GenesisConfig { changes_trie_config: match support_changes_trie { true => Some(super::changes_trie_config()), @@ -44,11 +49,13 @@ impl GenesisConfig { } pub fn genesis_map(&self) -> HashMap, Vec> { + #[cfg(feature = "include-wasm-blob")] let wasm_runtime = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm").to_vec(); let mut map: HashMap, Vec> = self.balances.iter() .map(|&(ref account, balance)| (account.to_keyed_vec(b"balance:"), vec![].and(&balance))) .map(|(k, v)| (blake2_256(&k[..])[..].to_vec(), v.to_vec())) .chain(vec![ + #[cfg(feature = "include-wasm-blob")] (well_known_keys::CODE.into(), wasm_runtime), (well_known_keys::HEAP_PAGES.into(), vec![].and(&(16 as u64))), (well_known_keys::AUTHORITY_COUNT.into(), vec![].and(&(self.authorities.len() as u32))), diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index 9e8617c59242a0cdcb4cacab1437833e51a5c51f..2e8981c52482365be5765a6ec8d3fbdc550b5a1f 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -34,8 +34,9 @@ use substrate_client::{ impl_runtime_apis, }; use runtime_primitives::{ - ApplyResult, transaction_validity::TransactionValidity, + ApplyResult, create_runtime_str, + transaction_validity::TransactionValidity, traits::{ BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT, GetNodeBlockType, GetRuntimeBlockType, AuthorityIdFor, Verify, @@ -43,7 +44,7 @@ use runtime_primitives::{ }; use runtime_version::RuntimeVersion; pub use primitives::hash::H256; -use primitives::{ed25519, sr25519, OpaqueMetadata}; +use primitives::{sr25519, OpaqueMetadata}; #[cfg(any(feature = "std", test))] use runtime_version::NativeVersion; use inherents::{CheckInherentsResult, InherentData}; @@ -102,8 +103,7 @@ pub enum Extrinsic { } #[cfg(feature = "std")] -impl serde::Serialize for Extrinsic -{ +impl serde::Serialize for Extrinsic { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { self.using_encoded(|bytes| seq.serialize_bytes(bytes)) } @@ -122,14 +122,18 @@ impl BlindCheckable for Extrinsic { Err(runtime_primitives::BAD_SIGNATURE) } }, - Extrinsic::IncludeData(data) => Ok(Extrinsic::IncludeData(data)), + Extrinsic::IncludeData(_) => Err(runtime_primitives::BAD_SIGNATURE), } } } impl ExtrinsicT for Extrinsic { fn is_signed(&self) -> Option { - Some(true) + if let Extrinsic::IncludeData(_) = *self { + Some(false) + } else { + Some(true) + } } } @@ -143,7 +147,7 @@ impl Extrinsic { } /// The signature type used by authorities. -pub type AuthoritySignature = ed25519::Signature; +pub type AuthoritySignature = sr25519::Signature; /// The identity type used by authorities. pub type AuthorityId = ::Signer; /// The signature type used by accounts/transactions. @@ -240,6 +244,13 @@ cfg_if! { fn use_trie() -> u64; fn benchmark_indirect_call() -> u64; fn benchmark_direct_call() -> u64; + /// Returns the initialized block number. + fn get_block_number() -> u64; + /// Takes and returns the initialized block number. + fn take_block_number() -> Option; + /// Returns if no block was initialized. + #[skip_initialize_block] + fn without_initialize_block() -> bool; } } } else { @@ -264,6 +275,13 @@ cfg_if! { fn use_trie() -> u64; fn benchmark_indirect_call() -> u64; fn benchmark_direct_call() -> u64; + /// Returns the initialized block number. + fn get_block_number() -> u64; + /// Takes and returns the initialized block number. + fn take_block_number() -> Option; + /// Returns if no block was initialized. + #[skip_initialize_block] + fn without_initialize_block() -> bool; } } } @@ -334,10 +352,6 @@ cfg_if! { fn initialize_block(header: &::Header) { system::initialize_block(header) } - - fn authorities() -> Vec { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl client_api::Metadata for Runtime { @@ -348,6 +362,16 @@ cfg_if! { impl client_api::TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { + if let Extrinsic::IncludeData(data) = utx { + return TransactionValidity::Valid { + priority: data.len() as u64, + requires: vec![], + provides: vec![data], + longevity: 1, + propagate: false, + }; + } + system::validate_transaction(utx) } } @@ -417,22 +441,44 @@ cfg_if! { fn benchmark_direct_call() -> u64 { (0..1000).fold(0, |p, i| p + benchmark_add_one(i)) } + + fn get_block_number() -> u64 { + system::get_block_number().expect("Block number is initialized") + } + + fn without_initialize_block() -> bool { + system::get_block_number().is_none() + } + + fn take_block_number() -> Option { + system::take_block_number() + } } impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } } + impl consensus_babe::BabeApi for Runtime { + fn startup_data() -> consensus_babe::BabeConfiguration { + consensus_babe::BabeConfiguration { + slot_duration: 1, + expected_block_time: 1, + threshold: std::u64::MAX, + } + } + } + impl offchain_primitives::OffchainWorkerApi for Runtime { fn offchain_worker(block: u64) { let ex = Extrinsic::IncludeData(block.encode()); - runtime_io::submit_extrinsic(&ex) + runtime_io::submit_transaction(&ex).unwrap(); } } impl consensus_authorities::AuthoritiesApi for Runtime { fn authorities() -> Vec> { - crate::system::authorities() + system::authorities() } } } @@ -450,10 +496,6 @@ cfg_if! { fn initialize_block(header: &::Header) { system::initialize_block(header) } - - fn authorities() -> Vec { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl client_api::Metadata for Runtime { @@ -464,6 +506,16 @@ cfg_if! { impl client_api::TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { + if let Extrinsic::IncludeData(data) = utx { + return TransactionValidity::Valid { + priority: data.len() as u64, + requires: vec![], + provides: vec![data], + longevity: 1, + propagate: false, + }; + } + system::validate_transaction(utx) } } @@ -537,24 +589,44 @@ cfg_if! { fn benchmark_direct_call() -> u64 { (0..10000).fold(0, |p, i| p + benchmark_add_one(i)) } - } + fn get_block_number() -> u64 { + system::get_block_number().expect("Block number is initialized") + } + + fn without_initialize_block() -> bool { + system::get_block_number().is_none() + } + fn take_block_number() -> Option { + system::take_block_number() + } + } impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } } + impl consensus_babe::BabeApi for Runtime { + fn startup_data() -> consensus_babe::BabeConfiguration { + consensus_babe::BabeConfiguration { + slot_duration: 1, + expected_block_time: 1, + threshold: core::u64::MAX, + } + } + } + impl offchain_primitives::OffchainWorkerApi for Runtime { fn offchain_worker(block: u64) { let ex = Extrinsic::IncludeData(block.encode()); - runtime_io::submit_extrinsic(&ex) + runtime_io::submit_transaction(&ex).unwrap() } } impl consensus_authorities::AuthoritiesApi for Runtime { fn authorities() -> Vec> { - crate::system::authorities() + system::authorities() } } } diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 51f12966dc84e244dc14da9444764587046bcb42..491ca0db364420ca485a21ec54c2f3aac566e2d6 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -21,13 +21,13 @@ use rstd::prelude::*; use runtime_io::{storage_root, enumerated_trie_root, storage_changes_root, twox_128, blake2_256}; use runtime_support::storage::{self, StorageValue, StorageMap}; use runtime_support::storage_items; -use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Digest as DigestT}; +use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Digest as DigestT, Header as _}; use runtime_primitives::generic; use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult, transaction_validity::TransactionValidity}; use parity_codec::{KeyedVec, Encode}; use super::{AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest}; use primitives::{Blake2Hasher, storage::well_known_keys}; -use primitives::ed25519::Public as AuthorityId; +use primitives::sr25519::Public as AuthorityId; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; @@ -35,9 +35,10 @@ const BALANCE_OF: &[u8] = b"balance:"; storage_items! { ExtrinsicData: b"sys:xtd" => required map [ u32 => Vec ]; // The current block number being processed. Set by `execute_block`. - Number: b"sys:num" => required BlockNumber; + Number: b"sys:num" => BlockNumber; ParentHash: b"sys:pha" => required Hash; NewAuthorities: b"sys:new_auth" => Vec; + StorageDigest: b"sys:digest" => Digest; } pub fn balance_of_key(who: AccountId) -> Vec { @@ -67,9 +68,18 @@ pub fn initialize_block(header: &Header) { // populate environment. ::put(&header.number); ::put(&header.parent_hash); + ::put(header.digest()); storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32); } +pub fn get_block_number() -> Option { + Number::get() +} + +pub fn take_block_number() -> Option { + Number::take() +} + /// Actually execute all transitioning for `block`. pub fn polish_block(block: &mut Block) { let header = &mut block.header; @@ -91,18 +101,17 @@ pub fn polish_block(block: &mut Block) { header.state_root = storage_root().into(); // check digest - let mut digest = Digest::default(); - if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into(), header.number - 1) { + let digest = &mut header.digest; + if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into()) { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); } if let Some(new_authorities) = ::take() { digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); } - header.digest = digest; } -pub fn execute_block(block: Block) { - let ref header = block.header; +pub fn execute_block(mut block: Block) { + let header = &mut block.header; // check transaction trie root represents the transactions. let txs = block.extrinsics.iter().map(Encode::encode).collect::>(); @@ -124,14 +133,13 @@ pub fn execute_block(block: Block) { assert!(storage_root == header.state_root, "Storage root must match that calculated."); // check digest - let mut digest = Digest::default(); - if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into(), header.number - 1) { + let digest = &mut header.digest; + if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into()) { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); } if let Some(new_authorities) = ::take() { digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); } - assert!(digest == header.digest, "Header digest items must match that calculated."); } /// The block executor. @@ -167,7 +175,9 @@ pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { let mut deps = Vec::new(); deps.push(hash(&tx.from, tx.nonce - 1)); deps - } else { Vec::new() }; + } else { + Vec::new() + }; let provides = { let mut p = Vec::new(); @@ -180,6 +190,7 @@ pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { requires, provides, longevity: 64, + propagate: true, } } @@ -199,13 +210,16 @@ pub fn finalize_block() -> Header { let txs: Vec<_> = (0..extrinsic_index).map(ExtrinsicData::take).collect(); let txs = txs.iter().map(Vec::as_slice).collect::>(); let extrinsics_root = enumerated_trie_root::(&txs).into(); - - let number = ::take(); + // let mut digest = Digest::default(); + let number = ::take().expect("Number is set by `initialize_block`"); let parent_hash = ::take(); + let mut digest = ::take().expect("StorageDigest is set by `initialize_block`"); + + // This MUST come after all changes to storage are done. Otherwise we will fail the + // “Storage root does not match that calculated” assertion. let storage_root = BlakeTwo256::storage_root(); - let storage_changes_root = BlakeTwo256::storage_changes_root(parent_hash, number - 1); + let storage_changes_root = BlakeTwo256::storage_changes_root(parent_hash); - let mut digest = Digest::default(); if let Some(storage_changes_root) = storage_changes_root { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root)); } diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index b63794045923706f07734681543cfb020306a110..be1e3ab84fe9f5a33a56eba9e58d5c532d064eb3 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -1,5 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aes-ctr" version = "0.3.0" @@ -33,7 +38,7 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.10" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -44,12 +49,12 @@ name = "aio-limited" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -79,7 +84,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -87,27 +92,26 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.14" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -115,19 +119,22 @@ name = "backtrace-sys" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "base-x" -version = "0.2.4" +name = "base58" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "base58" -version = "0.1.0" +name = "base64" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "bigint" @@ -179,10 +186,10 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -198,7 +205,7 @@ dependencies = [ [[package]] name = "block-padding" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -209,9 +216,14 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -250,12 +262,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.30" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -263,8 +275,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -273,7 +285,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -289,12 +301,28 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -346,7 +374,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -360,7 +388,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -380,7 +408,7 @@ name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -388,7 +416,7 @@ name = "crossbeam-utils" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -399,7 +427,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -440,14 +468,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -457,13 +485,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -482,11 +510,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" @@ -502,7 +525,7 @@ version = "1.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -510,7 +533,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -529,7 +552,7 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -543,15 +566,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "error-chain" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -559,7 +574,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -568,10 +583,10 @@ name = "failure_derive" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -581,33 +596,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fixed-hash" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "fnv" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "foreign-types" -version = "0.3.2" +name = "flate2" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "fnv" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -631,7 +646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -639,7 +654,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -672,7 +687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -682,7 +697,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -692,10 +707,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -717,7 +732,7 @@ name = "heapsize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -725,7 +740,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -735,16 +750,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -779,6 +794,16 @@ dependencies = [ "hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "http" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "httparse" version = "1.3.3" @@ -816,7 +841,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -829,21 +862,26 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -874,53 +912,51 @@ name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" -version = "0.2.50" +version = "0.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -929,64 +965,74 @@ dependencies = [ "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -996,28 +1042,28 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1026,54 +1072,55 @@ dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1081,103 +1128,107 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-secio" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1185,26 +1236,57 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-websocket" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1229,12 +1311,20 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1269,7 +1359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1278,17 +1368,44 @@ dependencies = [ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1296,25 +1413,14 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "mio-extras" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mio-uds" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1334,7 +1440,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1347,9 +1453,9 @@ name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1373,23 +1479,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1410,31 +1520,6 @@ name = "opaque-debug" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "openssl" -version = "0.10.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-sys" -version = "0.9.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "owning_ref" version = "0.3.3" @@ -1463,7 +1548,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1471,15 +1556,15 @@ name = "parity-codec-derive" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1487,24 +1572,31 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multihash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-wasm" version = "0.31.3" @@ -1540,15 +1632,25 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1556,11 +1658,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1568,31 +1670,46 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste-impl" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1610,28 +1727,23 @@ name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pkg-config" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1644,12 +1756,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1659,7 +1771,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.27" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1667,7 +1779,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.4.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1685,7 +1797,7 @@ name = "quote" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1693,7 +1805,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1703,10 +1815,10 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1716,9 +1828,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1726,17 +1838,17 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1744,7 +1856,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1779,12 +1891,12 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1794,10 +1906,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1805,7 +1917,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1823,7 +1935,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1834,7 +1946,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1848,7 +1960,7 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1856,24 +1968,24 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1884,17 +1996,17 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1911,18 +2023,31 @@ dependencies = [ ] [[package]] -name = "rw-stream-sink" -version = "0.1.1" +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rw-stream-sink" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1935,51 +2060,38 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.0.0" -source = "git+https://github.com/w3f/schnorrkel#3179838da9dd4896c12bb910e7c42477a3250641" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "schnorrkel" -version = "0.1.0" +name = "scopeguard" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "scopeguard" -version = "0.3.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "secp256k1" -version = "0.12.0" +name = "sct" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2002,20 +2114,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2023,9 +2135,20 @@ name = "serde_json" version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha-1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2050,7 +2173,7 @@ name = "sha2" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2058,10 +2181,10 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2081,16 +2204,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -2098,7 +2211,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2132,7 +2245,25 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2147,148 +2278,146 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-api-macros" -version = "1.0.0" +version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-io" -version = "1.0.0" +version = "2.0.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-std" -version = "1.0.0" +version = "2.0.0" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-version" -version = "1.0.0" +version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "srml-executive" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-metadata" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-support" -version = "1.0.0" +version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-metadata 1.0.0", - "srml-support-procedural 1.0.0", - "substrate-inherents 1.0.0", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-metadata 2.0.0", + "srml-support-procedural 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-support-procedural" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "srml-support-procedural-tools 1.0.0", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "srml-support-procedural-tools 2.0.0", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "srml-support-procedural-tools-derive 1.0.0", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "srml-support-procedural-tools-derive 2.0.0", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-system" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -2306,50 +2435,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -2369,263 +2454,289 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" +version = "0.2.1" +source = "git+https://github.com/paritytech/substrate-bip39#44307fda4ea17fe97aeb93af317fbc8f6ed34193" dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-client" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-trie 2.0.0", ] [[package]] name = "substrate-consensus-aura-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-consensus-authorities" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", +] + +[[package]] +name = "substrate-consensus-babe-primitives" +version = "2.0.0" +dependencies = [ + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-slots 2.0.0", ] [[package]] name = "substrate-consensus-common" -version = "1.0.0" +version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-consensus-slots" +version = "2.0.0" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-executor" -version = "1.0.0" +version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-version 1.0.0", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-serializer 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-version 2.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-serializer 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-inherents" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "substrate-keyring" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", + "sr-primitives 2.0.0", "strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-offchain-primitives" -version = "0.1.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-panic-handler" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", + "sr-std 2.0.0", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-serializer" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-state-machine" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-telemetry" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-test-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-executive 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", - "substrate-trie 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-executive 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-test-runtime-wasm" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "substrate-test-runtime 1.0.0", + "substrate-test-runtime 2.0.0", ] [[package]] name = "substrate-trie" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2637,35 +2748,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "subtle" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.31" +version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "termcolor" version = "1.0.4" @@ -2679,9 +2785,9 @@ name = "termion" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2698,9 +2804,9 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2730,31 +2836,32 @@ name = "tk-listen" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2765,17 +2872,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-current-thread" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2783,19 +2890,19 @@ name = "tokio-dns-unofficial" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-executor" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2803,9 +2910,9 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2814,7 +2921,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2824,25 +2931,38 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-sync" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2851,38 +2971,46 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-trace-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2891,9 +3019,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2905,11 +3033,11 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2918,10 +3046,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2956,7 +3084,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2974,11 +3102,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3001,7 +3129,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3038,11 +3166,6 @@ name = "utf8-ranges" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "vcpkg" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "version_check" version = "0.1.5" @@ -3055,103 +3178,141 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasmi" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasmi-validation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3164,7 +3325,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3186,7 +3347,7 @@ name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3199,28 +3360,10 @@ name = "wincolor" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -3232,21 +3375,21 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3261,45 +3404,68 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" -"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" +"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" "checksum aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f10b352bc3fc08ae24dc5d2d3ddcac153678533986122dc283d747b12071000" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9893d63fc3b1c44231e667da6836a33f27d8b6b3bdc82f83da5dfd579d1b6528" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" -"checksum backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5a90e2b463010cd0e0ce9a11d4a9d5d58d9f41d4a6ba3dcaf9e68b466e88b4" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" +"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" -"checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d" +"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" +"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" -"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" -"checksum cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)" = "d01c69d08ff207f231f07196e30f84c70f1c815b04f980f8b7b01ff01f05eb92" -"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" +"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" "checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" @@ -3311,36 +3477,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" +"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" "checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -"checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" +"checksum curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" -"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" +"checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" -"checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac" +"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" "checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" "checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" +"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" @@ -3348,60 +3511,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" "checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" -"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8e04cb7a5051270ef3fa79f8c7604d581ecfa73d520e74f554e45541c4b5881a" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" -"checksum hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" -"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc2928beef125e519d69ae1baa8c37ea2e0d3848545217f6db0179c5eb1d639" +"checksum hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" +"checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" +"checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" +"checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" -"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" -"checksum libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0231edab431064b30b7749484a39735eb36492cef4658c372c9059e58c3003aa" -"checksum libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a3bad2ed26297112847678683dd221473a0d44297250b61f004e1b35e72493" -"checksum libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f765f103b680cbed910b02bfdbdcfce5b1142899c93e51acb960bf59b6f81b1" -"checksum libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b129d20cc8cbb6ce5da8361045649c024659173e246c5dfbf20ae06071c046a" -"checksum libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70d68816b8435d6788399416eb2f0a6974fb1d15c4be5c30141f87c8e81746df" -"checksum libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "718ca645a065fd70855ca6042a7df686c24cd21add750c37a82c811fbd1e5c43" -"checksum libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbe27c623a6a720efd5d704347838972062f89149a9c3cd149748da60bdcd3e0" -"checksum libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9bc1a5d85f4812cae6367b49a432763fe28997bac7c530dc55b70ec18a78aa7" -"checksum libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe5a858342a1cc89464474f7edc4bae1da649b9c823a3e04d9fb494493601746" -"checksum libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc6b5185c50a52a12e7bbe2ee7799059e24de4e52ab25edbfd26c8ab8515d317" -"checksum libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7905c1431ad115bee83405770629a27d6f17153ad02ec9670a7347998ef20e22" -"checksum libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc17626763ded57da8fed73187c2d9f6ebb89d30838673c430315bf560c7e4db" -"checksum libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2409d08b809ab1a74269597f7da2829d117cc11b9ed3343af33fc20831619726" -"checksum libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258cdc6742945c8f6402997bbbf36733588e2db18e5a0014da6d46e3ccfb92cf" -"checksum libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b5691e2ba2720d42bd1e93d6b90239fa9235c1956ef6a5f1dd499a7ae2767be" -"checksum libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ab0b9ca050105fd94229c48911c0c84aef4d6b86a53d1b6df81d938354e47e" -"checksum libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" -"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" -"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" @@ -3409,40 +3580,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" +"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d" -"checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" -"checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" +"checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f50392d1265092fbee9273414cc40eb6d47d307bd66222c477bb8450c8504f9d" -"checksum paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a3cd512fe3a55e8933b2dcad913e365639db86d512e4004c3084b86864d9467a" +"checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" +"checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" +"checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66" +"checksum proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0c1dd4172a1e1f96f709341418f49b11ea6c2d95d53dca08c0f74cbd332d9cf3" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" @@ -3455,63 +3626,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" -"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" -"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" +"checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" -"checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" -"checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4070f3906e65249228094cf97b04a90799fba04468190bbbcfa812309cf86e32" +"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" -"checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" -"checksum serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6eabf4b5914e88e24eea240bb7c9f9a2cbc1bbbe8d961d381975ec3c6b806c" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" +"checksum serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "101b495b109a3e3ca8c4cbe44cf62391527cdfb6ba15821c5ce80bcd5ea23f9f" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" -"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a3edad410e603184d656e2abded5fd4d3d6e93d5763d21130dbaf99795db74eb" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1635afd059cbfac7d5b1274f0c44cec110c1e013c48e8bbc22e07e52696cf887" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" +"checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b4cfac95805274c6afdb12d8f770fa2d27c045953e7b630a81801953699a9a" -"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" "checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" @@ -3519,58 +3687,64 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" -"checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" +"checksum tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" +"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" -"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" +"checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" -"checksum tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" +"checksum tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" +"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" +"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" -"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +"checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" -"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" +"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" -"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" -"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" -"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" -"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" -"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" -"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" -"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" -"checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" -"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" -"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" +"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" +"checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" +"checksum web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" -"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/core/test-runtime/wasm/Cargo.toml b/core/test-runtime/wasm/Cargo.toml index e78de31f3a99e4570b8fd8b9ff3ef294ea794a80..a056eab3840740e0ee3f2f07f99214446b23a0f5 100644 --- a/core/test-runtime/wasm/Cargo.toml +++ b/core/test-runtime/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime-wasm" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/test-runtime/wasm/build.sh b/core/test-runtime/wasm/build.sh index abca9a60e9c4a7a5e68723cfd80c350a5c74d09a..0529a974ffe7188a800db991dad82ca0675e7ee5 100755 --- a/core/test-runtime/wasm/build.sh +++ b/core/test-runtime/wasm/build.sh @@ -6,8 +6,8 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release +CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release $@ for i in substrate_test_runtime do - wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm + wasm-gc "target/wasm32-unknown-unknown/release/$i.wasm" "target/wasm32-unknown-unknown/release/$i.compact.wasm" done diff --git a/core/transaction-pool/Cargo.toml b/core/transaction-pool/Cargo.toml index 55622093375b808f63a00002451bd7d9d5dd4126..ed2cd27833f5a77314ff2a44a8157c8adb1ae293 100644 --- a/core/transaction-pool/Cargo.toml +++ b/core/transaction-pool/Cargo.toml @@ -1,15 +1,15 @@ [package] name = "substrate-transaction-pool" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" futures = "0.1" log = "0.4" parity-codec = "3.3" -parking_lot = "0.7.1" +parking_lot = "0.8.0" sr-primitives = { path = "../sr-primitives" } client = { package = "substrate-client", path = "../client" } substrate-primitives = { path = "../primitives" } diff --git a/core/transaction-pool/graph/Cargo.toml b/core/transaction-pool/graph/Cargo.toml index 9090ef18b924d17cdef15ad06ff460e51ad72f7f..3f918efa4a2ea7c61b5717123f7fdd37e4a85a8e 100644 --- a/core/transaction-pool/graph/Cargo.toml +++ b/core/transaction-pool/graph/Cargo.toml @@ -1,20 +1,20 @@ [package] name = "substrate-transaction-graph" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" futures = "0.1" log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" serde = { version = "1.0", features = ["derive"] } substrate-primitives = { path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } [dev-dependencies] -assert_matches = "1.1" -env_logger = "0.6" -parity-codec = "3.3" +assert_matches = "1.3.0" +env_logger = "0.6.1" +parity-codec = "3.5.1" test_runtime = { package = "substrate-test-runtime", path = "../../test-runtime" } diff --git a/core/transaction-pool/graph/src/base_pool.rs b/core/transaction-pool/graph/src/base_pool.rs index ad434e57d45a21cdc2cec8a10984f1c782eb8a27..b3a2cf0e54702475a514da18705c6b76971dd3cb 100644 --- a/core/transaction-pool/graph/src/base_pool.rs +++ b/core/transaction-pool/graph/src/base_pool.rs @@ -25,7 +25,6 @@ use std::{ sync::Arc, }; -use error_chain::bail; use log::{trace, debug, warn}; use serde::Serialize; use substrate_primitives::hexdisplay::HexDisplay; @@ -43,9 +42,9 @@ use crate::ready::ReadyTransactions; /// Successful import result. #[derive(Debug, PartialEq, Eq)] pub enum Imported { - /// Transaction was successfuly imported to Ready queue. + /// Transaction was successfully imported to Ready queue. Ready { - /// Hash of transaction that was successfuly imported. + /// Hash of transaction that was successfully imported. hash: Hash, /// Transactions that got promoted from the Future queue. promoted: Vec, @@ -54,9 +53,9 @@ pub enum Imported { /// Transactions removed from the Ready pool (replaced). removed: Vec>>, }, - /// Transaction was successfuly imported to Future queue. + /// Transaction was successfully imported to Future queue. Future { - /// Hash of transaction that was successfuly imported. + /// Hash of transaction that was successfully imported. hash: Hash, } } @@ -101,6 +100,15 @@ pub struct Transaction { pub requires: Vec, /// Tags that this transaction provides. pub provides: Vec, + /// Should that transaction be propagated. + pub propagate: bool, +} + +impl Transaction { + /// Returns `true` if the transaction should be propagated to other peers. + pub fn is_propagateable(&self) -> bool { + self.propagate + } } impl fmt::Debug for Transaction where @@ -124,6 +132,7 @@ impl fmt::Debug for Transaction where write!(fmt, "priority: {:?}, ", &self.priority)?; write!(fmt, "valid_till: {:?}, ", &self.valid_till)?; write!(fmt, "bytes: {:?}, ", &self.bytes)?; + write!(fmt, "propagate: {:?}, ", &self.propagate)?; write!(fmt, "requires: [")?; print_tags(fmt, &self.requires)?; write!(fmt, "], provides: [")?; @@ -184,7 +193,7 @@ impl BasePool, ) -> error::Result> { if self.future.contains(&tx.hash) || self.ready.contains(&tx.hash) { - bail!(error::ErrorKind::AlreadyImported(Box::new(tx.hash.clone()))) + return Err(error::Error::AlreadyImported(Box::new(tx.hash.clone()))) } let tx = WaitingTransaction::new( @@ -259,7 +268,7 @@ impl BasePool) { - description("Transaction is already in the pool"), - display("[{:?}] Already imported", hash), - } - /// The transaction cannot be imported cause it's a replacement and has too low priority. - TooLowPriority(old: Priority, new: Priority) { - description("The priority is too low to replace transactions already in the pool."), - display("Too low priority ({} > {})", old, new) - } - /// Deps cycle detected and we couldn't import transaction. - CycleDetected { - description("Transaction was not imported because of detected cycle."), - display("Cycle Detected"), - } - /// Transaction was dropped immediately after it got inserted. - ImmediatelyDropped { - description("Transaction couldn't enter the pool because of the limit."), - display("Immediately Dropped"), - } - } +/// Transaction pool result. +pub type Result = std::result::Result; + +/// Transaction pool error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Transaction is not verifiable yet, but might be in the future. + #[display(fmt="Unkown Transaction Validity. Error code: {}", _0)] + UnknownTransactionValidity(i8), + /// Transaction is invalid. + #[display(fmt="Invalid Transaction. Error Code: {}", _0)] + InvalidTransaction(i8), + /// The transaction is temporarily banned. + #[display(fmt="Temporarily Banned")] + TemporarilyBanned, + /// The transaction is already in the pool. + #[display(fmt="[{:?}] Already imported", _0)] + AlreadyImported(Box), + /// The transaction cannot be imported cause it's a replacement and has too low priority. + #[display(fmt="Too low priority ({} > {})", old, new)] + TooLowPriority { + /// Transaction already in the pool. + old: Priority, + /// Transaction entering the pool. + new: Priority + }, + /// Deps cycle etected and we couldn't import transaction. + #[display(fmt="Cycle Detected")] + CycleDetected, + /// Transaction was dropped immediately after it got inserted. + #[display(fmt="Transaction couldn't enter the pool because of the limit.")] + ImmediatelyDropped, + /// Invalid block id. + InvalidBlockId(String), } +impl std::error::Error for Error {} + /// Transaction pool error conversion. pub trait IntoPoolError: ::std::error::Error + Send + Sized { /// Try to extract original `Error` diff --git a/core/transaction-pool/graph/src/pool.rs b/core/transaction-pool/graph/src/pool.rs index 91ded26630cf183eb3d1fcb98fe3681dcadf5372..4498598aee9cab96b878e4f5984460c806c8e053 100644 --- a/core/transaction-pool/graph/src/pool.rs +++ b/core/transaction-pool/graph/src/pool.rs @@ -27,14 +27,13 @@ use crate::listener::Listener; use crate::rotator::PoolRotator; use crate::watcher::Watcher; use serde::Serialize; -use error_chain::bail; use log::debug; use futures::sync::mpsc; use parking_lot::{Mutex, RwLock}; use sr_primitives::{ generic::BlockId, - traits::{self, As}, + traits::{self, SaturatedConversion}, transaction_validity::{TransactionValidity, TransactionTag as Tag}, }; @@ -119,18 +118,18 @@ impl Pool { T: IntoIterator> { let block_number = self.api.block_id_to_number(at)? - .ok_or_else(|| error::ErrorKind::Msg(format!("Invalid block id: {:?}", at)).into())?; + .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())?; let results = xts .into_iter() .map(|xt| -> Result<_, B::Error> { let (hash, bytes) = self.api.hash_and_length(&xt); if self.rotator.is_banned(&hash) { - bail!(error::Error::from(error::ErrorKind::TemporarilyBanned)) + return Err(error::Error::TemporarilyBanned.into()) } match self.api.validate_transaction(at, xt.clone())? { - TransactionValidity::Valid { priority, requires, provides, longevity } => { + TransactionValidity::Valid { priority, requires, provides, longevity, propagate } => { Ok(base::Transaction { data: xt, bytes, @@ -138,15 +137,18 @@ impl Pool { priority, requires, provides, - valid_till: block_number.as_().saturating_add(longevity), + propagate, + valid_till: block_number + .saturated_into::() + .saturating_add(longevity), }) }, TransactionValidity::Invalid(e) => { - bail!(error::Error::from(error::ErrorKind::InvalidTransaction(e))) + Err(error::Error::InvalidTransaction(e).into()) }, TransactionValidity::Unknown(e) => { self.listener.write().invalid(&hash); - bail!(error::Error::from(error::ErrorKind::UnknownTransactionValidity(e))) + Err(error::Error::UnknownTransactionValidity(e).into()) }, } }) @@ -166,7 +168,7 @@ impl Pool { let removed = self.enforce_limits(); Ok(results.into_iter().map(|res| match res { - Ok(ref hash) if removed.contains(hash) => Err(error::Error::from(error::ErrorKind::ImmediatelyDropped).into()), + Ok(ref hash) if removed.contains(hash) => Err(error::Error::ImmediatelyDropped.into()), other => other, }).collect()) } @@ -304,12 +306,9 @@ impl Pool { let hashes = status.pruned.iter().map(|tx| tx.hash.clone()).collect::>(); let results = self.submit_at(at, status.pruned.into_iter().map(|tx| tx.data.clone()))?; - // Collect the hashes of transactions that now became invalid (meaning that they are succesfuly pruned). + // Collect the hashes of transactions that now became invalid (meaning that they are succesfully pruned). let hashes = results.into_iter().enumerate().filter_map(|(idx, r)| match r.map_err(error::IntoPoolError::into_pool_error) { - Err(Ok(err)) => match err.kind() { - error::ErrorKind::InvalidTransaction(_) => Some(hashes[idx].clone()), - _ => None, - }, + Err(Ok(error::Error::InvalidTransaction(_))) => Some(hashes[idx].clone()), _ => None, }); // Fire `pruned` notifications for collected hashes and make sure to include @@ -317,7 +316,7 @@ impl Pool { let hashes = hashes.chain(known_imported_hashes.into_iter()); { let header_hash = self.api.block_id_to_hash(at)? - .ok_or_else(|| error::ErrorKind::Msg(format!("Invalid block id: {:?}", at)).into())?; + .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())?; let mut listener = self.listener.write(); for h in hashes { listener.pruned(header_hash, &h); @@ -333,11 +332,11 @@ impl Pool { /// /// Stale transactions are transaction beyond their longevity period. /// Note this function does not remove transactions that are already included in the chain. - /// See `prune_tags` ifyou want this. + /// See `prune_tags` if you want this. pub fn clear_stale(&self, at: &BlockId) -> Result<(), B::Error> { let block_number = self.api.block_id_to_number(at)? - .ok_or_else(|| error::ErrorKind::Msg(format!("Invalid block id: {:?}", at)).into())? - .as_(); + .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())? + .saturated_into::(); let now = time::Instant::now(); let to_remove = { self.ready() @@ -418,8 +417,7 @@ impl Pool { } /// Returns transaction hash - #[cfg(test)] - fn hash_of(&self, xt: &ExtrinsicFor) -> ExHash { + pub fn hash_of(&self, xt: &ExtrinsicFor) -> ExHash { self.api.hash_and_length(xt).0 } } @@ -493,6 +491,7 @@ mod tests { requires: if nonce > block_number { vec![vec![nonce as u8 - 1]] } else { vec![] }, provides: vec![vec![nonce as u8]], longevity: 3, + propagate: true, }) } } @@ -567,7 +566,7 @@ mod tests { assert_eq!(pool.status().future, 0); // then - assert_matches!(res.unwrap_err().kind(), error::ErrorKind::TemporarilyBanned); + assert_matches!(res.unwrap_err(), error::Error::TemporarilyBanned); } #[test] diff --git a/core/transaction-pool/graph/src/ready.rs b/core/transaction-pool/graph/src/ready.rs index befb1b60ccc2deb18e18eee7a4a08b977f87045d..3497c1bc4ba72408535c33d43813fc08031c465c 100644 --- a/core/transaction-pool/graph/src/ready.rs +++ b/core/transaction-pool/graph/src/ready.rs @@ -23,7 +23,6 @@ use std::{ use serde::Serialize; use log::debug; -use error_chain::bail; use parking_lot::RwLock; use sr_primitives::traits::Member; use sr_primitives::transaction_validity::{ @@ -376,7 +375,7 @@ impl ReadyTransactions { // bail - the transaction has too low priority to replace the old ones if old_priority >= tx.priority { - bail!(error::ErrorKind::TooLowPriority(old_priority, tx.priority)) + return Err(error::Error::TooLowPriority { old: old_priority, new: tx.priority }) } replace_hashes.into_iter().cloned().collect::>() @@ -500,6 +499,7 @@ mod tests { valid_till: 2, requires: vec![vec![1], vec![2]], provides: vec![vec![3], vec![4]], + propagate: true, } } @@ -559,6 +559,7 @@ mod tests { valid_till: u64::max_value(), // use the max_value() here for testing. requires: vec![tx1.provides[0].clone()], provides: vec![], + propagate: true, }; // when diff --git a/core/transaction-pool/graph/src/rotator.rs b/core/transaction-pool/graph/src/rotator.rs index 2ca51ef74e880007285ec8b0f279019fb2b5fa3f..41c1b5842ae849a3ff41e47896f4cf41d3d80ca1 100644 --- a/core/transaction-pool/graph/src/rotator.rs +++ b/core/transaction-pool/graph/src/rotator.rs @@ -120,6 +120,7 @@ mod tests { valid_till: 1, requires: vec![], provides: vec![], + propagate: true, }; (hash, tx) @@ -185,6 +186,7 @@ mod tests { valid_till, requires: vec![], provides: vec![], + propagate: true, } } diff --git a/core/transaction-pool/src/error.rs b/core/transaction-pool/src/error.rs index d4cc0acee8d79923bbeefa8314fc36f3e7ab9e30..f3641aa8ecee3bfc31d86977686d709ce4a355e4 100644 --- a/core/transaction-pool/src/error.rs +++ b/core/transaction-pool/src/error.rs @@ -16,29 +16,34 @@ //! Transaction pool error. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - use client; use txpool; -use error_chain::{ - error_chain, error_chain_processing, impl_error_chain_processed, impl_extract_backtrace, impl_error_chain_kind -}; -error_chain! { - foreign_links { - Client(client::error::Error) #[doc = "Client error"]; - } - links { - Pool(txpool::error::Error, txpool::error::ErrorKind) #[doc = "Pool error"]; +/// Transaction pool result. +pub type Result = std::result::Result; + +/// Transaction pool error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Pool error. + Pool(txpool::error::Error), +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + Error::Pool(ref err) => Some(err), + } } } impl txpool::IntoPoolError for Error { - fn into_pool_error(self) -> ::std::result::Result { + fn into_pool_error(self) -> std::result::Result { match self { - Error(ErrorKind::Pool(e), c) => Ok(txpool::error::Error(e, c)), + Error::Pool(e) => Ok(e), e => Err(e), } } diff --git a/core/transaction-pool/src/tests.rs b/core/transaction-pool/src/tests.rs index cab44f49cc79c4b812c513a2cc197b0a5e00d01d..a1ee4a50df332b9fe9d74fd0f4a1e8f3d637bebf 100644 --- a/core/transaction-pool/src/tests.rs +++ b/core/transaction-pool/src/tests.rs @@ -53,6 +53,7 @@ impl txpool::ChainApi for TestApi { requires, provides, longevity: 64, + propagate: true, }) } diff --git a/core/trie/Cargo.toml b/core/trie/Cargo.toml index 1fd1b7b3bd02e34bf9e57993f3bed632a33daa55..dc245a442bd06962a6da73adb7eb3cadd5d337f1 100644 --- a/core/trie/Cargo.toml +++ b/core/trie/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-trie" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Patricia trie stuff using a parity-codec node format" repository = "https://github.com/paritytech/parity-common" @@ -25,7 +25,7 @@ trie-bench = { version = "0.12" } trie-standardmap = { version = "0.12" } keccak-hasher = { version = "0.12" } criterion = "0.2" -hex-literal = "0.1.0" +hex-literal = "0.2.0" [features] default = ["std"] diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index a9a9860f949986c0376bbb860f881451be9eccfe..6298f10bf4b51d01b13d73a73cccf8a0c492d736 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -17,7 +17,6 @@ //! Utility functions to interact with Substrate's Base-16 Modified Merkle Patricia tree ("trie"). #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] mod error; mod node_header; @@ -44,9 +43,9 @@ pub type TrieError = trie_db::TrieError; pub trait AsHashDB: hash_db::AsHashDB {} impl> AsHashDB for T {} /// As in `hash_db`, but less generic, trait exposed. -pub type HashDB<'a, H> = hash_db::HashDB + 'a; +pub type HashDB<'a, H> = dyn hash_db::HashDB + 'a; /// As in `hash_db`, but less generic, trait exposed. -pub type PlainDB<'a, K> = hash_db::PlainDB + 'a; +pub type PlainDB<'a, K> = dyn hash_db::PlainDB + 'a; /// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. pub type PrefixedMemoryDB = memory_db::MemoryDB, trie_db::DBValue>; /// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. @@ -158,11 +157,7 @@ pub fn is_child_trie_key_valid(storage_key: &[u8]) -> bool { /// Determine the default child trie root. pub fn default_child_trie_root(_storage_key: &[u8]) -> Vec { - let mut db = MemoryDB::default(); - let mut root = H::Out::default(); - let mut empty = TrieDBMut::::new(&mut db, &mut root); - empty.commit(); - empty.root().as_ref().to_vec() + trie_root::, Vec>(core::iter::empty()).as_ref().iter().cloned().collect() } /// Determine a child trie root given its ordered contents, closed form. H is the default hasher, but a generic @@ -339,7 +334,7 @@ mod tests { use hash_db::{HashDB, Hasher}; use trie_db::{DBValue, TrieMut, Trie}; use trie_standardmap::{Alphabet, ValueMode, StandardMap}; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; fn check_equivalent(input: &Vec<(&[u8], &[u8])>) { { @@ -377,6 +372,18 @@ mod tests { } } + #[test] + fn default_trie_root() { + let mut db = MemoryDB::default(); + let mut root = ::Out::default(); + let mut empty = TrieDBMut::::new(&mut db, &mut root); + empty.commit(); + let root1 = empty.root().as_ref().to_vec(); + let root2: Vec = trie_root::, Vec>(std::iter::empty()).as_ref().iter().cloned().collect(); + + assert_eq!(root1, root2); + } + #[test] fn empty_is_equivalent() { let input: Vec<(&[u8], &[u8])> = vec![]; @@ -464,7 +471,7 @@ mod tests { } fn populate_trie<'db>( - db: &'db mut HashDB, + db: &'db mut dyn HashDB, root: &'db mut ::Out, v: &[(Vec, Vec)] ) -> TrieDBMut<'db, Blake2Hasher> { diff --git a/core/trie/src/node_header.rs b/core/trie/src/node_header.rs index 4f7617c0684bb881d970c177d940559d0760d9a9..2c01189f8a155118d3c1779524df729ed5059544 100644 --- a/core/trie/src/node_header.rs +++ b/core/trie/src/node_header.rs @@ -60,12 +60,12 @@ impl Decode for NodeHeader { Some(match input.read_byte()? { EMPTY_TRIE => NodeHeader::Null, // 0 - i @ LEAF_NODE_OFFSET ... LEAF_NODE_SMALL_MAX => // 1 ... (127 - 1) + i @ LEAF_NODE_OFFSET ..= LEAF_NODE_SMALL_MAX => // 1 ... (127 - 1) NodeHeader::Leaf((i - LEAF_NODE_OFFSET) as usize), LEAF_NODE_BIG => // 127 NodeHeader::Leaf(input.read_byte()? as usize + LEAF_NODE_THRESHOLD as usize), - i @ EXTENSION_NODE_OFFSET ... EXTENSION_NODE_SMALL_MAX =>// 128 ... (253 - 1) + i @ EXTENSION_NODE_OFFSET ..= EXTENSION_NODE_SMALL_MAX =>// 128 ... (253 - 1) NodeHeader::Extension((i - EXTENSION_NODE_OFFSET) as usize), EXTENSION_NODE_BIG => // 253 NodeHeader::Extension(input.read_byte()? as usize + EXTENSION_NODE_THRESHOLD as usize), diff --git a/core/trie/src/trie_stream.rs b/core/trie/src/trie_stream.rs index 123ab1ea16de5bd242f88e3715ebe7f192070b34..913cff2c5a94e0664e3e24163e9a39f65538ff72 100644 --- a/core/trie/src/trie_stream.rs +++ b/core/trie/src/trie_stream.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -//! `TrieStream` implementation for Substrate's trie format. +//! `TrieStream` implementation for Substrate's trie format. use rstd::iter::once; use hash_db::Hasher; @@ -83,7 +83,7 @@ impl trie_root::TrieStream for TrieStream { fn append_substream(&mut self, other: Self) { let data = other.out(); match data.len() { - 0...31 => { + 0..=31 => { data.encode_to(&mut self.buffer) }, _ => { diff --git a/core/util/fork-tree/Cargo.toml b/core/util/fork-tree/Cargo.toml index 12f03b4b2d6c808e2bdfc9d3385c76b531a117e4..d65f65d51afbe3bad6a20f8a309a9067fd5e0c55 100644 --- a/core/util/fork-tree/Cargo.toml +++ b/core/util/fork-tree/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fork-tree" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/util/fork-tree/src/lib.rs b/core/util/fork-tree/src/lib.rs index f194ac8915159b104be7e469bf5e27dcf9dbbdea..4b6745a354cb051ffed35d350e42659a0a7e560b 100644 --- a/core/util/fork-tree/src/lib.rs +++ b/core/util/fork-tree/src/lib.rs @@ -22,7 +22,7 @@ use std::fmt; use parity_codec::{Decode, Encode}; -/// Error occured when interating with the tree. +/// Error occured when iterating with the tree. #[derive(Clone, Debug, PartialEq)] pub enum Error { /// Adding duplicate node to tree. @@ -52,7 +52,7 @@ impl std::error::Error for Error { } } - fn cause(&self) -> Option<&std::error::Error> { + fn cause(&self) -> Option<&dyn std::error::Error> { None } } diff --git a/node-template/Cargo.toml b/node-template/Cargo.toml index 7ef20cc89f989cdd79d1513d75dd4b999ad65db3..e78bb2d27e4447142823e27a7c90eda5cea80d44 100644 --- a/node-template/Cargo.toml +++ b/node-template/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template" -version = "1.0.0" +version = "2.0.0" authors = ["Anonymous"] build = "build.rs" edition = "2018" @@ -10,14 +10,13 @@ name = "node-template" path = "src/main.rs" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" futures = "0.1" ctrlc = { version = "3.0", features = ["termination"] } log = "0.4" tokio = "0.1" exit-future = "0.1" -parking_lot = "0.7.1" -hex-literal = "0.1" +parking_lot = "0.8.0" parity-codec = "3.3" trie-root = "0.12.2" sr-io = { path = "../core/sr-io" } diff --git a/node-template/README.md b/node-template/README.md index 4d616be7f0930e8fb02d0f88664e044cd5cb345c..6924fa55762b2b4b0d284d7afd2de771d77c7cc0 100644 --- a/node-template/README.md +++ b/node-template/README.md @@ -40,7 +40,7 @@ Detailed logs may be shown by running the node with the following environment va If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two validator nodes for Alice and Bob, who are the initial authorities of the genesis chain that have been endowed with testnet units. Give each node a name and expose them so they are listed on the Polkadot [telemetry site](https://telemetry.polkadot.io/#/Local%20Testnet). You'll need two terminal windows open. -We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The bootnode ID of her node is `QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN`, which is generated from the `--node-key` value that we specify below: +We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The bootnode ID of her node is `QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR`, which is generated from the `--node-key` value that we specify below: ```bash cargo run -- \ @@ -57,7 +57,7 @@ In the second terminal, we'll start Bob's substrate node on a different TCP port ```bash cargo run -- \ --base-path /tmp/bob \ - --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN \ + --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR \ --chain=local \ --bob \ --port 30334 \ diff --git a/node-template/runtime/Cargo.toml b/node-template/runtime/Cargo.toml index df45166bd33025c7855d523c295fd80c3a79ceeb..bc784071baa9a2e0eb8fc3c11cdaf06567eadfc0 100644 --- a/node-template/runtime/Cargo.toml +++ b/node-template/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template-runtime" -version = "1.0.0" +version = "2.0.0" authors = ["Anonymous"] edition = "2018" diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index f7325923c7641f3b6180eb1a5090a242728d27fd..6193fd8e71810abb146c7892d356284e72184adf 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -1,7 +1,6 @@ //! The Substrate Node Template runtime. This can be compiled with `#[no_std]`, ready for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit="256"] @@ -95,8 +94,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node-template"), impl_name: create_runtime_str!("node-template"), authoring_version: 3, - spec_version: 3, - impl_version: 0, + spec_version: 4, + impl_version: 4, apis: RUNTIME_API_VERSIONS, }; @@ -156,7 +155,7 @@ impl indices::Trait for Runtime { type ResolveHint = indices::SimpleResolveHint; /// Determine whether an account is dead. type IsDeadAccount = Balances; - /// The uniquitous event type. + /// The ubiquitous event type. type Event = Event; } @@ -173,7 +172,7 @@ impl balances::Trait for Runtime { type OnFreeBalanceZero = (); /// What to do if a new account is created. type OnNewAccount = Indices; - /// The uniquitous event type. + /// The ubiquitous event type. type Event = Event; type TransactionPayment = (); @@ -182,7 +181,7 @@ impl balances::Trait for Runtime { } impl sudo::Trait for Runtime { - /// The uniquitous event type. + /// The ubiquitous event type. type Event = Event; type Proposal = Call; } @@ -201,7 +200,7 @@ construct_runtime!( System: system::{default, Log(ChangesTrieRoot)}, Timestamp: timestamp::{Module, Call, Storage, Config, Inherent}, Consensus: consensus::{Module, Call, Storage, Config, Log(AuthoritiesChange), Inherent}, - Aura: aura::{Module}, + Aura: aura::{Module, Log(PreRuntime)}, Indices: indices, Balances: balances, Sudo: sudo, @@ -225,7 +224,7 @@ pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive; +pub type Executive = executive::Executive; // Implement our runtime API endpoints. This is just a bunch of proxying. impl_runtime_apis! { @@ -241,10 +240,6 @@ impl_runtime_apis! { fn initialize_block(header: &::Header) { Executive::initialize_block(header) } - - fn authorities() -> Vec { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl runtime_api::Metadata for Runtime { diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index c430e34fb8a2e1a8491d9829be651acf5f30e576..c94150dc5b1103a9b3fba355d4b0e3e622ec6855 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -1,5 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aes-ctr" version = "0.3.0" @@ -33,7 +38,7 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.10" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -44,12 +49,12 @@ name = "aio-limited" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -79,7 +84,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -87,27 +92,26 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.14" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -115,19 +119,22 @@ name = "backtrace-sys" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "base-x" -version = "0.2.4" +name = "base58" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "base58" -version = "0.1.0" +name = "base64" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "bigint" @@ -179,10 +186,10 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -198,7 +205,7 @@ dependencies = [ [[package]] name = "block-padding" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -209,9 +216,14 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -250,12 +262,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.31" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -263,8 +275,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -273,7 +285,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -289,12 +301,28 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -346,7 +374,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -360,7 +388,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -380,7 +408,7 @@ name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -388,7 +416,7 @@ name = "crossbeam-utils" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -399,7 +427,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -440,14 +468,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -457,13 +485,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -482,11 +510,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" @@ -502,7 +525,7 @@ version = "1.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -510,7 +533,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -529,7 +552,7 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -543,15 +566,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "error-chain" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -559,7 +574,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -568,10 +583,10 @@ name = "failure_derive" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -581,33 +596,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fixed-hash" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "fnv" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "foreign-types" -version = "0.3.2" +name = "flate2" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "fnv" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -631,7 +646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -639,7 +654,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -672,7 +687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -682,7 +697,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -692,10 +707,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -717,7 +732,7 @@ name = "heapsize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -725,7 +740,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -735,16 +750,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -779,6 +794,16 @@ dependencies = [ "hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "http" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "httparse" version = "1.3.3" @@ -816,7 +841,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -829,21 +862,26 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -874,53 +912,51 @@ name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" -version = "0.2.50" +version = "0.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -929,64 +965,74 @@ dependencies = [ "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -996,28 +1042,28 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1026,54 +1072,55 @@ dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1081,103 +1128,107 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-secio" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1185,26 +1236,57 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-websocket" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1229,12 +1311,20 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1269,7 +1359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1278,17 +1368,44 @@ dependencies = [ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1296,25 +1413,14 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "mio-extras" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mio-uds" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1334,7 +1440,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1347,43 +1453,43 @@ name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "node-template-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-aura 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-executive 1.0.0", - "srml-indices 1.0.0", - "srml-sudo 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-aura 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-executive 2.0.0", + "srml-indices 2.0.0", + "srml-sudo 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "node-template-runtime-wasm" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "node-template-runtime 1.0.0", + "node-template-runtime 2.0.0", ] [[package]] @@ -1407,23 +1513,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1444,31 +1554,6 @@ name = "opaque-debug" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "openssl" -version = "0.10.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-sys" -version = "0.9.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "owning_ref" version = "0.3.3" @@ -1497,7 +1582,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1505,15 +1590,15 @@ name = "parity-codec-derive" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1521,24 +1606,31 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multihash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-wasm" version = "0.31.3" @@ -1574,15 +1666,25 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1590,11 +1692,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1602,31 +1704,46 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste-impl" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1644,28 +1761,23 @@ name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pkg-config" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1678,12 +1790,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1693,7 +1805,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.27" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1701,7 +1813,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.4.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1719,7 +1831,7 @@ name = "quote" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1727,7 +1839,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1737,10 +1849,10 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1750,9 +1862,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1760,17 +1872,17 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1778,7 +1890,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1813,12 +1925,12 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1828,10 +1940,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1839,7 +1951,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1857,7 +1969,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1868,7 +1980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1882,7 +1994,7 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1890,24 +2002,24 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1918,17 +2030,17 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1944,19 +2056,32 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1969,51 +2094,38 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.0.0" -source = "git+https://github.com/w3f/schnorrkel#0a0de4294b475ef6abdeebb50067f213ca79b3c7" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "schnorrkel" -version = "0.1.0" +name = "scopeguard" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "scopeguard" -version = "0.3.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "secp256k1" -version = "0.12.0" +name = "sct" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2036,20 +2148,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2057,9 +2169,20 @@ name = "serde_json" version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha-1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2084,7 +2207,7 @@ name = "sha2" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2092,10 +2215,10 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2115,16 +2238,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -2132,7 +2245,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2166,7 +2279,25 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2181,274 +2312,265 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-api-macros" -version = "1.0.0" +version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-io" -version = "1.0.0" +version = "2.0.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-std" -version = "1.0.0" +version = "2.0.0" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-version" -version = "1.0.0" +version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "srml-aura" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-inherents 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-balances" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", ] [[package]] name = "srml-consensus" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-executive" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-indices" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-metadata" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-session" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", ] [[package]] name = "srml-staking" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-session 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", ] [[package]] name = "srml-sudo" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-support-procedural 1.0.0", - "srml-system 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-support-procedural 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-support" -version = "1.0.0" +version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-metadata 1.0.0", - "srml-support-procedural 1.0.0", - "substrate-inherents 1.0.0", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-metadata 2.0.0", + "srml-support-procedural 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-support-procedural" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "srml-support-procedural-tools 1.0.0", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "srml-support-procedural-tools 2.0.0", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "srml-support-procedural-tools-derive 1.0.0", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "srml-support-procedural-tools-derive 2.0.0", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-system" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-timestamp" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] @@ -2466,50 +2588,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -2529,229 +2607,229 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" +version = "0.2.1" +source = "git+https://github.com/paritytech/substrate-bip39#44307fda4ea17fe97aeb93af317fbc8f6ed34193" dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-client" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-trie 2.0.0", ] [[package]] name = "substrate-consensus-aura-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-consensus-authorities" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-consensus-common" -version = "1.0.0" +version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-executor" -version = "1.0.0" +version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-version 1.0.0", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-serializer 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-version 2.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-serializer 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-inherents" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "substrate-keyring" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", + "sr-primitives 2.0.0", "strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-offchain-primitives" -version = "0.1.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-panic-handler" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-serializer" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-state-machine" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-telemetry" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-trie" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2763,35 +2841,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "subtle" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.31" +version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "termcolor" version = "1.0.4" @@ -2805,9 +2878,9 @@ name = "termion" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2824,14 +2897,14 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tiny-bip39" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2856,31 +2929,32 @@ name = "tk-listen" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2891,17 +2965,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-current-thread" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2909,19 +2983,19 @@ name = "tokio-dns-unofficial" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-executor" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2929,9 +3003,9 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2940,7 +3014,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2950,25 +3024,38 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-sync" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2977,38 +3064,46 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-trace-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3017,9 +3112,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3031,11 +3126,11 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3044,10 +3139,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3082,7 +3177,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3100,11 +3195,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3127,7 +3222,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3164,11 +3259,6 @@ name = "utf8-ranges" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "vcpkg" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "version_check" version = "0.1.5" @@ -3181,103 +3271,141 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasmi" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasmi-validation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3290,7 +3418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3312,7 +3440,7 @@ name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3325,28 +3453,10 @@ name = "wincolor" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -3358,21 +3468,21 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3387,45 +3497,68 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" -"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" +"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" "checksum aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f10b352bc3fc08ae24dc5d2d3ddcac153678533986122dc283d747b12071000" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9893d63fc3b1c44231e667da6836a33f27d8b6b3bdc82f83da5dfd579d1b6528" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" -"checksum backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5a90e2b463010cd0e0ce9a11d4a9d5d58d9f41d4a6ba3dcaf9e68b466e88b4" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" +"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" -"checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d" +"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" +"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" -"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" -"checksum cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ce8bb087aacff865633f0bd5aeaed910fe2fe55b55f4739527f2e023a2e53d" -"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" +"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" "checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" @@ -3437,36 +3570,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" +"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" "checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -"checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" +"checksum curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" -"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" +"checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" -"checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac" +"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" "checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" "checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" +"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" @@ -3474,60 +3604,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" "checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" -"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8e04cb7a5051270ef3fa79f8c7604d581ecfa73d520e74f554e45541c4b5881a" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" -"checksum hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" -"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc2928beef125e519d69ae1baa8c37ea2e0d3848545217f6db0179c5eb1d639" +"checksum hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" +"checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" +"checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" +"checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" -"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" -"checksum libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0231edab431064b30b7749484a39735eb36492cef4658c372c9059e58c3003aa" -"checksum libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a3bad2ed26297112847678683dd221473a0d44297250b61f004e1b35e72493" -"checksum libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f765f103b680cbed910b02bfdbdcfce5b1142899c93e51acb960bf59b6f81b1" -"checksum libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b129d20cc8cbb6ce5da8361045649c024659173e246c5dfbf20ae06071c046a" -"checksum libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70d68816b8435d6788399416eb2f0a6974fb1d15c4be5c30141f87c8e81746df" -"checksum libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "718ca645a065fd70855ca6042a7df686c24cd21add750c37a82c811fbd1e5c43" -"checksum libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbe27c623a6a720efd5d704347838972062f89149a9c3cd149748da60bdcd3e0" -"checksum libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9bc1a5d85f4812cae6367b49a432763fe28997bac7c530dc55b70ec18a78aa7" -"checksum libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe5a858342a1cc89464474f7edc4bae1da649b9c823a3e04d9fb494493601746" -"checksum libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc6b5185c50a52a12e7bbe2ee7799059e24de4e52ab25edbfd26c8ab8515d317" -"checksum libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7905c1431ad115bee83405770629a27d6f17153ad02ec9670a7347998ef20e22" -"checksum libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc17626763ded57da8fed73187c2d9f6ebb89d30838673c430315bf560c7e4db" -"checksum libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2409d08b809ab1a74269597f7da2829d117cc11b9ed3343af33fc20831619726" -"checksum libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258cdc6742945c8f6402997bbbf36733588e2db18e5a0014da6d46e3ccfb92cf" -"checksum libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b5691e2ba2720d42bd1e93d6b90239fa9235c1956ef6a5f1dd499a7ae2767be" -"checksum libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ab0b9ca050105fd94229c48911c0c84aef4d6b86a53d1b6df81d938354e47e" -"checksum libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" -"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" -"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" @@ -3535,40 +3673,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" +"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d" -"checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" -"checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" +"checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f50392d1265092fbee9273414cc40eb6d47d307bd66222c477bb8450c8504f9d" -"checksum paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a3cd512fe3a55e8933b2dcad913e365639db86d512e4004c3084b86864d9467a" +"checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" +"checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" +"checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66" +"checksum proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0c1dd4172a1e1f96f709341418f49b11ea6c2d95d53dca08c0f74cbd332d9cf3" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" @@ -3581,122 +3719,125 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" -"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" -"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" +"checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" -"checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" -"checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4070f3906e65249228094cf97b04a90799fba04468190bbbcfa812309cf86e32" +"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" -"checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" -"checksum serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6eabf4b5914e88e24eea240bb7c9f9a2cbc1bbbe8d961d381975ec3c6b806c" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" +"checksum serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "101b495b109a3e3ca8c4cbe44cf62391527cdfb6ba15821c5ce80bcd5ea23f9f" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" -"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a3edad410e603184d656e2abded5fd4d3d6e93d5763d21130dbaf99795db74eb" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1635afd059cbfac7d5b1274f0c44cec110c1e013c48e8bbc22e07e52696cf887" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" +"checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b4cfac95805274c6afdb12d8f770fa2d27c045953e7b630a81801953699a9a" -"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" "checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5388a470627f97a01a6e13389ced797a42b1611f9de7e0f6ca705675ac55297" +"checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" -"checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" +"checksum tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" +"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" -"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" +"checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" -"checksum tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" +"checksum tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" +"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" +"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" -"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +"checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" -"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" +"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" -"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" -"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" -"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" -"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" -"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" -"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" -"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" -"checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" -"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" -"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" +"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" +"checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" +"checksum web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" -"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/node-template/runtime/wasm/Cargo.toml b/node-template/runtime/wasm/Cargo.toml index 8b3dcf52ea087151492cb9f23a0a360ae45a16ca..2b89c6e4db807296e0bb58655f0587ccfbb5f34c 100644 --- a/node-template/runtime/wasm/Cargo.toml +++ b/node-template/runtime/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template-runtime-wasm" -version = "1.0.0" +version = "2.0.0" authors = ["Anonymous"] edition = "2018" diff --git a/node-template/runtime/wasm/build.sh b/node-template/runtime/wasm/build.sh index 0be6e7a11c75464ce42a8ad0ddb8a7ccd8d630fc..566e5de35d8c8628e2b0018f235b6f898d0c63e6 100755 --- a/node-template/runtime/wasm/build.sh +++ b/node-template/runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -$CARGO_CMD build --target=wasm32-unknown-unknown --release +CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release $@ for i in node_template_runtime_wasm do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm diff --git a/node-template/scripts/build.sh b/node-template/scripts/build.sh index edbcba835c13c8fed43400cab2e5a24be04a21b2..01d0fee3549461f5f2f36be54fc38dc5c64011f7 100755 --- a/node-template/scripts/build.sh +++ b/node-template/scripts/build.sh @@ -2,7 +2,7 @@ set -e -PROJECT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +PROJECT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null && pwd )" export CARGO_INCREMENTAL=0 diff --git a/node-template/src/cli.rs b/node-template/src/cli.rs index 258d2194a66c682d2c917bd8855a2ddf075826d4..cd148f3462dce8cac7ffa981d37439967954ba3c 100644 --- a/node-template/src/cli.rs +++ b/node-template/src/cli.rs @@ -17,7 +17,7 @@ pub fn run(args: I, exit: E, version: VersionInfo) -> error::Result<()> { parse_and_execute::( load_spec, &version, "substrate-node", args, exit, - |exit, _custom_args, config| { + |exit, _cli_args, _custom_args, config| { info!("{}", version.name); info!(" version {}", config.full_version()); info!(" by {}, 2017, 2018", version.author); @@ -61,8 +61,8 @@ fn run_until_exit( { let (exit_send, exit) = exit_future::signal(); - let executor = runtime.executor(); - informant::start(&service, exit.clone(), executor.clone()); + let informant = informant::build(&service); + runtime.executor().spawn(exit.until(informant).map(|_| ())); let _ = runtime.block_on(e.into_exit()); exit_send.fire(); diff --git a/node-template/src/error.rs b/node-template/src/error.rs deleted file mode 100644 index a8aa94bf3285f928b79468ed5317a28eeaa8b635..0000000000000000000000000000000000000000 --- a/node-template/src/error.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Initialization errors. - -use client; - -error_chain! { - foreign_links { - Io(::std::io::Error) #[doc="IO error"]; - Cli(::clap::Error) #[doc="CLI error"]; - } - links { - Client(client::error::Error, client::error::ErrorKind) #[doc="Client error"]; - } -} diff --git a/node-template/src/main.rs b/node-template/src/main.rs index 53845ddd087b84ddb8bf654caeee7f9e44e13855..5418453a022cac246e767dbda5c031b9b201836c 100644 --- a/node-template/src/main.rs +++ b/node-template/src/main.rs @@ -9,7 +9,7 @@ mod cli; pub use substrate_cli::{VersionInfo, IntoExit, error}; -fn run() -> cli::error::Result<()> { +fn main() { let version = VersionInfo { name: "Substrate Node", commit: env!("VERGEN_SHA_SHORT"), @@ -19,7 +19,9 @@ fn run() -> cli::error::Result<()> { description: "Template Node", support_url: "support.anonymous.an", }; - cli::run(::std::env::args(), cli::Exit, version) -} -error_chain::quick_main!(run); + if let Err(e) = cli::run(::std::env::args(), cli::Exit, version) { + eprintln!("Error starting the node: {}\n\n{:?}", e, e); + std::process::exit(1) + } +} diff --git a/node-template/src/service.rs b/node-template/src/service.rs index 239f02f33da3fde1741d17f284c9307a3897b477..25e7db8dec34d6ca6605c0bb26bd2bdc21fabe8e 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -10,10 +10,12 @@ use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, FullClient, LightClient, LightBackend, FullExecutor, LightExecutor, TaskExecutor, + error::{Error as ServiceError}, }; use basic_authorship::ProposerFactory; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; -use substrate_client as client; +use futures::prelude::*; +use substrate_client::{self as client, LongestChain}; use primitives::{ed25519::Pair, Pair as PairT}; use inherents::InherentDataProviders; use network::construct_simple_protocol; @@ -45,10 +47,18 @@ construct_service_factory! { RuntimeApi = RuntimeApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, RuntimeDispatch = Executor, - FullTransactionPoolApi = transaction_pool::ChainApi, FullExecutor, Block, RuntimeApi>, Block> - { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, - LightTransactionPoolApi = transaction_pool::ChainApi, LightExecutor, Block, RuntimeApi>, Block> - { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, + FullTransactionPoolApi = transaction_pool::ChainApi< + client::Client, FullExecutor, Block, RuntimeApi>, + Block + > { + |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + }, + LightTransactionPoolApi = transaction_pool::ChainApi< + client::Client, LightExecutor, Block, RuntimeApi>, + Block + > { + |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + }, Genesis = GenesisConfig, Configuration = NodeConfig, FullService = FullComponents @@ -62,20 +72,22 @@ construct_service_factory! { let proposer = Arc::new(ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - inherents_pool: service.inherents_pool(), }); let client = service.client(); - executor.spawn(start_aura( + let select_chain = service.select_chain() + .ok_or_else(|| ServiceError::SelectChainRequired)?; + let aura = start_aura( SlotDuration::get_or_compute(&*client)?, key.clone(), client.clone(), + select_chain, client, proposer, service.network(), - service.on_exit(), service.config.custom.inherent_data_providers.clone(), service.config.force_authoring, - )?); + )?; + executor.spawn(aura.select(service.on_exit()).then(|_| Ok(()))); } Ok(service) @@ -86,11 +98,13 @@ construct_service_factory! { FullImportQueue = AuraImportQueue< Self::Block, > - { |config: &mut FactoryFullConfiguration , client: Arc>| { + { |config: &mut FactoryFullConfiguration , client: Arc>, _select_chain: Self::SelectChain| { import_queue::<_, _, _, Pair>( SlotDuration::get_or_compute(&*client)?, client.clone(), None, + None, + None, client, NothingExtra, config.custom.inherent_data_providers.clone(), @@ -105,11 +119,22 @@ construct_service_factory! { SlotDuration::get_or_compute(&*client)?, client.clone(), None, + None, + None, client, NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) } }, + SelectChain = LongestChain, Self::Block> + { |config: &FactoryFullConfiguration, client: Arc>| { + #[allow(deprecated)] + Ok(LongestChain::new(client.backend().clone())) + } + }, + FinalityProofProvider = { |_client: Arc>| { + Ok(None) + }}, } } diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index a26d8f3ae879889ade59c331be4a3080467d33be..24234fd271e0223cac31bfef46990367b2751b66 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-cli" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." build = "build.rs" @@ -19,7 +19,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" inherents = { package = "substrate-inherents", path = "../../core/inherents" } node-runtime = { path = "../runtime" } node-primitives = { path = "../primitives" } -hex-literal = "0.1" +hex-literal = "0.2" substrate-basic-authorship = { path = "../../core/basic-authorship" } substrate-service = { path = "../../core/service" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } @@ -30,8 +30,16 @@ sr-primitives = { path = "../../core/sr-primitives" } node-executor = { path = "../executor" } substrate-keystore = { path = "../../core/keystore" } substrate-telemetry = { package = "substrate-telemetry", path = "../../core/telemetry" } +structopt = "0.2" +transaction-factory = { path = "../../test-utils/transaction-factory" } +keyring = { package = "substrate-keyring", path = "../../core/keyring" } +indices = { package = "srml-indices", path = "../../srml/indices" } +timestamp = { package = "srml-timestamp", path = "../../srml/timestamp", default-features = false } +rand = "0.6" +finality_tracker = { package = "srml-finality-tracker", path = "../../srml/finality-tracker", default-features = false } [dev-dependencies] +consensus-common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } service-test = { package = "substrate-service-test", path = "../../core/service/test" } [build-dependencies] diff --git a/node/cli/res/emberic-elm.json b/node/cli/res/emberic-elm.json deleted file mode 100644 index 84b537744b2b48d258a08b1c362479736c6211f9..0000000000000000000000000000000000000000 --- a/node/cli/res/emberic-elm.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "name": "Emberic Elm", - "id": "emberic-elm", - "properties": { - "tokenDecimals": 15, - "tokenSymbol": "EAN" - }, - "bootNodes": [ - "/ip4/104.211.54.233/tcp/30333/p2p/QmWxNqJeKEBWjJXeX8s882ZdphuVPgUV43THfGAJn7UBWB", - "/ip4/104.211.48.51/tcp/30333/p2p/QmXd7MQAuXkQK1r3ejSbaXKgjXmT2FvbJ3yNfLZpsQ2t8S", - "/ip4/104.211.48.247/tcp/30333/p2p/QmV2zjgFRfxbgYZQC9qFr4aHsQt7tDBJRAdgqqxqTq1Kta", - "/ip4/40.114.120.164/tcp/30333/p2p/QmQbPCeurXuKhzCw6Ar6ovizNKATMTnkkqFJKgZzbF2MJs" - ], - "telemetryEndpoints": [ - ["wss://telemetry.polkadot.io/submit/", 0] - ], - "protocolId": null, - "consensusEngine": null, - "genesis": { - "raw": { - "0x5ed99fb359fb6799d57fe4ff8cae9d05": "0x00", - "0xb9b861cab4bbce870c811515bd5f33d7": "0x00", - "0x927154b0e6cda82b9a0b44e489a8a9ae": "0x1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f44", - "0x6e45a8645fa8f905c49fecfef3d06c67": "0x01000000", - "0x0e0cdac0d4de97c54f3ae216b003fa81": "0x5802000000000000", - "0x24b2518f9a9ee24ab0b62346d83d90b0": "0x11080000", - "0xf4039aa8ae697861be900c58239e96f7": "0x0010a5d4e80000000000000000000000", - "0x799192c17c5cc562d709af11ace92e6a": "0x00040000", - "0x579ab55d37b1220812be3c3df29d4858": "0x0000000000000000", - "0x9a407c6bb9914a308de7006093089b76": "0x0f0000c16ff286230f0000c16ff2862300", - "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", - "0xb7b6ec0f25eb1ed8b91d05f697d7a874": "0x0c00000000000000", - "0x24586f4898a5a637b755b658ec163d00": "0x00407a10f35a00000000000000000000", - "0x3a617574683a03000000": "0xf54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf077", - "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0x0000c16ff28623000000000000000000", - "0x90e2849b965314409e8bc00011f3004f": "0x04000000", - "0xabe32953315ab8fe7b2b925eba5f4c80": "0x00e40b54020000000000000000000000", - "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x102a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678f06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5ceacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267f0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19", - "0x3b7d32346a3315a351084927a27d06a7": "0x0010a5d4e80000000000000000000000", - "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", - "0x125dc846383907f5846f72ce53ca0e4b": "0x00ca9a3b000000000000000000000000", - "0x0e4944cfd98d6f4cc374d16f5a4e3f9c": "0x0000000000000000", - "0x22bc8c154e4b317f5495a906caaf444e": "0x00", - "0x934302c5ec4cb4f73a395e2184ab0aa6": "0x00e40b54020000000000000000000000", - "0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000", - "0x3a6772616e6470613a617574683a6c656e": "0x04000000", - "0xb6d5bfd5d8d92f0f212a8c22535c9214": "0x0000c16ff28623000000000000000000", - "0xeed97a85a4f02a96fae3fc6210ec53f6": "0x0c000001fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e", - "0x27b3872d47181b4a2dc15f0da43e7026": "0xe803000000000000", - "0xfc2dc4b8bb0b9ca8f01a73a726f7c7f5": "0x00e1000000000000", - "0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000", - "0xc81a21733684a8047e9d810d78a8b9db": "0x0f0000c16ff286230f0000c16ff2862300", - "0x74d5dca6735bab024bc25136daaab7c0": "0x06", - "0x637414312dac3b280120bf15b4f66cee": "0x00000000", - "0xf718f07ec955fb94f1b3069713461089": "0x0010a5d4e80000000000000000000000", - "0x37c05deaa240e0691daf4dea41c3b5c3": "0x0c0001fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e0172b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c", - "0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000", - "0xdd9b01f8462dc19488279cb351a6d861": "0x20a10700", - "0x23df389ad0a7bab6ab6b2a35f0f02952": "0x0c00012254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e1700", - "0x78152ea7013ebe91392b425506c10074": "0x00", - "0x62f532424b7b1c52f522857315040f27": "0x00407a10f35a00000000000000000000", - "0xd437fe93b0bd0a5d67d30d85d010edc2": "0x40420f00", - "0xe532791382a63a9bd48f2bc7fba9907d": "0xe29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed", - "0x93940e78496482b15b64783020bbdfa0": "0x6400000000000000", - "0x7e6064dc0e78ffebb59b3053826a9467": "0x10f0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19eacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267f06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5c2a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678", - "0xf29d830d1e349e75cb09cc309ff99cae": "0x00", - "0x59b17352bea17cb7dec6dde697de7db4": "0x6400000000000000", - "0x90d5871cf3f4d0a3642cf2043a7d8eda": "0x0010a5d4e80000000000000000000000", - "0x717a2ee9c64ad3424e10e4461ec08296": "0x000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000000010010000000", - "0xd7ec675c9803761fed320c891f024816": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0x982a35fc0ccb86c71c5868d1ab9a8f24": "0xf54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf077", - "0xd94712e4e93059160b019777f1d514c8": "0xf06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5c", - "0x8366297e853b97a38cca0f62019a717b": "0x00000000000000000000000000000000", - "0x6049593ee984e2e3142d968450c2499b": "0x0f0000c16ff286230f0000c16ff2862300", - "0x472b8f236d06a2ff7f1e9b2e848ef1d5": "0x0080e03779c311000000000000000000", - "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", - "0x6de9a38a396b5f99e5c455561e72b48e": "0xe19b6b89729a41638e57dead9c993425287d386fa4963306b63f018732843495", - "0xdeb7eb5c65480ddd073a5bfafed0754f": "0x60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a07430f0000c16ff286230f0000c16ff2862300", - "0xb12f6ccdb8b9fdf64c98783becc0b82e": "0x72b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c0f0000c16ff286230f0000c16ff2862300", - "0x64873b9e6ab89b1f892a7a42d405d8ad": "0xf0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19", - "0x3a617574683a02000000": "0x1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f44", - "0x7935e46f94f24b82716c0142e2271de9": "0x8070000000000000", - "0x677198f01757ddfcb0e33c9de27bdcce": "0x0c000160779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743012254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e17", - "0x730e605a7019f66c4bc5df70178f2bb2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0xb8f48a8c01f629d6dc877f64892bed49": "0x0000000000000000", - "0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000", - "0xfbb77d814ac81cfe0ef7030e8bd686f0": "0xe803000000000000", - "0x52c9048efbfc40fd1e312b7bed451dee": "0x06000000", - "0xa62601bb840b2ee9ae90cbc8aefa0d01": "0x60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743", - "0x3a617574683a00000000": "0xe29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed", - "0xdee5bbb035d9ebc2c9338b5aedf744d7": "0x4038000000000000", - "0x3a617574683a6c656e": "0x04000000", - "0xde7e6f7637ad906002e911eae3e49f75": "0x0f0000c16ff286230f0000c16ff2862300", - "0xa36baa0f89eff09b2facf282f27a11ba": "0x50c30000", - "0xd543ad6ee4446bf5bcf48867fe340f36": "0xfe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e0f0000c16ff286230f0000c16ff2862300", - "0x2ec6e5652282d579398fb8fdfa531ef6": "0x0000000000000000", - "0x0c5cbeca89340ea96c6f8fe1442df463": "0x0010a5d4e80000000000000000000000", - "0xf541ffd8c90d7124a5298d6c1e2c0d40": "0x0300000000000000", - "0x7c1f36e9b2a83a7f2b42d97ec0f18d9c": "0x14c224ccba63292331623bbf06a55f46607824c2580071a80a17c53cab2f999e2f72b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e17fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743", - "0x2b89d3b6f46fc8a3aee48c9cb06d7670": "0x0010a5d4e80000000000000000000000", - "0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000", - "0x1b4b2c8255b431edbbb5a4f5c7dcde69": "0x0010a5d4e80000000000000000000000", - "0xb5195c66899fef96507f9d63b7bb38d4": "0x0000a0dec5adc9353600000000000000", - "0x50a63a871aced22e88ee6466fe5aa5d9": "0xc224ccba63292331623bbf06a55f46607824c2580071a80a17c53cab2f999e2f", - "0x3a6772616e6470613a617574683a02000000": "0x1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f440100000000000000", - "0xd9c94b41dc87728ebf0a966d2e9ad9c0": "0x3200000000000000", - "0xd2f07efec1d302ff1a26581135e0298f": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0xeb0e8ce72fcdefef3a57c7f513a8472b": "0x2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e170f0000c16ff286230f0000c16ff2862300", - "0x0a48d3d36ccd781f6e9e46530a158883": "0x0000c16ff28623000000000000000000", - "0xa8faca54f39771f71efa0e9f698ae52e": "0x0000c16ff28623000000000000000000", - "0xea711aaf3497563884c33630127d71ff": "0x0000c16ff28623000000000000000000", - "0x4a8b1a5c7681353a6a320553abbbca49": "0x4038000000000000", - "0x3a6772616e6470613a617574683a03000000": "0xf54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf0770100000000000000", - "0xbb6e9b5b6b8700aea3b8b4eba8b75803": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0x99e2aba8a2b7c8ccba2d740fb86adb0c": "0x00", - "0x3a617574683a01000000": "0xe19b6b89729a41638e57dead9c993425287d386fa4963306b63f018732843495", - "0x2efe65fb3e5579a8af5f464dc3da63d8": "0xeacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267", - "0x3a636f6465": "0x0061736d0100000001ba022a60037f7f7f017f60037f7f7f0060047f7f7f7f0060027f7f0060017f0060067f7f7f7f7f7f0060027f7f017f60057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60047f7f7f7f017f60047f7f7e7f017f60077f7f7f7f7f7f7f017f60017e0060017f017f60000060057f7f7f7f7f0060037f7e7f0060087f7f7e7e7f7f7f7f0060087f7f7f7f7f7e7e7f0060087f7f7f7f7f7f7f7f0060057f7f7f7e7e0060047f7f7e7e0060097f7f7f7e7e7f7f7f7f0060047f7f7f7f017e60017f017e60027e7f0060037f7e7e0060057f7e7f7f7e0060037f7f7e0060047f7e7e7e0060027e7e0060027f7e0060067f7f7e7e7e7f0060037e7f7f0060077f7e7e7e7e7e7e0060057f7f7e7e7f0060037e7f7f017f60027f7f017e60057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f0002d3051b03656e760e6578745f626c616b65325f323536000103656e760c6578745f74776f785f313238000103656e76146578745f6765745f73746f726167655f696e746f000703656e760f6578745f7365745f73746f72616765000203656e76166578745f73616e64626f785f6d656d6f72795f6e6577000603656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000403656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000403656e76116578745f636c6561725f73746f72616765000303656e760e6578745f7072696e745f75746638000303656e76126578745f737232353531395f766572696679000a03656e76126578745f656432353531395f766572696679000a03656e76106578745f73746f726167655f726f6f74000403656e76186578745f73746f726167655f6368616e6765735f726f6f74000b03656e76166578745f6b696c6c5f6368696c645f73746f72616765000303656e76166578745f73616e64626f785f6d656d6f72795f676574000a03656e76166578745f73616e64626f785f6d656d6f72795f736574000a03656e760d6578745f7072696e745f686578000303656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e761a6578745f6765745f6368696c645f73746f726167655f696e746f000c03656e76176578745f636c6561725f6368696c645f73746f72616765000203656e76156578745f7365745f6368696c645f73746f72616765000503656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000203656e760d6578745f7072696e745f6e756d000d03656e760a6578745f6d616c6c6f63000e03656e76086578745f66726565000403bd03bb03010104000e030f1001110303060303030304010f120106040313011403030303040415160f041702030304030306030e010101030101100101010303010303030303030303030303000202020202020202020202020202020202020202180e03010f030103040104040404020319060104040d04011a0303031b1c03030d03030e101d031604030303030401031e0303041f20032003030304030303030403030404040303030303030e0303030f01030216030603210322030303030403040f040304231e04031b010404041b04030303160416162403161f01040605020f040304040303030303030303030302060625080601020103030201032626030301060626260f2603010303032626260303032626262626262603262603030303030303040404030404040404040125030303010e0304040403010503030301010404040404040303010604040403011d03030e0402000f030303060303030303040403040303030303030103031603040101040404040404040404040404040404040403030303030303030d01040404040403010306010601030301010401030304030e04000e000f0604000606190a06060600000000272728282904070170019001900105030100120619037f01418080c0000b7f0041f0c0c4000b7f0041f0c0c4000b07be0415066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010a5f5f646174615f656e6403020c436f72655f76657273696f6e00960212436f72655f657865637574655f626c6f636b00970215436f72655f696e697469616c697a655f626c6f636b009d0210436f72655f617574686f726974696573009e02114d657461646174615f6d6574616461746100a0021c426c6f636b4275696c6465725f6170706c795f65787472696e73696300a6021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00a70220426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300a8021c426c6f636b4275696c6465725f636865636b5f696e686572656e747300ac0218426c6f636b4275696c6465725f72616e646f6d5f7365656400ad022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e00ae02214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657200af02214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e676500b002204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500b1021e4772616e6470614170695f6772616e6470615f617574686f72697469657300b20215417572614170695f736c6f745f6475726174696f6e00b4021a417574686f7269746965734170695f617574686f72697469657300b502098c02010041010b8f0127b1036465666768696a6b6c6d6e6f707172737475767778ce01f601af038a029b02e3028d0289029c02ca03cb03f402cc03c303ab03d402d802d302d50240f70130d90237ac03fe01e9019d038003ff01bf01be01dc0184028302820281028002c002d202e002830382038103ff02fe028903ea0285038a03d901db018c038d03c502c602c402840185018301e502e602e4028e03e601e801e0018f03db02dc02da029003fb02fd02fa029103bc01bd01bb019203fc01fd01fa019303be02bf02bd029403a903aa03a8039503b801c202c302c1029603de02df02dd029703980399039a039b03d002d102cf029c03a303a203a103a0039f039e03c403c503c603c703c8030ad5c532bb03c404020d7f017e230041c0006b22032400200128020022042001280208220541047422066a2107200128020421080240024002400240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d0340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b013020012d0000220e41ac01460d022003410c6a41026a220f200b2d00003a0000200320032f01303b010c200141046a2902002110200341306a410c6a2001410c6a280200360200200920032f010c3b0000200941026a200f2d00003a00002003200e3a003020032010370234200341206a200341306a2002101c2003200c2900003703102003200d29000037001720032d0020220e411a470d052006200a41106a220a470d000c040b0b200422012007470d010c020b200141106a22012007460d010b03400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a22012007470d000b0b02402008450d002004101d0b2000411a3a00000c010b200020032903103700012000200e3a0000200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d002001417c6a280200101d0b200141106a2101200a41106a2007470d000b0b2008450d002004101d200341c0006a24000f0b200341c0006a24000bd0ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a28020020042006101e2205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a28020020042006101e2205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd702200728020020042008101e2209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd802200528020020042008101e2206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a28020020042006101e2205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda02200728020020042008101e2209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb02200728020020042008101e2209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc02200728020020042008101e2209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a28020020042006101e2205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde02200728020020042008101e2209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a28020020042006101e2205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de002200528020020042009101e2206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a28020020042006101e2205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de202200728020020062005101e2208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a28020020042006101e2205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de402200728020020042008101e2209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de502200528020020042009101e2206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a28020020042006101e2205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a28020020042006101e2205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a28020020042006101e2205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b28020020042006101e2208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea02200728020020062005101e2208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a28020020042006101e2205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a28020020042006101e2205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a28020020042006101e2205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a28020020042006101e2205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a28020020042006101e2205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df002200728020020062005101e2208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df102200528020020042009101e2206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a28020020042006101e2205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df302200728020020062005101e2208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a28020020042006101e2205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a28020020042006101e2205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a28020020042006101e2205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a28020020042006101e2205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a28020020042006101e2205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a28020020042006101e2205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc02200728020020042008101e2209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a28020020042006101e2205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe02200728020020042008101e2209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a28020020042006101e2205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a28020020042006101e2205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a28020020042006101e2205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a28020020042006101e2205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a28020020042006101e2205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a28020020042006101e2205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a28020020042006101e2205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a28020020042006101e2205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a28020020042006101e2205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a28020020042006101e2205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a28020020042006101e2205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a28020020042006101e2205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a28020020042006101e2205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c03200728020020042008101e2209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d03200728020020042008101e2209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a28020020042006101e2205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a28020020042006101e2205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a28020020042006101e2205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d9103200728020020042008101e2209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d9203200728020020042008101e2209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a28020020042006101e2205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a28020020042006101e2205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a28020020042006101e2205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a28020020042006101e2205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a28020020042006101e2205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a28020020042006101e2205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a28020020042006101e2205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a28020020042006101e2205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b03200728020020042008101e2209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a28020020042006101e2205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a28020020042006101e2205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a28020020042006101e2205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a28020020042006101e2205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a28020020042006101e2205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a28020020042006101e2205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a28020020042006101e2205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da303200528020020042009101e2206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a28020020042006101e2205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a28020020042006101e2205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a28020020042006101e2205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a28020020042006101e2205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a28020020042006101e2205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a28020020042006101e2205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a28020020042006101e2205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab03200728020020062005101e2208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac03200728020020042008101e2209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a28020020042006101e2205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a28020020042006101e2205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a28020020042006101e2205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a28020020042006101e2205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a28020020042006101e2205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a28020020042006101e2205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a28020020042006101e2205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a28020020042006101e2205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a28020020042006101e2205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a28020020042006101e2205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a28020020042006101e2205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a28020020042006101e2205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a28020020042006101e2205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a28020020042006101e2205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a28020020042006101e2205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a28020020042006101e2205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a28020020042006101e2205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a28020020042006101e2205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a28020020042006101e2205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a28020020042006101e2205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a28020020042006101e2205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a28020020042006101e2205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a28020020042006101e2205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a28020020042006101e2205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a28020020042006101e2205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a28020020042006101e2205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a28020020042006101e2205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a28020020042006101e2205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a28020020042006101e2205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca03200728020020042008101e2209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a28020020042008101e2205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc03200528020020042009101e2206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a28020020042006101e2205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a28020020042006101e2205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a28020020042006101e2205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a28020020042006101e2205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a28020020042006101e2205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a28020020042006101e2205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a28020020042006101e2205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a28020020042006101e2205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a28020020042006101e2205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a28020020042006101e2205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a28020020042006101e2205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a28020020042006101e2205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a28020020042006101e2205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a28020020042006101e2205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a28020020042006101e2205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a28020020042006101e2205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a28020020042006101e2205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a28020020042006101e2205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a28020020042006101e2205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de003200728020020042008101e2209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de103200728020020042008101e2209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a28020020042006101e2205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a28020020042006101e2205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a28020020042006101e2205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de503200528020020042009101e2206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a28020020042006101e2205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a28020020042006101e2205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a28020020042006101e2205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de903200728020020042008101e2209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a28020020042006101e2205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a28020020042006101e2205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a28020020042006101e2205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a28020020042006101e2205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a28020020042006101e2205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a28020020042006101e2205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a28020020042006101e2205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a28020020042006101e2205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df203200728020020062005101e2208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a28020020042006101e2205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a28020020042006101e2205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df503200728020020042008101e2209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a28020020042006101e2205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a28020020042006101e2205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df803200728020020042008101e2209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df903200728020020042008101e2209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a28020020042006101e2205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb03200928020020052001101e2206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc03200728020020042008101e2209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a28020020042006101e2205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe03200728020020042008101e2209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff03200728020020062005101e2208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a28020020042006101e2205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d8104200728020020062005101e2208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a28020020042006101e2205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006101f22050db4050b200641011020000b2008101f22090dad050b200841011020000b2008101f22060da9050b200841011020000b2006101f22050da5050b200641011020000b2008101f22090da1050b200841011020000b2008101f22090d9a050b200841011020000b2008101f22090d96050b200841011020000b2006101f22050d92050b200641011020000b2008101f22090d8e050b200841011020000b2006101f22050d8a050b200641011020000b2009101f22060d86050b200941011020000b2006101f22050d82050b200641011020000b2005101f22080dfe040b200541011020000b2006101f22050dfa040b200641011020000b2008101f22090df6040b200841011020000b2009101f22060df2040b200941011020000b2006101f22050dee040b200641011020000b2006101f22050dea040b200641011020000b2006101f22050de6040b200641011020000b2006101f22080de2040b200641011020000b2005101f22080dde040b200541011020000b2006101f22050dda040b200641011020000b2006101f22050dd6040b200641011020000b2006101f22050dd2040b200641011020000b2006101f22050dce040b200641011020000b2006101f22050dca040b200641011020000b2005101f22080dc6040b200541011020000b2009101f22060dc2040b200941011020000b2006101f22050dbe040b200641011020000b2005101f22080dba040b200541011020000b2006101f22050db6040b200641011020000b2006101f22050db2040b200641011020000b2006101f22050dae040b200641011020000b2006101f22050daa040b200641011020000b2006101f22050da6040b200641011020000b2006101f22050da2040b200641011020000b2006101f22050dee040b200641011020000b2008101f22090d9c040b200841011020000b2006101f22050d98040b200641011020000b2008101f22090d94040b200841011020000b2006101f22050d90040b200641011020000b2006101f22050d8c040b200641011020000b2006101f22050d88040b200641011020000b2006101f22050d84040b200641011020000b2006101f22050d80040b200641011020000b2006101f22050dfc030b200641011020000b2006101f22050df8030b200641011020000b2006101f22050df4030b200641011020000b2006101f22050df0030b200641011020000b2006101f22050dec030b200641011020000b2006101f22050de8030b200641011020000b2006101f22050de4030b200641011020000b2006101f22050de0030b200641011020000b2008101f22090ddc030b200841011020000b2008101f22090dd8030b200841011020000b2006101f22050dd4030b200641011020000b2006101f22050dd0030b200641011020000b2006101f22050dcc030b200641011020000b2008101f22090dc8030b200841011020000b2008101f22090dc4030b200841011020000b2006101f22050dc0030b200641011020000b2006101f22050dbc030b200641011020000b2006101f22050db8030b200641011020000b2006101f22050db4030b200641011020000b2006101f22050db0030b200641011020000b2006101f22050dac030b200641011020000b2006101f22050da8030b200641011020000b2006101f22050da4030b200641011020000b2008101f22090da0030b200841011020000b2006101f22050d9c030b200641011020000b2006101f22050d98030b200641011020000b2006101f22050d94030b200641011020000b2006101f22050d90030b200641011020000b2006101f22050d8c030b200641011020000b2006101f22050d88030b200641011020000b2006101f22050d84030b200641011020000b2009101f22060d80030b200941011020000b2006101f22050dfc020b200641011020000b2006101f22050df8020b200641011020000b2006101f22050df4020b200641011020000b2006101f22050df0020b200641011020000b2006101f22050dec020b200641011020000b2006101f22050de8020b200641011020000b2006101f22050de4020b200641011020000b2005101f22080de0020b200541011020000b2008101f22090ddc020b200841011020000b2006101f22050dd8020b200641011020000b2006101f22050dd3020b200641011020000b2006101f22050dcf020b200641011020000b2006101f22050dcb020b200641011020000b2006101f22050dc7020b200641011020000b2006101f22050dc3020b200641011020000b2006101f22050dbf020b200641011020000b2006101f22050dbb020b200641011020000b2006101f22050db7020b200641011020000b2006101f22050db3020b200641011020000b2006101f22050daf020b200641011020000b2006101f22050dab020b200641011020000b2006101f22050da7020b200641011020000b2006101f22050da3020b200641011020000b2006101f22050d9f020b200641011020000b2006101f22050d9b020b200641011020000b2006101f22050d97020b200641011020000b2006101f22050d93020b200641011020000b2006101f22050d8f020b200641011020000b2006101f22050d8b020b200641011020000b2006101f22050d87020b200641011020000b2006101f22050d83020b200641011020000b2006101f22050dff010b200641011020000b2006101f22050dfb010b200641011020000b2006101f22050df7010b200641011020000b2006101f22050df3010b200641011020000b2006101f22050def010b200641011020000b2006101f22050deb010b200641011020000b2006101f22050de7010b200641011020000b2008101f22090de3010b200841011020000b2008101f22050ddf010b200841011020000b2009101f22060ddb010b200941011020000b2006101f22050dd7010b200641011020000b2006101f22050dd3010b200641011020000b2006101f22050dcf010b200641011020000b2006101f22050dcb010b200641011020000b2006101f22050dc7010b200641011020000b2006101f22050dc3010b200641011020000b2006101f22050dbf010b200641011020000b2006101f22050dbb010b200641011020000b2006101f22050db7010b200641011020000b2006101f22050db3010b200641011020000b2006101f22050daf010b200641011020000b2006101f22050dab010b200641011020000b2006101f22050da7010b200641011020000b2006101f22050da3010b200641011020000b2006101f22050d9f010b200641011020000b2006101f22050d9b010b200641011020000b2006101f22050d97010b200641011020000b2006101f22050d93010b200641011020000b2006101f22050d8f010b200641011020000b2008101f22090d8b010b200841011020000b2008101f22090d87010b200841011020000b2006101f22050d83010b200641011020000b2006101f22050d7f0b200641011020000b2006101f22050d7b0b200641011020000b2009101f22060d770b200941011020000b2006101f22050d730b200641011020000b2006101f22050d6f0b200641011020000b2006101f22050d6b0b200641011020000b2008101f22090d670b200841011020000b2006101f22050d630b200641011020000b2006101f22050d5f0b200641011020000b2006101f22050d5b0b200641011020000b2006101f22050d570b200641011020000b2006101f22050d530b200641011020000b2006101f22050d4f0b200641011020000b2006101f22050d4b0b200641011020000b2006101f22050d470b200641011020000b2005101f22080d430b200541011020000b2006101f22050d3f0b200641011020000b2006101f22050d3b0b200641011020000b2008101f22090d370b200841011020000b2006101f22050d330b200641011020000b2006101f22050d2f0b200641011020000b2008101f22090d2b0b200841011020000b2008101f22090d270b200841011020000b2006101f22050d230b200641011020000b2001101f22060d1f0b200141011020000b2008101f22090d1b0b200841011020000b2006101f22050d170b200641011020000b2008101f22090d130b200841011020000b2005101f22080d0f0b200541011020000b2006101f22050d0b0b200641011020000b2005101f22080d070b200541011020000b2006101f22050d030b200641011020000b1021000b1021000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d41011020000b200941011020000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210220240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008101e22050d020c060b200928020021050c020b2008101f2205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d101d0b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d101d200341106a24000f0b200841011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a0000200320062002102320032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a2002102420032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a280200101d200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d41011020000b200941011020000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b200941011020000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007101e22080d020c050b200b28020021080c020b2007101f2208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b28020020042006101e2205450d020c040b200b28020021050c040b2006101f22050d020b200641011020000b200741011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009101e22060d020c070b200728020021060c020b2009101f2206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b1021000b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009101e22050d020c070b200728020021050c020b2009101f2205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b1021000b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200341106a24000b0700200010be030b0b0020002001200210bf030b0700200010bd030b0e0041ddafc200412210bc0300000b0a0041f8b0c400102c000bce0301067f2004410c6a2105200441086a2106200441046a210702400240024003400240024002400240200628020020052802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120072802002008200a101e22090d020c070b200728020021090c020b200a101f2209450d050b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b024020022003460d002004410c6a2105200441086a21060340200241046a210a2002280200210103400240024002400240200628020020052802002208470d00200841016a22092008490d0720084101742202200920092002491b22024100480d072008450d01200441046a28020020082002101e22090d020c080b200441046a28020021090c020b2002101f2209450d060b20062002360200200441046a2009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b200a2102200a2003470d000b0b2000411a3a00000f0b1021000b200241011020000b200a41011020000be30301077f200141c000712103200141ff00712104024002400240024002400240200141077522050d002003450d010b02402005417f470d0020030d010b2002410c6a2104200241086a2106200241046a21070340200521030240024002400240200628020020042802002205470d00200541016a22082005490d0620054101742209200820082009491b22094100480d062005450d01200728020020052009101e22080d020c070b200728020021080c020b2009101f2208450d050b2006200936020020072008360200200428020021050b2004200541016a360200200820056a200141807f723a0000200341c00071210802400240200341077522050d002008450d010b200321012005417f470d01200321012008450d010b0b200341ff007121040b024002400240200241086a2802002002410c6a2802002205470d00200541016a22032005490d0320054101742201200320032001491b22014100480d032005450d01200241046a28020020052001101e2203450d020c050b200241046a28020021030c050b2001101f22030d030b200141011020000b1021000b200941011020000b200241086a2001360200200241046a20033602002002410c6a28020021050b2002410c6a200541016a360200200320056a20043a00002000411a3a00000be60301047f2001a7220341c000712104200341ff00712105024002400240024002400240200142078722014200520d002004450d010b02402001427f520d0020040d010b03400240024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d0620044101742206200520052006491b22064100480d062004450d01200241046a28020020042006101e22050d020c070b200241046a28020021050c020b2006101f2205450d050b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200341807f723a00002001a7220341c00071210402400240200142078722014200520d002004450d010b2001427f520d012004450d010b0b200341ff007121050b024002400240200241086a2802002002410c6a2802002204470d00200441016a22032004490d0320044101742206200320032006491b22064100480d032004450d01200241046a28020020042006101e2203450d020c050b200241046a28020021030c050b2006101f22030d030b200641011020000b1021000b200641011020000b200241086a2006360200200241046a20033602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000bd403020a7f017e230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a2001102620022802184101460d01200220032900003703082002200429000037000f200241186a41086a2d0000210a2002200229000f37001f20022002290308370318024020072008470d00200741016a220b2007490d032005200b200b2005491b2208ad420486220c422088a70d03200ca7220b4100480d0302402007450d0020092006200b101e22090d010c050b200b101f2209450d040b200920066a220b200a3a0000200b41086a200229001f370000200b41016a2002290318370000200541026a2105200641106a2106200741016a2107200a41ff01714106470d000b20002009360204200041003602002000410c6a2007360200200041086a2008360200200241306a24000f0b2000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a280200101d0b200741106a2107200641706a22060d000b0b02402008450d002009101d0b200241306a24000f0b1021000b200b41081020000bc4bd0103087f017e037f230041e0006b22022400024020012802082203200128020c2204470d00200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d000021072001410c6a220820053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070ec001b504b50400840124b504aa01aa01aa01aa01aa01a801a501a701a101200b11aa01aa01aa01aa01aa01aa01aa01aa01a60103aa01aa01aa01aa0112189801511aaa01aa01aa0121520533069f0186016f238f019e01a40132080d8801379b01a20104013841714970548b010209441476783f8101752226778701070c252c1016920194011f96019a01a3015ba0011599015e1b5a0f9c019d011d900174720a0e42452813950119602f91018e01890129173497013a27644b5565624a7d407b2e8a0185012b8c0193011c463e2d8d016e3b1e7c5f487982012a3130363d6d5c6c80017f3583014e4f7e7366617a695d39533c674c436a4d6b5768634756505859b5040b20032005470dae01200241013a0037200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241376a3602282002200241286a360258200241386a200241c8006a1028200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cb0020b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db30220046741686a41ff017141034b0db302410d21010cb2010b200320056b41084f0da801200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10282002290318210a200041106a2002280220360200200041086a200a37020020004281808080d000370300200241e0006a24000f0b410e21070ca5010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de8012001450da70320032001490da803200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb1010b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb2010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb3010b413d21070ca1010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db00220046741686a41ff017141034b0db002410d21010cb3010b413121070c9f010b41d70021070c9e010b410021014100210903402001411f4b0db20120032005460de9012005417f460da8032003200541016a2207490da903200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dea010b410b21070ca8040b413e21070c9c010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dac0220046741686a41ff017141034b0dac02410d21010cb1010b41d80021070c9a010b41d00021070c99010b41c10021070c98010b410021014100210903402001411f4b0daf0120032005460de7012005417f460da6032003200541016a2204490da703200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b024020014120490d00410d210120076741686a41ff017141034d0de8010b20032004470dbf02200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b410021014100210903402001411f4b0daf0120032005460de8012005417f460da7032003200541016a2207490da803200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de9010b410f21070ca1040b41dc0021070c95010b413321070c94010b41cb0021070c93010b41c20021070c92010b41e50021070c91010b410021014100210903402001411f4b0daa0120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411021070c9b040b41de0021070c8f010b410021014100210903402001411f4b0da90120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411321070c99040b41ce0021070c8d010b41f90021070c8c010b41d30021070c8b010b41800121070c8a010b41c50021070c89010b410a21070c88010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d990220046741686a41ff017141034b0d9902410d21010ca3010b413921070c86010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d980220046741686a41ff017141034b0d9802410d21010ca3010b20032005470d8701200241013a0037200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241376a3602282002200241286a360258200241386a200241c8006a1028200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090c88020b413f21070c83010b413a21070c82010b41e90021070c81010b41db0021070c80010b41e40021070c7f0b41860121070c7e0b41f60021070c7d0b41c00021070c7c0b41fc0021070c7b0b41f30021070c7a0b41e00021070c790b41880121070c780b41870121070c770b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c96010b410120036b2107200441026a2101410021054100210903402005411f4b0d9701200720016a4102460dd3012001450d920320032001490d9303200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c97010b41e60021070c740b41900121070c730b41890121070c720b410120036b2107200441026a2101410021054100210903402005411f4b0d9501200720016a4102460dd1012001450d900320032001490d9103200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c95010b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c96010b419b0121070c6f0b41e80021070c6e0b41ff0021070c6d0b419d0121070c6c0b418a0121070c6b0b41fb0021070c6a0b413621070c690b41f10021070c680b410120036b2107200441026a2101410021054100210903402005411f4b0d8f01200720016a4102460dcb012001450d8a0320032001490d8b03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dff0120046741686a41ff017141034b0dff01410d21010c8f010b41d90021070c660b41a00121070c650b413221070c640b41da0021070c630b41fa0021070c620b41a70121070c610b41830121070c600b20032005470d63200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41ef0021070c5e0b41eb0021070c5d0b419f0121070c5c0b41a20121070c5b0b41920121070c5a0b41930121070c590b41a90121070c580b410021014100210903402001411f4b0d810120032005460dbd012005417f460dfc022003200541016a2207490dfd02200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dbe010b411221070ce2030b410120036b2107200441026a2101410021054100210903402005411f4b0d8101200720016a4102460dbe012001450dfd0220032001490dfe02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490def0120046741686a41ff017141034b0def01410d21010c81010b419c0121070c550b4200210a410021010340410e21072001413f4b0dff0120032005460dbe012005417f460dfd022003200541016a2209490dfe02200620056a2d0000210420082009360200200441ff0071220bad2001413f71ad86200a84210a200141076a210120092105200441187441187522094100480d000b200941c0007121052001413f4b0dee012005450dee01200a427f2001413f71ad8684210a412e21070cde030b41ec0021070c530b41a80121070c520b41a40121070c510b41aa0121070c500b41ab0121070c4f0b41cf0021070c4e0b41c90021070c4d0b418c0121070c4c0b419a0121070c4b0b41cd0021070c4a0b41820121070c490b41df0021070c480b41970121070c470b41ee0021070c460b41a60121070c450b41ea0021070c440b41ed0021070c430b41960121070c420b419e0121070c410b41a50121070c400b41990121070c3f0b41a10121070c3e0b41a30121070c3d0b418d0121070c3c0b418b0121070c3b0b41fe0021070c3a0b410120036b2107200441026a2101410021054100210903402005411f4b0d66200720016a4102460da4012001450de40220032001490de502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dd40120046741686a41ff017141034b0dd401410d21010c660b41002101410021090340410d210b2001411f4b0dc00320032005460da5012005417f460de5022003200541016a2204490de602200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a210120042105200741187441187522044100480d000b200441c0007121052001411f4b0dd4012005450dd4012009417f2001411f7174722109412d21070cc3030b20032005470d3c200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41d60021070c360b41950121070c350b41d50021070c340b413821070c330b413421070c320b413b21070c310b413521070c300b41840121070c2f0b41980121070c2e0b41f20021070c2d0b41810121070c2c0b41f00021070c2b0b41940121070c2a0b418f0121070c290b418e0121070c280b413721070c270b41850121070c260b41910121070c250b20032005470d2b200241013a0037200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241376a3602282002200241286a360258200241386a200241c8006a1028200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cae010b41f50021070c230b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbf0120046741686a41ff017141034b0dbf01410d21010c510b413c21070c210b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbe0120046741686a41ff017141034b0dbe01410d21010c510b41e30021070c1f0b41f40021070c1e0b200320056b41044f0d25200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820004281808080d000370300200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b41f70021070c1c0b41fd0021070c1b0b41e20021070c1a0b410120036b2107200441026a2101410021054100210903402005411f4b0d4c200720016a4102460d8b012001450dcc0220032001490dcd02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db80120046741686a41ff017141034b0db801410d21010c4c0b41d40021070c180b41e10021070c170b41c30021070c160b41f80021070c150b41c40021070c140b41dd0021070c130b41c60021070c120b41e70021070c110b410021014100210903402001411f4b0d4520032005460d84012005417f460dc5022003200541016a2207490dc602200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d85010b411121070c9b030b41cc0021070c0f0b41c70021070c0e0b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dad0120046741686a41ff017141034b0dad01410d21010c430b41d10021070c0c0b41d20021070c0b0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c420b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c430b41ca0021070c080b200241c8006a2001102941042109200228024822064101470d10200041013602002000200241c8006a41047222012902003702042000410c6a200141086a290200370200200241e0006a24000f0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da90120046741686a41ff017141034b0da901410d21010c420b41c80021070c050b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da80120046741686a41ff017141034b0da801410d21010c420b410021014100210903402001411f4b0d4320032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410721070c8e030b410d21070c020b410021014100210903402001411f4b0d4220032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410821070c8c030b410621070b0c89030b2000410b3a000420004101360200200041056a20073a0000200241e0006a24000f0b200441096a2101200541784f0df00220032001490df102200620056a290000210a20082001360200413021070c87030b200441026a21092005417f460df10220032009490df202200620056a2c00002101200820093602004100210b20014100480d7f200141017441807f71200172220141ff0171220541847e6a220941034b0da101024020090e0400f301f101f201000b4103210b410421070c88030b200441026a21012005417f460df20220032001490df302200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21012005417f460df30220032001490df402200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21092005417f460df40220032009490df502200620056a2c00002101200820093602004100210b20014100480d8001200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f301f101f201000b4103210b410221070c85030b200441026a21092005417f460df50220032009490df602200620056a2c00002101200820093602004100210b20014100480d8101200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f501f301f401000b4103210b410321070c84030b200441056a21012005417c4f0df60220032001490df702200620056a280000210920082001360200412f21070c82030b200241d0006a280200210b200228024c2103200241d4006a2802002205450d81012005410274220c4102752207ad420286220a422088a70de802200aa722044100480de8022004101f2209450df70220054102742104200c417c6a210c410021050340200920056a200320056a2802003602002004200541046a2205470d000b200c41027641016a210d200b450dff020cfe020b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010c370b410f21010b0c370b410f21010c380b410f21010c390b410f21010c3a0b410f21010c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010c3c0b410f21010b0c3c0b410f21010b0c3d0b410f21010b0c3e0b410f21010b0c3e0b410f21010b0c3e0b410f21010c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010c400b410f21010c410b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241186a200241c8006a1028200228022021012002290318210a410521070c410b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10284105210b0c9a020b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b411821090b2002200229011e37010e200220022903183703080c81020b412c21074100210b0c86020b412b21074100210b0c85020b411821090b2002200229011e37010e200220022903183703080cfc010b411821090b2002200229011e37010e200220022903183703080cf9010b410021074100210d200b0dfc010cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3a2001417f460db8012003200141016a2207490db901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3b0b200bad210a412821070cfe010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3b2001417f460db9012003200141016a2207490dba01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3c0b200bad210a412721070cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3c2001417f460dba012003200141016a2207490dbb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3d0b200bad210a411621070cfc010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3d2001417f460dbb012003200141016a2207490dbc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3e0b200bad210a411821070cfb010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3e2001417f460dbc012003200141016a2207490dbd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3f0b200bad210a412121070cfa010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3f2001417f460dbd012003200141016a2207490dbe01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d400b200bad210a412221070cf9010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d402001417f460dbe012003200141016a2207490dbf01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d410b200bad210a411421070cf8010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d412001417f460dbf012003200141016a2207490dc001200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d420b200bad210a411c21070cf7010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d422001417f460dc0012003200141016a2207490dc101200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b41202107024020054120490d00410d210120046741686a41ff01714104490d430b200bad210a0cf6010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d432001417f460dc1012003200141016a2207490dc201200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d440b200bad210a411721070cf5010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d442001417f460dc2012003200141016a2207490dc301200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d450b200bad210a412421070cf4010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d452001417f460dc3012003200141016a2207490dc401200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d460b200bad210a412921070cf3010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d462001417f460dc4012003200141016a2207490dc501200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d470b200bad210a412a21070cf2010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411521070cf1010b200141c000490d0e2005450d0e200b41ff00470d0f0c110b2001417f6a2101410021054100210b03402005411f4b0d2220032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411b21070cef010b20014120490d102005450d102004417f7341ff00716741686a41ff01714105490dea010c110b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411a21070ced010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d482001417f460dc6012003200141016a2207490dc701200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d490b200bad210a412321070cec010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d492001417f460dc7012003200141016a2207490dc801200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4a0b200bad210a411d21070ceb010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4a2001417f460dc8012003200141016a2207490dc901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4b0b200bad210a412521070cea010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4b2001417f460dc9012003200141016a2207490dca01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4c0b200bad210a411e21070ce9010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4c2001417f460dca012003200141016a2207490dcb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4d0b200bad210a411921070ce8010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4d2001417f460dcb012003200141016a2207490dcc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4e0b200bad210a412621070ce7010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4e2001417f460dcc012003200141016a2207490dcd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4f0b200bad210a411f21070ce6010b41062109200541c001470de0014104210b410421070ce6010b41062109200541c001470dde014104210b410221070ce5010b41062109200541c001470ddc014104210b410321070ce4010b200441016a21012004417f460dd90120032001490dda01200620046a2d00002105200820013602002005450d54200041163a000420004101360200200041056a20053a0000200241e0006a24000f0b200141c000490d022009450d020b0b200020022f00083b0005200020073a000420004101360200200041106a2001360200200041086a200a370200200041076a2002410a6a2d00003a0000200241e0006a24000f0b412e21070cdd010b200441ff01716741686a41ff017141044b0d0020014120490d002005450dd9010b412d21070cdc010b410f21010c170b410f21010c180b410f21010c190b410f21010c1a0b410f21010c1b0b410f21010c1c0b410f21010c1d0b410f21010c1e0b410f21010c1f0b410f21010c200b410f21010c210b410f21010c220b410f21010c230b410f21010c240b410f21010c250b410f21010c260b410f21010c270b410f21010c280b410f21010c290b410f21010c2a0b410f21010c2b0b410f21010c2c0b410f21010c2d0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b4101210b0b410421070c96010b4102210b410421070c95010b4101210b0b410221070c93010b4102210b410221070c92010b4101210b0b410321070c90010b4102210b410321070c8f010b410c21074100210b0c8e010b417f2005102a000b20052003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b1021000b20052001102a000b20012003102b000b417f2009102a000b20092003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2009102a000b20092003102b000b417f2009102a000b20092003102b000b20052001102a000b20012003102b000b200441041020000b417f2001102a000b20012003102b000b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b2000200b36020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b2003101d0b024020022d004c4105470d002006450d00200241d4006a280200450d00200241d0006a280200101d0b0240024002402007200d470d002007210d0c010b2007200d490d010240200d450d0020092007410274200d4102742205101e22090d01200541041020000b4100210d02402007450d002009101d0b410421090b410021052001410c6a210b200141086a210c410021070240024002400240024003402005411f4b0d01200c2802002206200b2802002203460d02200341016a21042003417f460d0420062004490d05200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d210120036741686a41ff01714104490d030b2007ad422086200dad84210a410921070c070b410f21010c010b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200d41ffffffff0371450d062009101d200241e0006a24000f0b417f2004102a000b20042006102b000b41b8cfc200102c000b0b0b20004100360200200041106a200a3703002000410c6a2009360200200041096a200b3a0000200041086a20073a00000b200241e0006a24000b6b000240024020002d000022004101460d0020004102470d01200128021841f1aac200410b2001411c6a28020028020c1100000f0b200128021841e4aac200410d2001411c6a28020028020c1100000f0b200128021841d8aac200410c2001411c6a28020028020c1100000b800301067f230041306b22022400200128020021030240024002400240024002400240200128020422044103742205450d00200341046a2106410021070340200628020020076a2107200641086a2106200541786a22050d000b200141146a280200450d010c020b41002107200141146a2802000d010b200721060c010b2004450d02024002402007410f4b0d002003280204450d010b200720076a220620074f0d010b4101210541002106200241086a21070c010b2006417f4c0d02200241086a210702402006450d002006101f22050d01200641011020000b41012105410021060b200241003602102002200636020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a290200370300200220012902003703180240200241146a41a0b1c400200241186a10c1030d0020002007290200370200200041086a200741086a280200360200200241306a24000f0b10c203000b4190b1c40041004100104b000b102e000bbb07030d7f017e017f230041c0006b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0920072009490d0a200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d032001410c6a2107200141086a210a4100210b4104210c4100210d0340200d220e41016a210d410021034100210403402003411f4b0d07200a280200220520072802002208460d08200841016a21092008417f460d0c20052009490d0d200128020020086a2d0000210820072009360200200841ff00712003411f71742004722104200341076a21032008418001710d000b024020034120490d0020086741686a41ff01714104490d090b0240200b200e470d00200b4101742203200b41016a220820082003491b2203ad420286220f422088a70d0e200fa722084100480d0e02400240200b450d00200c200b4102742008101e220c0d010c110b2008101f220c450d100b2003210b0b20044108762110200c200e4102746a2004360200200d2006490d000c050b0b410f21030c010b200241013a000f2002413c6a4101360200200241013602142002420137022c20024190afc40036022820022002410f6a3602102002200241106a360238200241186a200241286a1028410521030b200241086a2208200241186a41086a280200360200200220022902183703002000200336020420004101360200200041086a2002290300370200200041106a20082802003602000c0c0b4104210c4100210b4100210d0b2000200c360204200041003602002000410c6a200d360200200041086a200b360200200241c0006a24000f0b410f21030c080b200241013a00002002413c6a4101360200200241013602142002420137022c20024190afc400360228200220023602102002200241106a360238200241186a200241286a102820022802202104200228021c21092002280218210841002110410521030c070b410d21030c060b417f2009102a000b20092007102b000b417f2009102a000b20092005102b000b1021000b200841041020000b20004101360200200041106a20043602002000410c6a2009360200200041086a200836020020002010410874200372360204200b450d00200c101d200241c0006a24000f0b200241c0006a24000b7001017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c20024198b2c4003602082002200241046a360228200220023602202002200241206a360218200241086a41a8b2c40010cf01000b7001017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241f8b1c4003602082002200241046a360228200220023602202002200241206a360218200241086a4188b2c40010cf01000b6902017f037e230041306b22012400200029020821022000290210210320002902002104200141146a410036020020012004370318200141f8b3c200360210200142013702042001200141186a36020020012003370328200120023703202001200141206a10cf01000bd0ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a28020020042006101e2205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a28020020042006101e2205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd702200728020020042008101e2209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd802200528020020042008101e2206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a28020020042006101e2205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda02200728020020042008101e2209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb02200728020020042008101e2209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc02200728020020042008101e2209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a28020020042006101e2205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde02200728020020042008101e2209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a28020020042006101e2205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de002200528020020042009101e2206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a28020020042006101e2205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de202200728020020062005101e2208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a28020020042006101e2205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de402200728020020042008101e2209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de502200528020020042009101e2206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a28020020042006101e2205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a28020020042006101e2205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a28020020042006101e2205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b28020020042006101e2208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea02200728020020062005101e2208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a28020020042006101e2205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a28020020042006101e2205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a28020020042006101e2205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a28020020042006101e2205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a28020020042006101e2205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df002200728020020062005101e2208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df102200528020020042009101e2206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a28020020042006101e2205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df302200728020020062005101e2208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a28020020042006101e2205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a28020020042006101e2205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a28020020042006101e2205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a28020020042006101e2205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a28020020042006101e2205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a28020020042006101e2205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc02200728020020042008101e2209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a28020020042006101e2205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe02200728020020042008101e2209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a28020020042006101e2205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a28020020042006101e2205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a28020020042006101e2205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a28020020042006101e2205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a28020020042006101e2205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a28020020042006101e2205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a28020020042006101e2205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a28020020042006101e2205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a28020020042006101e2205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a28020020042006101e2205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a28020020042006101e2205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a28020020042006101e2205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a28020020042006101e2205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c03200728020020042008101e2209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d03200728020020042008101e2209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a28020020042006101e2205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a28020020042006101e2205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a28020020042006101e2205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d9103200728020020042008101e2209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d9203200728020020042008101e2209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a28020020042006101e2205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a28020020042006101e2205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a28020020042006101e2205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a28020020042006101e2205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a28020020042006101e2205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a28020020042006101e2205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a28020020042006101e2205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a28020020042006101e2205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b03200728020020042008101e2209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a28020020042006101e2205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a28020020042006101e2205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a28020020042006101e2205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a28020020042006101e2205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a28020020042006101e2205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a28020020042006101e2205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a28020020042006101e2205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da303200528020020042009101e2206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a28020020042006101e2205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a28020020042006101e2205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a28020020042006101e2205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a28020020042006101e2205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a28020020042006101e2205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a28020020042006101e2205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a28020020042006101e2205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab03200728020020062005101e2208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac03200728020020042008101e2209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a28020020042006101e2205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a28020020042006101e2205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a28020020042006101e2205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a28020020042006101e2205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a28020020042006101e2205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a28020020042006101e2205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a28020020042006101e2205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a28020020042006101e2205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a28020020042006101e2205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a28020020042006101e2205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a28020020042006101e2205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a28020020042006101e2205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a28020020042006101e2205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a28020020042006101e2205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a28020020042006101e2205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a28020020042006101e2205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a28020020042006101e2205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a28020020042006101e2205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a28020020042006101e2205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a28020020042006101e2205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a28020020042006101e2205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a28020020042006101e2205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a28020020042006101e2205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a28020020042006101e2205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a28020020042006101e2205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a28020020042006101e2205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a28020020042006101e2205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a28020020042006101e2205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a28020020042006101e2205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca03200728020020042008101e2209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a28020020042008101e2205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc03200528020020042009101e2206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a28020020042006101e2205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a28020020042006101e2205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a28020020042006101e2205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a28020020042006101e2205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a28020020042006101e2205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a28020020042006101e2205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a28020020042006101e2205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a28020020042006101e2205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a28020020042006101e2205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a28020020042006101e2205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a28020020042006101e2205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a28020020042006101e2205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a28020020042006101e2205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a28020020042006101e2205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a28020020042006101e2205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a28020020042006101e2205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a28020020042006101e2205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a28020020042006101e2205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a28020020042006101e2205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de003200728020020042008101e2209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de103200728020020042008101e2209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a28020020042006101e2205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a28020020042006101e2205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a28020020042006101e2205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de503200528020020042009101e2206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a28020020042006101e2205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a28020020042006101e2205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a28020020042006101e2205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de903200728020020042008101e2209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a28020020042006101e2205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a28020020042006101e2205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a28020020042006101e2205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a28020020042006101e2205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a28020020042006101e2205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a28020020042006101e2205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a28020020042006101e2205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a28020020042006101e2205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df203200728020020062005101e2208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a28020020042006101e2205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a28020020042006101e2205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df503200728020020042008101e2209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a28020020042006101e2205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a28020020042006101e2205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df803200728020020042008101e2209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df903200728020020042008101e2209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a28020020042006101e2205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb03200928020020052001101e2206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc03200728020020042008101e2209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a28020020042006101e2205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe03200728020020042008101e2209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff03200728020020062005101e2208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a28020020042006101e2205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d8104200728020020062005101e2208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a28020020042006101e2205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006101f22050db4050b200641011020000b2008101f22090dad050b200841011020000b2008101f22060da9050b200841011020000b2006101f22050da5050b200641011020000b2008101f22090da1050b200841011020000b2008101f22090d9a050b200841011020000b2008101f22090d96050b200841011020000b2006101f22050d92050b200641011020000b2008101f22090d8e050b200841011020000b2006101f22050d8a050b200641011020000b2009101f22060d86050b200941011020000b2006101f22050d82050b200641011020000b2005101f22080dfe040b200541011020000b2006101f22050dfa040b200641011020000b2008101f22090df6040b200841011020000b2009101f22060df2040b200941011020000b2006101f22050dee040b200641011020000b2006101f22050dea040b200641011020000b2006101f22050de6040b200641011020000b2006101f22080de2040b200641011020000b2005101f22080dde040b200541011020000b2006101f22050dda040b200641011020000b2006101f22050dd6040b200641011020000b2006101f22050dd2040b200641011020000b2006101f22050dce040b200641011020000b2006101f22050dca040b200641011020000b2005101f22080dc6040b200541011020000b2009101f22060dc2040b200941011020000b2006101f22050dbe040b200641011020000b2005101f22080dba040b200541011020000b2006101f22050db6040b200641011020000b2006101f22050db2040b200641011020000b2006101f22050dae040b200641011020000b2006101f22050daa040b200641011020000b2006101f22050da6040b200641011020000b2006101f22050da2040b200641011020000b2006101f22050dee040b200641011020000b2008101f22090d9c040b200841011020000b2006101f22050d98040b200641011020000b2008101f22090d94040b200841011020000b2006101f22050d90040b200641011020000b2006101f22050d8c040b200641011020000b2006101f22050d88040b200641011020000b2006101f22050d84040b200641011020000b2006101f22050d80040b200641011020000b2006101f22050dfc030b200641011020000b2006101f22050df8030b200641011020000b2006101f22050df4030b200641011020000b2006101f22050df0030b200641011020000b2006101f22050dec030b200641011020000b2006101f22050de8030b200641011020000b2006101f22050de4030b200641011020000b2006101f22050de0030b200641011020000b2008101f22090ddc030b200841011020000b2008101f22090dd8030b200841011020000b2006101f22050dd4030b200641011020000b2006101f22050dd0030b200641011020000b2006101f22050dcc030b200641011020000b2008101f22090dc8030b200841011020000b2008101f22090dc4030b200841011020000b2006101f22050dc0030b200641011020000b2006101f22050dbc030b200641011020000b2006101f22050db8030b200641011020000b2006101f22050db4030b200641011020000b2006101f22050db0030b200641011020000b2006101f22050dac030b200641011020000b2006101f22050da8030b200641011020000b2006101f22050da4030b200641011020000b2008101f22090da0030b200841011020000b2006101f22050d9c030b200641011020000b2006101f22050d98030b200641011020000b2006101f22050d94030b200641011020000b2006101f22050d90030b200641011020000b2006101f22050d8c030b200641011020000b2006101f22050d88030b200641011020000b2006101f22050d84030b200641011020000b2009101f22060d80030b200941011020000b2006101f22050dfc020b200641011020000b2006101f22050df8020b200641011020000b2006101f22050df4020b200641011020000b2006101f22050df0020b200641011020000b2006101f22050dec020b200641011020000b2006101f22050de8020b200641011020000b2006101f22050de4020b200641011020000b2005101f22080de0020b200541011020000b2008101f22090ddc020b200841011020000b2006101f22050dd8020b200641011020000b2006101f22050dd3020b200641011020000b2006101f22050dcf020b200641011020000b2006101f22050dcb020b200641011020000b2006101f22050dc7020b200641011020000b2006101f22050dc3020b200641011020000b2006101f22050dbf020b200641011020000b2006101f22050dbb020b200641011020000b2006101f22050db7020b200641011020000b2006101f22050db3020b200641011020000b2006101f22050daf020b200641011020000b2006101f22050dab020b200641011020000b2006101f22050da7020b200641011020000b2006101f22050da3020b200641011020000b2006101f22050d9f020b200641011020000b2006101f22050d9b020b200641011020000b2006101f22050d97020b200641011020000b2006101f22050d93020b200641011020000b2006101f22050d8f020b200641011020000b2006101f22050d8b020b200641011020000b2006101f22050d87020b200641011020000b2006101f22050d83020b200641011020000b2006101f22050dff010b200641011020000b2006101f22050dfb010b200641011020000b2006101f22050df7010b200641011020000b2006101f22050df3010b200641011020000b2006101f22050def010b200641011020000b2006101f22050deb010b200641011020000b2006101f22050de7010b200641011020000b2008101f22090de3010b200841011020000b2008101f22050ddf010b200841011020000b2009101f22060ddb010b200941011020000b2006101f22050dd7010b200641011020000b2006101f22050dd3010b200641011020000b2006101f22050dcf010b200641011020000b2006101f22050dcb010b200641011020000b2006101f22050dc7010b200641011020000b2006101f22050dc3010b200641011020000b2006101f22050dbf010b200641011020000b2006101f22050dbb010b200641011020000b2006101f22050db7010b200641011020000b2006101f22050db3010b200641011020000b2006101f22050daf010b200641011020000b2006101f22050dab010b200641011020000b2006101f22050da7010b200641011020000b2006101f22050da3010b200641011020000b2006101f22050d9f010b200641011020000b2006101f22050d9b010b200641011020000b2006101f22050d97010b200641011020000b2006101f22050d93010b200641011020000b2006101f22050d8f010b200641011020000b2008101f22090d8b010b200841011020000b2008101f22090d87010b200841011020000b2006101f22050d83010b200641011020000b2006101f22050d7f0b200641011020000b2006101f22050d7b0b200641011020000b2009101f22060d770b200941011020000b2006101f22050d730b200641011020000b2006101f22050d6f0b200641011020000b2006101f22050d6b0b200641011020000b2008101f22090d670b200841011020000b2006101f22050d630b200641011020000b2006101f22050d5f0b200641011020000b2006101f22050d5b0b200641011020000b2006101f22050d570b200641011020000b2006101f22050d530b200641011020000b2006101f22050d4f0b200641011020000b2006101f22050d4b0b200641011020000b2006101f22050d470b200641011020000b2005101f22080d430b200541011020000b2006101f22050d3f0b200641011020000b2006101f22050d3b0b200641011020000b2008101f22090d370b200841011020000b2006101f22050d330b200641011020000b2006101f22050d2f0b200641011020000b2008101f22090d2b0b200841011020000b2008101f22090d270b200841011020000b2006101f22050d230b200641011020000b2001101f22060d1f0b200141011020000b2008101f22090d1b0b200841011020000b2006101f22050d170b200641011020000b2008101f22090d130b200841011020000b2005101f22080d0f0b200541011020000b2006101f22050d0b0b200641011020000b2005101f22080d070b200541011020000b2006101f22050d030b200641011020000b1021000b1021000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d41011020000b200941011020000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210220240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008101e22050d020c060b200928020021050c020b2008101f2205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d101d0b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d101d200341106a24000f0b200841011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a0000200320062002102320032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a2002102420032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a280200101d200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d41011020000b200941011020000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b200941011020000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007101e22080d020c050b200b28020021080c020b2007101f2208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b28020020042006101e2205450d020c040b200b28020021050c040b2006101f22050d020b200641011020000b200741011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009101e22060d020c070b200728020021060c020b2009101f2206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b1021000b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009101e22050d020c070b200728020021050c020b2009101f2205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b1021000b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200341106a24000b05001021000b912503027f027e087f230041d00b6b2208240002402001280224200128024022092802a001470d00200041013a0000200041086a4124360200200041046a419e81c000360200200841d00b6a24000f0b200442002004290308220a20094198016a2903007d220b200b200a56200b507222091b37030802402009450d00200041013a0000200041086a412a360200200041046a41c281c000360200200841d00b6a24000f0b200841d8026a41186a22094200370300200841d8026a41106a220c4200370300200841d8026a41086a220d4200370300200842003703d80220062007200841d8026a1000200841f8006a41186a2009290300370300200841f8006a41106a200c290300370300200841f8006a41086a200d290300370300200820082903d8023703780240024002400240024002404120101f2209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c000101e2209450d0120092008290378370020200941386a200841f8006a41186a290300370000200941306a200841f8006a41106a290300370000200941286a200841f8006a41086a290300370000200941c000418001101e2209450d022009200141cc006a220e290000370040200941d8006a200e41186a290000370000200941d0006a200e41106a290000370000200941c8006a200e41086a290000370000200841d8026a41186a220c4200370300200841d8026a41106a220d4200370300200841d8026a41086a220f4200370300200842003703d802200941e000200841d8026a1000200841086a41186a200c290300370300200841086a41106a200d290300370300200841086a41086a200f290300370300200820082903d8023703082009101d200841d8026a2001410c6a2210200841086a1030024020082d00d8024101470d00200041013a0000200041086a4117360200200041046a41ec81c000360200200841d00b6a24000f0b2008413c6a4184d0c200360200200841286a41086a2209420037030020082010360238200841f0c0c10036022c2008410036022820084188026a41186a200541186a29000037030020084188026a41106a200541106a29000037030020084188026a41086a200541086a2900003703002008200529000037038802417f210c2008417f360228200841f8006a41186a200841086a41186a290300370300200841f8006a41106a200841086a41106a290300370300200841f8006a41086a200841086a41086a29030037030020082008290308370378418009101f220f450d03200841286a4104722111200f41003b0106200f4100360200200f41086a200841d8026a41f80810ce031a200941003602002008200f36022c200f2f010622124105742113410021090240024002400240034020132009460d01200841f8006a200f20096a41086a412010d003220d450d03200941206a2109200c41016a210c200d41004e0d000c020b0b2012210c0b200841a8026a41186a200841f8006a41186a290300370300200841a8026a41106a200841f8006a41106a290300370300200841a8026a41086a200841f8006a41086a290300370300200820082903783703a802200841346a21094100450d010c060b200c41016a210c200841346a210941010d050b200841f8006a411c6a200841a8026a41086a2903003702002008419c016a200841a8026a41106a290300370200200841a4016a200841a8026a41186a29030037020020082009360288012008200c3602840120082011360280012008200f36027c20084100360278200820082903a80237028c01200841d8026a411c6a4200370200200841d8026a41106a200841c8026a41086a290300370300200841fd026a200829004037000020084185036a200841c0006a41086a2900003700002008418d036a200841c0006a41106a29000037000020084195036a200841c0006a41186a2900003700002008419c036a200841df006a280000360000200842003703d802200841023a00fc02200841f0c0c1003602f002200820082903c8023703e002200841f8006a200841d8026a103121090c050b412041011020000b41c00041011020000b41800141011020000b41800941081020000b200841f0026a4200370300200841ec026a41f0c0c100360200200841003602f802200841003602e802200842003703e002200841f0c0c1003602dc02200841003602d802200f200c41c8006c6a41e8026a2109200841d8026a10320b200941013a0024200941256a2008290388023700002009412d6a20084188026a41086a290300370000200941356a20084188026a41106a2903003700002009413d6a20084188026a41186a2903003700002008200828022841016a360228200841a8026a41106a2209200841286a41106a290300370300200841a8026a41086a220c200841286a41086a290300370300200820082903283703a802200841f8006a41186a220d200841086a41186a290300370300200841f8006a41106a220f200841086a41106a290300370300200841f8006a41086a2213200841086a41086a29030037030020082008290308370378200841c0006a200841f8006a103320082802482111200829024c210b200841ac036a2013290300370200200841b4036a200f290300370200200841bc036a200d290300370200200841ec026a200c290300370200200841f4026a20092903003702002008200b3702dc02200820113602d802200820082903783702a403200820082903a8023702e402200141246a2802002109200141c0006a290200210b2001280248210c20084190036a420037030020084188036a428080808080013703002008200c3602a0032008200b3703980320084208370380032008200941016a3602fc02200820044101200e200841086a20022003200841d8026a103402400240024020082802002209450d0020082802042101200041013a0000200041086a2001360200200041046a200936020020082802d80222090d010c020b200841f8006a2005200141c8006a28020028020010350240024020082802784101470d00200041046a200829027c370200200041013a00000c010b200841a8026a41186a220920084194016a280200360200200841a8026a41106a220c2008418c016a290200370300200841a8026a41086a220d20084184016a2902003703002008200829027c3703a802200841c0006a41106a200d290300370300200841c0006a41186a200c290300370300200841e0006a2009280200360200200841063602442008419289c000360240200820082903a802370348200141c4006a280200210c200841d8016a41186a200141e4006a290000370300200841d8016a41106a200141dc006a290000370300200841d8016a41086a200141d4006a2900003703002008200129004c3703d801200841c8026a41086a22094200370300200842003703c802418390c100410d200841c8026a1001200841f8016a41086a220d2009290300370300200820082903c8023703f8014200210b02400240024002400240200841f8016a411041f8b3c200410041001002417f460d00200842003703a802200841f8016a4110200841a8026a41084100100241016a41084d0d0120082903a802210b0b20094200370300200842003703c80241fbb8c0004111200841c8026a1001200d2009290300370300200820082903c8023703f80102400240200841f8016a411041f8b3c200410041001002417f460d00200841c0026a4200370300200841a8026a41106a4200370300200841b0026a4200370300200842003703a802200841f8016a4110200841a8026a4120410010022209417f460d032009411f4d0d0320084188026a41186a200841a8026a41186a29030037030020084188026a41106a200841a8026a41106a29030037030020084188026a41086a200841a8026a41086a290300370300200820082903a802370388020c010b200841a0026a420037030020084198026a420037030020084190026a420037030020084200370388020b2008419c016a200841d8016a41086a290300370200200841a4016a200841d8016a41106a290300370200200841ac016a200841d8016a41186a290300370200200841bc016a20084188026a41086a290300370200200841c4016a20084188026a41106a290300370200200841cc016a20084188026a41186a29030037020020082002370378200820082903d801370294012008200b3703880120082008290388023702b40120082003370380012008200841d8026a36029001200841003602b002200842013703a802200841e8006a200c200841c0006a200841f8006a20062007200841a8026a2004103602400240200828026822094101460d0020094102470d01200041046a200829026c370200200041013a0000200841d8006a280200450d06200841d4006a280200101d20082802d80222090d070c080b200841e8006a41086a280200450d00200828026c101d0b200841f8006a41186a200141cc006a220941186a290000370300200841f8006a41106a200941106a290000370300200841f8006a41086a200941086a290000370300200841a8026a41086a200841086a41086a290300370300200841a8026a41106a200841086a41106a290300370300200841a8026a41186a200841086a41186a29030037030020082009290000370378200820082903083703a802024002400240024020084188036a280200220920084184036a280200470d00200941016a220c2009490d062009410174220d200c200c200d491b220dad42d8007e220b422088a70d06200ba722054100480d062009450d0120084180036a280200200941d8006c2005101e220c0d020c070b20084180036a280200210c0c020b2005101f220c450d050b20084184036a200d36020020084180036a200c36020020084188036a28020021090b200c200941d8006c6a22092008290378370001200941013a0000200920082903a8023700212009200829008802370041200941096a200841f8006a41086a220c290300370000200941116a200841f8006a41106a290300370000200941196a200841f8006a41186a290300370000200941296a200841a8026a41086a220d290300370000200941316a200841a8026a41106a290300370000200941396a200841a8026a41186a290300370000200941d0006a20084197026a290000370000200941c9006a20084188026a41086a29000037000020084188036a2209200928020041016a2205360200200c200841e4026a220941086a290200370300200d20084184016a280200360200200820092902003703782008200829027c3703a80220084194036a280200210d20084190036a280200210f2008418c036a280200210920084184036a280200210420084180036a280200210c0240200841c0006a41186a280200450d00200841d4006a280200101d0b024020082802d8022213450d0020082802dc02450d002013101d0b200841f8006a41086a2213200841a8026a41086a280200360200200820082903a802370378200841d8026a41086a2013280200360200200820082903783703d8022010200841d8026a10372008200c200541d8006c6a3602e4022008200c3602e002200820043602dc022008200c3602d802200141286a200841d8026a103820082009200d4107746a3602e402200820093602e0022008200f3602dc02200820093602d802200141346a200841d8026a1039200041003a0000200041196a200841206a290300370000200041116a200841186a290300370000200041096a200841086a41086a29030037000020002008290308370001200841d00b6a24000f0b41df88c0004133103a000b41df88c0004133103a000b1021000b200541081020000b20082802d8022209450d010b20082802dc02450d002009101d0b200841d8026a41186a280200210d200841e8026a280200210902400240200841d8026a41146a2802002200450d002000210c2009210103402001280280092101200c417f6a220c0d000b0340200920092f01064102746a4180096a28020021092000417f6a22000d000c020b0b200921010b20084194016a20092f0106360200200841f8006a41186a4100360200200841f8006a41146a20093602002008200d36029801200841003602880120084200370380012008200136027c20084100360278200841f8006a103b024020084188036a2802002201450d00200841d8026a41286a2802002109200141d8006c21010340024020092d00004105490d00200941286a280200450d00200941246a280200101d0b200941d8006a2109200141a87f6a22010d000b0b024020084184036a280200450d0020084180036a280200101d0b024020084194036a2802002209450d00200941077421012008418c036a28020041206a210903402009103c20094180016a2109200141807f6a22010d000b0b024020084190036a280200450d002008418c036a280200101d0b200841d00b6a24000bec0301097f230041c0006b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a280200210602400240024003402004280200220841086a210920082f0106220741057421044100210a0240024003402004450d0120022009412010d003220b450d02200441606a2104200a41016a210a200941206a2109200b417f4a0d000b200a417f6a21070b2006450d022006417f6a2106200820074102746a4180096a21040c010b0b2008200a41c8006c6a41e8026a2204450d0020042d002422094102470d010b200020012802102002200141146a280200280210110100200128020021050c010b4100210a024020094101470d00200341386a2004413d6a290000370300200341306a200441356a290000370300200341286a2004412d6a2900003703002003200441256a2900003703204101210a0b200341186a2204200341206a41186a290300370300200341106a2209200341206a41106a290300370300200341086a220b200341206a41086a290300370300200320032903203703002000200a3a000020002003290300370001200041096a200b290300370000200041116a2009290300370000200041196a20042903003700000b20012005417f6a360200200341c0006a24000f0b103f000bd31801187f230041d00c6b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241186a41186a22062000412c6a290000370300200241186a41106a2207200041246a290000370300200241186a41086a22082000411c6a29000037030020022000290014370318200241e8016a200141c80010ce031a024020032f01062201410b4f0d00200320044105746a220041286a200041086a2209200120046b41057410cf031a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000200920022903183700002003200441c8006c6a220041b0036a200041e8026a2200200341066a22032f010020046b41c8006c10cf031a2000200241e8016a41c80010ce032100200320032f010041016a3b0100200241d00c6a240020000f0b024002400240418009101f220a450d00200a41003b0106200a4100360200200a41086a200241a8036a41f80810ce0321012002200341ca016a2d00003a00da02200220032f00c8013b01d802200220032900db013703c8022002200341e0016a2900003700cd02200341cb016a280000210b200341cf016a280000210c200341d3016a280000210d200341d7016a280000210e200241a8036a20034198066a41c80010ce031a2001200341e8016a200341066a22062f010041796a220041057410ce032101200a41e8026a200341e0066a200041c8006c10ce032107200641063b0100200a20003b0106200220022d00da023a00c602200220022f01d8023b01c402200220022903c8023703b002200220022900cd023700b502200241e0026a200241a8036a41c80010ce031a02400240200441064b0d00200341086a20044105746a220141206a2001200341066a22002f010020046b41057410cf031a200141186a200241186a41186a290300370000200141106a200241186a41106a290300370000200141086a200241186a41086a29030037000020012002290318370000200341e8026a200441c8006c6a220f41c8006a200f20002f010020046b41c8006c10cf031a200f200241e8016a41c80010ce031a0c010b200120044105746a41c07e6a2001200441796a22064105746a2201200041ffff037120066b41057410cf031a200141186a200241186a41186a290300370000200141106a200241186a41106a290300370000200141086a200241186a41086a290300370000200120022903183700002007200441c8006c6a220041d07c6a200041887c6a220f200a41066a22002f010020066b41c8006c10cf031a200f200241e8016a41c80010ce031a0b200241d0016a41026a220420022d00c6023a0000200020002f010041016a3b0100200220022f01c4023b01d001200220022903b002370360200220022900b502370065200241f0006a200241e0026a41c80010ce031a200241146a41026a221020042d00003a0000200220022f01d0013b01142002200229036037030020022002290065370005200241186a200241f0006a41c80010ce031a02400240024020032802002207450d0020032f010421110340200241e4016a41026a221620102d00003a0000200220022f01143b01e401200220022903003703d001200220022900053700d501200241e8016a200241186a41c80010ce031a201141ffff0371210620072f01062203410a4d0d0241b009101f2201450d03200141003b010620014100360200200141086a200241a8036a41a80910ce0321002002200741ca016a2d00003a00da02200220072f00c8013b01d802200220072900db013703c8022002200741e0016a2900003700cd02200741cb016a2800002112200741cf016a2800002115200741d3016a2800002114200741d7016a2800002113200241a8036a20074198066a41c80010ce031a2000200741e8016a200741066a22092f0100220441796a220341057410ce032117200141e8026a200741e0066a200341c8006c10ce03211820014180096a2007419c096a2004417a6a220841027410ce032119200941063b0100200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241e0026a200241a8036a41c80010ce031a200220022d00da023a00c602200220022f01d8023b01c402200220022903c8023703b002200220022900cd023700b502200241dc026a41026a220820022d00c6023a0000200220022f01c4023b01dc02200220022903b002370360200220022900b502370065200241a8036a200241e0026a41c80010ce031a02400240201141ffff0371220041064b0d00200741086a2203200641016a22044105746a200320064105746a220320092f0100221120066b221941057410cf031a2003200e36000f2003200d36000b2003200c3600072003200b360003200341026a20162d00003a0000200320022f01e4013b0000200320022903d001370013200341186a20022900d501370000200741e8026a200641c8006c6a220341c8006a2003201941c8006c10cf031a2003200241e8016a41c80010ce031a2009201141016a22033b010020074180096a2211200641027422196a41086a201120044102746a2211200341ffff037120046b41027410cf031a2011200a360200200020092f010022044f0d01200720196a4184096a2103034020032802002200200641016a22063b010420002007360200200341046a210320042006470d000c020b0b20172006417a6a22044105746a2017200641796a22034105746a2200200141066a22092f010020036b41057410cf031a200041186a20022900d5013700002000200e36000f2000200d36000b2000200c3600072000200b360003200041026a20162d00003a0000200020022f01e4013b0000200020022903d0013700132018200641c8006c6a220041d07c6a200041887c6a220020092f010020036b41c8006c10cf031a2000200241e8016a41c80010ce031a200920092f010041016a22003b01002019200641027422116a416c6a201920044102746a2209200041ffff0371220620046b41027410cf031a2009200a360200200420064b0d00200120116a41e8086a2100034020002802002204200341016a22033b010420042001360200200041046a210020062003470d000b0b200241cc016a41026a220320082d00003a0000200220022f01dc023b01cc01200220022903603703b801200220022900653700bd01200241f0006a200241a8036a41c80010ce031a201020032d00003a0000200220022f01cc013b0114200220022903b801370300200220022900bd01370005200241186a200241f0006a41c80010ce031a024020072802002203450d0020072f010421112012210b2013210e2014210d2015210c200321072001210a0c010b0b2012210b2013210e2014210d2015210c2001210a0b41b009101f2203450d03200341003b010620034100360200200341086a200241a8036a41a80910ce03210120032005280200220036028009200520033602002005200528020441016a360204200041003b010420002003360200200120032f010622044105746a220020022f01143b00002000200e36000f2000200d36000b2000200c3600072000200b36000320002002290300370013200041026a200241146a41026a2d00003a0000200041186a20022900053700002003200441c8006c6a41e8026a200241186a41c80010ce031a20034180096a200441016a22004102746a200a360200200320003b0106200a20003b0104200a20033602000c040b200741086a2200200641016a22044105746a200020064105746a2200200320066b220141057410cf031a2000200e36000f2000200d36000b2000200c3600072000200b360003200041026a200241e4016a41026a2d00003a0000200020022f01e4013b0000200020022903d001370013200041186a20022900d5013700002007200641c8006c6a220041b0036a200041e8026a2200200141c8006c10cf031a2000200241e8016a41c80010ce031a200741066a2200200341016a22033b010020074180096a220120064102746a41086a200120044102746a2201200341ffff037120046b41027410cf031a2001200a360200201141ffff037120002f010022034f0d03200a20043b0104200a200736020020042003460d032003417f6a210120072004417f6a22034102746a4188096a2100034020002802002204200341026a3b010420042007360200200041046a21002001200341016a2203470d000c040b0b41b00941081020000b41800941081020000b41b00941081020000b200241d00c6a2400200f0bd80101067f230041206b22012400200141086a200010d702024020012802082202450d00200141186a2103200141146a2104034020032802002105200428020021060240200128020c450d002002101d0b02402006450d002005450d002006101d0b200141086a200010d702200128020822020d000b0b02402000280204220641f0c0c100460d00200628020021022006101d2002450d00200228020021052002101d2005450d00024020052802002206450d0003402005101d2006210520062802002202210620020d000b0b2005101d0b200141206a24000bd30402077f017e230041306b2202240002400240024002404116101f2203450d002003410e6a41002900aaf341370000200341086a41002900a4f3413700002003410029009cf341370000200341164136101e2203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241186a41086a220142003703002002420037031820034136200241186a1001200241086a41086a200129030037030020022002290318370308024002400240024002400240200241086a411041f8b3c200410041001002417f460d002002421037021c2002200241086a3602182002200241186a10d5012002280200450d0520022802042201417f4c0d082001450d01200110792204450d09200241206a2205200528020022052001410020022802182206200228021c2207200420012005100222052005417f461b2205200520014b1b22086a220536020020082001460d020c040b200041003602080c020b4101210420022802182206200228021c220741014100200241206a280200220510021a41002001470d020b20024200370328200241186a41086a410020062007200241286a41082005100222062006417f461b2206410820064108491b20056a360200200641074d0d012004450d0220022903282109200041106a20013602002000200136020c20002004360208200020093703000b2003101d200241306a24000f0b2001450d002004101d0b41df88c0004133103a000b411641011020000b413641011020000b102e000b200141011020000bbe0d030c7f067e0a7f23004180016b22082400024002400240024002400240200728020c22094100480d00200941ffffffff07460d002007410c6a210a2007410c6a200941016a220b360200200741146a280200210c200741106a220d210e410021090340024002400240024002400240024020090e020001010b200e280200221041086a211120102f0106220f410574210941002112024002400240024003402009450d0120042011412010d0032213450d02200941606a2109201241016a2112201141206a21112013417f4a0d000b2012417f6a210f0b200c450d01200c417f6a210c2010200f4102746a4180096a210e410021090c090b201041e8026a201241c8006c6a2209450d002009280200450d00200941106a2903002114200941086a29030021150c010b200841286a2007411c6a2802002004200741206a280200280214110100200841306a2903002114200728020c210b200829032821150b2007410c6a200b417f6a360200200141186a29030021162007280240210920012903102117024041004101410220152014842218501b20021b22114101460d0020114102470d0220094180016a21094200211920172016844200520d030c0d0b200941f0006a21094200211920172016844200510d0c0c020b200d2802002210201d6a211120102f0106220d201e742109410021120240024003402009450d0120032011202210d0032213450d02200920236a21092012201a6a2112201120226a21112013201f4a0d000b2012201f6a210d0b201c450d03201c201f6a211c2010200d2020746a20216a210d410121090c060b201041e8026a201241c8006c6a2209450d022009280200450d02200941106a2903002116200941086a29030021170c030b200941e0006a21094200211920172016844200510d0a0b200841186a2009290300200941086a2903002017201610d103200120192001290308221720082903187d221620162017562016507222091b37030802402009450d00418382c0002109412221110c090b200a28020022094100480d04200941ffffffff07460d044101211a2007410c6a200941016a221b360200200741146a280200211c4108211d4105211e417f211f41022120418009212141202122416021230c020b200841086a2007411c6a2802002003200741206a280200280214110100200841106a2903002116200728020c211b200829030821170b200a201b417f6a3602000240201720057d2219201756201620067d2017200554ad7d221720165620172016511b4101470d00418dd6c0002109411d21110c070b024020184200520d00200741c0006a2802002209290350200556200941d8006a290300221620065620162006511b450d0041eed5c0002109411f21110c070b20082003410220192017103d024020082802002209450d00200828020421110c070b0240201520057c22182015542209201420067c2009ad7c221620145420162014511b450d0041c1d5c0002109412d21110c070b4100210920032004460d0520032004412010d003450d05200a200320192017103e200a200420182016103e200841e0006a41186a200341186a290000370300200841e0006a41106a200341106a290000370300200841e0006a41086a200341086a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a29000037030020082003290000370360200820042900003703400240024002400240200741306a28020022092007412c6a280200470d00200941016a22112009490d0320094101742212201120112012491b2212ad42d8007e2216422088a70d032016a722224100480d032009450d01200741286a280200200941d8006c2022101e2211450d020c070b200741286a28020021110c070b2022101f22110d050b202241081020000b1021000b410121090c000b0b103f000b2007412c6a2012360200200741286a2011360200200741306a28020021090b2011200941d8006c6a2211200829036037000141002109201141003a00002011200829034037002120112008280039360041201141096a200841e0006a41086a290300370000201141116a200841e0006a41106a290300370000201141196a200841e0006a41186a290300370000201141296a200841c0006a41086a290300370000201141316a200841c0006a41106a290300370000201141396a200841c0006a41186a290300370000201141c4006a2008413c6a280000360000201141d0006a200637030020112005370348200741306a2211201128020041016a3602000b0b200020113602042000200936020020084180016a24000f0b4180dac300102c000be110010d7f23004180016b220324000240024002400240024002400240024002400240024002404114101f2204450d00200441106a41002800c2f341360000200441086a41002900baf341370000200441002900b2f341370000200441144134101e2204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341f0006a41086a220542003703002003420037037020044134200341f0006a1001200341e0006a41086a2005290300370300200320032903703703600240024002400240200341e0006a411041f8b3c200410041001002417f460d002003421037023c2003200341e0006a360238200341286a200341386a10d5012003280228450d03200328022c2106200341206a200341386a10d5012003280220450d0320032802242107200341186a200341386a10d5012003280218450d03200328021c210841002109200341003a0070200341c0006a2205200528020022052003280238200328023c200341f0006a41012005100241016a41014b22056a3602002005450d03024020032d00702205450d004101210920054101470d040b200341106a200341386a10d5012003280210450d0320032802142205417f4c0d0b2005450d0120051079220a450d06200341c0006a220b200b280200220b200541002003280238200328023c200a2005200b1002220b200b417f461b220b200b20054b1b220b6a360200200b2005470d020c070b410221092004101d4102210441024102460d070c080b4101210a2003280238200328023c41014100200341c0006a28020010021a41002005460d050b2005450d00200a101d0b41df88c0004133103a000b411441011020000b413441011020000b200541011020000b200341dc006a41026a220b200341f0006a41026a2d00003a0000200320032f00703b015c200341386a41026a200b2d00003a0000200320032f015c3b01382004101d4102210420094102470d010b4101210b41fdd3c0002106411121070c010b200341f0006a20046a200341386a20046a2d00003a0000200320032f01383b01704100210b0b200341346a20046a200341f0006a20046a2d00003a0000200320032f01703b01340240200b450d002000200636020420004101360200200041086a200736020020034180016a24000f0b200341306a41026a220c200341346a41026a2d00003a0000200320032f01343b0130024002400240024002400240024002400240024002400240024002400240200228024020064d0d004115101f2204450d05410021062004410d6a4100290094f341370000200441086a410029008ff34137000020044100290087f341370000200441154135101e2204450d06200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341f0006a41086a220742003703002003420037037020044135200341f0006a1001200341e0006a41086a200729030037030020032003290370370360200341e0006a411041f8b3c200410041001002417f460d012003421037023c2003200341e0006a360238200341086a200341386a10d5012003280208450d04200328020c220b417f4c0d0f200b450d02200b10792206450d07200341c0006a220720072802002207200b41002003280238200328023c2006200b2007100222072007417f461b22072007200b4b1b22076a3602002007200b470d030c080b200521042005210e200a21020c120b2004101d41000d070c080b410121062003280238200328023c41014100200341c0006a28020010021a4100200b460d050b200b450d002006101d0b41df88c0004133103a000b411541011020000b413541011020000b200b41011020000b2004101d2006450d010b2006410020061b210d200341386a2006200b20021042200341386a41086a2802002107200328023c210620032802384101470d042000200636020420004101360200200041086a2007360200200b450d01200d101d20050d020c030b2000418ed4c00036020420004101360200200041086a411a3602000b2005450d010b200a101d0b20034180016a24000f0b200341f0006a41026a220f200341d7006a2d00003a0000200320032f00553b0170200341d4006a2d00002109200341d0006a2802002104200341cc006a280200210e200341c8006a2802002102200341c4006a280200210802402005450d00200a101d0b200341306a41026a200f2d00003a0000200320032f01703b01302004417f4c0d004101210502402004450d002004101f2205450d040b20052002200410ce03210a200341386a41146a2004360200200341386a41106a2004360200200320083602402003200736023c200320063602382003200a3602442003200941ff01714101463a00504114101f2205450d01200541106a41002800c2f341360000200541086a41002900baf341370000200541002900b2f341370000200541144134101e2205450d02200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200341f0006a41086a220142003703002003420037037020054134200341f0006a1001200341e0006a41086a200129030037030020032003290370370360200341e0006a200341386a10612005101d02402004450d00200a101d0b200b450d04200d101d0c040b102e000b411441011020000b413441011020000b200441011020000b20002006360204200020032f01303b001d200041003602002000411c6a20093a0000200041186a2004360200200041146a200e360200200041106a20023602002000410c6a2008360200200041086a20073602002000411f6a200c2d00003a000020034180016a24000bc33f01087f230041a0016b22082400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002410c6a280200200241106a28020010042209417f460d00410c101f220a450d01200a2009360208200a42818080801037020002404101450d00200a410141016a3602004101417e460d00200a41014102723602004104101f220b450d03200b200a360200200a280208210c4103101f220d450d04200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004106101f220e450d05200e41046a41002f009c89403b0000200e410028009889403600004120101f2209450d062009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a41086a2802001005200a200a280204417f6a220d360204200d0d00200a101d0b4103101f220d450d07200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004103101f220e450d08200e41026a41002d00e4a3423a0000200e41002f00e2a3423b00002009412041c000101e2209450d092009410336023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d3602204103101f220d450d0a200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410f101f220e450d0b200e41076a41002900b49d42370000200e41002900ad9d42370000200941c000418001101e2209450d0c2009410436025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d3602404103101f220d450d0d200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410f101f220e450d0e200e41076a41002900c39d42370000200e41002900bc9d423700002009410536027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d3602604103101f220d450d0f200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004108101f220e450d10200e42e5f0d1fbb5ac98b6ec003700002009418001418002101e2209450d112009410636029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d360280014103101f220d450d12200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410a101f220e450d13200e41086a41002f00db9d423b0000200e41002900d39d42370000200941073602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a0014103101f220d450d14200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410a101f220e450d15200e41086a41002f00e59d423b0000200e41002900dd9d42370000200941083602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c0014103101f220d450d16200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410a101f220e450d17200e41086a41002f00ef9d423b0000200e41002900e79d42370000200941093602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e0014103101f220d450d18200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410b101f220e450d19200e41076a41002800f89d42360000200e41002900f19d423700002009418002418004101e2209450d1a2009410a36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d360280024103101f220d450d1b200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410d101f220e450d1c200e41056a41002900819e42370000200e41002900fc9d423700002009410b3602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a0024103101f220d450d1d200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410c101f220e450d1e200e41086a41002800919e42360000200e41002900899e423700002009410c3602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c0024103101f220d450d1f200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410b101f220e450d20200e41076a410028009c9e42360000200e41002900959e423700002009410d3602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e0024103101f220e450d21200e41026a41002d00e1a3423a0000200e41002f00dfa3423b00004115101f220d450d22200d410d6a41002900ad9e42370000200d41086a41002900a89e42370000200d41002900a09e423700002009410e36029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e360280034103101f220d450d23200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410f101f220e450d24200e41076a41002900bc9e42370000200e41002900b59e423700002009410f3602bc03200941003602b8032009428f808080f0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a0034103101f220d450d25200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004107101f220e450d26200e41036a41002800c79e42360000200e41002800c49e42360000200941103602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c0034103101f220e450d27200e41026a41002d00e1a3423a0000200e41002f00dfa3423b00004111101f220d450d28200d41106a41002d00db9e423a0000200d41086a41002900d39e42370000200d41002900cb9e42370000200941113602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e0034103101f220d450d29200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410e101f220e450d2a200e41066a41002900e29e42370000200e41002900dc9e423700002009418004418008101e220c450d2b200c411236029c04200c410036029804200c428e808080e00137029004200c200e36028c04200c42838080803037028404200c200d360280044103101f2209450d2c200941026a41002d00e1a3423a0000200941002f00dfa3423b0000410e101f220d450d2d200d41066a41002900f09e42370000200d41002900ea9e42370000200c41133602bc04200c41003602b804200c428e808080e0013702b004200c200d3602ac04200c4283808080303702a404200c20093602a0044103101f2209450d2e200941026a41002d00e1a3423a0000200941002f00dfa3423b00004110101f220d450d2f200d41086a41002900809f42370000200d41002900f89e42370000200c41143602dc04200c41003602d804200c429080808080023702d004200c200d3602cc04200c4283808080303702c404200c20093602c0044103101f2209450d30200941026a41002d00e1a3423a0000200941002f00dfa3423b00004110101f220d450d31200d41086a41002900909f42370000200d41002900889f42370000200c41153602fc04200c41003602f804200c429080808080023702f004200c200d3602ec04200c4283808080303702e404200c20093602e0044103101f220d450d32200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004111101f2209450d33200941106a41002d00a89f423a0000200941086a41002900a09f42370000200941002900989f42370000200c411636029c05200c410036029805200c4291808080900237029005200c200936028c05200c42838080803037028405200c200d36028005200841086a41086a2005360200200841086a41206a4100360200200841086a41146a200641086a2802003602002008200436020c2008200336020820084100360238200820073602342008200a36023020084201370320200820062902003702142008200128020036022c200241146a28020021072002411c6a280200210f200841003602602008420137035820084115360248200841c8006a200841d8006a10624100210402400240024002400240024002400340200c20046a220d28020021012008200d41086a2802002209360248200841c8006a200841d8006a10620240024002400240200828025c2206200841d8006a41086a220e280200220a6b20094f0d00200a20096a2203200a490d0520064101742205200320032005491b22034100480d052006450d01200828025820062003101e22060d020c060b200828025821060c020b2003101f2206450d040b2008200336025c200820063602580b200e200a20096a3602002006200a6a2001200910ce031a200d410c6a28020021052008200d41146a2802002201360248200841c8006a200841d8006a10620240024002400240200828025c220a200e28020022036b20014f0d00200320016a22092003490d05200a4101742206200920092006491b22064100480d05200a450d012008280258200a2006101e22090d020c070b200828025821090c020b2006101f2209450d050b2008200636025c200820093602582006210a0b200e200320016a2206360200200920036a2005200110ce031a0240024002400240024002400240024002400240024002400240024002400240200d41186a2802004101470d00200a2006470d01200a41016a2201200a490d11200a4101742203200120012003491b22014100480d11200a450d032009200a2001101e22090d040c140b200a2006470d01200a41016a2201200a490d10200a4101742203200120012003491b22014100480d10200a450d052009200a2001101e22090d060c140b200a21010c030b200a21010c050b2001101f2209450d100b2008200136025c200820093602580b200e200641016a220a360200200920066a41023a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0b20014101742205200320032005491b22034100480d0b2001450d03200920012003101e22090d040c100b2001101f2209450d0e0b2008200136025c200820093602580b200e200641016a220a360200200920066a41013a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0820014101742205200320032005491b22034100480d082001450d03200920012003101e22090d040c0e0b2003101f2209450d0c0b2008200336025c200820093602580b200e200641056a3602002009200a6a200d360000200441206a220441a005470d040c030b2003101f2209450d0a0b2008200336025c200820093602580b200e200641056a3602002009200a6a200d360000200441206a220441a005470d010b0b200828025c21090240024041172007200f20082802582206200841e0006a280200200841086a1006220a417d460d00200a417f470d014100210d2009450d410c400b4102210d20090d3f0c400b4104101f220e450d3b200b280200220d28020041016a22014102490d07200d2001360200200e200d36020002402009450d002006101d0b200841d0006a4281808080103703002008200e36024c2008200a36024820022802002106200228020421012008410036026020084201370358200841003602980120084198016a200841d8006a106220082802602103200828025c21042008280258210d410a10792209450d3c41012105024002400240200a20062001200d20032009410a200841086a10072206417d460d0020060d402008410936029c012008200941016a36029801024020092d00002206450d00024020064101470d00200841d8006a20084198016a107a2008280258417e714104470d010b2009101d2004450d02200d101d0c020b410021050b2009101d02402004450d00200d101d0b410321092005450d010b410221090b200841d8006a41386a200841086a41386a280200360200200841d8006a41306a200841086a41306a290300370300200841d8006a41286a200841086a41286a290300370300200841d8006a41206a200841086a41206a290300370300200841d8006a41186a200841086a41186a290300370300200841d8006a41106a200841086a41106a290300370300200841d8006a41086a200841086a41086a290300370300200820082903083703582000200841d8006a2009107b200a1008200e28020022092009280200417f6a3602000240200e28020022092802000d0020092802081005200e28020022092009280204417f6a360204200e28020022092802040d002009101d0b200e101d4101210d41002106200c41046a2802000d400c410b1021000b200341011020000b200641011020000b200141011020000b200141011020000b200341011020000b200341011020000b00000b107c000b410c41041020000b410441041020000b410341011020000b410641011020000b412041041020000b410341011020000b410341011020000b41c00041041020000b410341011020000b410f41011020000b41800141041020000b410341011020000b410f41011020000b410341011020000b410841011020000b41800241041020000b410341011020000b410a41011020000b410341011020000b410a41011020000b410341011020000b410a41011020000b410341011020000b410b41011020000b41800441041020000b410341011020000b410d41011020000b410341011020000b410c41011020000b410341011020000b410b41011020000b410341011020000b411541011020000b410341011020000b410f41011020000b410341011020000b410741011020000b410341011020000b411141011020000b410341011020000b410e41011020000b41800841041020000b410341011020000b410e41011020000b410341011020000b411041011020000b410341011020000b411041011020000b410341011020000b411141011020000b410441041020000b410a41011020000b41c4f5c200102c000b2006101d0b200d450d02200841d8006a41386a200841086a41386a280200360200200841d8006a41306a200841086a41306a290300370300200841d8006a41286a200841086a41286a290300370300200841d8006a41206a200841086a41206a290300370300200841d8006a41186a200841086a41186a290300370300200841d8006a41106a200841086a41106a290300370300200841d8006a41086a200841086a41086a290300370300200820082903083703582000200841d8006a200d107b4100210d41012106200c41046a280200450d010b200c280200101d0b0240200c41106a280200450d00200c28020c101d0b0240200c41246a280200450d00200c41206a280200101d0b0240200c41306a280200450d00200c28022c101d0b0240200c41c4006a280200450d00200c41c0006a280200101d0b0240200c41d0006a280200450d00200c28024c101d0b0240200c41e4006a280200450d00200c41e0006a280200101d0b0240200c41f0006a280200450d00200c28026c101d0b0240200c4184016a280200450d00200c4180016a280200101d0b0240200c4190016a280200450d00200c28028c01101d0b0240200c41a4016a280200450d00200c41a0016a280200101d0b0240200c41b0016a280200450d00200c2802ac01101d0b0240200c41c4016a280200450d00200c41c0016a280200101d0b0240200c41d0016a280200450d00200c2802cc01101d0b0240200c41e4016a280200450d00200c41e0016a280200101d0b0240200c41f0016a280200450d00200c2802ec01101d0b0240200c4184026a280200450d00200c4180026a280200101d0b0240200c4190026a280200450d00200c28028c02101d0b0240200c41a4026a280200450d00200c41a0026a280200101d0b0240200c41b0026a280200450d00200c2802ac02101d0b0240200c41c4026a280200450d00200c41c0026a280200101d0b0240200c41d0026a280200450d00200c2802cc02101d0b0240200c41e4026a280200450d00200c41e0026a280200101d0b0240200c41f0026a280200450d00200c2802ec02101d0b0240200c4184036a280200450d00200c4180036a280200101d0b0240200c4190036a280200450d00200c28028c03101d0b0240200c41a4036a280200450d00200c41a0036a280200101d0b0240200c41b0036a280200450d00200c2802ac03101d0b0240200c41c4036a280200450d00200c41c0036a280200101d0b0240200c41d0036a280200450d00200c2802cc03101d0b0240200c41e4036a280200450d00200c41e0036a280200101d0b0240200c41f0036a280200450d00200c2802ec03101d0b0240200c4184046a280200450d00200c4180046a280200101d0b0240200c4190046a280200450d00200c28028c04101d0b0240200c41a4046a280200450d00200c41a0046a280200101d0b0240200c41b0046a280200450d00200c2802ac04101d0b0240200c41c4046a280200450d00200c41c0046a280200101d0b0240200c41d0046a280200450d00200c2802cc04101d0b0240200c41e4046a280200450d00200c41e0046a280200101d0b0240200c41f0046a280200450d00200c2802ec04101d0b0240200c4184056a280200450d00200c4180056a280200101d0b0240200c4190056a280200450d00200c28028c05101d0b200c101d200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081005200b28020022092009280204417f6a360204200b28020022092802040d002009101d0b200b101d4100210902402006410047200d720d00200a100802400340200e20096a220a280200220d200d280200417f6a36020002400240200a280200220d2802000d00200d2802081005200a280200220d200d280204417f6a360204200a280200220a280204450d010b200941046a22094104470d010c020b200a101d200941046a22094104470d000b0b200e101d0b200841a0016a24000f0b2000419e89c00036020420004102360200200041086a41103602000240200841146a2802002209450d00200841086a41106a280200450d002009101d0b0240200841246a280200450d00200841206a280200101d0b200841306a2209280200220a200a280200417f6a36020002402009280200220a2802000d00200a28020810052009280200220a200a280204417f6a360204200928020022092802040d002009101d0b0240200841386a2802002209450d002008413c6a280200450d002009101d0b0240200c41046a280200450d00200c280200101d0b0240200c41106a280200450d00200c28020c101d0b0240200c41246a280200450d00200c41206a280200101d0b0240200c41306a280200450d00200c28022c101d0b0240200c41c4006a280200450d00200c41c0006a280200101d0b0240200c41d0006a280200450d00200c28024c101d0b0240200c41e4006a280200450d00200c41e0006a280200101d0b0240200c41f0006a280200450d00200c28026c101d0b0240200c4184016a280200450d00200c4180016a280200101d0b0240200c4190016a280200450d00200c28028c01101d0b0240200c41a4016a280200450d00200c41a0016a280200101d0b0240200c41b0016a280200450d00200c2802ac01101d0b0240200c41c4016a280200450d00200c41c0016a280200101d0b0240200c41d0016a280200450d00200c2802cc01101d0b0240200c41e4016a280200450d00200c41e0016a280200101d0b0240200c41f0016a280200450d00200c2802ec01101d0b0240200c4184026a280200450d00200c4180026a280200101d0b0240200c4190026a280200450d00200c28028c02101d0b0240200c41a4026a280200450d00200c41a0026a280200101d0b0240200c41b0026a280200450d00200c2802ac02101d0b0240200c41c4026a280200450d00200c41c0026a280200101d0b0240200c41d0026a280200450d00200c2802cc02101d0b0240200c41e4026a280200450d00200c41e0026a280200101d0b0240200c41f0026a280200450d00200c2802ec02101d0b0240200c4184036a280200450d00200c4180036a280200101d0b0240200c4190036a280200450d00200c28028c03101d0b0240200c41a4036a280200450d00200c41a0036a280200101d0b0240200c41b0036a280200450d00200c2802ac03101d0b0240200c41c4036a280200450d00200c41c0036a280200101d0b0240200c41d0036a280200450d00200c2802cc03101d0b0240200c41e4036a280200450d00200c41e0036a280200101d0b0240200c41f0036a280200450d00200c2802ec03101d0b0240200c4184046a280200450d00200c4180046a280200101d0b0240200c4190046a280200450d00200c28028c04101d0b0240200c41a4046a280200450d00200c41a0046a280200101d0b0240200c41b0046a280200450d00200c2802ac04101d0b0240200c41c4046a280200450d00200c41c0046a280200101d0b0240200c41d0046a280200450d00200c2802cc04101d0b0240200c41e4046a280200450d00200c41e0046a280200101d0b0240200c41f0046a280200450d00200c2802ec04101d0b0240200c4184056a280200450d00200c4180056a280200101d0b0240200c4190056a280200450d00200c28028c05101d0b200c101d200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081005200b28020022092009280204417f6a360204200b28020022092802040d002009101d0b200b101d200841a0016a24000bd70e05057f017e157f027e0a7f230041900b6b22022400024020002802000d002000417f36020020012802082103200128020021040240024020012802042205450d002005210620042101034020012802800921012006417f6a22060d000b0340200420042f01064102746a4180096a28020021042005417f6a22050d000c020b0b200421010b200241086a411c6a20042f0106360200200241086a41186a4100360200200241086a41146a20043602002002200336022820024100360218200242003703102002200136020c2002410036020820024198026a200241086a10d602024020022903b80222074202510d002000410c6a2108200041046a2109200241c0016a41146a210a200241a0016a410c6a210b20024198026a41256a210c200241dd026a210d200241c8026a210e200241c0026a210f200241dc026a2110200241d0026a2111200241d4026a2112200241d8026a2113200241bc026a211420024198026a41206a211520024198026a411c6a21160340200241d8006a41086a220420024198026a41086a2217290300370300200241d8006a41106a220120024198026a41106a2218290300370300200241d8006a41186a220620024198026a41186a2219290300370300200241306a41086a2203200d41086a290000370300200241306a41106a221a200d41106a290000370300200241306a41186a221b200d41186a290000370300200241306a411f6a221c200d411f6a28000036000020022002290398023703582002200d290000370330200e290300211d200f290300211e20102d0000211f201128020021052012280200212020132802002121200241f8006a411f6a2222201c280000360000200241f8006a41186a2223201b290300370300200241f8006a41106a2224201a290300370300200241f8006a41086a2225200329030037030020022002290330370378200241c0016a41186a22262006290300370300200241c0016a41106a221c2001290300370300200241c0016a41086a221a2004290300370300200220022903583703c001024002400240024002400240024002402009280200220341f0c0c100460d00200041086a28020021270c010b418009101f2203450d0141002127200341003b010620034100360200200341086a20024198026a41f80810ce031a200041086a4100360200200920033602000b0240034020032f01062228410574211b410021044100210102400340201b2004460d01200241c0016a200320046a41086a412010d0032206450d03200441206a2104200141016a21012006417f4a0d000b2001417f6a21280b02402027450d002027417f6a2127200320284102746a4180096a28020021030c010b0b200241a0016a41186a22042026290300370300200241a0016a41106a2201201c290300370300200241a0016a41086a2206201a290300370300200220022903c0013703a001201c2008360200200241c0016a410c6a2028360200201a2009360200200a20022903a001370200200a41086a2006290300370200200a41106a2001290300370200200a41186a2004290300370200200220033602c401200241003602c0012018201d3703002017201e3703002014201f3a0000201520213602002016202036020020192005360200200c2002290378370000200c41086a2025290300370000200c41106a2024290300370000200c41186a2023290300370000200c411f6a20222800003600002002200737039802200241c0016a20024198026a10311a0c060b200341e8026a200141c8006c6a21060240024020074201510d00201f41ff01714102470d010c030b200642013703002006201e370308200641106a201d370300201f41ff01714102460d020b2006201f3a00242006413d6a2023290300370000200641356a20242903003700002006412d6a2025290300370000200641256a200229037837000020200d020c030b41800941081020000b2020450d010b2020210120052104034020042802900221042001417f6a22010d000b0340200520052f01064102746a4190026a28020021052020417f6a22200d000c020b0b200521040b20052f0106210120152021360200201620013602002019410036020020024198026a41146a200536020020184100360200201742003703002002200436029c022002410036029802200241c0016a20024198026a10d702024020022802c001450d00200641186a21010340200241a0016a41106a201c290300370300200241a0016a41086a2204201a290300370300200220022903c0013703a00120024188026a41086a2004280200360200200220022903a00137038802201a200b41086a2802003602002002200b2902003703c001200241f8016a200120024188026a200241c0016a10f801024020022802f801450d0020022802fc012204450d00200241f8016a41086a280200450d002004101d0b200241c0016a20024198026a10d70220022802c0010d000b0b20024198026a10320b20024198026a200241086a10d602201529030022074202520d000b0b200241086a103b2000200028020041016a360200200241900b6a24000f0b10f901000b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641d8006d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad42d8007e2209422088a70d032009a722084100480d032002450d012000280200200241d8006c2008101e2202450d020c040b200028020021020c040b2008101f22020d020b200841081020000b1021000b20002002360200200041046a2003360200200041086a28020021030b2002200341d8006c6a2005200610ce031a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d002001280200101d0b0b8d0202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641077522074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad4207862209422088a70d032009a722084100480d032002450d01200028020020024107742008101e2202450d020c040b200028020021020c040b2008101f22020d020b200841081020000b1021000b20002002360200200041046a2003360200200041086a28020021030b200220034107746a2005200610ce031a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d002001280200101d0b0b5f01017f230041306b220224002002200136020c20022000360208200241246a41013602002002411836022c20024201370214200241d8c0c4003602102002200241086a3602282002200241286a360220200241106a41e0c0c40010cf01000b8403010e7f23004190016b220124002001200010d602024020012903204202510d00200141c0006a21022001413c6a2103200141386a210420014184016a210520014180016a2106200141fc006a2107200141f8006a2108200141f0006a210903402002280200210a2004280200210b024002402003280200220c450d00200c210d200b210e0340200e28029002210e200d417f6a220d0d000b0340200b200b2f01064102746a4190026a280200210b200c417f6a220c0d000c020b0b200b210e0b200141e8006a41206a200a3602002005200b2f0106360200200641003602002007200b36020020084100360200200942003703002001200e36026c20014100360268200141e8006a10322001200010d602200141206a2903004202520d000b0b02402000280204220b41f0c0c100460d00200b280200210c200b101d200c450d00200c280200210e200c101d200e450d000240200e280200220b450d000340200e101d200b210e200b280200220c210b200c0d000b0b200e101d0b20014190016a24000ba30601027f024002400240024002400240024002400240024002400240024002400240024002400240024020002802002201410d4b0d0020010e0e1201121212020304050612071208120b20002802044101470d11200041086a2200280200103c2000280200101d0f0b200041086a280200220141064b0d0b024020010e071100110d110e0f110b200041106a280200450d102000410c6a280200101d0f0b200041086a2d00002201410e4b0d0e20014106470d0f200041106a280200450d0f2000410c6a280200101d0f0b200041086a2d000022014105460d0520014101470d0e2000410c6a2200280200103c2000280200101d0f0b200041086a28020022014102460d0520014101470d0d200041106a280200450d0d2000410c6a280200101d0f0b200041086a2d00004101470d0c2000410c6a2200280200103c2000280200101d0f0b20002d00044101470d0b2000410c6a2200280200103c2000280200101d0f0b200041086a280200450d0a2000280204101d0f0b200041086a2d000022014102490d0920014103460d0220014102470d03200041106a280200450d092000410c6a280200101d0f0b2000410c6a2200280200103c2000280200101d0f0b200041106a280200450d072000410c6a280200101d0f0b200041346a280200450d06200041306a280200101d0f0b200041306a280200450d052000412c6a280200101d0f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d002001280200101d0b2001410c6a2101200241746a22020d000b0b200041106a280200450d042000410c6a280200101d0f0b200041106a280200450d032000410c6a280200101d0f0b200041106a280200450d022000410c6a280200101d0f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200241686a22020d000b0b200041106a280200450d012000410c6a280200101d0f0b200041106a280200450d002000410c6a280200101d0f0b0ba90404027f017e027f017e230041d0006b220524000240024002400240200241ff017122064102460d0020064104470d02200541106a200110e1012005290310200356200541186a290300220720045620072004511b0d010c020b2005200110e1012005290300200358200541086a290300220720045820072004511b0d010b41adb7c0002101412621060c010b200541206a200110ea01024002400240024002402005280228450d0042002107200541c0006a41086a2206420037030020054200370340418cb9c000410d200541c0006a1001200541306a41086a2006290300370300200520052903403703300240200541306a411041f8b3c200410041001002417f460d0020054200370340200541306a4110200541c0006a41084100100241016a41084d0d03200529034021070b200541c0006a200110ea012005280244210820052802402109024020052802482201450d00200141286c210620092101034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d040b200141286a2101200641586a22060d000b0b410021012008450d040c030b02402005280224450d002005280220101d0b410021010c040b41d3b7c000210120080d010c020b41df88c0004133103a000b2009101d0b02402005280224450d002005280220101d0b413121060b2000200636020420002001360200200541d0006a24000b820701087f230041900a6b22042400024002400240024020002802000d002000417f360200200441e0006a41186a200141186a290000370300200441e0006a41106a200141106a290000370300200441e0006a41086a200141086a29000037030020042001290000370360024002402000280204220541f0c0c100460d00200041086a28020021060c010b418009101f2205450d0241002106200541003b010620054100360200200541086a20044198016a41f80810ce031a200041086a4100360200200041046a20053602000b200041046a210702400240034020052f010622084105742109410021014100210a0240034020092001460d01200441e0006a200520016a41086a412010d003220b450d03200141206a2101200a41016a210a200b417f4a0d000b200a417f6a21080b02402006450d002006417f6a2106200520084102746a4180096a28020021050c010b0b200441086a41186a200441e0006a41186a290300370300200441086a41106a200441e0006a41106a290300370300200441086a41086a200441e0006a41086a290300370300200420042903603703082000410c6a2101410021062008210a41000d010c040b2000410c6a21014101450d030b200441b0016a4200370300200441ac016a41f0c0c100360200200441003602b801200441003602a801200442003703a001200441f0c0c10036029c0120044100360298012005200a41c8006c6a41e8026a210120044198016a10320c030b10f901000b41800941081020000b200441e0006a411c6a200441086a41086a29030037020020044184016a200441086a41106a2903003702002004418c016a200441086a41186a290300370200200420013602702004200a36026c2004200736026820042005360264200420063602602004200429030837027420044198016a411c6a420037020020044198016a41106a200441d0006a41086a290300370300200441bd016a200429002d370000200441c5016a2004412d6a41086a290000370000200441cd016a2004412d6a41106a290000370000200441d5016a2004412d6a41186a290000370000200441dc016a200441cc006a2800003600002004420037039801200441023a00bc01200441f0c0c1003602b001200420042903503703a001200441e0006a20044198016a103121010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441900a6a24000b7701017f230041c0006b220024002000411836020c200041fca8c100360208200041346a4119360200200041246a41023602002000411836022c20004202370214200041b8b1c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8b1c40010cf01000bc50101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a2802002204450d002004210520032100034020002802800921002005417f6a22050d000b0340200320032f01064102746a4180096a28020021032004417f6a22040d000c020b0b200321000b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a103b200141306a24000bfc1b03027f027e097f230041d0036b2209240002400240024020012802242001280240220a2802a001470d00200041a582c00036020420004101360200200041086a4129360200200841046a2802000d010c020b200542002005290308220b200a4190016a2903007d220c200c200b56200c5072220a1b37030802400240200a450d00200041ce82c00036020420004101360200200041086a41233602000c010b200941106a2001410c6a220a2002103020094180026a41186a220d200241186a29000037030020094180026a41106a220e200241106a29000037030020094180026a41086a220f200241086a2900003703002009200229000037038002200941c8016a20094180026a103320092802d001211020092902d401210c200941f0006a4200370300200941e8006a42808080808001370300200941d8006a4184d0c200360200200941d4006a200a360200200941cc006a4200370200200941386a41106a41f0c0c1003602002009418c016a200f29030037020020094194016a200e2903003702002009419c016a200d290300370200200942083703604100210e200941003602442009200c37023c2009201036023820092009290380023702840120092001280248360280012009200141c0006a2902003703784101210d2009200141246a28020041016a36025c0240024002400240024002400240024002400240024002402003200484500d00200941086a20054100200141cc006a200220032004200941386a103420092802082202450d00200928020c21012000200236020420004101360200200041086a2001360200024020092802382201450d00200928023c450d002001101d0b200941386a41186a280200210a200941c8006a2802002101200941386a41146a2802002202450d012002210520012100034020002802800921002005417f6a22050d000b0340200120012f01064102746a4180096a28020021012002417f6a22020d000c030b0b0240024020092d0010450d00200941a8016a41186a200941296a290000370300200941a8016a41106a200941216a290000370300200941a8016a41086a200941196a290000370300200920092900113703a80120094180026a200941a8016a200141c8006a28020028020010352009280280024101470d01200020092902840237020420004101360200024020092802382201450d00200928023c450d002001101d0b200941386a41186a280200210a200941c8006a2802002101200941386a41146a2802002202450d042002210520012100034020002802800921002005417f6a22050d000b0340200120012f01064102746a4180096a28020021012002417f6a22020d000c060b0b410021074101210f0c070b200941b0036a41186a220d2009419c026a280200360200200941b0036a41106a220e20094194026a290200370300200941b0036a41086a22022009418c026a29020037030020092009290284023703b003200941c8016a41106a2002290300370300200941c8016a41186a200e290300370300200941e8016a200d280200360200200941043602cc012009418df9c1003602c801200920092903b0033703d001200141c4006a280200210d200941e0026a41186a200141e4006a290000370300200941e0026a41106a200141dc006a290000370300200941e0026a41086a200141d4006a2900003703002009200129004c3703e00220024200370300200942003703b003418390c100410d200941b0036a1001200941a0036a41086a2002290300370300200920092903b0033703a0034200210c0240200941a0036a411041f8b3c200410041001002417f460d00200942003703b003200941a0036a4110200941b0036a41084100100241016a41084d0d0a20092903b003210c0b200941b0036a41086a22024200370300200942003703b00341fbb8c0004111200941b0036a1001200941a0036a41086a2002290300370300200920092903b0033703a003200941a0036a411041f8b3c200410041001002417f460d04200941c8036a4200370300200941b0036a41106a420037030020024200370300200942003703b003200941a0036a4110200941b0036a4120410010022202417f460d0a2002411f4d0d0a20094180036a41186a200941b0036a41186a29030037030020094180036a41106a200941b0036a41106a29030037030020094180036a41086a200941b0036a41086a290300370300200920092903b003370380030c050b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a20013602002009200a3602a002200941003602900220094200370388022009200036028402200941003602800220094180026a103b0240200941e8006a2802002200450d00200941386a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a280200101d0b200141d8006a2101200041a87f6a22000d000b0b0240200941e4006a280200450d00200941e0006a280200101d0b0240200941f4006a2802002201450d0020014107742100200941ec006a28020041206a210103402001103c20014180016a2101200041807f6a22000d000b0b200941f0006a280200450d09200941ec006a280200101d200841046a2802000d0a0c0b0b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a20013602002009200a3602a002200941003602900220094200370388022009200036028402200941003602800220094180026a103b0240200941e8006a2802002200450d00200941386a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a280200101d0b200141d8006a2101200041a87f6a22000d000b0b0240200941e4006a280200450d00200941e0006a280200101d0b0240200941f4006a2802002201450d0020014107742100200941ec006a28020041206a210103402001103c20014180016a2101200041807f6a22000d000b0b200941f0006a280200450d07200941ec006a280200101d200841046a2802000d080c090b20094198036a420037030020094180036a41106a420037030020094180036a41086a420037030020094200370380030b200941a4026a200941e0026a41086a290300370200200941ac026a200941e0026a41106a290300370200200941b4026a200941e0026a41186a290300370200200941c4026a20094180036a41086a290300370200200941cc026a20094180036a41106a290300370200200941d4026a20094180036a41186a2903003702002009200337038002200920092903e00237029c022009200c3703900220092009290380033702bc0220092004370388022009200941386a36029802200941b0036a41086a200841086a280200360200200920082902003703b003200941f0016a200d200941c8016a20094180026a20062007200941b0036a200510364101210d0240024020092802f00122024101460d004100210e4100210720024102470d01200020092902f401370204200041013602000240200941e0016a280200450d00200941dc016a280200101d0b024020092802382201450d00200928023c450d002001101d0b200941386a41186a2802002108200941c8006a2802002101200941386a41146a2802002202450d032002210520012100034020002802800921002005417f6a22050d000b0340200120012f01064102746a4180096a28020021012002417f6a22020d000c050b0b200941fc016a280200210e200941f0016a41086a280200210720092802f401210d0b0240200941e0016a280200450d00200941dc016a280200101d0b4100210f0b20094180026a41086a2206200941386a410c6a220241086a290200370300200941c8016a41086a221020094180026a410c6a280200360200200920022902003703800220092009290284023703c801200941f4006a2802002111200941f0006a2802002112200941386a41346a2802002102200941e8006a2802002113200941e4006a2802002114200941386a41286a2802002105024020092802382215450d00200928023c450d002015101d0b20062010280200360200200920092903c80137038002200941386a41086a20062802003602002009200929038002370338200a200941386a103720092005201341d8006c6a360244200920053602402009201436023c20092005360238200141286a200941386a10382009200220114107746a360244200920023602402009201236023c20092002360238200141346a200941386a10392000410c6a200e360200200041086a20073602002000200d36020420004100360200200f450d06200841046a280200450d062008280200101d200941d0036a24000f0b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a2001360200200920083602a002200941003602900220094200370388022009200036028402200941003602800220094180026a103b0240200941e8006a2802002200450d00200941386a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a280200101d0b200141d8006a2101200041a87f6a22000d000b0b0240200941e4006a280200450d00200941e0006a280200101d0b0240200941f4006a2802002201450d0020014107742100200941ec006a28020041206a210103402001103c20014180016a2101200041807f6a22000d000b0b200941f0006a280200450d04200941ec006a280200101d200941d0036a24000f0b41df88c0004133103a000b41df88c0004133103a000b200841046a280200450d010b2008280200101d0b200941d0036a24000ba07709227f047e4f7f017e397f017e057f027e0f7f230041c0046b220424004100210520044100360290022004200236028c022004200136028802024002400240024002400240200241034b0d00200441013a0048200441c4036a4101360200200441013602f401200442013702b40320044190afc4003602b0032004200441c8006a3602f0012004200441f0016a3602c003200441e0006a200441b0036a1028200428026821022004280264210620042802602107410521080c010b20044190026a4104360200024002400240024020012800004180c2cdeb06470d002002417c714104470d01200441013a0048200441c4036a4101360200200441013602f401200442013702b40320044190afc4003602b0032004200441c8006a3602f0012004200441f0016a3602c003200441e0006a200441b0036a102820042802682102200428026421062004280260210741052108410021050c040b410121080c010b02400240024002400240024002400240024002400240024002400240200241074d0d0020044188026a41086a41083602000240024002400240200128000422074101470d00200441b0036a20044188026a104320042802b0034101470d014104210a4100210b4100210c20042d00b4030d020c050b410221080c120b200441b0036a410572210f4104210a200441b0036a412c6a2110200441d4036a2111200441d0036a2112200441cc036a2113200441c8036a2114200441c4036a2115200441c0036a2116200441bc036a2117200441b8036a211841002107412821054100210b4100210c410021090340200441f0016a41026a2219200f41026a2d00003a00002004200f2f00003b01f0012010280200211a200441d8036a280200211b2011280200211c2012280200211d2013280200211e2014280200211f20152802002120201628020021212017280200212220182802002106024020042d00b4032223417e6a220141ff0171410a4b0d0002400240024002400240024002400240024002400240024002400240024002402001410a4b22240d00024020010e0b00070405020809060b030a000b200941ff0171222541014d0d0c0c0b0b200941ff0171222541004b0d0a0c0b0b200941ff0171222541054d0d0a0c090b200941ff01712225410a4d0d090c080b200941ff0171222541034d0d080c070b200941ff0171222541044d0d070c060b200941ff0171222541084d0d060c050b200941ff0171222541024d0d050c040b200941ff0171222541064d0d040c030b200941ff0171222541074d0d030c020b200941ff01712225410b4d0d020c010b200941ff0171222541094d0d010b411321082023410d4b0d010c020b02400240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b20254101470d0e0c0b0b20254100460d0a0c0d0b20254105470d0c0c090b2025410a470d0b0c080b20254103470d0a0c070b20254104470d090c060b20254108470d080c050b20254102470d070c040b20254106470d060c030b20254107470d050c020b2025410b470d040c010b20254109470d030b411421082023410d4d0d010b02402022450d002006101d0b0240201f450d00201e450d00201f101d0b201b450d10201c101d200b0d110c120b0240024002400240024002400240024002400240024020230e0e1904050119191908031a07000206190b2021450d184118213d2006202141186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff0321454170214620062147410121010c110b2021450d17202141286c21022006210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200241586a22020d000c180b0b2021450d16411c214820062021411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff0321504170215120062152410221010c0f0b2021450d15202141146c21022006210103400240200141046a280200450d002001280200101d0b200141146a21012002416c6a22020d000c160b0b02402022450d002006101d0b201f450d152020101d200b0d160c170b2021450d13202141047421022006210103400240200141046a280200450d002001280200101d0b200141106a2101200241706a22020d000c140b0b200641ff017122014102460d0320014101460d022021450d132022101d200b0d140c150b2021450d11411c215320062021411c6c6a2154410c2155410821564114215741042158411021594109215a41ffffffff03215b4170215c2006215d410321010c0a0b2021450d104104215e200620214104746a215f41102160410921614108216241ffffffff0321634170216420062165410421010c090b201f450d0c201f410c6c2102202121010340024020012802002205450d00200141046a280200450d002005101d0b2001410c6a2101200241746a22020d000c0d0b0b201f450d0b41042195012021201f4104746a2196014110219701410c21980141082199014174219a012021219b01410521010c070b0240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b410121090c0b0b410021090c0a0b410521090c090b410a21090c080b410321090c070b410421090c060b410821090c050b410221090c040b410621090c030b410721090c020b410b21090c010b410921090b200441e0006a41026a222420192d00003a0000200420042f01f0013b01600240200b200c470d00200b41016a2201200b490d072007200120012007491b220cad422c7e2226422088a70d072026a722014100480d070240200b450d00200a200541586a2001101e220a0d010c040b2001101f220a450d030b200a20056a220141586a20233a00002001201a3602002001417c6a201b360200200141786a201c360200200141746a201d360200200141706a201e3602002001416c6a201f360200200141686a2020360200200141646a2021360200200141606a20223602002001415c6a20063602002001415b6a20242d00003a0000200141596a20042f01603b0000200741026a21072005412c6a2105200b41016a210b200441b0036a20044188026a104320042802b0034101470d000b20042d00b403450d030b20042902b4032227a722084110762105200841087621092027422088a72107200441b0036a41106a2802002102200441bc036a2802002106200b0d0c0c0d0b200141041020000b41082002102b000b200b412c6c2101200a41606a21050240024003402001450d01200141546a2101200541206a21072005412c6a220d210520072d0000410b470d000b200d280200210e0c010b4100210e0b200b412c6c2101200a41586a21050240024003402001450d01200141546a2101200541286a21072005412c6a220d210520072d00004104470d000b200441c0006a200d1044200e2004280244460d010c0d0b200e4100470d0c0b024002400240024020044188026a41086a2802002002470d004280c2cdeb062128200441b4026a200b360200200441b0026a2201200c360200200441ac026a200a360200200441003602a00220044280c2cdeb06428080808010843702a402200a450d0320012903002229a7212a200a2029422088a7222b412c6c6a2105200a2101034020052001460d0220012d000021022001412c6a2207210120024102470d000b200441386a200741586a104420042802382101200428023c21020c020b200441003a0048200441c4036a4101360200200441013602f401200442013702b40320044190afc4003602b0032004200441c8006a3602f0012004200441f0016a3602c003200441e0006a200441b0036a1028200441bb036a200441e0006a41086a280200360000200420042903603700b303200441ac026a200441b7036a290000370000200441053a00a402200441013602a002200420042900b0033700a5020240200b450d00200b412c6c2108200a21010340200110452001412c6a2101200841546a22080d000b0b200441a0026a41047221010240200c450d00200a101d0b4100450d130c140b410021010b2002410020011b212c200141f8b3c20020011b212d200a202b412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024108470d000b200441306a200741586a104420042802302101200428023421020c010b410021010b2002410020011b212e200141f8b3c20020011b210d200a202b412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024104470d000b200441286a200741586a104420042802282101200428022c21020c010b410021010b2002410020011b212f200141f8b3c20020011b2130200a202b412c6c6a2105200a210102400240024003404100210e20052001460d0120012d000021022001412c6a2207210120024103470d000b200441206a200741586a104420042802244100200428022022011b22020d010c020b410021014100410041001b2202450d010b200241286c2102200141f8b3c20020011b41186a21014100210e0340200e20012d0000456a210e200141286a2101200241586a22020d000b0b41142131200d202e41146c6a213241002133410821344106212e419289c0002135410c2136411021374102213841042139418df9c100213a41e3c2b1e306213b4100213c410021010c010b418284c0004136103a000b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e080001020304070a0b0b0b0240200d2032460d000240024002400340200d280200210102400240200d20346a2802002202202e460d0020022039470d012001203a460d042001280000203b470d010c040b20012035460d0220012035202e10d003450d020b200d20316a220d2032470d000c040b0b4101213c200d20366a280200450d010c0a0b41012133200d20366a2802000d090b200d20376a2802002201200e6b220220014b0d09419988c000210141262123202f20024d0d52203020022038746a2202450d5241bf88c000210141202123202c200228020022024d0d52202d20022039746a2202450d52411f212341c483c000210120022802080d52200d20316a210d20022d000d2039460d200c520b024002402033203c71410171450d00200a202b412c6c6a2105200a2101034020052001460d0220012d000021022001412c6a2207210120024106470d000b200441186a200741586a1044200428021c450d01200041e383c000360204411f21230c540b411c411e203c41017122011b212341df87c00041fb87c00020011b21010c520b200a202b412c6c6a2105200a2101034020052001460d0520012d000021022001412c6a2207210120024102470d000b200441106a200741586a104420042802102101200428021421020c050b02402047203f6a280200450d002047280200101d0b0240204720406a2802002202450d00204728020c21012002203f7421020340024020012d00002043470d00200120446a280200204571450d002001203f6a280200101d0b200120416a2101200220466a22020d000b0b2047203d6a21010240204720416a280200450d00204720426a280200101d0b200121472001203e470d1f0c520b02402052204a6a2802002202450d00205228020421012002204d7421020340024020012d0000204f470d002001204b6a280200205071450d002001204d6a280200101d0b2001204e6a2101200220516a22020d000b0b02402052204b6a280200450d002052204d6a280200101d0b205220486a210102402052204c6a280200450d002052280210101d0b2001215220012049470d1f0c510b0240205d20556a2802002202450d00205d2802042101200220587421020340024020012d0000205a470d00200120566a280200205b71450d00200120586a280200101d0b200120596a21012002205c6a22020d000b0b0240205d20566a280200450d00205d20586a280200101d0b205d20536a21010240205d20576a280200450d00205d280210101d0b2001215d20012054470d1f0c500b024020652802082202450d00206528020021012002205e7421020340024020012d00002061470d00200120626a280200206371450d002001205e6a280200101d0b200120606a2101200220646a22020d000b0b206520606a210102402065205e6a280200450d002065280200101d0b200121652001205f470d1f0c4f0b410021010b2002410020011b2166200141f8b3c20020011b2167200a202b412c6c6a2105200a21010240024003404100216820052001460d0120012d000021022001412c6a2207210120024103470d000b200441086a200741586a104420042802082101200428020c21020c010b410021010b41282169200141f8b3c20020011b226a2002410020011b41286c6a216b4103216c41dfa3c200216d4104216e41e2a3c200216f4101217041e0002171410d217241792173410e217441c49ec20021754107217641cb9dc20021774106217842e5f0d1fbb5ac98b6ec00217941d39dc200217a410a217b41dd9dc200217c4102217d41e79dc200217e41f19dc200217f410b21800141959ec20021810141899ec200218201410c21830141fc9dc20021840141dc9ec20021850141ea9ec20021860141ad9dc200218701410f21880141bc9dc20021890141b59ec200218a0141f89ec200218b014110218c0141889fc200218d0141cb9ec200218e014111218f0141989fc20021900141a09ec2002191014115219201411c21930141002194010c330b209b0122072097016a219b01024020072802042201450d00024020072098016a2802002202450d0020022098016c21020340024020012802002205450d0020012095016a280200450d002005101d0b20012098016a21012002209a016a22020d000b0b20072099016a280200450d0020072095016a280200101d0b209b01209601470d1d0c490b41132123418783c00021010c490b412a2123419a83c00021010c480b0240024002400240024002400240024002400240024002400240206a206b460d0041b884c000211b412d2123206a280208206c470d070240206a2802002201206d460d002001206d206c10d0030d080b206a20696a211e0240024002400240024002400240024002400240024002400240024002400240024002400240206a2d001822010d00418b85c000211b413621232066206a28021c22014d0d1a20672001206e746a221f450d1a206a28020c2101024002400240024002400240024002400240024002400240206a2802142202206c470d0041e584c000211b412621232001206f460d262001206f206c10d003450d26206f2001206c10d0030d262070101f2207450d33200720683a0000201f2d000c2071470d1e201f2802082070470d1e201f280200210f41002101034020010d02200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c1f0b0b41e584c000211b41262123200220736a220220744b0d25024020020e0f000926070508040602030b2626260a000b024020012075460d0020752001207610d0030d260b201f2d000c2071470d25201f2802080d25201e216a201f20726a2d0000206e460d4a0c250b201f20726a2d000021012007101d201e216a2001206e460d580c240b2001208701460d0a208701200120880110d003450d0a2001208901460d14208901200120880110d003450d1402402001208a01460d00208a01200120880110d0030d240b201f2d000c2071470d23201f2802080d23201e216a201f20726a2d0000206e460d520c230b2001208b01460d0a208b012001208c0110d003450d0a02402001208d01460d00208d012001208c0110d0030d230b206c101f2207450d32200720683a0002200720683b0000201f2d000c2071470d23201f280208206c470d23201f280200210f4100210103402001207d4b0d16200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c240b0b02402001208401460d002084012001207210d0030d220b201f2d000c2071470d21201f2802080d21201e216a201f20726a2d0000206e460d490c210b2001207f460d09207f200120800110d003450d0902402001208101460d00208101200120800110d0030d210b201f2d000c2071470d20201f2802080d20201e216a201f20726a2d0000206e460d490c200b2001208501460d092085012001207410d003450d0902402001208601460d002086012001207410d0030d200b206c101f2207450d32200720683a0002200720683b0000201f2d000c2071470d21201f280208206c470d21201f280200210f4100210103402001207d4b0d14200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c220b0b2001207a460d09207a2001207b10d003450d092001207c460d10207c2001207b10d003450d1002402001207e460d00207e2001207b10d0030d1f0b201f2d000c2071470d1e201f2802080d1e201e216a201f20726a2d0000206e460d490c1e0b02402001208201460d00208201200120830110d0030d1e0b201f2d000c2071470d1d201f2802080d1d201e216a201f20726a2d0000206e460d440c1d0b024020012077460d0020012900002079520d1d0b2076101f2207450d3220072068360003200720703a0002200720683b0000201f2d000c2071470d16201f2802082076470d16201f280200210f410021010340200120784b0d0a200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c170b0b02402001209101460d00209101200120920110d0030d1c0b201f2d000c2071470d1b201f2802080d1b201e216a201f20726a2d0000206e460d410c1b0b2001208e01460d06208e012001208f0110d003450d0602402001209001460d002090012001208f0110d0030d1b0b207d101f2207450d28200720683b0000201f2d000c2071470d19201f280208207d470d19201f280200210f410021010340200120704b0d10200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c1a0b0b02402001207d470d00206a2093016a2194010b201e216a410621010c610b206e101f2207450d2a20072068360000201f2d000c2071470d15201f280208206e470d15201f280200210f4100210103402001206c4b0d07200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c160b0b201f2d000c2071470d17201f2802080d17201f20726a2d00002201206e460d17201e216a2001206e72206e460d4a0c170b201f2d000c2071470d16201f2802080d16201e216a201f20726a2d0000206e460d400c160b201f2d000c2071470d15201f2802080d15201f20726a2d00002201206e460d15201e216a2001206e72206e460d370c150b2076101f2207450d2920072068360003200720703a0002200720683b0000201f2d000c2071470d0f201f2802082076470d0f201f280200210f410021010340200120784b0d04200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c100b0b207d101f2207450d22200720683b0000201f2d000c2071470d0f201f280208207d470d0f201f280200210f410021010340200120704b0d04200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c100b0b201f20726a2d00002201206e460d0c2007101d201e216a2001206e72206e460d400c120b201f20726a2d000021012007101d201e216a2001206e460d420c110b201f20726a2d00002201206e460d0b2007101d201e216a2001206e72206e460d3d0c100b201f20726a2d000021012007101d201e216a2001206e460d330c0f0b2070101f2207450d1f200720683a0000201f2d000c2071470d15201f2802082070470d15201f280200210f41002101034020010d05200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c160b0b207d101f2207450d21200720683b0000201f2d000c2071470d15201f280208207d470d15201f280200210f410021010340200120704b0d05200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c160b0b201f20726a2d000021012007101d201e216a2001206e460d3e0c0c0b201f20726a2d000021012007101d201e216a2001206e460d2c0c0b0b201f20726a2d000021012007101d201e216a2001206e460d2d0c0a0b201f20726a2d00002201206e460d102007101d201e216a2001206e72206e460d390c090b201f20726a2d000021012007101d201e216a2001206e460d340c080b2007101d200041e584c0003602040c550b209401450d04209401280204450d09209401280200229c01209401280208229d014d0d0a200041c185c00036020441c90021230c540b2007101d200041e584c0003602040c530b2007101d200041e584c0003602040c520b2007101d200041e584c0003602040c510b2007101d200041e584c0003602040c500b4100219c014100219d010c060b2007101d0b2000201b3602040c4d0b2007101d200041e584c0003602040c4c0b2007101d200041e584c0003602040c4b0b200041cb86c000360204413221230c4a0b209d0120032802484d0d002000418a86c00036020441c10021230c490b200441b0036a41086a22024200370300200441f0c0c1003602b403200420032903083e02c003200420032903103e02b003200441b0036a4104722201410d10462001410c10462001410710462001410f1046200441d8006a20042802c003360200200441c8006a41086a2002290300370300200420042903b003370348200a450d11200441b0036a410c6a20293702002004200a3602b80320042028428080808010843703b003200441e0006a200441b0036a10474101101f2201450d12200141003a0000200420042f01b0033b01a002200441c0036a41e0083b0100200441b8036a428180808010370300200420013602b403200441013602b003200420042f01a0023b01c203200441e0006a200441b0036a1048219e014103101f2202450d13200241026a41002d00e1a3423a0000200241002f00dfa3423b00004103101f2205450d14200541026a41002d00e4a3423a0000200541002f00e2a3423b0000200441a0026a41026a229f01200441b0036a41026a22a0012d00003a0000200420042f00b0033b01a002200441f4006a22a1012802002107200441e0006a41106a280200210120a001209f012d00003a0000200420042f01a0023b01b00320072001470d05200141016a22072001490d432001410174229f0120072007209f01491b229f01ad42287e2227422088a70d432027a722074100480d432001450d03200441ec006a280200200141286c2007101e2201450d060c040b20a2012d000020a8016a220120a9014b0d32024002400240024020010e0400030102000b20a20128020c2201450d35200120aa016c210220a20128020420ab016a210103400240200120ac016a2802000d002001280200220520a101490d0020012005209e016a3602000b200120aa016a2101200220ad016a22020d000c360b0b20a20128020c2201450d3420a20128020422c001200120ae016c6a21c101410021010c330b20a20128020c2201450d3320a20128020422c201200120b0016c6a21c3010c310b20a201280204220120a101490d3220a201209f016a2001209e016a36020020a20120a4016a22a20120a501470d2f0c330b2007101d200041e584c0003602040c460b2007101d200041e584c0003602040c450b2007101f2201450d020b200441f0006a209f01360200200441ec006a2001360200200441f4006a28020021070b200441ec006a280200200741286c6a220141003a00182001200536020c200142838080803037020420012002360200200141106a4283808080303702002001411b6a200441b2036a2d00003a0000200141196a20042f01b0033b00002001411c6a209e0136020020a10120a10128020041016a360200200441b0036a200441e0006a418c0110ce031a200441f0016a200441b0036a1049200441f0016a41106a280200229f01412c6c210120042802f80122a20141586a210202400340410021052001450d01200141546a2101200241286a21072002412c6a22a101210220072d00004103470d000b20a10141086a2802002201450d00200141286c210220a10128020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b209f01412c6c210120a20141586a21022005417f6a21a10102400340410021052001450d01200141546a2101200241286a21072002412c6a229e01210220072d00004103470d000b209e0141086a2802002201450d00200141286c2102209e0128020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b209f01412c6c210120a20141606a21020240024003402001450d01200141546a2101200241206a21072002412c6a229e01210220072d00004104470d000b209e012802002101209f010d010c310b41002101209f01450d300b200120056a21a301412c21a40120a201209f01412c6c6a21a5014104219f01200441c8006a41047221a601410021a701417821a801410321a901411421aa01411021ab01417c21ac014101219e01416c21ad01411c21ae01410221af01411821b001410c21b101410821b20142808080801021b301412d21b40142202127417f21b501410b21a001417021b601417e21b70141ec0021b801420321b901420221ba0141ff0121bb01410521bc01410621bd01410021be01410021bf01410721010c3c0b200741041020000b410141011020000b410241011020000b410241011020000b410341011020000b410141011020000b410441011020000b410341011020000b410241011020000b410741011020000b410741011020000b418284c0004136103a000b410141011020000b410341011020000b410341011020000b410021010c2c0b410121010c2b0b410221010c2a0b410321010c290b410421010c280b410521010c270b410621010c260b410621010c250b410621010c240b410621010c230b410621010c220b410621010c210b410621010c200b410621010c1f0b410621010c1e0b410621010c1d0b410621010c1c0b410621010c1b0b410621010c1a0b410621010c190b410621010c180b410621010c170b410621010c160b410621010c150b410621010c140b410621010c130b410621010c120b410721010c110b410121010b034002400240024002400240024002400240024020010e020001010b20c001220120ae016a21c001024020012802182202450d0020012802102101200220af01742102034002402001280200220520a101490d0020012005209e016a3602000b2001209f016a2101200220ac016a22020d000b0b20c00120c101470d010c090b20bf012111024020c201280214209f01742202450d0020c20128020c21010340024020012d000020a001470d002001209f016a2205280200220720a101490d0020052007209e016a3602000b200120ab016a2101200220b6016a22020d000b0b20b201101f2201450d02200120b301370200209f01101f221c450d0120c20120b1016a2105201c20a70136020020c20120aa016a22102802002224450d0341002102410121234101210f4101211b41012107024002400240024041002024221f4f0d00024003402002209e016a211f0240024002400240024002400240024020052802002002209f01746a2d0000220220b7016a20a9014f0d002002104a21c401200441c8006a20b2016a28020021c50120a60121c6010c010b0240024002400240024002400240200220bc01460d00200220bd01470d012007450d0f200720b5016a21070c0a0b2007450d0e2023200f470d012023209e016a22022023490d2b2023209e0174221e20022002201e491b221ead20b901862226202788a70d2b2026a7220220a701480d2b2023450d022001202320a901742002101e22010d030c040b2002104a21c701200441c8006a20b2016a28020021c80120a60121c9010c060b2023211e0c010b2002101f2201450d010b2001200f20a901746a2202209e013602042002201f360200024002400240201b200720b5016a2223470d00201b209e01742202200720072002491b2219ad20ba01862226202788a70d2a2026a7220220a701480d2a201b450d01201c201b20af01742002101e221c0d020c040b201b21190c010b2002101f221c450d020b200f209e016a2102201c202320af01746a200f360200201f20244f0d130c080b200241041020000b200241041020000b410021020c010b410121020b0240024003400240024020020e020001010b20c601280200221920b2016a21bf0120192f0106211e410021020240024002400340201e2002460d0120a70120b501209e0120bf0120026a2d0000221a20c40120bb0171221d4b1b201a201d461b221a450d022002209e016a2102201a209e01460d000b200220b5016a211e0b024020c501450d0020c50120b5016a21c5012019201e20af01746a20b8016a21c601410021020c040b200441c8006a211e200720b5016a22022007490d010c0b0b200441c8006a211e02402019200220a901746a20aa016a2202450d0020022802002219209e01460d0b201920af01470d002002209f016a211e0b200720b5016a220220074f0d0a0b200220074b0d09200f201c200220af01746a28020022024d0d092001200220a901746a22192802042202201e2802006a221e2002490d092019209f016a201e36020002402023200f470d002023209e016a22022023490d272023209e0174221e20022002201e491b221ead20b901862226202788a70d272026a7220220a701480d272023450d062001202320a901742002101e22010d070c0c0b2023211e0c060b20c901280200221920b2016a21bf0120192f0106211e4100210202400340201e2002460d0120a70120b501209e0120bf0120026a2d0000221a20c70120bb0171221d4b1b201a201d461b221a450d032002209e016a2102201a209e01460d000b200220b5016a211e0b024020c801450d0020c80120b5016a21c8012019201e20af01746a20b8016a21c901410121020c010b0b200441c8006a211e200720b5016a22022007490d010c070b200441c8006a211e02402019200220a901746a20aa016a2202450d0020022802002219209e01460d07201920af01470d002002209f016a211e0b200720b5016a220220074f0d060b200220074b0d05200f201c200220af01746a28020022024d0d052001200220a901746a22192802042202201e2802006a221e2002490d052019209f016a201e3602000b2023211e200f2102201b2119201f2024490d020c0d0b2002101f2201450d050b2001200f20a901746a2202209e013602042002201f360200024002400240201b2007470d00201b209e016a2202201b490d22201b209e01742223200220022023491b2219ad20ba01862226202788a70d222026a7220220a701480d22201b450d01201c201b20af01742002101e221c0d020c080b201b21190c010b2002101f221c450d060b200f209e016a2102201c200720af01746a200f3602002007209e016a2107201f20244f0d0b0b201e21232002210f2019211b201f22022010280200221f490d000c020b0b02402023450d002001101d0b410121be010240201b450d00201c101d201121bf0120a20120a4016a22a20120a501470d040c0e0b201121bf010c0c0b41a0aec4002002201f104b000b200241041020000b200241041020000b410721010c170b410021010c060b410441041020000b410841041020000b200120b2016a210f410121194101211e0c010b2002450d012001200220a901746a210f0b2001212341012102034020012902002126200420b4013a00b003200420262027883e02b403200520022026a76a220720b5016a200441b0036a104c200420a0013a00b003200420a1013602b40320052007200441b0036a104c200220af016a2102200f200120b2016a2201470d000b202321010b0240201e450d002001101d0b02402019450d00201c101d0b20c20120b0016a21c20102400240200441c8006a20ab016a280200450d0020102802002202450d00200528020021012002209f01742102410021050340024020012d000020a401470d00200120a0013a00002001209f016a20a3013602002005209e016a21050b200120ab016a2101200220b6016a22020d000b410121bf0120050d010b201121bf010b20c20120c301460d01410121010c000b0b20a20120a4016a22a20120a501470d0d0b024020be01410171450d0020042802f8012109200441fc016a2902002227a7210202402027422088a72201450d002001412c6c2108200921010340200110452001412c6a2101200841546a22080d000b0b02402002450d002009101d0b200428024c200441d0006a280200200441d4006a280200104d200041fd86c000360204411a21010c030b024020bf01410171450d00200441b0036a41106a200441f0016a41106a280200360200200441b0036a41086a200441f0016a41086a290300370300200420042903f0013703b003200441a0026a200441b0036a10474110101f2208450d08200841063a00004101101f2201450d09200141003a00004101101f2202450d0a200220012d00003a00002001101d4110101f2209450d0b200941063a000041f000101f2201450d0c200141063a00602001412c3b0150200120a1013602442001410b3a0040200141d8003a00302001412d3a0020200141003602142001410f3a0010200141003602042001410f3a00002001200441d8006a280200360224024020092d00004109470d00200928020841ffffffff0371450d002009280204101d0b2009101d024020082d00004109470d00200828020841ffffffff0371450d002008280204101d0b2008101d200441d4036a4287808080f000370200200441d0036a2001360200200441cc036a4100360200200441b0036a410c6a4281808080800c370200200441b8036a4101360200200441003602dc03200442043702c403200420023602b403200441013602b003200441a0026a200441b0036a104e200441b0036a200441a0026a418c0110ce031a20044188026a200441b0036a104920044188026a410c6a290200212720042802900221a201200428028c02210120042802880221080c020b20042802f80121a2010b200441fc016a290200212720042802f401210120042802f00121080b200428024c200441d0006a280200200441c8006a410c6a280200104d20a201450d02200441a0026a410c6a2027370200200420a2013602a80220042001ad4220862008ad843703a002200441b0036a200441a0026a2003280244104f20042802b0034101470d010240200441b8036a280200450d0020042802b403101d0b2000419787c000360204412321010b20004101360200200041086a2001360200200441c0046a24000f0b200441bc036a28020022a101450d01200441c0036a2903002127200441b8036a280200210220042802b403210920032802402161200441003602900220044201370388024104101f2201450d022004410436028c0220044190026a22082008280200220541046a3602002004200136028802200120056a2009360000024002400240200428028c022209200828020022016b41044f0d00200141046a22082001490d0d20094101742201200820082001491b22014100480d0d2009450d0120042802880220092001101e2208450d020c0e0b20042802880221080c0e0b2001101f22080d0c0b200141011020000b418284c0004136103a000b418284c0004136103a000b410441011020000b411041081020000b410141011020000b410141011020000b411041081020000b41f00041081020000b410721010c000b0b1021000b2004200136028c02200420083602880220044190026a28020021010b20044188026a41086a200141046a360200200820016a200236000020a1012027422088a72201412c6c22086a21022027a72164024002400240024002402001450d00200841546a2122200441b0036a4101722108200441b0036a41276a2105200441b0036a41206a210b200441b0036a41186a2107200441b0036a41106a2106200441b0036a41086a212120a1012101034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703b0032009410f460d02200441a0026a41276a22202005280000360000200441a0026a41206a220d200b290300370300200441a0026a41186a220e2007290300370300200441a0026a41106a22412006290300370300200441a0026a41086a22602021290300370300200420042903b0033703a002200820042903a002370000200841086a2060290300370000200841106a2041290300370000200841186a200e290300370000200841206a200d290300370000200841276a2020280000360000200420093a00b003200441e0006a200441b0036a20044188026a105020042d00602209411a470d05202241546a21222001412c6a22012002470d000b200222012002470d020c030b20a10122012002470d010c020b2001412c6a22012002460d010b200441b0036a4101722108200441b0036a41276a2105200441b0036a41206a210b200441b0036a41186a2107200441b0036a41106a2106200441b0036a41086a2121034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703b0032009410f460d01200441a0026a41276a22222005280000360000200441a0026a41206a2220200b290300370300200441a0026a41186a220d2007290300370300200441a0026a41106a220e2006290300370300200441a0026a41086a22412021290300370300200420042903b0033703a002200820042903a002370000200841086a2041290300370000200841106a200e290300370000200841186a200d290300370000200841206a2020290300370000200841276a2022280000360000200420093a00b003200441b0036a10452001412c6a22012002470d000b0b02402064450d0020a101101d0b20044188026a41086a280200210120042903880221272000411c6a41003a0000200041186a2001360200200041106a20273702002000410c6a209d01360200200041086a209c0136020020002061360204200041003602002000411d6a20042f00b0033b00002000411f6a200441b2036a2d00003a0000200441c0046a24000f0b200441e0006a41086a28020021612004280264215c02402022450d002001412c6a2101200441b0036a4101722108200441b0036a41276a210b200441b0036a41206a2107200441b0036a41186a2106200441b0036a41106a2121200441b0036a41086a2122034020012d00002105200b200141286a2800003600002007200141216a2900003703002006200141196a2900003703002021200141116a2900003703002022200141096a2900003703002004200141016a2900003703b0032005410f460d01200441a0026a41276a2220200b280000360000200441a0026a41206a220d2007290300370300200441a0026a41186a220e2006290300370300200441a0026a41106a22412021290300370300200441a0026a41086a22602022290300370300200420042903b0033703a002200820042903a002370000200841086a2060290300370000200841106a2041290300370000200841186a200e290300370000200841206a200d290300370000200841276a2020280000360000200420053a00b003200441b0036a10452001412c6a22012002470d000b0b02402064450d0020a101101d0b0240200428028c02450d00200428028802101d0b024020094105470d002061450d00205c101d0b200041ba87c00036020420004101360200200041086a4125360200200441c0046a24000f0b2020450d032021101d200b0d040c050b200020013602040b20004101360200200041086a2023360200200a450d0b0240202b450d00202b412c6c2108200a21010340200110452001412c6a2101200841546a22080d000b0b202a450d0b200a101d200441c0046a24000f0b2022450d002006101d0b200b450d010b200b412c6c210b200a21010340200110452001412c6a2101200b41546a220b0d000b0b200c450d04200a101d0c040b0240200b450d00200b412c6c2108200a21010340200110452001412c6a2101200841546a22080d000b0b41192108200c450d00200a101d0b0b0c010b410021090b200441b0026a2002360200200441ac026a2006360200200441013602a00220042007ad4220862005ad42ffff03834210862009ad42ff0183420886842008ad42ff018384843702a402200441a0026a4104722101200841ff01714105470d010b2001280208450d002001280204101d20042802a0020d0041002108200441ac026a280200220921010340200110452001412c6a2101200841546a22080d000b200441b0026a280200450d002009101d0b200041f182c00036020420004101360200200041086a41163602000b200441c0046a24000bf5d8012b0a7f027e027f017e027f017e387f027e107f017e0f7f027e067f017e117f027e0e7f017e0b7f027e107f027e177f027e177f017e067f017e017f017e027f017e017f017e1a7f017e097f017e0b7f017e0b7f017e277f230041d080046b22022400024002402001280204220320012802082204470d00200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022802bc8004210120022802b88004210520004101360200200041003a00042001450d012005101d0c010b200441016a210502400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d00002104200141086a2005360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004410b4b0d0002400240024002400240024002400240024002400240024020040e0c00070405020809060b030a01000b41002104200141086a21074100210803402004411f4b0d1820032005460d192005417f460d6a2003200541016a2209490d6b200620056a2d0000210a20072009360200200a41ff00712004411f71742008722108200441076a210420092105200a418001710d000b20044120490d36200a6741686a41ff017141044f0d36410d21010cb6010b200241206a2001105520022802204101470d0b20022802242201410876210b200241206a41086a290300220c422088210d200241306a280200210e0cc9010b200241206a2001105520022802204101470d0b200228022422054108762104200241206a41086a290300220d422088210c200241306a28020021010cc6010b200241206a2001105520022802204101470d0b20022802242201410876210f200241206a41086a2903002210422088210d200241306a28020021110cc3010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cc0010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cbd010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cba010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cb7010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cb4010b200241206a2001105520022802204101470d0b200228022422124108762101200241206a41086a2903002213422088210d200241306a28020021140cb1010b200241206a2001105520022802204101470d0b200228022422154108762101200241206a41086a290300220d422088210c200241306a28020021160cae010b200241206a2001105520022802204101470d0b200041013602002000200241206a41047222012902003702042000410c6a200141086a290200370200200241d080046a24000f0b200041123a000420004101360200200041056a20043a0000200241d080046a24000f0b200241186a200241346a280200360200200241106a2217200241206a410c6a290200370300200220022902243703084100210b410021014100211803402001411f4b0d0d20172802002203200241086a410c6a22192802002205460d1d200541016a21042005417f460d5f20032004490d60200228020820056a2d0000210520192004360200200541ff00712001411f71742018722118200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a4100210b410d211a0c0d0b200241c880046a200241346a280200360200200241c080046a22012002412c6a290200370300200220022902243703b88004200128020021044100210520022802c48004210120022802b8800421084100210903402005411f4b0d0e20042001460d1d2001417f460d602004200141016a220a490d61200820016a2d0000220341ff00712005411f71742009722109200541076a2105200a21012003418001710d000b200241c480046a200a36020020054120490d2a20036741686a41ff017141044f0d2a41002105410d210a0c0e0b200241c880046a200241346a280200360200200241c080046a221b200241206a410c6a290200370300200220022902243703b880044100210f410021014100211c03402001411f4b0d0f201b2802002203200241b880046a410c6a221d2802002205460d1d200541016a21042005417f460d6120032004490d6220022802b8800420056a2d00002105201d2004360200200541ff00712001411f7174201c72211c200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a4100210f410d211e0c0f0b200241c880046a200241346a280200360200200241c080046a221f200241206a410c6a290200370300200220022902243703b8800441002106410021014100212003402001411f4b0d10201f2802002203200241b880046a410c6a22212802002205460d1d200541016a21042005417f460d6220032004490d6320022802b8800420056a2d0000210520212004360200200541ff00712001411f71742020722120200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a410d21014100210a0cb3010b200241346a2802002122200241306a28020021012002412c6a2802002107200241286a28020021232002280224212441002121410021054100212503402005411f4b0d1020072001460d1d2001417f460d632007200141016a2226490d64202420016a2d0000220441ff00712005411f71742025722125200541076a2105202621012004418001710d000b20054120490d2a20046741686a41ff017141044f0d2a410d2101410021050cb0010b200241c880046a200241346a280200360200200241c080046a2227200241206a410c6a290200370300200220022902243703b8800441002128410021014100212903402001411f4b0d1020272802002203200241b880046a410c6a22212802002205460d1d200541016a21042005417f460d6420032004490d6520022802b8800420056a2d0000210520212004360200200541ff00712001411f71742029722129200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a410d21014100210a0cad010b200241346a280200212a200241306a28020021012002412c6a280200210a200241286a280200212b2002280224212c41002121410021054100212d03402005411f4b0d10200a2001460d1d2001417f460d65200a200141016a222e490d66202c20016a2d0000220441ff00712005411f7174202d72212d200541076a2105202e21012004418001710d000b20054120490d2a20046741686a41ff017141044f0d2a410d21014100210a0caa010b200241c880046a200241346a280200360200200241c080046a22012002412c6a290200370300200220022902243703b88004200128020021034100210520022802c48004210120022802b8800421084100210403402005411f4b0d1020032001460d1d2001417f460d662003200141016a220a490d67200820016a2d0000220941ff00712005411f71742004722104200541076a2105200a21012009418001710d000b200241c480046a200a36020020054120490d2a20096741686a41ff017141044f0d2a41002105410d21080c100b200241c880046a200241346a280200360200200241c080046a222f200241206a410c6a290200370300200220022902243703b8800441002130410021014100212103402001411f4b0d11202f2802002214200241b880046a410c6a22032802002205460d1d200541016a21042005417f460d6720142004490d6820022802b88004220620056a2d0000210520032004360200200541ff00712001411f71742021722121200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a410d2112410021310ca4010b200241346a2802002132200241306a28020021012002412c6a2802002108200241286a280200213320022802242134410021054100213503402005411f4b0d1120082001460d1d2001417f460d682008200141016a2209490d69203420016a2d0000220441ff00712005411f71742035722135200541076a2105200921012004418001710d000b20054120490d2a20046741686a41ff017141034b0d2a410d21150c110b200241346a2802002120200241306a28020021012002412c6a2802002104200241286a280200210720022802242108410021054100210303402005411f4b0d1220042001460d1e2001417f460d692004200141016a2209490d6a200820016a2d0000220a41ff00712005411f71742003722103200541076a210520092101200a418001710d000b024020054120490d00410d2101200a6741686a41ff017141034d0d1f0b2020200946210102402007450d002008101d0b2001450d2b410921050c9c010b410f21010c9e010b200241013a00a88004200241346a41013602002002410136020c2002420137022420024190afc4003602202002200241a880046a3602082002200241086a360230200241b880046a200241206a102820022802c08004210520022903b88004210d410521010c9d010b410f211a0b41002136410021370cae010b200241c480046a200136020041002105410f210a0b41002108410021070caa010b410f211e0b41002138410021390ca6010b410f21014100210a0ca3010b410f2101410021050ca0010b410f21014100210a0c9d010b410f21014100210a0c9a010b200241c480046a200136020041002105410f21080b41002107410021200c96010b410f2112410021310c93010b410f21150b0c0b0b410f21010c0c0b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7213620022802c08004210e200da721374105211a4100210b0c9f010b200241c480046a2004360200200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7210820022802102101200da721074105210a410021050c9c010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7213820022802102111200da721394105211e4100210f0c99010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7210620022802102104200da7210a410521010c96010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7212120022802c080042104200da72105410521010c93010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7212820022802102104200da7210a410521010c90010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7212120022802c080042104200da7210a410521010c8d010b200241c480046a2003360200200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7210720022802102104200da7212041052108410021050c8a010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7213020022802102114200da72131410521120c87010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022802c08004211620022903b88004210d410521150b200d422088a7213a200da7213b0c83010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a1028410521010b2000200136020420004101360200200041086a20022902b88004370200200041106a200241b880046a41086a2802003602002007450d95012008101d200241d080046a24000f0b4100210a200241206a41004180800110cd031a41012125410021074100210402402008450d00200141086a211c200141046a211841012125410021074100210341002109034020182802002229201c28020022046b200820096b220541808001200541808001491b2205490d0c200420056a22202004490d4c20292020490d4d200241206a200128020020046a200510ce031a201c20203602000240024002400240200720036b20054f0d00200320056a22042003490d6b20074101742220200420042020491b22204100480d6b2007450d01202520072020101e22250d020c530b200520036a21040c020b2020101f2225450d510b202021070b202520036a200241206a200510ce031a200421032008200520096a22094b0d000b0b41002101410021050340410021082001411f4b0d0d2004200a460d0e2004200a4d0d4d2025200a6a2d0000220341ff00712001411f71742005722105200141076a2101200a41016a2209210a2003418001710d000b20014120490d1b20036741686a41ff017141044f0d1b410d21014100210a0c7d0b2018450d0d4100213c4104213d4101213e411f213f410c2140200241086a410c6a214141082142200241086a41086a2143417f214441ff002145410721464180012147416821484120214941ff01214a41808004214b421c214c4220214d411c214e4110214f410321504118215141142152410421034100211741002119410021210c590b2009450d0d41042103200241b880046a410c6a21294108211c410021204100212502402004200a460d000340200a41016a2101200a417f460d4f20042001490d502008200a6a2c000021052029200136020020054100480d1c4107210a200541c00071450d1d200541807f7222054170470d1f200241206a200241b880046a105620022f002520022d002741107472210520022d0024210a20022802204101460d1e200241206a410c6a2802002104200241206a41086a280200210802400240024020252020470d0020204101742201202041016a220720072001491b2207ad420c7e220d422088a70d68200da722014100480d682020450d0120032020410c6c2001101e22030d020c5a0b202021070c010b2001101f2203450d580b2003201c6a220120043602002001417b6a200541ffffff077122054110763a0000200141796a20053b00002001417c6a2008360200200141786a200a3a0000202541016a220120094f0d20201c410c6a211c20022802b8800421082007212020012125200241b880046a41086a28020022042029280200220a470d000b0b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200241106a2802002101200228020c2108200228020821074105210a0c1d0b201c450d0d4100215f4104216041012161411f2162410c2163200241b880046a410c6a216441082165200241b880046a41086a2166417f216741ff00216841072169418001216a4168216b4120216c41ff01216d421c216e4220216f411c2170411021714103217241182173411421744102217542022176417c2177410421034100211b4100211d410121210c580b2020450d0d41042178410021794101217a410c217b200241206a410c6a217c4108217d200241206a41086a217e417f217f4103218001411f21810141ff0021820141072183014180012184014168218501412021860141ff01218701422821880142202189014128218a01411c218b01411a218c014119218d014118218e014114218f014110219001410221910141c00021920141807f219301417021940141fc012195014100211f4104210341002196014100219701410221210c580b410421032025450d0d41002199014101219a01411f219b01417f219c0141ff00219d014107219e01418001219f01416821a001412021a10141ff0121a201410321a301420221a401422021a501410221a601410021a701410021a801410321210c580b2029450d0d410421a901410021aa01410121ab01410c21ac01410821ad01417f21ae01410321af01411f212841ff0021b001410721b10141800121b201416821b301412021b40141ff0121b501421421b601422021b701411421b8014100212741042103410021b901410021ba01410421210c580b202d450d0d410021bb014100200a6b21bc01410421bd01410121be01417f21bf0141e00021c001410321c101411f21c20141ff0021c301410721c40141800121c501416821c601412021c70141ff0121c801411021c901410821ca0141c00021cb0141807f21cc0141fb0121cd014180807c21ce01420421cf01422021d001410221d101410021d20141042103410021d301410021d401410521210c580b2004450d0d200241206a410c6a2129200241206a41086a21184100212541002109410021014100211c410421030340200241206a200241b880046a105620022f002520022d0027411074722105202928020021072018280200212020022d0024210820022802204101460d13200141016a210a02402001201c470d002025200a200a2025491b221cad420c7e220d422088a70d5f200da7222d4100480d5f02402001450d0020032009202d101e22030d010c490b202d101f2203450d480b200320096a220120083a0000200141036a20054110763a0000200141016a20053b0000200141086a2007360200200141046a2020360200202541026a21252009410c6a2109200a2101200a2004490d000c0f0b0b2021450d0e200241b880046a410c6a215c200241206a41086a215b4100215941002158410021544100212f41042153410421d60141042103024020142004460d000340200441016a21052004417f460d4a20142005490d4b200620046a2c00002101205c200536020020014100480d1b41062112200141c00071450d1c200141807f72225d41ff017141fc01490d1e20142005460d1f200441026a21042005417f460d4e20142004490d4f200620056a2d00002101410c2112200241b880046a410c6a20043602004100210402402001450d0020014101470d2241800221040b200241206a200241b880046a1025200241206a410c6a2802002130205b28020021312002280224211220022802204101460d22205441016a210502402054202f470d002059200520052059491b222fad420486225e422088a70d5f205ea722014100480d5f024002402054450d00205320582001101e22530d010c540b2001101f2253450d530b205321d601205321030b200320586a220120123602002001410c6a205a4180807c71205d417f7341ff017172200472225a360200200141086a2030360200200141046a2031360200200520214f0d24205941026a2159205841106a215820022802b88004210620052154200241b880046a41086a2802002214205c2802002204470d000b0b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10280c1e0b2035450d0e200241296a21d701410021d801410421d901410121da01411f21db01417f21dc0141ff0021dd01410721de0141800121df01416821e001412021e10141ff0121e2014180800121e301411021e401200241086a41106a21e501410c21e601200241086a410c6a21e701422021e801410221e901410821ea01200241206a41086a21eb01410621ec01411421ed01200241206a41146a21ee01420421ef01410321f001421821f101411821f201417e21f301420321f401410121f501420121f6014190afc40021f70141c00021f80141807f21f90141fb0121fa014180807c21fb0141042103410021fc01410021fd01410621210c560b200241013a00a88004200241cc80046a410136020020024101360204200242013702bc800420024190afc4003602b880042002200241a880046a360200200220023602c88004200241086a200241b880046a1028200228021021052002290308210d4105210120070d730c740b20024103410220011b3a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a10282002412b6a200241c080046a280200360000200220022903b88004370023200041053a000420004101360200200020022900203700052000410c6a200241276a290000370000200241d080046a24000f0b410f21014100210a0c700b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7210820022802c080042105200da7210a410521010c6f0b410021174104210341002119410021010c550b4100210741042103410021050c110b4100211b410421034100211d410121010c530b410021960141042103410021010c690b410021a701410021a8010c670b410021b90141042103410021010c650b410021d30141042103410021590c630b410421034100210a4100211c0b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b2001450d02200aad422086201cad84210d410621050c650b41042103410021054100212f0c4b0b410021fc0141042103410021fd01410221010c4b0b20024103410220011b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088210c200228021021044105210141002105201c450d6b2003101d0c6b0b200241306a2802002104201c450d692003101d0c690b2005450d08200241206a410041800810cd031a410121294100210a41002103410021200340200420096b200520206b22014180082001418008491b2201490d0f200920016a221c2009490d382004201c490d39200241206a202520096a200110ce031a0240024002400240200a20036b20014f0d00200320016a22082003490d4e200a4101742209200820082009491b22094100480d4e200a450d012029200a2009101e22290d020c420b200120036a21080c020b2009101f2229450d400b2009210a0b202920036a200241206a200110ce031a201c2109200821032005200120206a22204b0d000b200241206a20292008105720022802204101470d1041082101200a450d132029101d0c610b4118210a0b0c010b20054180feff07714108762104200241306a28020021012002412c6a2802002108200241206a41086a28020021070b2004410874200541ff01717221052020450d702003101d0c700b202541016a21050b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b02402001450d002005ad4220862007ad84210d410521050c5b0b20024103410220011b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088210c2002280210210141052105410021042007450d6f2003101d0c6f0b411821120b0c040b4100210341012129410021084100210a20042009490d080c3d0b205d21010c020b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10280b20022802102114200228020c213020022802082131410521120b200141ff017141087420127221122054450d450c380b200241306a280200211420540d370c440b200241013a00a88004200241cc80046a410136020020024101360204200242013702bc800420024190afc4003602b880042002200241a880046a360200200220023602c88004200241086a200241b880046a10282002290308220d422088a7210820022802102105200da7210441052101200a450d032029101d2004210a0c520b205441016a21050c370b202941087621032004201c22094f0d350b20092004102a000b2004210a0c4e0b0c4d0b417f2005102a000b20052003102b000b417f200541016a102a000b200541016a2003102b000b417f2004102a000b20042003102b000b417f200141016a102a000b200141016a2004102b000b417f2004102a000b20042003102b000b417f2004102a000b20042003102b000b417f200141016a102a000b200141016a2007102b000b417f2004102a000b20042003102b000b417f200141016a102a000b200141016a200a102b000b417f200141016a102a000b200141016a2003102b000b417f2004102a000b20042014102b000b417f200141016a102a000b200141016a2008102b000b417f200141016a102a000b200141016a2004102b000b20042020102a000b20202029102b000b200a41016a2004102b000b202041011020000b202d41041020000b417f2001102a000b20012004102b000b417f2005102a000b20052014102b000b2009201c102a000b201c2004102b000b417f2004102a000b20042014102b000b200141041020000b200141041020000b200941011020000b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b200320586a21be02411021bf02410421c002410921c102410821c20241ffffffff0321c302417021c402410c2121410321010c020b0240200420096b2205417f4c0d00024002402005450d002005101f22010d01200541011020000b410121010b2008ad422086210d200aad210c2001202520096a200510ce031a2005ad2210422086211302402007450d002025101d0b200d200c84210d2013201084210c2003410874202941ff0171722103410121050c1a0b102e000b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b02402001450d002005ad422086202fad84210d410721050c190b20024103410220011b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a1028422021910220022903082113200228021021142005450d124104219202200320054104746a21930241102194024109219502410821960241ffffffff032197024170219802200321990241082121410321010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010206060b200241146a28020020022802184621010240200228020c450d002002280208101d0b2001450d032019ad4220862017ad84210d410c21050cdf010b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b2001450d01201dad422086201bad84210d410a21050cde010b2009203246210102402033450d002034101d0b2001450d0220fd01ad42208620fc01ad84210d410b21050cdd010b20024103410220011b3a00a880044114219a02200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10284220219b022002290308211020022802102111201d450d03411c219c022003201d411c6c6a219d02410c219e024108219f02410421a002411021a102410921a20241ffffffff0321a302417021a402200321a502410921210cb9010b20024103410220011b3a00a88004411421a602200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241b880046a200241206a1028422021a70220022903b88004210c20022802c08004210e2019450d04411c21a80220032019411c6c6a21a902410c21aa02410821ab02410421ac02411021ad02410921ae0241ffffffff0321af02417021b002200321b102410a21210cba010b20024103410220011b3a0008411421b202200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a1028422021b30220022903b88004210d20022802c08004211620fd01450d05411821b402200320fd0141186c6a21b502410421b602411021b702410c21b802410921b902410821ba0241ffffffff0321bb02417021bc02200321bd02410b21210cbb010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024020210e0f000102030405060b0d1416181c202c2c0b20192253203e6a2119410021014100210603404100210b2001203f4b0d0c2043280200225420412802002205460d0e2005203e6a210420052044460d7420542004490d75200228020820056a2d000021052041200436020020052045712001203f71742006722106200120466a210120052047710d000b024020012049490d0020056720486a204a71203d490d530b200241206a200241086a10252002280220203e460d53200241206a20406a2802002155200241206a20426a280200215620022802242157410021054100215803402005203f4b0d1d2043280200225420412802002204460d1f2004203e6a210120042044460d840120542001490d85012002280208225920046a2d000021042041200136020020042045712005203f71742058722158200520466a210520042047710d000b024020052049490d0020046720486a204a71203d490d5e0b4100215a200241206a4100204b10cd031a024002402058450d004100215a4101215b410021044100215c0340205420016b2058205c6b2205204b2005204b491b2205490d3d200120056a225d2001490d9b012054205d490d9c01200241206a205920016a200510ce031a2041205d3602000240024002400240205a20046b20054f0d00200420056a225d2004490ddd01205a203e742201205d205d2001491b2201203c480ddd01205a450d01205b205a2001101e225b0d020ca1010b200520046a215d0c020b2001101f225b450d9f010b2001215a0b205b20046a200241206a200510ce031a20582005205c6a225c4d0d02204128020021012043280200215420022802082159205d21040c000b0b4101215b4100215d0b024020172053470d002017203e7422012017203e6a220520052001491b2205ad204c7e225e204d88a70dd701205ea72201203c480dd701024002402017450d0020032017204e6c2001101e22030d010ca3010b2001101f2203450da2010b200521170b20032053204e6c6a2201200620427622053b00012001205b36021020012057360204200120063a0000200120506a2005204f763a0000200120516a205d360200200120526a205a360200200120406a2055360200200120426a205636020020192018490dae010cbd010b201d225820616a211d410021014100210603404100210f200120624b0d072066280200225420642802002205460d09200520616a210420052067460d7120542004490d7220022802b8800420056a2d000021052064200436020020052068712001206271742006722106200120696a21012005206a710d000b02402001206c490d00200567206b6a206d712060490d4b0b200241206a200241b880046a102520022802202061460d4b200241206a20636a2201280200215c200241206a20656a2205280200215d2002280224215a200241206a200241b880046a102920022802202061460d4c200528020021532002280224215902400240024020012802002201450d0020012075742204207575225bad207686225e206f88a70dd801205ea72201205f480dd8012001101f2254450d9d01200420776a21552054210120592105034020012005280200360200200120606a2101200520606a2105200420776a22040d000b205520757620616a21052053450d020c010b4100215b41042154410021052053450d010b2059101d0b0240201b2058470d00201b2061742201201b20616a220420042001491b2204ad206e7e225e206f88a70dd601205ea72201205f480dd60102400240201b450d002003201b20706c2001101e22030d010c9e010b2001101f2203450d9d010b2004211b0b2003205820706c6a2201200620657622043b0001200120543602102001205a360204200120063a0000200120726a20042071763a0000200120736a2005360200200120746a205b360200200120636a205c360200200120656a205d360200201d201c490dae010cbd010b200241206a200241b880046a1058207c2802002106207e280200215d2002280224215b2002280220207a460d23200241206a200241b880046a1058207c2802002157207e2802002153200228022421552002280220207a460d24200241b880046a207d6a2802002204200241b880046a207b6a22592802002221460d252021207a6a21012021207f460d850120042001490d860120022802b88004225c20216a2d00002105205920013602004100215a20052080014b0d2602400240024002400240024020050e0400030102000b4100215a4100210541002121034020052081014b0d1d20042001460d1e2001207f460d7f20042001207a6a2258490d8001205c20016a2d000021542059205836020020542082017120052081017174202172212120052083016a2105205821012054208401710d000b4100215a02402005208601490d002054672085016a208701712078490d5b0b209601209701460d030c040b200241206a200241b880046a1056207e290300215e200228022421212002280220207a460d424102215a209601209701460d020c030b20042001460d4320212091016a21582001207f460da30120042058490da401205c20016a2c000021052059205836020020052079480d44200520920171450d38200520930172220520870171209501490d3820042058460d4820212080016a21012058207f460d9f0120042001490da0012005207f732154205c20586a2d00002105410c2121200241b880046a410c6a20013602004103215a4100210402402005450d002005207a470d4b410121040b209601209701460d010c020b20042001460d4120212091016a21052001207f460d900120042005490d9101205c20016a2c00002101205920053602002001207f4c0d44200120920171450d382001209301722201209401470d38200241206a200241b880046a1056207e290300215e200228022421212002280220207a460d484101215a209601209701470d010b209601207a742201209601207a6a220520052001491b2205ad2088017e22980120890188a70dd501209801a722012079480dd50102400240209601450d002003209601208a016c2001101e22030d010c93010b2001101f2203450d92010b20052196010b2003209701208a016c6a2201205536020c200120063602082001205d3602042001205b36020020012086016a205e3702002001208b016a20213602002001208c016a20043a00002001208d016a20543a00002001208e016a205a3a00002001208f016a205736020020012090016a2053360200201f208a016a211f209701207a6a220121970120012020490dae010cea010b20a7012206209a016a21a70120262101410021054100210403402005209b014b0d0420072001460d062001209c01460d6d20072001209a016a2226490d6e202420016a2d00002221209d01712005209b01717420047221042005209e016a2105202621012021209f01710d000b0240200520a101490d0020216720a0016a20a2017120a3014d0d480b024020a8012006470d002006209a0174220120a70120a7012001491b22a801ad20a40186225e20a50188a70dd401205ea72201209901480dd40102402006450d002003200620a601742001101e22030d010c9c010b2001101f2203450d9b010b2003200620a601746a200436020020a7012025490dae010ce8010b200241206a200241b880046a1058200228022020ab01460d2b200241206a20ad016a280200215a2002280224215d200241b880046a20ad016a2802002205200241b880046a20ac016a22212802002204460d2c200420ab016a2101200420ae01460d900120052001490d9101200241206a20ac016a280200215320022802b88004220620046a2d0000215c20212001360200205c20af014b0d2f02400240024002400240205c0e0400030102000b4100215c41002154410021040340205420284b0d1e20052001460d24200120ae01460d86012005200120ab016a2259490d8701200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4100215c205420b401490d0320586720b3016a20b5017120a9014f0d030c620b41002154410021040340205420284b0d1220052001460d21200120ae01460d89012005200120ab016a2259490d8a01200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4102215c205420b401490d0220586720b3016a20b5017120a9014f0d020c550b41002154410021040340205420284b0d1120052001460d21200120ae01460d7e2005200120ab016a2259490d7f200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4103215c205420b401490d0120586720b3016a20b5017120a9014f0d010c540b41002154410021040340205420284b0d1020052001460d1e200120ae01460d7b2005200120ab016a2259490d7c200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4101215c205420b401490d0020586720b3016a20b5017120a901490d530b200241a880046a20ad016a20043602002002205c3602ac8004200220533602a8800420022902ac8004215e024020b90120ba01470d0020b90120ab0174220120b90120ab016a220520052001491b2205ad20b6017e22980120b70188a70dd301209801a7220120aa01480dd3010240024020b901450d00200320b90120b8016c2001101e22030d010c92010b2001101f2203450d91010b200521b9010b200320ba0120b8016c6a2201205e37020c200120533602082001205a3602042001205d360200202720b8016a212720ba0120ab016a220121ba0120012029490dae010ce6010b200a202e460d34202e20be016a2101202e20bf01460d9101200a2001490d9201202c202e6a2d0000225820c001470d3820d40120be016a2159202e20c1016a210641002158410021054100212103402006212e200520c2014b0d0c200a2001460d0d200120bf01460d73200a200120be016a2204490d74202c20016a2d0000225420c30171200520c20171742021722121202e20be016a2106200520c4016a210520042101205420c501710d000b0240200520c701490d0020546720c6016a20c8017120bd01490d510b41002105024002402021450d0020bc0120046a2153202c20046a215b4101215a41002154410021014100215d0340205320016a450d30202e450da701200a202e490da801205b20016a2c0000225820bb01480d324106215c205820cb0171450d33205820cc0172225820c8017120cd014d0d33200120be016a210602402001205d470d002054200620062054491b225d20bb01480dd50102402001450d00205a2001205d101e225a0d010ca1010b205d101f225a450da0010b205a20016a205820bf01733a0000205420d1016a2154202e20be016a212e2006210120062021490d000b200420066a21040c010b4101215a410021064100215d0b205a20c9017620c901742253205a20ca017620c8017120ca0174225b72205a20c80171225a72215441002101034041002158200520c2014b0d28200a2004460d2a200420bf01460d8701200a200420be016a222e490d8801202c20046a2d0000222120c30171200520c20171742001722101200520c4016a2105202e2104202120c501710d000b0240200520c701490d0020216720c6016a20c8017120bd01490d620b024002400240200120be01460d0020010d654104210520d30120d401460d010c020b200a202e460d65202e20bf01460da801200a202e20be016a2201490da901202c202e6a2c0000225820bb01480d664106215c205820cb0171450d2a205820cc0172225820c8017120cd014d0d2a205820bf017321052001212e20d30120d401470d010b20d30120be0174220120d30120be016a220420042001491b2204ad20cf0186225e20d00188a70dd201205ea7220120bb01480dd2010240024020d301450d00200320d30120bd01742001101e22030d010cab010b2001101f2203450daa010b200421d3010b200320d40120bd01746a220120d50120ce0171200520c8017120ca01747220c0017222d50136020c200120063602082001205d3602042001205b205a7220537236020020d20120c9016a21d201205921d4012059202d490dae010ce4010b20fd01225d20da016a21fd0141002101410021040340200120db014b0d0920082009460d0a200920dc01460d702008200920da016a2205490d71203420096a2d0000220620dd0171200120db0171742004722104200120de016a210120052109200620df01710d000b0240200120e101490d0020066720e0016a20e2017120d901490d4f0b41002158200241206a410020e30110cd031a4101215a024002402004450d00410021544100215c410021590340200820056b200420596b220120e301200120e301491b2201490d21200520016a22092005490d7e20082009490d7f200241206a203420056a200110ce031a0240024002400240205c20546b20014f0d00205420016a22062054490dd701205c20da01742205200620062005491b220520d801480dd701205c450d01205a205c2005101e225a0d020c8e010b200120546a21060c020b2005101f225a450d8c010b2005215c0b205a20546a200241206a200110ce031a20092105200621542004200120596a22594b0d000c020b0b200521094100215c410021060b20e501200636020020e70141003602002002205a36020820022006ad20e80186205cad8437020c41002101410021590340200120db014b0d2420062058460d25205820dc01460d89012006205820da016a2204490d8a01205a20586a2d0000210520e7012004360200200520dd0171200120db0171742059722159200120de016a210120042158200520df01710d000b0240200120e101490d0020056720e0016a20e2017120d901490d5e0b4100215b024002402059450d004100215c410421554100215a0340205a225320da016a215a410021014100210602400240024002400340200120db014b0d01200241086a20ea016a280200225420e7012802002205460d02200520da016a2104200520dc01460d7b20542004490d7c2002280208225820056a2d0000211520e7012004360200201520dd0171200120db0171742006722106200120de016a2101201520df01710d000b02400240200120e101490d0020156720e0016a20e2017120f0014d0d010b0240024020542004470d00200220da013a00a8800420ee0120da01360200200220f501360204200241206a20e4016a2002360200200220f601370224200220f7013602202002200241a880046a360200200241b880046a200241206a1028200241b880046a20ea016a28020021fe0120022802bc800421ff0120022802b88004218002410521060c010b200520e9016a2101200420dc01460da70120542001490da801205820046a2c0000210520e701200136020002400240200520d801480d00200520f801710d01410621060c020b411821060c010b0240200520f90172220120e2017120fa014d0d00200620fb01712104200620ea01762105200120dc01732101410021540c060b41062106200121050b20800220ea0176218102410121544100210420ff0121820220fe0121830220800221010c040b203b2101203a218202410d21060c020b410f2106203b2101203a2182020c010b200220da013a00a8800420ee0120da01360200200220f501360204200241206a20e4016a2002360200200220f601370224200220f7013602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e20e80188a7218202200241b880046a20ea016a2802002116205ea72101410521060b200120ea017621810241012154410021052016218302410021042001213b208202213a0b2004200520e2017120ea017472200620e2017172211520540d3b0240205c2053470d00205c20da01742205205c20da016a220420042005491b2204ad20f40186225e20e80188a70dd401205ea7220520d801480dd40102400240205c450d002055205c20f001742005101e22550d010ca6010b2005101f2255450da5010b2004215c0b2055205320f001746a220520013a000420052015360200205a2059490d000c020b0b410421554100215c4100215a0b410121064108215641002101410021044100218402034020012105200241206a200241086a1026200228022020da01460d3a200241b880046a20e9016a220120d70120e9016a2d00003a0000200220d7012f00003b01b88004200241206a20e6016a2802002159200241206a20e4016a280200215820ee0128020021530240024020eb012d0000225420ec01470d00200620dc016a21060c010b205420f3016a20e9014b0d00200620da016a225720064f21850220572106208502450d540b200241206a20e9016a225720012d00003a0000200220022f01b880043b012002402004208402470d00200420da016a22012004490dd201205b20012001205b491b228402ad20ef0186225e20e80188a70dd201205ea7220120d801480dd20102402004450d00205620052001101e22560d010ca4010b2001101f2256450da3010b205620056a220120543a0000200120e6016a2053360200200120ea016a2058360200200120d9016a2059360200200120f0016a20572d00003a0000200120da016a20022f01203b0000205b20e9016a215b200520e4016a2101200420da016a210420060d000b20e70128020020e5012802004621010240200228020c450d002002280208101d0b2001450d64024020fc01205d470d0020fc0120da0174220120fc0120da016a220520052001491b2205ad20f1017e225e20e80188a70dd101205ea7220120d801480dd1010240024020fc01450d00200320fc0120f2016c2001101e22030d010ca5010b2001101f2203450da4010b200521fc010b2003205d20f2016c6a2201205636020c2001205a3602082001205c36020420012055360200200120ed016a2004360200200120e4016a20840236020020fd012035490dae010cb9010b410f210120a8010de1010cf4010b410f211e20580d480c490b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022802c08004210420022802bc8004212120022802b8800421054105210120a801450df2010cdf010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a10282002290308225e422088a72138200241106a2802002111205ea721394105211e0c440b02402090022088026a2802002205450d0020900228020421012005208b027421050340024020012d0000208d02470d0020012089026a280200208e0271450d002001208b026a280200101d0b2001208c026a21012005208f026a22050d000b0b02402090022089026a280200450d00209002208b026a280200101d0b2090022086026a21010240209002208a026a280200450d00209002280210101d0b20012190022001208702470daa010c460b410f211a20530d540c550b02402099022802082205450d00209902280200210120052092027421050340024020012d0000209502470d0020012096026a28020020970271450d0020012092026a280200101d0b20012094026a210120052098026a22050d000b0b2099022094026a210102402099022092026a280200450d00209902280200101d0b20012199022001209302470da9010cda010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a72136200241c080046a280200210e205ea721374105211a20530d520c530b410f2115205d0d5e0c5f0b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a7213a200241c080046a2802002116205ea7213b41052115205d0d5d0c5e0b410f215c0cc8010b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a102820022903b88004220d422088a72121200241c080046a2802002101200da7210a4105215c0cc7010b410f21014100215c0cc7010b024020a502209e026a2802002205450d0020a5022802042101200520a0027421050340024020012d000020a202470d002001209f026a28020020a30271450d00200120a0026a280200101d0b200120a1026a2101200520a4026a22050d000b0b024020a502209f026a280200450d0020a50220a0026a280200101d0b20a502209c026a2101024020a502209a026a280200450d0020a502280210101d0b200121a5022001209d02470da3010b2010209b0288210d410521014100210f201b450deb012003101d0ceb010b024020b10220aa026a2802002205450d0020b1022802042101200520ac027421050340024020012d000020ae02470d00200120ab026a28020020af0271450d00200120ac026a280200101d0b200120ad026a2101200520b0026a22050d000b0b024020b10220ab026a280200450d0020b10220ac026a280200101d0b20b10220a8026a2101024020b10220a6026a280200450d0020b102280210101d0b200121b102200120a902470da2010b200c20a70288210d410521014100210b2017450ded012003101d0ced010b024020bd0220b6026a280200450d0020bd02280200101d0b024020bd0220b2026a2802002205450d0020bd0228020c2101200520b6027421050340024020012d000020b902470d00200120ba026a28020020bb0271450d00200120b6026a280200101d0b200120b7026a2101200520bc026a22050d000b0b20bd0220b4026a2101024020bd0220b7026a280200450d0020bd0220b8026a280200101d0b200121bd02200120b502470da1010b200d20b30288210c410521154100210120fc01450dd9012003101d0cd9010b410f21210cc6010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200229020c210d2002280208210a410521214100215a0cc6010b024020032802082205450d0020032802002101200520c0027421050340024020012d000020c102470d00200120c2026a28020020c30271450d00200120c0026a280200101d0b200120bf026a2101200520c4026a22050d000b0b200320bf026a21010240200320c0026a280200450d002003280200101d0b2001210320be022001470d9e010cc3010b410f211a20550d410c420b410f21010cbc010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a72136200241c080046a280200210e205ea721374105211a0c1c0b024020cf0220c7026a2802002205450d0020cf022802042101200520ca027421050340024020012d000020cc02470d00200120c8026a28020020cd0271450d00200120ca026a280200101d0b200120cb026a2101200520ce026a22050d000b0b024020cf0220c8026a280200450d0020cf0220ca026a280200101d0b20cf0220c5026a2101024020cf0220c9026a280200450d0020cf02280210101d0b200121cf02200120c602470d9b010c410b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280c100b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280c0f0b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280c0e0b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a1028200229020c210d2002280208210a410521010cb6010b200241013a00a78004200241cc80046a410136020020024101360204200241c880046a2002360200200242013702bc800420024190afc4003602b880042002200241a780046a360200200241a880046a200241b880046a102820022903a88004225e422088a7213a200241b080046a2802002116205ea7213b41052115205c450d46205a101d205d0d480c490b200241306a2802002104205d210a205b21012097010dbf010cc0010b200241306a28020021042053210a2057210620552101205d0dbc010cbd010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200229020c210d2002280208210a410521214100215a410021040cba010b41092121410021040cb9010b410f2115200228020c0d3a0c3b0b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a7218202200241c080046a280200218302205ea7213b410521150c300b024020da0220d2026a280200450d0020da02280200101d0b024020da0220d3026a2802002205450d0020da0228020c2101200520d2027421050340024020012d000020d602470d00200120d7026a28020020d80271450d00200120d2026a280200101d0b200120d4026a2101200520d9026a22050d000b0b20da0220d0026a2101024020da0220d4026a280200450d0020da0220d5026a280200101d0b200121da02200120d102470d90010c420b410f215c0b205d0daf010cb0010b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c280046a2f01002105200241c180046a2d00002104200241c080046a2d0000210120022802bc8004212120022802b88004210a4105215c205d450daf010cae010b20022002412c6a2902003703a88004200241286a280200210a2002280224210120022802a88004212820022802ac8004210420ba010dab010cac010b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280b200229020c210d2002280208210a410521014100215c0ca8010b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c080046a280200210120022802bc8004212120022802b88004210a4105215c205d0d030ca6010b410a21010ca6010b4118215c0b205d450da3010b205a101d0ca2010b41062121410021040caa010b410721040c0c0b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c280046a2f01002105200241c180046a2d00002104200241c080046a2d0000210120022802bc8004212120022802b88004210a4105215c0ca4010b200241013a00a78004200241cc80046a410136020020024101360204200241c880046a2002360200200242013702bc800420024190afc4003602b880042002200241a780046a360200200241a880046a200241b880046a1028200241b080046a280200210e20022802ac8004213620022802a8800421374105211a205a0d010b2055450d230c220b205b101d20550d210c220b4117215c0ca0010b20810220ea0174200120e2017172213b205c0d1d0c1c0b200241306a2802002183022002412c6a280200218202200241286a280200213b200228022421152004450d1a0c190b200241206a41086a200241306a2802003602002021418080807871215a20214180807c712104202141087621050c97010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200241106a28020021052002290308215e410521040c040b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a102841052121200229020c210d2002280208210a410021040c9f010b41182121410021040c9e010b411821040b0b200141ff017141087420047221210c90010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200229020c210d2002280208210a41052121410021040c9a010b200241306a28020021050c8e010b4100215a0c98010b410d210120a8010d9d010cb0010b410d211e20580d040c050b2002280224221e410876210f200241306a28020021112002412c6a2802002138200241206a41086a280200213920580d030c040b2002280224211e200241206a41106a28020021112002412c6a2802002138200241206a41086a28020021390240205c450d00205c4104742105205a21010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a2101200541706a22050d000b0b201e410876210f205d0d010b2058450d020c010b205a101d2058450d010b411c21860220032058411c6c6a218702410c21880241082189024114218a024104218b024110218c024109218d0241ffffffff03218e024170218f022003219002410721210c760b201b450dad012003101d0cad010b410d211a20530d0d0c0e0b2002280224221a410876210b200241306a280200210e2002412c6a2802002136200241206a41086a280200213720530d0c0c0d0b410d2115205d0d180c190b410d215c0c83010b410d21014100215c0c83010b410d21210c88010b024020544109470d00205841ffffffff0371450d002059101d0b4115218202418080c000213b410421152004450d010b205621010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a2101200541706a22050d000b0b0240208402450d002056101d0b205c0d010b200228020c450d090c080b2055101d200228020c0d070c080b410d211a2055450d010b20554104742105205721010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a2101200541706a22050d000b0b4100210b02402056450d002057101d0b2053450d010b411c21c50220032053411c6c6a21c602410c21c702410821c802411421c902410421ca02411021cb02410921cc0241ffffffff0321cd02417021ce02200321cf02410d21210c700b2017450da1012003101d0ca1010b410d21010c770b410d2115200228020c450d010b2002280208101d0b208202213a20830221160c050b410d215c205d0d760c770b4104215c4198a0c100210a41242121205d0d750c760b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c280046a2f01002105200241c180046a2d00002104200241c080046a2d0000210120022802bc8004212120022802b88004210a4105215c205d0d740c750b4118215c205d0d730c740b200220f00120e90120011b3a00a88004200241346a410136020020024101360204200241206a41106a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a1028200241b880046a41086a280200211620022802bc8004213a20022802b88004213b02402004450d00200541106a21044100210103400240205620016a22052d00004109470d00200541086a28020041ffffffff0371450d00200541046a280200101d0b2004200141106a2201470d000b0b0240208402450d002056101d0b41052115205c0d010b205d450d020c010b2055101d205d450d010b411821d0022003205d41186c6a21d102410421d202411421d302411021d402410c21d502410921d602410821d70241ffffffff0321d802417021d902200321da02410e21210c650b20fc01450d82012003101d0c82010b417f200141016a102a000b200141016a2007102b000b417f2004102a000b20042054102b000b417f2004102a000b20042054102b000b417f200941016a102a000b200941016a2008102b000b417f200141016a102a000b200141016a200a102b000b417f2004102a000b20042054102b000b417f200141016a102a000b200141016a2004102b000b417f200141016a102a000b200141016a2005102b000b417f200141016a102a000b200141016a2005102b000b20052009102a000b20092008102b000b417f2001102a000b20012054102b000b417f200141016a102a000b200141016a2005102b000b417f2001102a000b20012004102b000b417f200141016a102a000b200141016a2005102b000b417f200441016a102a000b200441016a200a102b000b200541011020000b417f205841016a102a000b205841016a2006102b000b417f2005102a000b20052004102b000b200141041020000b200141041020000b417f2001102a000b20012005102b000b417f2001102a000b2001200a102b000b2001205d102a000b205d2054102b000b200141011020000b200141041020000b200141041020000b200141041020000b417f2001102a000b20012004102b000b200141041020000b205d41011020000b417f2058102a000b20582004102b000b417f2001102a000b20012054102b000b200541041020000b200141081020000b200141041020000b417f202e102a000b202e200a102b000b417f202e41016a102a000b202e41016a200a102b000b200141041020000b410021210c110b410121210c110b410221210c110b410321210c110b410421210c110b410521210c110b410621210c110b410721210c120b410821210c120b410921210c130b410a21210c140b410b21210c150b410c21210c150b410d21210c160b410e21210c170b410021010c170b410121010c160b410221010c150b410321010c140b410321010c130b410321010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b410321010c0a0b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b410321010c010b410321010c000b0b1021000b200241206a41086a20053602002021418080807871215a20214180807c712104202141087621050b2002205e3703202002290224210d205ea7210a0c090b20014110762105200141087621040c040b205c41087420017221012002200d3703a88004200da721280240205a450d00205d101d0b20022802ac8004210420ba01450d010b2003210503400240200541046a280200450d002005280200101d0b200541146a21052027416c6a22270d000b0b20b901450d1c2003101d0c1c0b2054101d0b200441ff0171410874200141ff017172210420054110742105205841ff01714108742109024020d401450d002003210103400240200141046a280200450d002001280200101d0b200141106a210120d20141706a22d2010d000b0b200420057221042009205c72210120d301450d182003101d0c180b202f450d1320d601101d0c130b0b41002104410021050b202141ff0171200541ff0171410874722004418080fc077172205a722101200d422088a72104200da7210602402053450d002055101d0b205d450d010b205b101d0b209701450d010b2003210503400240200541046a280200450d002005280200101d0b0240200541106a280200450d002005410c6a280200101d0b200541286a2105201f41586a221f0d000b0b209601450d162003101d0c160b201320910288210d4105211241002101202f450d0c2003101d0c0c0b2003101d0c120b202e202a4621010240202b450d00202c101d0b02402001450d002059ad42208620d301ad84210d410221050c040b20024103410220011b3a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004210d20022802c08004210402402059450d00205941047421052003210103400240200141046a280200450d002001280200101d0b200141106a2101200541706a22050d000b0b200d422088210c410521014100210520d301450d0e2003101d0c0e0b200241c480046a28020020022802c88004462105024020022802bc8004450d0020022802b88004101d0b02402005450d002001ad42208620b901ad84210d410821050c030b20024103410220051b3a00a88004200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308210d2002280210210402402001450d00200141146c21052003210103400240200141046a280200450d002001280200101d0b200141146a21012005416c6a22050d000b0b200d422088210c410521014100210520b901450d0f2003101d0c0f0b2026202246210102402023450d002024101d0b02402001450d0020a701ad42208620a801ad84210d410421050c020b20024103410220011b3a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088210c20022802c080042104410521014100210520a801450d102003101d0c100b200241c480046a28020020022802c88004462105024020022802bc8004450d0020022802b88004101d0b02402005450d002001ad422086209601ad84210d410321050c010b20024103410220051b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308210d2002280210210402402001450d00200141286c21052003210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200541586a22050d000b0b200d422088210c4105210141002105209601450d112003101d0c110b200020053a000420004100360200200041056a20022f00b880043b0000200041186a200c370200200041146a20013602002000410c6a200d370200200041086a2003360200200041206a2002290220370200200041076a200241ba80046a2d00003a0000200041286a200241206a41086a290200370200200241d080046a24000f0b2008ad422086200aad84210d2007450d010b2025101d0b2000200136020420004101360200200041106a2005360200200041086a200d370200200241d080046a24000f0b20154108762101203aad220c422086203bad84210d2033450d002034101d0b20004101360200200041106a2016360200200041086a200c422086200d42ffffffff0f838437020020002001410874201541ff017172360204200241d080046a24000f0b201241087621012030ad220d4220862031ad84211320022802bc8004450d0020022802b88004101d0b20004101360200200041106a2014360200200041086a200d422086201342ffffffff0f838437020020002001410874201241ff017172360204200241d080046a24000f0b200541ffffff07712205410874200841ff01717221012007ad220c4220862020ad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200141087621052021ad220c422086200aad84210d202b450d00202c101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200141087621052028ad220c422086200aad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b2021ad220c4220862005ad84210d410021052023450d002024101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200141087621052006ad220c422086200aad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200f410874201e41ff01717221012038ad220d4220862039ad84211020022802bc8004450d0020022802b88004101d0b20004101360200200041106a2011360200200041086a200d422086201042ffffffff0f83843702002000200f410874200141ff017172360204200241d080046a24000f0b200541ffffff07712204410874200a41ff01717221052008ad220c4220862007ad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2001360200200041086a200c422086200d42ffffffff0f838437020020002004410874200541ff017172360204200241d080046a24000f0b200b410874201a41ff01717221012036ad220d4220862037ad84210c200228020c450d002002280208101d0b20004101360200200041106a200e360200200041086a200d422086200c42ffffffff0f83843702002000200b410874200141ff017172360204200241d080046a24000f0b200241d080046a24000b160020002001280208360204200020012802003602000bf30f01347f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002201410d4b0d00024020010e0e000203040506070809140a0b0c0d000b200041086a280200450d13200041046a280200101d0f0b0240200041086a280200450d00200041046a280200101d0b0240200041146a2802002201450d00200041186a280200450d002001101d0b200041246a280200450d12200041206a280200101d0f0b0240200041086a280200450d00200041046a280200101d0b200041146a280200450d11200041106a280200101d0f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d002001280200101d0b200141106a2101200241706a22020d000b0b200041086a280200450d10200041046a280200101d0f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200241586a22020d000b0b200041086a280200450d0f200041046a280200101d0f0b200041086a280200450d0e200041046a280200101d0f0b200041086a280200450d0d200041046a280200101d0f0b200041086a280200450d0c200041046a280200101d0f0b2000410c6a2802002201450d0a41042103200041046a280200220420014104746a210541102106410921074108210841ffffffff0321094170210a410021010c050b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d002001280200101d0b200141146a21012002416c6a22020d000b0b200041086a280200450d0a200041046a280200101d0f0b410c210b2000410c6a2802002201450d07411c210c4104210d200041046a280200220e2001411c6c6a210f4108211041142111411021124109211341ffffffff03211441702115410121010c030b410c21162000410c6a2802002201450d054118211741042118200041046a2802002219200141186c6a211a4114211b4110211c4109211d4108211e41ffffffff03211f41702120410221010c020b410c21212000410c6a2802002201450d03411c212241042123200041046a28020022242001411c6c6a21254108212641142127411021284109212941ffffffff03212a4170212b410321010c010b024002400240200041046a2d000022014102460d0020014101460d0120010d022000410c6a280200450d09200041086a280200101d0f0b200041146a2802002201450d03410c212c2000410c6a280200222d20014104746a212e4110212f410821304104213141742132410421010c020b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002206450d00200141046a280200450d002006101d0b2001410c6a2101200241746a22020d000b0b200041106a280200450d072000410c6a280200101d0f0b2000410c6a280200450d06200041086a280200101d0f0b0340024002400240024002400240024002400240024020010e050001020304040b024020042802082202450d0020042802002101200220037421020340024020012d00002007470d00200120086a280200200971450d00200120036a280200101d0b200120066a21012002200a6a22020d000b0b200420066a21010240200420036a280200450d002004280200101d0b2001210420012005470d040c0e0b0240200e200b6a2802002202450d00200e28020421012002200d7421020340024020012d00002013470d00200120106a280200201471450d002001200d6a280200101d0b200120126a2101200220156a22020d000b0b0240200e20106a280200450d00200e200d6a280200101d0b200e200c6a21010240200e20116a280200450d00200e280210101d0b2001210e2001200f470d040c0c0b0240201920186a280200450d002019280200101d0b02402019201b6a2802002202450d00201928020c2101200220187421020340024020012d0000201d470d002001201e6a280200201f71450d00200120186a280200101d0b2001201c6a2101200220206a22020d000b0b201920176a210102402019201c6a280200450d00201920166a280200101d0b200121192001201a470d040c0a0b0240202420216a2802002202450d0020242802042101200220237421020340024020012d00002029470d00200120266a280200202a71450d00200120236a280200101d0b200120286a21012002202b6a22020d000b0b0240202420266a280200450d00202420236a280200101d0b202420226a21010240202420276a280200450d002024280210101d0b2001212420012025470d040c080b202d2233202f6a212d024020332802042201450d0002402033202c6a2802002202450d002002202c6c21020340024020012802002234450d00200120316a280200450d002034101d0b2001202c6a2101200220326a22020d000b0b203320306a280200450d00203320316a280200101d0b202d202e470d040c060b410021010c040b410121010c030b410221010c020b410321010c010b410421010c000b0b200041106a280200450d042000410c6a280200101d0c040b200041086a280200450d03200041046a280200101d0f0b200041086a280200450d02200041046a280200101d0f0b200041086a280200450d01200041046a280200101d0f0b200041086a280200450d00200041046a280200101d0f0b0bb310012e7f230041a0016b2202240002400240024002402000280200220341f0c0c100460d00200028020421040c010b41ec00101f2203450d0141002104200341003b010620034100360200200341086a200241086a41e40010ce031a20004100360204200020033602000b200141ff017121050c010b41ec0041041020000b41002107024003400240024002400240024002400240024020070e020001010b200341086a210820032f0106210641002107024002400240034020062007460d014100417f4101200820076a2d0000220920054b1b20092005461b2209450d02200741016a210720094101460d000b2007417f6a21060b02402004450d002004417f6a2104200320064102746a41ec006a2802002103410021070c0a0b2000200028020841016a36020820032f01062207410b4f0d01200341086a2209200641016a220a6a200920066a2209200720066b10cf031a200920013a0000200341146a2207200a4103746a200720064103746a2209200341066a22072f010020066b41037410cf031a20094101360200200720072f010041016a3b0100200241a0016a24000f0b200320074103746a41146a42013702000c090b41ec00101f220b450d04200b41003b0106200b4100360200200b41086a200241086a41e40010ce0321092003410e6a2d0000210c2003280248210d2003280244210e20092003410f6a200341066a220a2f010041796a220710ce032109200b41146a200341cc006a200741037410ce03210f200a41063b0100200b20073b010602400240200641064b0d00200341086a2207200641016a22096a200720066a220a200341066a22072f010020066b10cf031a200a20013a0000200341146a220a20094103746a200a20064103746a220920072f010020066b41037410cf031a200941013602000c010b20092006417a6a220a6a2009200641796a22066a2209200741ffff037120066b10cf031a200920013a0000200f200a4103746a200f20064103746a2209200b41066a22072f010020066b41037410cf031a200941013602000b4101210a200720072f010041016a3b010020032802002210450d014104210f410a2111419c0121124100211341082114419401211541c800211641c4002117410e2118410f21194106211a4179211b41cc00211c4114211d4103211e418801211f41ec002120417a21214102212241ffff03212341f0002124416c212541d4002126200341046a2f0100212720102f01062207410a4b0d060c020b2012101f2208450d02200820133b010620082013360200200820146a200241086a201510ce032106201020166a280200212a201020176a2802002129201020186a2d000021282006201020196a2010201a6a222b2f01002209201b6a220710ce03212c2008201d6a2010201c6a2007201e7410ce03212d200820206a2010201f6a200920216a222e20227410ce03212f202b201a3b0100200820073b01060240202e450d0041002107202f210603402006280200220920073b0104200920083602002006200f6a2106202e2007200a6a2207470d000b0b024002402027201a4b0d00201020146a22062027200a6a22076a200620276a2206202b2f0100220920276b222e10cf031a2006200c3a00002010201d6a22062007201e746a20062027201e746a2206202e201e7410cf031a2006200e3602002006200d360204202b2009200a6a22063b0100201020206a22092027202274222b6a20146a200920072022746a222e2006202371220920076b20227410cf031a202e200b360200202720094f0d012010202b6a20246a21070340200728020022062027200a6a22273b0104200620103602002007200f6a210720092027470d000c020b0b202c202720216a22066a202c2027201b6a22076a222e2008201a6a22092f010020076b10cf031a202e200c3a0000202d2006201e746a202d2007201e746a222e20092f010020076b201e7410cf031a202e200e360200202e200d360204200920092f0100200a6a222e3b0100202f2027202274222b6a20256a202f20062022746a2209202e202371222720066b20227410cf031a2009200b360200200620274b0d002008202b6a20266a21060340200628020022092007200a6a22073b0104200920083602002006200f6a210620272007470d000b0b024020102802002207450d002028210c2029210e202a210d2008210b2010200f6a2f01002127200722102f0106220720114d0d02410121070c070b2008210b202a210d2029210e2028210c0b419c01101f2207450d03200741003b010620074100360200200741086a200241086a41940110ce03210920072000280200220636026c200020073602002000200028020441016a360204200641003b010420062007360200200720072f010622064103746a220a41186a200d360200200a41146a200e360200200920066a200c3a0000200741ec006a200641016a22064102746a200b360200200720063b0106200b20063b0104200b2007360200200241a0016a24000f0b201041086a2209202741016a22066a200920276a2209200720276b220a10cf031a2009200c3a0000201041146a220920064103746a200920274103746a2209200a41037410cf031a2009200e3602002009200d360204201041066a200741016a22073b0100201041ec006a220920274102746a41086a200920064102746a2209200741ffff0371220a20066b41027410cf031a2009200b3602002027200a4f0d0520102006417f6a22074102746a41f0006a2106034020062802002209200741016a22073b010420092010360200200641046a2106200a2007470d000c060b0b419c0141041020000b41ec0041041020000b419c0141041020000b410121070c000b0b200241a0016a24000b8f4701af017f230041f0016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a28020021032001280208210441002105024002400240200141106a2802002206450d0041012107200241c0016a410172210841002109417f210a412c210b4109210c4108210d20024190016a41086a210e4111210f20024190016a41106a2110411921114118211220024190016a41186a21134121211420024190016a41206a21154127211620024190016a41276a2117410f2118417e2119410a211a410d211b4114211c200241c0016a41146a211d200241e4016a211e200241c0016a410c6a211f411c21204104212141ffffffff03212241702123410221244174212541582126416c212741002128410021294100212a4100212b4100212c4100212d4100212e4100212f4100213041002131410021320c010b4100210941002128410021294100212a4100212b4100212c4100212d4100212e4100212f4100213041002131410021010c010b410121010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e020001010b410421820120022802002183010240200241086a2802002201450d0020014104742132208301210103400240200141046a280200450d002001280200101d0b200141106a2101203241706a22320d000b0b02402002280204450d00208301101d0b2002410c6a2802002183010240200241146a2802002201450d00200141286c2132208301210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101203241586a22320d000b0b0240200241106a280200450d00208301101d0b02402002411c6a280200450d00200241186a280200101d0b0240200241286a280200450d00200241246a280200101d0b0240200241346a280200450d00200241306a280200101d0b2002413c6a280200218301200241c4006a2802002201450d01410421840120830120014104746a21850141102186014109218701410821880141ffffffff032189014170218a01208301218b01410121320c2d0b0240024020320e050001030507070b200e20042006200a6a2206200b6c6a2201200c6a29000037030020102001200f6a2900003703002013200120116a2900003703002015200120146a2900003703002017200141286a2800003600002002200129000137039001024020012d000022332018460d0020082002290390013700002008200d6a200e290300370000200841106a2010290300370000200820126a2013290300370000200841206a2015290300370000200820166a2017280000360000200220333a00c00141012134203320196a2235201a4b22360d3c02400240024002400240024002400240024002400240024002400240024002400240024020350e0b000102030405060708090a000b201f2802002137200241c0016a200d6a280200213820022802c40121392030450d0a0240203a450d00203a202174213b2030210103400240200120216a280200450d002001280200101d0b200141106a2101203b20236a223b0d000b0b4100213b0240203c450d002030101d0b2037213a2038213c203921300c4e0b201f2802002137200241c0016a200d6a280200213820022802c4012139202f450d0a0240203d450d00203d41286c213b202f210103400240200120216a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101203b20266a223b0d000b0b4100213e0240203f450d00202f101d0b2037213d2038213f2039212f4101213b0c4e0b201f2802002140200241c0016a200d6a280200210120022802c401213302402041450d00202e450d00202e101d0b2033212e2001214120060d200c2f0b201f2802002142200241c0016a200d6a280200210120022802c401213302402043450d00202d450d00202d101d0b2033212d2001214320060d1e0c2d0b201f2802002144200241c0016a200d6a280200210120022802c401213302402045450d00202c450d00202c101d0b2033212c2001214520060d1c0c2b0b201f2802002146200241c0016a200d6a280200214720022802c4012148202b450d072049450d42202b20492021746a214a202b214b4100214c0c4b0b201f2802002137200241c0016a200d6a280200213820022802c4012139202a450d0702402052450d002052201c6c213b202a210103400240200120216a280200450d002001280200101d0b2001201c6a2101203b20276a223b0d000b0b4100214f02402053450d00202a101d0b20372152203821532039212a4101213b4101213e4101214d41012150410121512036450d430c420b4101213120022802c401215420060d130c220b201f2802002155200241c0016a200d6a280200215620022802c40121572029450d062058450d422029205820206c6a21592029215a4101214c0c490b201f280200215c200241c0016a200d6a280200215d20022802c401215e2028450d06205f450d422028205f20126c6a2160202821614102214c0c490b201f2802002163200241c0016a200d6a280200216420022802c40121652009450d062066450d422009206620206c6a2167200921684103214c0c490b203921302038213c2037213a20060d190c280b2039212f2038213f2037213d20060d170c260b2048212b2047214e2046214920060d120c210b2039212a203821532037215220060d100c1f0b205721292056215b2055215820060d0e0c1d0b205e2128205d2162205c215f20060d0c0c1b0b20652109206421692063216620060d0a0c190b20062105410021010c430b0240208b012802082232450d00208b01280200210120322084017421320340024020012d0000208701470d0020012088016a28020020890171450d0020012084016a280200101d0b20012086016a21012032208a016a22320d000b0b208b012086016a21010240208b012084016a280200450d00208b01280200101d0b2001218b012001208501470d120b0240200241c0006a280200450d00208301101d0b200241c8006a280200218c010240200241d0006a2802002201450d00200141146c2132208c01210103400240200141046a280200450d002001280200101d0b200141146a21012032416c6a22320d000b0b0240200241cc006a280200450d00208c01101d0b200241dc006a280200218c01200241e4006a2802002201450d01411c218d01208c012001411c6c6a218e01410c218f014108219001411421910141042192014110219301410921940141ffffffff032195014170219601208c01219701410221320c2d0b0240209701208f016a2802002232450d00209701280204210120322092017421320340024020012d0000209401470d0020012090016a28020020950171450d0020012092016a280200101d0b20012093016a210120322096016a22320d000b0b02402097012090016a280200450d002097012092016a280200101d0b209701208d016a210102402097012091016a280200450d00209701280210101d0b20012197012001208e01470d110b0240200241e0006a280200450d00208c01101d0b200241e8006a280200219801200241f0006a2802002201450d014118219901209801200141186c6a219a014104219b014114219c014110219d01410c219e014109219f01410821a00141ffffffff0321a101417021a20120980121a301410321320c2d0b024020a301209b016a280200450d0020a301280200101d0b024020a301209c016a2802002232450d0020a30128020c21012032209b017421320340024020012d0000209f01470d00200120a0016a28020020a10171450d002001209b016a280200101d0b2001209d016a2101203220a2016a22320d000b0b20a3012099016a2101024020a301209d016a280200450d0020a301209e016a280200101d0b200121a3012001209a01470d100b0240200241ec006a280200450d00209801101d0b41800121a401200241f4006a28020021a501200241fc006a2802002201450d01411c21a60120a5012001411c6c6a21a701410c21a801410821a901411421aa01410421ab01411021ac01410921ad0141ffffffff0321ae01417021af0120a50121b001410421320c2d0b024020b00120a8016a2802002232450d0020b0012802042101203220ab017421320340024020012d000020ad01470d00200120a9016a28020020ae0171450d00200120ab016a280200101d0b200120ac016a2101203220af016a22320d000b0b024020b00120a9016a280200450d0020b00120ab016a280200101d0b20b00120a6016a2101024020b00120aa016a280200450d0020b001280210101d0b200121b001200120a701470d0f0b200220a4016a21010240200241f8006a280200450d0020a501101d0b2066410020091b21322069410020091b218601205f410020281b218a012062410020281b2187012058410020291b219d01205b410020291b21960120524100202a1b21940120534100202a1b21930120494100202b1b21a201204e4100202b1b219f0120444100202c1b21af0120454100202c1b21ad0120424100202d1b21ac0120434100202d1b21890120404100202e1b21880120414100202e1b218301203d4100202f1b219001203f4100202f1b21a901203a410020301b219501203c410020301b218401200920820120091b21a101202820820120281b21a001202920820120291b21ae01202a208201202a1b219201202b208201202b1b218b01202c208201202c1b219b01202d208201202d1b219701202e208201202e1b21ab01202f208201202f1b21a301203020820120301b21b001200110b703024020024184016a2201280200450d0020024180016a280200101d0b20024188016a20053602002001200336020020024180016a2004360200200241fc006a2032360200200241f8006a208601360200200241f4006a20a101360200200241f0006a208a01360200200241ec006a208701360200200241e8006a20a001360200200241e4006a209d01360200200241e0006a209601360200200241dc006a20ae01360200200241d8006a2054360200200241d4006a2031360200200241d0006a209401360200200241cc006a209301360200200241c8006a209201360200200241c4006a20a201360200200241c0006a209f013602002002413c6a208b01360200200241386a20af01360200200241346a20ad01360200200241306a209b013602002002412c6a20ac01360200200241286a208901360200200241246a209701360200200241206a2088013602002002411c6a208301360200200241186a20ab01360200200241146a209001360200200241106a20a9013602002002410c6a20a301360200200241086a2095013602002002208401360204200220b00136020020002002418c0110ce031a200241f0016a24000f0b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410121320c1a0b410221320c1b0b410321320c1c0b410421320c1d0b410021010c2b0b410021010c2a0b410021010c290b410021010c280b410021010c270b410021010c260b410021010c250b410021010c240b410021010c230b410021010c220b410021010c210b410121010c200b410121010c1f0b410121010c1e0b410121010c1d0b410121010c1c0b410121010c1b0b410121010c1a0b410121010c190b410121010c180b410121010c170b410121010c160b410121010c150b410121010c140b410121010c130b410121010c120b410121010c110b410121010c100b410121010c0f0b410121010c0e0b410021010c0c0b410821010c0b0b410121010c0a0b410221010c090b410321010c080b410421010c070b410521010c060b410621010c050b410721010c040b410921010c030b410921010c020b410921010c010b410921010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0a00010203040f10111234340b4100214d0240204e450d00202b101d0b204621492047214e2048212b4101213b4101213e4101214f410121504101215120360d70410121010c87010b024020350e0b00040506070809720a0b0c000b203b450d4220022802c40121360240201f2802002201450d00200120217421332036210103400240200120216a280200450d002001280200101d0b200141106a2101203320236a22330d000b0b200241c0016a200d6a280200450d422036101d20060d160c210b410021500240205b450d002029101d0b205521582056215b205721294101213b4101213e4101214d4101214f410121512036450d6d0c6c0b4100215102402062450d002028101d0b205c215f205d2162205e21284101213b4101213e4101214d4101214f410121502036450d6a0c690b410021342069450d092009101d2063216620642169206521094101213b4101213e4101214d4101214f4101215041012151410021342036450d670c660b203e450d3e20022802c40121360240201f2802002201450d00200141286c21332036210103400240200120216a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101203320266a22330d000b0b200241c0016a200d6a280200450d3e2036101d20060d110c1c0b200241c0016a200d6a280200450d3d20022802c401101d20060d0f0c1a0b200241c0016a200d6a280200450d3c20022802c401101d20060d0d0c180b200241c0016a200d6a280200450d3b20022802c401101d20060d0b0c160b204d450d3a20022802c401216a201f2802002201450d2b206a20012021746a216b206a216c4104214c0c6e0b204f450d3920022802c40121360240201f2802002201450d002001201c6c21332036210103400240200120216a280200450d002001280200101d0b2001201c6a2101203320276a22330d000b0b200241c0016a200d6a280200450d392036101d20060d080c130b2050450d3820022802c401216d201f2802002201450d2b206d200120206c6a216e206d216f4105214c0c6e0b2051450d3720022802c4012170201f2802002201450d2c2070200120126c6a2171207021724106214c0c6f0b2034450d3620022802c4012173201f2802002201450d2d2073200120206c6a2174207321754107214c0c700b206321662064216920652109410521010c790b4101213b410621010c780b4101213e410721010c770b4101214d4101214f41012150410121512036450d60410821010c760b024002400240024002402033201b4b0d000240024020330e0e0001020202020202023803040506000b200241c0016a200d6a280200450d3720022802c401101d20060d0f0c1a0b0240200241c0016a200d6a280200450d0020022802c401101d0b201d280200450d36200241c0016a41106a280200101d20060d0d0c180b0240200241c0016a200d6a280200450d0020022802c401101d0b0240201d2802002201450d00200241c0016a20126a280200450d002001101d0b201e280200450d35200241c0016a41206a280200101d20060d0e0c190b20022802c4012176201f2802002201450d2d2076200120206c6a2177207621784108214c0c700b20022802c4012179201f2802002201450d2e2079200120126c6a217a2079217b4109214c0c710b20022802c401217c201f2802002201450d2f207c200120206c6a217d207c217e410a214c0c720b02400240024020022d00c40122012024460d0020012007460d0120010d02201f280200450d34200241c0016a200d6a280200101d20060d0a0c150b201f280200217f201d2802002201450d32207f20012021746a218001207f218101410b214c0c750b201f28020021350240201d2802002201450d002001410c6c2133203521010340024020012802002236450d00200120216a280200450d002036101d0b2001410c6a2101203320256a22330d000b0b200241c0016a41106a280200450d322035101d20060d070c120b201f280200450d31200241c0016a200d6a280200101d0c310b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021010c6a0b410021010c690b410021010c680b410021010c670b410021010c660b410021010c650b410021010c640b410021010c630b410021010c620b410021010c610b410021010c600b410121010c5f0b410121010c5e0b410121010c5d0b410121010c5c0b410121010c5b0b410121010c5a0b410121010c590b410121010c580b410121010c570b410121010c560b410121010c550b02400240024002400240204c0e0c000102030406080a0c0e1012120b0240204b2802082237450d00204b2802002101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b204b41106a21010240204b20216a280200450d00204b280200101d0b2001214b2001204a470d2e410021010c570b0240205a410c6a2802002237450d00205a2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b0240205a200d6a280200450d00205a20216a280200101d0b205a20206a21010240205a201c6a280200450d00205a280210101d0b2001215a20012059470d2e410221010c560b0240206120216a280200450d002061280200101d0b02402061201c6a2802002237450d00206128020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b206120126a21010240206141106a280200450d002061410c6a280200101d0b2001216120012060470d2e410321010c550b02402068410c6a2802002237450d0020682802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b02402068200d6a280200450d00206820216a280200101d0b206820206a210102402068201c6a280200450d002068280210101d0b2001216820012067470d2e410421010c540b0240206c2802082237450d00206c2802002101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b206c41106a21010240206c20216a280200450d00206c280200101d0b2001216c2001206b470d2e0b200241c0016a200d6a280200450d0e206a101d20060d120c1b0b0240206f410c6a2802002237450d00206f2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b0240206f200d6a280200450d00206f20216a280200101d0b206f20206a21010240206f201c6a280200450d00206f280210101d0b2001216f2001206e470d2d0b200241c0016a200d6a280200450d0c206d101d20060d0f0c180b0240207220216a280200450d002072280200101d0b02402072201c6a2802002237450d00207228020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b207220126a21010240207241106a280200450d002072410c6a280200101d0b2001217220012071470d2c0b200241c0016a200d6a280200450d0a2070101d20060d0c0c150b02402075410c6a2802002237450d0020752802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b02402075200d6a280200450d00207520216a280200101d0b207520206a210102402075201c6a280200450d002075280210101d0b2001217520012074470d2b0b200241c0016a200d6a280200450d082073101d20060d090c120b02402078410c6a2802002237450d0020782802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b02402078200d6a280200450d00207820216a280200101d0b207820206a210102402078201c6a280200450d002078280210101d0b2001217820012077470d2a0b200241c0016a200d6a280200450d062076101d20060d0b0c140b0240207b20216a280200450d00207b280200101d0b0240207b201c6a2802002237450d00207b28020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b207b20126a21010240207b41106a280200450d00207b410c6a280200101d0b2001217b2001207a470d290b200241c0016a200d6a280200450d042079101d20060d0a0c130b0240207e410c6a2802002237450d00207e2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b0240207e200d6a280200450d00207e20216a280200101d0b207e20206a21010240207e201c6a280200450d00207e280210101d0b2001217e2001207d470d280b200241c0016a200d6a280200450d02207c101d20060d090c120b208101223941106a218101024020392802042201450d0002402039410c6a2802002237450d002037410c6c21370340024020012802002238450d00200120216a280200450d002038101d0b2001410c6a2101203720256a22370d000b0b2039200d6a280200450d00203920216a280200101d0b208101208001470d270b200241c0016a41106a280200450d00207f101d20060d080c110b2006450d08410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021010c3b0b410021010c3a0b410021010c390b410021010c380b410021010c370b410021010c360b410021010c350b410021010c340b410021010c330b410121010c320b410121010c310b410121010c300b410121010c2f0b410121010c2e0b410121010c2d0b410121010c2c0b410121010c2b0b410121010c2a0b4100214c0c140b4101214c0c140b4102214c0c140b4103214c0c140b4104214c0c150b4105214c0c160b4106214c0c170b4107214c0c180b4108214c0c190b4109214c0c1a0b410a214c0c1b0b410b214c0c1c0b410821010c1c0b410121010c1b0b410821010c1a0b410121010c190b410821010c180b410121010c170b410821010c160b410121010c150b410821010c140b410921010c130b410921010c120b410921010c110b410921010c100b410921010c0f0b410921010c0e0b410921010c0d0b410921010c0c0b410921010c0b0b410921010c0a0b410921010c090b410921010c080b410921010c070b410921010c060b410921010c050b410921010c040b410921010c030b410921010c020b410921010c010b410921010c000b0b0b980c02297f017e230041106b22022400024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042101200241086a2000104420022802082208200228020c22094104746a210a4100210b20094104490d0141ff01210c200341ff0171210d4101210e410d210f411c211041182111411d2112412c21134128211441202115412d2116413c211741c0002118413821194130211a413d211b413f211c4101211d0c020b20012802042104200241106a240020040f0b410021090c010b410121090b02400240024003400240024002400240024002400240024002400240024002400240024002400240024020090e020001010b2008200a460d01410421210240200741ff017122224104470d0041102123200341ff0171212441012125410d21264100211d0c0c0b41102127200341ff0171212841012129410d212a4102211d0c0f0b024002400240201d0e03010002020b024020082d000c200d470d0020082802082004470d002008280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008200f6a2d0000221f410446221e470d00201f2009460d0720200d07201e0d070b0240200820106a2d0000200d470d00200820116a2802002004470d00200841106a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820126a2d0000221f410446221e470d00201f2009460d0420200d04201e0d040b0240200820136a2d0000200d470d00200820146a2802002004470d00200820156a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820166a2d0000221f410446221e470d00201f2009460d0520200d05201e0d050b0240200820176a2d0000200d470d00200820196a2802002004470d002008201a6a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008201b6a2d0000221f410446221e470d00201f2009460d0620200d06201e0d060b200b41046a210b200a200820186a22086b201c4b0d0a410021090c110b024020082d000c2024470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920256a2109201f2d0000201d2d0000460d000c020b0b200820266a2d00002021460d060b200b20256a210b200820236a2208200a470d080c010b024020082d000c2028470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920296a2109201f2d0000201d2d0000460d000c020b0b2008202a6a2d000022092022470d0020092021470d050b200b20296a210b200820276a2208200a470d090b024002400240200041046a28020020002802082208470d00200841016a22092008490d082008410174220e20092009200e491b220ead420486222b422088a70d08202ba7221d4100480d082008450d0120002802002008410474201d101e2209450d020c120b200028020021090c120b201d101f22090d100b201d41041020000b200b410172210b20050d030c100b200b410272210b20050d020c0f0b200b410372210b0b2005450d0d0b2001101d200241106a2400200b0f0b1021000b4100211d0c030b4101211d0c030b4102211d0c030b410121090c040b410121090c030b410121090c020b410121090c010b410121090c000b0b20002009360200200041046a200e360200200041086a28020021080b200920084104746a220820063b010e200820073a000d200820033a000c200820043602082008200536020420082001360200200041086a2204200428020041016a3602002002200010442002280204417f6a210b0b200241106a2400200b0bac24032d7f017e2b7f230041306b220224002001280204210320012802002104410121050240024002400240024020012802082206450d00412c101f2207450d02200720022f002d3b0001200741023a00002007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002108410121090c010b4104210741002109410121080b200141106a280200210a200128020c210b024002400240200141146a280200220c450d002009410174220d200941016a220e200e200d491b220d412c6c210e2009450d0120072009412c6c200e101e2207450d020c040b2009210d0c040b200e101f22070d020b200e41041020000b412c41041020000b20072009412c6c6a220e20022f002d3b0001200e41033a0000200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200941016a2109410021050b2001411c6a280200210f2001280218211041002111024002400240024002400240024002400240200141206a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c2013101e2207450d020c030b410021140c040b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012114200941016a21090b200141286a28020021152001280224211602402001412c6a2802002212450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c2013101e2207450d010c020b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41053a0000200e201236000c200e2015360008200e2016360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012111200941016a21090b200141346a280200211720012802302118024002400240024002400240200141386a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c2013101e2207450d020c030b410021190c040b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41063a0000200e201236000c200e2017360008200e2018360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012119200941016a21090b200141c0006a280200211a200128023c211b4101211c024002400240024002400240200141c4006a280200221d450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c2012101e2207450d020c030b4101211e0c040b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e41073a0000200e201d36000c200e201a360008200e201b360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100211e0b200141cc006a280200211f200128024821200240200141d0006a2802002221450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c2012101e2207450d010c020b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e41083a0000200e202136000c200e201f360008200e2020360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241086a41086a290200370200200e2002290208370210200941016a21094100211c0b41012122024020012802544101470d00200141d8006a28020021120240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c2013101e2207450d010c020b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41093a0000200e2012360204200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41206a280200360200200e41206a200241086a41186a290200370200200e41186a200241086a41106a290200370200200e41106a200241106a290200370200200e2002290208370208200941016a21090b200141e0006a2802002123200128025c21240240200141e4006a2802002225450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c2012101e2207450d010c020b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e410a3a0000200e202536000c200e2023360008200e2024360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021220b200141ec006a28020021262001280268212741012128024002400240024002400240200141f0006a2802002229450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c2012101e2207450d020c030b4101212a0c040b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e410b3a0000200e202936000c200e2026360008200e2027360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100212a0b200141f8006a2802002112200128027421130240200141fc006a280200222b450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22282028200e491b220ead422c7ea722284100480d02024002400240200d450d002007200d412c6c2028101e2207450d010c020b2028101f22070d010b202841041020000b200e210d0b20072009412c6c6a220e410c3a0000200e202b36000c200e2012360008200e2013360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021280b20014184016a280200212c200128028001210e024002400240200d20096b20014188016a280200412c6c222d412c6d22014f0d00200920016a22012009490d03200d410174222e20012001202e491b222ead422c7e222f422088a70d03202fa722304100480d03200d450d012007200d412c6c2030101e2207450d020c040b200920016a21010c040b2030101f22070d020b203041041020000b1021000b202e210d0b20072009412c6c6a200e202d10ce031a0240202c450d00200e101d0b0240024002400240024041c005101f2209450d002000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200936021020024280c2cdeb16370308200241106a10b7032009101d2028450d02202b450d01411c21312013202b411c6c6a2132410c2133410821344114213541042136411021374109213841ffffffff0321394170213a2013213b4100213c0c030b41c00541041020000b410021010c020b410121010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b2012450d0e2013101d410121010c160b202a450d022029450d014118213d2027202941186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff03214541702146202721474101213c0c0f0b02400240203c0e0400010407070b0240203b20336a2802002209450d00203b2802042101200920367421090340024020012d00002038470d00200120346a280200203971450d00200120366a280200101d0b200120376a21012009203a6a22090d000b0b0240203b20346a280200450d00203b20366a280200101d0b203b20316a21010240203b20356a280200450d00203b280210101d0b2001213b20012032470d09410021010c150b02402047203f6a280200450d002047280200101d0b0240204720406a2802002209450d00204728020c21012009203f7421090340024020012d00002043470d00200120446a280200204571450d002001203f6a280200101d0b200120416a2101200920466a22090d000b0b2047203d6a21010240204720416a280200450d00204720426a280200101d0b200121472001203e470d090b2026450d002027101d0b2022450d022025450d01411c214820242025411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff03215041702151202421524102213c0c0e0b02402052204a6a2802002209450d00205228020421012009204d7421090340024020012d0000204f470d002001204b6a280200205071450d002001204d6a280200101d0b2001204e6a2101200920516a22090d000b0b02402052204b6a280200450d002052204d6a280200101d0b205220486a210102402052204c6a280200450d002052280210101d0b2001215220012049470d070b2023450d002024101d0b0240201c450d0002402021450d00202141146c21092020210103400240200141046a280200450d002001280200101d0b200141146a21012009416c6a22090d000b0b201f450d002020101d0b201e450d02201d450d0141042153201b201d4104746a215441102155410921564108215741ffffffff03215841702159201b215a4103213c0c0d0b0240205a2802082209450d00205a2802002101200920537421090340024020012d00002056470d00200120576a280200205871450d00200120536a280200101d0b200120556a2101200920596a22090d000b0b205a20556a21010240205a20536a280200450d00205a280200101d0b2001215a20012054470d050b201a450d00201b101d0b02402017410047201941017371450d002018101d0b02402015410047201141017371450d002016101d0b0240200f410047201441017371450d002010101d0b02402005450d000240200c450d00200c41286c2109200b210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200941586a22090d000b0b200a450d00200b101d0b02402008450d0002402006450d00200641047421092004210103400240200141046a280200450d002001280200101d0b200141106a2101200941706a22090d000b0b2003450d002004101d0b200241306a24000f0b4100213c0c040b4101213c0c050b4102213c0c060b4103213c0c070b410121010c070b410221010c060b410221010c050b410221010c040b410221010c030b410221010c020b410221010c010b410221010c000b0bb505000240024002400240024002400240024002400240200041ff0171417f6a220041aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020000eab014a00000000000000000000000000010101010103030404050506060707080809094b0a0a0b0b0c0c0d0d4c4d0e0e0f0f10101111121213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f20204e212122224f2323242450252526262727282829292a2a512b2b2c2c2d2d2e2e2f2f30303131323233333434353536363737383839393a3a3b3b3c3c3d3d3e3e523f3f404041414242434344444545464647474848020202024a0b410a0f0b41080f0b41100f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410f0f0b410f0f0b410e0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b41110f0b41120f0b41050f0b41130f0b41140f0b41000f0b41020f0b41000f0b41020f0b410e0b6d01017f230041306b2203240020032002360204200320013602002003412c6a41023602002003411c6a4102360200200341023602242003420237020c200341d8b1c400360208200320033602282003200341046a3602202003200341206a360218200341086a200010cf01000b800203047f017e017f024002400240200041086a28020022032001490d0002400240024002402003200041046a280200470d00200341016a22042003490d0320034101742205200420042005491b2206ad4204862207422088a70d032007a722084100480d032003450d01200028020020034104742008101e2205450d020c050b200341016a2104200028020021050c050b2008101f22050d030b200841081020000b1021000b41c8aec400102c000b20002005360200200041046a20063602000b200520014104746a220541106a2005200320016b41047410cf031a200541086a200241086a29030037030020052002290300370300200041086a20043602000bbf0303027f017e027f02402001450d000340200028026c21002001417f6a22010d000b0b4100210341002101024003402002450d010240200120002f01064f0d0020014103742104200141016a21012002417f6a2102200020046a41146a290200a74103470d010c020b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b2000101d2005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b2001101d2005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41f0006a2802002100200420074103746a41146a2902002105024020064101460d00410120066b21010340200028026c2100200141016a22010d000b0b410021012002417f6a21022005a74103470d000b0b0240200041f0c0c100460d00200028020021012000101d2001450d00200128020021042001101d2004450d00024020042802002201450d0003402004101d2001210420012802002200210120000d000b0b2004101d0b0b9d0503057f017e017f230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a10482103024002400240024002400240024002402000411c6a280200200041206a2802002204470d00200441016a22052004490d0520044101742206200520052006491b2206ad4202862207422088a70d052007a722084100480d052004450d01200041186a28020020044102742008101e2205450d020c030b200041186a28020021050c030b2008101f22050d010b200841041020000b2000411c6a2006360200200041186a2005360200200041206a28020021040b200520044102746a2003360200200041206a2204200428020041016a360200200241186a41106a200241106a290300370300200241186a41086a200241086a29030037030020022002290300370318024002400240200041ec006a280200200041f0006a2802002204470d00200441016a22052004490d0320044101742203200520052003491b2203ad42187e2207422088a70d032007a722064100480d032004450d01200041e8006a280200200441186c2006101e2205450d020c040b200041e8006a28020021050c040b2006101f22050d020b200641041020000b1021000b200041ec006a2003360200200041e8006a2005360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000ba68f0117097f017e5a7f037e047f017e117f017e177f017e1b7f027e137f037e497f027e017f017e117f047e117f017e1e7f23002203210420034180096b416071220324000240024002400240024002400240024002404110101f2205450d00200541063a00004120101f2206450d01200641063a001020064100360204200620032f00c0053b00012006412d3a0000200641036a200341c2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d002005280204101d0b2005101d200141106a2802002207412c6c21052001280208220841586a210902400240024002400240024003402005450d01200541546a2105200941286a210a2009412c6a220b2109200a2d00004107470d000b200320032f01a0033b01c005200b41046a280200200b41086a2802002205470d01200541016a22092005490d0e2005410174220a20092009200a491b220aad420486220c422088a70d0e200ca722074100480d0e2005450d04200b28020020054104742007101e2209450d050c0b0b4110101f2209450d0720094180023b010c200942828080802037020420092006360200200920032f01a0033b010e2001410c6a2802002007470d09200741016a22052007490d0d2007410174220a20052005200a491b2205ad422c7e220c422088a70d0d200ca7220a4100480d0d2007450d0120082007412c6c200a101e2208450d020c080b200b28020021090c0a0b200a101f22080d060b200a41041020000b2007101f22090d060b200741041020000b411041081020000b412041081020000b411041041020000b2001410c6a2005360200200141086a20083602000b200141106a200741016a220d36020020082007412c6c6a220520032f00b0043b0001200541073a0000200542818080801037000820052009360004200520032902c005370210200541036a200341b2046a2d00003a0000200541186a200341c8056a290200370200200541206a200341c0056a41106a290200370200200541286a200341c0056a41186a2802003602004100210e0c020b200b2009360200200b41046a200a360200200b41086a28020021050b200920054104746a22054180023b010c200542828080802037020420052006360200200520032f01c0053b010e200b41086a2205200528020041016a360200200341c0006a200b10442003280244417f6a210e200141106a280200210d200141086a28020021080b200d412c6c2105200841586a210902400340410021062005450d01200541546a2105200941286a210a2009412c6a220b2109200a2d00004103470d000b200b41086a2802002205450d00200541286c2109200b28020041186a2105410021060340200620052d0000456a2106200541286a2105200941586a22090d000b0b200d412c6c2105200841586a2109024003404100210a2005450d01200541546a2105200941286a210b2009412c6a22072109200b2d00004103470d000b200741086a2802002205450d00200541286c2109200728020041186a21054100210a0340200a20052d0000456a210a200541286a2105200941586a22090d000b0b200d412c6c2105200841606a21090240024003402005450d01200541546a2105200941206a210b2009412c6a22072109200b2d00004104470d000b200728020021050c010b410021050b02402005200a6a220fad220c421e88a70d00200c420286a72205417f4c0d0002400240024002400240024002402005450d00200510792208450d02200f0d010c030b41042108200f450d030b2008200f4102746a2110410021114101211241042113200141106a2114412c211541082116200141086a211741582118415421194128211a410b211b4118211c4103211d2008211e4100211f0c030b200541041020000b410021050c020b410021050c010b410121050b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e020001010b200141086a2802002121412c2123200141106a2802002220450d2f0c010b024002400240024002400240024002400240201f0e050001030405050b024020112006490d002014280200222020156c220a21052017280200222120186a220b210902400340410021072005450d01200520196a21052009201a6a210d200920156a22222109200d2d0000201d470d000b202220166a2802002205450d002005201a6c21092022280200201c6a2105410021070340200720052d0000456a21072005201a6a2105200920186a22090d000b0b201120076b220720114b0d060340200a450d03200a20196a210a200b201a6a2105200b20156a2209210b20052d0000201b470d000b200920166a28020020074d0d0720092802002007201c6c6a2802082109200341c0056a2007200110ad0320032802c405210520032802c0052012460d08201e200520096a3602000b201120126a2111201e20136a221e2010470d0c410021050c3b0b20212d0000202a470d34202128020c2205450d34202128020422702005202b6c6a2171410021720c1b0b412c101f2205450d07200541286a41002800c9a042360000200541206a41002900c1a042370000200541186a41002900b9a042370000200541106a41002900b1a042370000200541086a41002900a9a042370000200541002900a1a0423700000c2e0b20840121c10102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020b601208c01712205207c460d002005208d01470d01410021050c430b20b701208c01712205208d01460d0102402005207c470d000340208a012081016b208e014d0d0520810128020c450d092081012090016a2205280200450d0d2081012092016a2205280200450d112081012095016a21052081012094016a220921810120052802000d000b2009218101200528020421c2010c160b0340208a012081016b208e014d0d0520810128020c450d092081012090016a2205280200450d0d2081012092016a2205280200450d112081012095016a21052081012094016a220921810120052802000d000b20092181010c170b20b701208c01712205208d01460d0102402005207c470d000340208a012081016b208e014d0d0620810128020c450d0a2081012090016a2205280200450d0e2081012092016a2205280200450d122081012095016a21052081012094016a220921810120052802000d000b20092181010c120b0340208a012081016b208e014d0d0620810128020c450d0a2081012090016a2205280200450d0e2081012092016a2205280200450d132081012095016a21052081012094016a220921810120052802000d000b20092181010c1a0b20b901207c470d1a20830120b801460d1a0c3f0b20b901207c470d2a20830120b801460d29410321050c3f0b208101208a01460d412081012096016a2105034020810128020c450d1120052089016a21052081012089016a228101208a01470d000c420b0b0240208101208a01460d00208101208f016a2105034020810128020c450d1320052089016a21052081012089016a228101208a01470d000b208a012181010b20b901207c470d240c230b410121b701208101208a01460d2a2081012096016a2105034020810128020c450d1320052089016a21052081012089016a228101208a01470d000b208a012181012085010d2b0c3f0b0240208101208a01460d00208101208f016a2105034020810128020c450d1520052089016a21052081012089016a228101208a01470d000b208a012181010b20b901207c470d240c230b208101208f016a21052081012089016a218101200528020421c2010c0d0b208101208f016a21052081012089016a2181010c0e0b208101208f016a21052081012089016a2181010c080b208101208f016a21052081012089016a2181010c100b2081012091016a218101200528020421c2010c090b2081012091016a2181010c0a0b2081012091016a2181010c040b2081012091016a2181010c0c0b2081012093016a218101200528020421c2010c050b2081012093016a2181010c060b2081012093016a2181010b200528020421c2010c060b2081012093016a2181010c070b2005208b016a218101200528020021c2010b410121b60120c101218401410121b701200320c20136027c20080d1f0c2d0b20052097016a2181010b410021b701410121b60120c1012184012003200528020422c20136027c20080d1a0c2b0b2005208b016a218101200528020021c2010b410121b701410021b60120c101218401200320c20136027c20080d1a0c290b20052097016a2181010b410021b60120c101218401410021b7012003200528020422c20136027c20080d170c270b0340208201208801460d29200341286a20820110ae032003280228228301450d292082012087016a218201208301208301200328022c208d01746a22b801470d250c000b0b20bf01220520e2016a21bf01200528020021bb02200341e0006a21bc02200328026421bd020c100b024020c2022d0000220520c402460d000240200520d002460d00200520c802470d2720c20228020c2205450d2720c20228020422d202200520d1026c6a21d302410a21720c210b20c20228020421d702200341e0006a21d802200328026421d9020c110b20c20228020c2205450d2520c20228020422da02200520c5026c6a21db02410c21720c210b412c101f2205450d04200541286a410028009da042360000200541206a4100290095a042370000200541186a410029008da042370000200541106a4100290085a042370000200541086a41002900fd9f42370000200541002900f59f423700000c2a0b411e101f2205450d04200541166a41002900e3a042370000200541106a41002900dda042370000200541086a41002900d5a042370000200541002900cda042370000429e808080e003210c0c2a0b200341c8056a290300210c2008101d20050d2a41002108412c21232020450d2e0b2021202020236c6a212441142125200341b0046a41146a2126200341b0076a212741012128200341c0056a4101722129410b212a4118212b410c212c4104212d4102212e200341a4076a212f200341a0076a21304113213120034190076a213241d700213320034184076a213420034180076a2135412d2136200341f4066a2137200341f0066a213841122139200341e4066a213a200341e0066a213b200341d0066a213c4106213d200341c0066a213e4100213f200341b0066a21404184082141200341a0066a21424137214320034194066a214420034190066a214520034184066a214620034180066a2147200341f4056a2148200341f0056a21494120214a200341c0056a41206a214b41d600214c4110214d200341c0056a41106a214e4108214f200341b0046a41086a215041ac0121514109215241ffffffff032153200341e8056a2154200341e4056a2155200341f8056a215620034188066a215720034198066a2158200341a8066a2159200341a4066a215a200341b8066a215b200341b4066a215c200341c8066a215d200341c4066a215e200341d8066a215f200341d4066a2160200341e8066a2161200341f8066a216220034188076a216320034198076a216420034194076a2165200341a8076a21664208216742042168422021694103216a4170216b41ff01216c411a216d4201216e41f0adc400216f4101211f0c040b412c41011020000b412c41011020000b411e41011020000b4100211f410121050c2e0b410121050c2d0b410321720c0e0b410421720c0e0b410521720c0e0b410621720c0e0b410721720c0e0b410821720c0e0b410921720c0e0b410b21720c0f0b410021050c110b410121050c100b410221050c0f0b410221050c0e0b410221050c0d0b410221050c0c0b410421050c0b0b410421050c0a0b410421050c090b410421050c080b410421050c070b410421050c060b410421050c050b410421050c040b410421050c030b410421050c020b410421050c010b208301450d0320830128020021c201410121b601410221b70120c101218401208301208b016a218301410121b901200320c20136027c2008450d01410221050b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e05000102030f0f0b208501450d3a410121050c370b410221b60141002184014100218501200320c10122c20136027c2008450d37410221050c360b200f20c2014d0d05200820c201208d01746a2802002209450d0b20bb0120ba01470d0320ba01207c6a220520ba01490d4a20ba01207c74220a20052005200a491b22bb01ad20800186220c20980188a70d4a200ca72205207f480d4a20ba01450d0120bd0120ba01208d01742005101e22bc010d020c090b208301208b016a2105208301450d0320830128020021c201410121b901410221b701410021b60120c1012184012005218301200320c20136027c20080d180c350b2005101f22bc01450d070b20bc0121bd0120bc0121be0120bc0121bf010b20bf0120ba01208d01746a20c201360200200341c0056a200328027c22c301200341c8006a10b003200341c0056a2097016a22c40128020021c50120032802c40521c00120032802c00522c601207c460d0220c00128020822052099014c0d4520c0012d000c210b024002402005450d0020c00128020021072005101f220a450d06200a2007200510ce031a0c010b4101210a0b20c001209a016a2d000021072003200936029c012003200328027c360298012003207f36029001200320073a008d012003200b3a008c01200320053602880120032005360284012003200a3602800102400240200328027022c701208601460d00200328027421c8010c010b209b01101f22c701450d07410021c80120c70141003b010620c701410036020020c7012097016a200341c0056a209c0110ce031a20034100360274200320c7013602700b20ba01207c6a21ba010c090b410121b901410221b70120052183012085010d120c330b200341d4056a4101360200200341023602a403200341d0056a200341a0036a360200200342023702c405200341e0aec4003602c0052003200341fc006a3602a003200341b0046a200341c0056a102820032902b404228001422088a7210920032802b00421c001208001a721c5010c010b200341c0056a208f016a28020021090b20032802702003280274200341f8006a28020010b203024020bb01450d0020bc01101d0b0240207d450d00207d412c6c217c207e21050340200510452005412c6a2105207c41546a227c0d000b0b0240200341d4006a280200450d00207e101d0b200020c00136020420004101360200200041086a2009ad42208620c501ad843702002008450d39200f450d392008101d200424000f0b200541011020000b200541041020000b41940341041020000b4102211f410121050c3c0b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020720e0d000102060708090b0c0f101112120b207020256a22732802002274450d4d2070202c6a2175410021760c410b20c7012097016a210a20c7012f01062207208d01742109417f21050240024002400240024003402009450d012005207c6a2105207f209901207c200a280200220b20c3014b1b200b20c301461b220b450d04200920b3016a2109200a208b016a210a200b207c460d000b20c8010d010c020b2007210520c801450d010b20c8012099016a21c80120c7012005208d01746a209b016a28020021c701410121720c380b200341f0006a2097016a22092009280200207c6a360200200329039801210c20032903900121c90120032903880121ca0120032903800121cb0120c7012f01062209209e014f0d0120c7012097016a220a2005207c6a220b208d01746a200a2005208d01746a220a200920056b208d017410cf031a200a20c30136020020c7012092016a2209200b209f01746a20092005209f01746a220920c701209d016a220a2f010020056b209f017410cf031a200920a0016a200c370200200920c901370210200920ca01370208200920cb01370200200a200a2f0100207c6a3b010020c601450d220c480b20c7012005209f01746a220520a9016a200329039801370200200520aa016a220929020021c901200920032903900137020020052093016a20032903880137020020052092016a2205290200210c200520032903800137020020c90120b5018320800185500d46200c20b40183500d46200ca7101d0c460b209b01101f2209450d1b2009207f3b01062009207f36020020092097016a200341c0056a209c0110ce03210b200341c0056a20a0016a22cc0120c70120a1016a290200370300200341c0056a2096016a22cd0120c70120a2016a29020037030020c40120c70120a3016a290200370300200320c7012902f4013703c00520c70128022021ce01200b20c70120a4016a20c701209d016a22072f010020a5016a220a208d017410ce03210b20092092016a20c70120a6016a200a209f017410ce03210d2007209d013b01002009200a3b0106200341b0046a20a0016a22cf0120cc01290300370300200341b0046a2096016a22d00120cd01290300370300200341b0046a2097016a22d10120c401290300370300200320032903c0053703b004024002402005209d014b0d0020c7012097016a220a2005207c6a220b208d01746a200a2005208d01746a220720c701209d016a220a2f010020056b208d017410cf031a200720c30136020020c7012092016a2207200b209f01746a20072005209f01746a220b200a2f010020056b209f017410cf031a200b20a0016a200c370200200b20c901370210200b20ca01370208200b20cb013702000c010b200b200520b0016a221f208d01746a200b200520a5016a2207208d01746a2205200a20ab017120076b208d017410cf031a200520c301360200200d201f209f01746a200d2007209f01746a22052009209d016a220a2f010020076b209f017410cf031a200520a0016a200c370200200520c901370210200520ca01370208200520cb013702000b200a200a2f0100207c6a3b0100200341a0036a20a0016a22d20120cf01290300370300200341a0036a2096016a22d30120d001290300370300200341a0036a2097016a22d40120d101290300370300200320032903b0043703a00320034190026a20a0016a22d50120d20129030037030020034190026a2096016a22d60120d30129030037030020034190026a2097016a22d70120d401290300370300200320032903a0033703900220c70128020022d801450d0120c7012f010421d901200921da010c260b20d20120d50129030037030020d30120d60129030037030020d40120d70129030037030020032003290390023703a00320d90120ab0171210720d8012f0106220520ac014d0d0220a701101f220b450d1b200b207f3b0106200b207f360200200b2097016a200341c0056a20a80110ce03210920d8012090016a280200212220cc0120d80120a1016a29020037030020cd0120d80120a2016a29020037030020c40120d80120a3016a290200370300200320d80120ae016a2902003703c005200920d80120a4016a20d801209d016a221f2f0100220a20a5016a2205208d017410ce032178200b2092016a20d80120a6016a2005209f017410ce032179200b209b016a20d80120af016a200a20b0016a220d208d017410ce032120201f209d013b0100200b20053b01060240200d450d00410021052020210903402009280200220a20053b0104200a200b3602002009208b016a2109200d2005207c6a2205470d000b0b20cf0120cc0129030037030020d00120cd0129030037030020d10120c401290300370300200320032903c0053703b00420cc0120cf0129030037030020cd0120d00129030037030020c40120d101290300370300200320032903b0043703c0050240024020d90120ab01712209209d014b0d0020d8012097016a22052007207c6a220d208d0174220a6a20052007208d017422206a2205201f2f0100227820076b2279208d017410cf031a200520ce0136020020d8012092016a2205200d209f01746a20052007209f01746a22052079209f017410cf031a200520a0016a20d20129030037020020052096016a20d30129030037020020052097016a20d401290300370200200520032903a003370200201f2078207c6a22053b010020d801209b016a221f20206a2097016a201f200a6a221f200520ab0171220a200d6b208d017410cf031a201f20da013602002009200a4f0d0120d80120206a20ad016a21050340200528020022092007207c6a22073b0104200920d8013602002005208b016a2105200a2007470d000c020b0b2078200720b0016a220a208d0174221f6a2078200720a5016a2205208d01746a2209200b209d016a220d2f010020056b208d017410cf031a200920ce013602002079200a209f01746a20792005209f01746a2209200d2f010020056b209f017410cf031a200920a0016a20d20129030037020020092096016a20d30129030037020020092097016a20d401290300370200200920032903a003370200200d200d2f0100207c6a22093b010020202007208d017422ce016a20b1016a2020201f6a220d200920ab01712207200a6b208d017410cf031a200d20da01360200200a20074b0d00200b20ce016a20b2016a210903402009280200220a2005207c6a22053b0104200a200b3602002009208b016a210920072005470d000b0b20d50120cc0129030037030020d60120cd0129030037030020d70120c401290300370300200320032903c00537039002024020d8012802002205450d0020d8012f010421d901200521d801202221ce01200b21da01410221720c370b202221ce0120a701101f22050d010c1c0b2009210b20a701101f2205450d1b0b2005207f3b01062005207f36020020052097016a200341c0056a20a80110ce0321072005200328027022093602940320032003280274207c6a3602742009207f3b01042003200536027020092005360200200520052f0106220a209f01746a220920a9016a20d501290300370200200920aa016a20d60129030037020020092093016a20d70129030037020020092092016a2003290390023702002007200a208d01746a20ce013602002005209b016a200a207c6a2209208d01746a200b360200200520093b0106200b20093b0104200b200536020020c6010d430c1c0b20d8012097016a22092007207c6a220a208d0174220b6a20092007208d0174220d6a2209200520076b221f208d017410cf031a200920ce0136020020d8012092016a2209200a209f01746a20092007209f01746a2209201f209f017410cf031a200920a0016a20d20129030037020020092096016a20d30129030037020020092097016a20d401290300370200200920032903a00337020020d801209d016a2005207c6a22053b010020d801209b016a2209200d6a2097016a2009200b6a2209200520ab0171220b200a6b208d017410cf031a200920da013602002007200b4f0d4120d801200a2099016a2205208d01746a20ad016a210903402009280200220a2005207c6a22053b0104200a20d8013602002009208b016a2109200b2005470d000c420b0b20830120b801460d23208301450d4b20830128020021c201410121b601410221b70120c101218401208301208b016a218301410121b901200320c20136027c20080d2b0c490b208201208801460d4a200341206a20820110ae032003280220228301450d4a2082012087016a2182012083012003280224208d01746a21b8010c210b024020830120b801460d00208301208b016a2105208301450d0220830128020021c201410121b901410221b701410021b60120c1012184012005218301200320c20136027c20080d2c0c480b410121b90120b801218301410621720c340b410221b701208201208801460d03200341106a20820110ae032082012087016a21820120032802102205450d2320052003280214208d01746a21b80120052183010c210b410121b901410221b70120052183012085010d250c470b410121b90120b801218301410821720c330b410221b701208201208801470d010b2088012182012085010d210c440b200341186a20820110ae032082012087016a21820120032802182205450d1f20052283012005200328021c208d01746a22b801470d260c1d0b20bc02280200220b20dd016a210a200b2f0106220d20df01742109417f210502400240024003402009450d01200520e5016a210520e60120e30120e501200a280200220720bb024b1b200720bb02461b2207450d03200920e7016a2109200a20e2016a210a200720e501460d000b20bd020d010c080b200d210520bd02450d070b20bd0220e3016a21bd02200b200520df01746a20e4016a21bc02410921720c310b200b20e9016a200520e801746a2220450d0520202802182109202028021c210520ea01200e36020020ec0120ed013a000020ef0120f0013a000020f101200536020020f30120f4013a000020f501200e36020020f70120f8013a000020f901200936020020fb0120fc013a000020fe0120ff013a000020810220e6013a00002083022084023b01002086022087023a00002088022002360200208a0220f4013a0000208b02200e360200208d0220f8013a0000200341c0056a20e9016a2278200e360200208f0220ed013a00002091022092023a0000209402200536020020dc0120f4013a00002003200e3602c405200320f8013a00c0052020280208220d20db016a2205ad220c20960288a70d53200c20950286a7220920e3014c0d53202020dd016a2122024002400240024002402009450d002009101f2207450d0d2022280200220d450d020c010b41082107200d450d010b4100210b410021090340024020092005470d00200520e5016a220a2005490d59200520e50174221f200a200a201f491b220aad20950286220c20980288a70d59200ca7221f20e601480d59024002402005450d002007200520e20174201f101e22070d010c0b0b201f101f2207450d0a0b200a21050b2007200b6a220a2097023a0000200a20e2016a2009360200200a20ba026a200341a0036a20df016a2d00003a0000200a20e5016a20032f01a0033b0000200b20db016a210b200920e5016a220a2109200d200a470d000b2005200a6b2097024f0d020c010b4100210a200541006b2097024f0d010b200a2097026a2209200a490d55200520e50174220b20092009200b491b2209ad20950286220c20980288a70d55200ca7220b20e601480d55024002402005450d002007200520e20174200b101e22070d010c0e0b200b101f2207450d0d0b200921050b200341b0046a200341c0056a10b3032007200a20e201746a220920032903b004370300200920dd016a200341b0046a20dd016a220b290300370300200341b0046a20dc0110b30320092099026a200b290300370300200920032903b004370310200341b0046a20910210b3032009209a026a200b29030037030020092090026a20032903b004370300200341b0046a208f0210b3032009209b026a200b2903003703002009208e026a20032903b004370300200341b0046a208d0210b3032009209c026a200b2903003703002009208c026a20032903b004370300200341b0046a208a0210b3032009209d026a200b29030037030020092089026a20032903b004370300200341b0046a20860210b3032009209e026a200b29030037030020092085026a20032903b004370300200341b0046a20830210b3032009209f026a200b29030037030020092082026a20032903b004370300200341b0046a20810210b303200920a0026a200b29030037030020092080026a20032903b004370300200341b0046a20fe0110b303200920a1026a200b290300370300200920fd016a20032903b004370300200341b0046a20fb0110b303200920a2026a200b290300370300200920fa016a20032903b004370300200341b0046a20f70110b303200920a3026a200b290300370300200920f6016a20032903b004370300200341b0046a20f30110b303200920a4026a200b290300370300200920f2016a20032903b004370300200341b0046a20ef0110b303200920a5026a200b290300370300200920ee016a20032903b004370300200341b0046a20ec0110b303200920a6026a200b290300370300200920eb016a20032903b00437030002400240024002402005200a2097026a2209470d00200520e5016a22092005490d58200520e50174220b20092009200b491b221fad20950286220c20980288a70d58200ca7220920e601480d582005450d012007200520e201742009101e22070d020c100b2005211f0c020b2009101f2207450d0e0b200521090b2007200920e201746a220520ff013a0000200520dd016a20a702290000370000200520032900b004370001200341b0046a20034180016a20a80210ce031a20db01101f2209450d06200920ff013a0000200341a0036a200341b0046a20a80210ce031a2022280200220520e3014c0d53024002402005450d002020280200210b2005101f220d450d0b200d200b200510ce03210b2005101f220d450d0c200d200b200510ce031a200b101d2005ad210c0c010b4101210d41014101200510ce031a2005ad210c410021050b200341b0046a200341a0036a20a80210ce031a202031000d21c901200341a0036a200341b0046a20a80210ce031a200341b0046a200341a0036a20a80210ce031a20034190026a200341b0046a20a80210ce031a20db01101f220b450d07200a20db016a210a20be0220a9027121be0220bf0220aa028322bf02200c8420c90120ac02868420ad0284210c200b20ff013a0000200b101d200341a0036a20034190026a20a80210ce031a200341b0046a200341a0036a20a80210ce031a024020092d000020ae02470d00200928020820af0271450d002009280204101d0b2009101d20034190026a200341b0046a20a80210ce031a200341b0046a20034190026a20a80210ce031a20b00220be02360200200341a0036a209a026a200a36020020b202201f360200200341a0036a2090026a200736020020b30220e601360200200341a0036a2093026a20950237020020b402200c370200200341a0036a20dd016a20053602002003200d3602a403200320e5013602a003200341b0046a200341a0036a104e20034180016a200341b0046a20a80210ce031a202020e501360210202020e101360214024020032d00c00520ae02470d0020de0128020020af0271450d0020032802c405101d0b024020dc012d000020ae02470d00200341c0056a2099026a28020020af0271450d00209402280200101d0b02402091022d000020ae02470d00200341c0056a209a026a28020020af0271450d00200341c0056a20b1026a280200101d0b0240208f022d000020ae02470d00200341c0056a209b026a28020020af0271450d002078280200101d0b0240208d022d000020ae02470d00200341c0056a209c026a28020020af0271450d00208b02280200101d0b0240208a022d000020ae02470d00200341c0056a209d026a28020020af0271450d00208802280200101d0b02402086022d000020ae02470d00200341c0056a209e026a28020020af0271450d0020b502280200101d0b02402083022d000020ae02470d00200341c0056a209f026a28020020af0271450d0020b602280200101d0b02402081022d000020ae02470d00200341c0056a20a0026a28020020af0271450d0020b702280200101d0b024020fe012d000020ae02470d00200341c0056a20a1026a28020020af0271450d0020b802280200101d0b024020fb012d000020ae02470d00200341c0056a20a2026a28020020af0271450d0020f901280200101d0b024020f7012d000020ae02470d00200341c0056a20a3026a28020020af0271450d0020f501280200101d0b024020f3012d000020ae02470d00200341c0056a20a4026a28020020af0271450d0020f101280200101d0b024020ef012d000020ae02470d00200341c0056a20a5026a28020020af0271450d0020b902280200101d0b024020ec012d000020ae02470d00200341c0056a20a6026a28020020af0271450d0020ea01280200101d0b20bf0220ab028421bf0220e10120e5016a21e10120bf0120e001470d130c430b20d20228020c0d3520d20228021021d402200341e0006a21d502200328026421d6020c320b20d802280200220b20c8026a210a200b2f0106220d20c602742109417f21050240024003402009450d01200520cb026a210520cc0220c90220cb02200a280200220720d7024b1b200720d702461b2207450d04200920cd026a2109200a20c7026a210a200720cb02460d000b20d9020d010c410b200d210520d902450d400b20d90220c9026a21d902200b200520c602746a20ca026a21d802410b21720c2f0b20da022802182205450d3220da0228021022dc02200520c602746a21dd02410221050c310b200b20cf026a200520ce02746a2205450d3d2005280210450d0c20c20220c7026a20052802143602000c3d0b201f41081020000b4192a5c200418001103a000b411041081020000b411041081020000b200941081020000b200541011020000b200541011020000b200b41081020000b200941081020000b41940341041020000b41c40341041020000b41c40341041020000b4192a6c2004135103a000b4102211f0c020b4102211f0c020b4103211f0c020b410121050c3d0b410121050c3c0b410121050c3b0b410121720c0e0b410221720c0f0b410321720c100b410421720c100b410521720c100b410721720c110b410021050c210b410021050c200b410121050c1f0b410121050c1e0b410121050c1d0b410221050c1c0b410221050c1b0b410221050c1a0b410321050c190b410421050c180b410421050c170b410421050c160b410421050c150b410421050c140b410421050c130b410421050c120b410421050c110b410421050c100b410421050c0f0b410421050c0e0b410421050c0d0b410021050c010b410121050b0340024002400240024002400240024002400240024002400240024002400240024002400240024020050e03000102020b207620744f0d020240024002400240024020752802002076202d7422206a22052d0000202a470d0020032005202d6a2205360290022008450d08200f200528020022054d0d0420082005202e746a2802002209450d00202f200e360200203020313a0000203220333a000020342009360200203520363a00002037200e360200203820393a0000203a2005360200203b202a3a0000203c203d3a0000203e203f3a0000204020413b0100204220433a000020442002360200204520363a00002046200e360200204720393a00002048200e360200204920313a0000204b204c3a0000200341c0056a20256a22772009360200204e20363a0000202920032f00b0043b00002029202e6a200341b0046a202e6a2d00003a0000200320393a00c0052003200e3602c40520732802002222207620286a221f490d0a2073207636020020752802002105200341b0046a202b6a220d2027360200200341b0046a204d6a227820753602002050200520206a2207204d6a220b3602002003201f3602b004200341b0046a202c6a22792005201f202d74227a6a227b3602002026200341c0056a36020020032022201f6b22743602b404200b2105024020072d0000220a2051460d00410021050340200720056a21090240200a206c712052470d002009204f6a280200205371450d002009202d6a280200101d0b2005450d0320502009204a6a3602002005204d6a21052009204d6a2d0000220a2051470d000b200720056a204d6a21050b2005207b470d020c030b410121050c150b2009204d6a2205207b460d010b0340205020052209204d6a22053602000240024020092d0000220a2052460d00200a2051470d010c030b2009204f6a280200205371450d002009202d6a280200101d0b200b2005470d000b0b024002400240024002402074450d00201f20702802142205470d0120272220200341c0056a22096b202d7622050d020c040b2075202610b403205028020022052079280200220b470d140c150b20202005202d7422056b210a207528020020056a2105200341c0056a22092027460d01034020262009204d6a360200200341a0036a200910b30320032d00a0032051460d13200520032903a0033703002005204f6a200341a0036a204f6a2903003703002073207328020020286a3602000240200a450d002005204d6a2105200a206b6a210a20262802002209200d280200470d010c030b0b200d2802002220202628020022096b202d762205450d020b02400240024002402078280200220b202d6a2207280200220a20226b20054f0d00202220056a227b2022490d39200a2028742222207b207b2022491b2222ad206886220c206988a70d39200ca7227b203f480d39200a450d01200b280200200a202d74207b101e220a0d020c0d0b200b280200210a0c020b207b101f220a450d0b0b200b200a360200200720223602000b200a201f20056a2207202d746a200a207a6a2074202d7410cf031a200320073602b0042007200b280208220a460d01207620056a202d74200a202d7422056b210a200b28020020056a210520092020460d00034020262009204d6a360200200341a0036a200910b30320032d00a0032051460d12200520032903a0033703002005204f6a200341a0036a204f6a290300370300200b204f6a2209200928020020286a360200200a450d022005204d6a2105200a206b6a210a20262802002209200d280200470d000b0b200320513a00a003205028020022052079280200220b470d110c120b200341a0036a204f6a2205203f360200200320673703a003200341a0036a202610b40320032802a003222220052802002209202d7422076a210b20032802a403217b2022210502402009450d00024002400240024020782802002220202d6a2274280200220520032802b404220d20032802b00422096a221f6b2007202d75220a4f0d00201f200a6a227a201f490d382005202874221f207a207a201f491b227aad206886220c206988a70d38200ca7221f203f480d382005450d0120202802002005202d74201f101e22050d020c0d0b202028020021050c020b201f101f2205450d0b0b202020053602002074207a3602000b20052009200a6a220a202d74221f6a20052009202d746a200d202d7410cf031a2003200a3602b00420222105200a20202802082209460d0020202802002205201f6a217420052009202d746a210a2022210903402007450d0e200341a0036a202e6a22052009206a6a2d00003a0000200320092f00013b01a00320092d0000220d2051460d0d2009202d6a290200210c2009202c6a280200211f200a200d3a0000200a202c6a201f360200200a202d6a200c37020020032f01a003210d200a206a6a20052d00003a0000200a20286a200d3b00002020204f6a2205200528020020286a3602002007206b6a21072009204d6a22052109200a204d6a220a2074470d000b0b2005200b460d0e0c0d0b200341c0056a20256a20283602002003206d3602a403204e200341a0036a3602002003206e3702c4052003206f3602c005200320034190026a3602a003200341b0046a200341c0056a102820032802b0042205450d1c20032902b4042180012000200536020420004101360200200041086a2080013702002008450d28200f450d282008101d0c280b20d502280200220b20c8026a210a200b2f0106220d20c602742109417f210502400240024003402009450d01200520cb026a210520cc0220c90220cb02200a280200220720d4024b1b200720d402461b2207450d03200920cd026a2109200a20c7026a210a200720cb02460d000b20d6020d010c160b200d210520d602450d150b20d60220c9026a21d602200b200520c602746a20ca026a21d502410121050c120b200b20cf026a200520ce02746a2205450d132005280210450d0720d20220c0026a20052802143602000c130b20dc02222020c7026a21dc022020280200210b200341e0006a21052003280264211f024003402005280200220720c8026a210a20072f0106222220c602742109417f210502400240024003402009450d01200520cb026a210520cc0220c90220cb02200a280200220d200b4b1b200d200b461b220d450d03200920cd026a2109200a20c7026a210a200d20cb02460d000b201f0d010c040b20222105201f450d030b201f20c9026a211f2007200520c602746a20ca026a21050c010b0b200720cf026a200520ce02746a2205450d002005280210450d03202020052802143602000b20dc0220dd02470d070c110b41e0adc40020762074104b000b41a99fc20041cc00103a000b4192a6c2004135103a000b41b0aec400102c000b207b41081020000b201f41081020000b4192a6c2004135103a000b410221050c080b2009204d6a2205200b470d010c020b200b2205200b460d010b03400240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a280200101d0b2005204d6a2205200b470d000b0b207b450d002022101d0b205028020022052079280200220b460d010b0340205020052209204d6a22053602000240024020092d0000220a2052460d00200a2051470d010c030b2009204f6a280200205371450d002009202d6a280200101d0b200b2005470d000b0b024020032802b4042205450d00024020032802b004220b20782802002207204f6a220a2802002209460d00200728020022072009202d746a2007200b202d746a2005202d7410cf031a0b200a200520096a3602000b024020032d00c0052052470d00200341c0056a204f6a280200205371450d0020032802c405101d0b0240204e2d00002052470d00200341c0056a202b6a280200205371450d002077280200101d0b0240204b2d00002052470d002054280200205371450d002055280200101d0b024020492d00002052470d002056280200205371450d002048280200101d0b024020472d00002052470d002057280200205371450d002046280200101d0b024020452d00002052470d002058280200205371450d002044280200101d0b024020422d00002052470d002059280200205371450d00205a280200101d0b024020402d00002052470d00205b280200205371450d00205c280200101d0b0240203e2d00002052470d00205d280200205371450d00205e280200101d0b0240203c2d00002052470d00205f280200205371450d002060280200101d0b0240203b2d00002052470d002061280200205371450d00203a280200101d0b024020382d00002052470d002062280200205371450d002037280200101d0b024020352d00002052470d002063280200205371450d002034280200101d0b024020322d00002052470d002064280200205371450d002065280200101d0b024020302d00002052470d002066280200205371450d00202f280200101d0b410f21050b200520766a2276207328020022744f0d0a410021050c000b0b20da0220c5026a22da0220db02460d0b410c2172410421050c090b20d20220d1026a22d20220d302460d0a410a2172410421050c080b20c601450d010b20c501450d0120c001101d4102211f0c020b4102211f0c020b4102211f0c020b410121050c160b410121050c150b410121050c140b2070202b6a22702071460d0d41002172410421050c000b0b41a99fc20041cc00103a000b20c20220c1026a22c20220c302460d024104211f410121050c100b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360207d412c6c2105207e41586a2109024003404100210a2005450d01200541546a2105200941286a210b2009412c6a22072109200b2d00004103470d000b200741086a2802002205450d00200541286c2109200728020041186a21054100210a0340200a20052d0000456a210a200541286a2105200941586a22090d000b0b207d412c6c2105207e41606a21090240024003402005450d01200541546a2105200941206a210b2009412c6a22072109200b2d00004104470d000b200728020021050c010b410021050b411021db01200341c0056a41106a22dc01200341c8006a41106a280200360200410821dd01200341c0056a41086a22de01200341c8006a41086a290300370300200320032903483703c00520034180016a200341c0056a104720ba01450d00410221df0120bf0120ba014102746a21e0012005200a6a21e101410421e201417f21e30141940321e401410121e501410021e601417c21e701410521e801413421e901200341a4076a21ea0141e00121eb01200341c0056a41e0016a21ec01411321ed0141d00121ee01200341c0056a41d0016a21ef0141d70021f00120034184076a21f10141c00121f201200341c0056a41c0016a21f301412d21f401200341f4066a21f50141b00121f601200341c0056a41b0016a21f701411221f801200341e4066a21f90141a00121fa01200341c0056a41a0016a21fb01410b21fc0141900121fd01200341c0056a4190016a21fe01410621ff01418001218002200341c0056a4180016a21810241f000218202200341c0056a41f0006a21830241840821840241e000218502200341c0056a41e0006a218602413721870220034194066a21880241d000218902200341c0056a41d0006a218a0220034184066a218b0241c000218c02200341c0056a41c0006a218d024130218e02200341c0056a41306a218f024120219002200341c0056a41206a21910241d6002192024114219302200341c0056a41146a2194024204219502421c219602410f219702422021980241182199024128219a024138219b0241c800219c0241d800219d0241e800219e0241f800219f0241880121a00241980121a10241a80121a20241b80121a30241c80121a40241d80121a50241e80121a602200341b7046a21a702418c0121a80241807e21a902428080808080804021aa024280808080808c0121ab02422821ac024280808080800c21ad02410921ae0241ffffffff0321af02200341cc036a21b002412421b102200341a0036a41246a21b202200341bc036a21b302200341ac036a21b402200341a4066a21b502200341b4066a21b602200341c4066a21b702200341d4066a21b80220034194076a21b902410321ba024103211f0c020b024020bb01450d0020be01101d0b200341c0056a20034180016a418c0110ce031a200341b0046a200341c0056a1049411021c002200341b0046a41106a2802002205450d00412c21c10220032802b80422c2022005412c6c6a21c302410a21c402411c21c502410221c602410421c702410821c802417f21c90241940321ca02410121cb02410021cc02417c21cd02410521ce02413421cf02410921d002411421d1024104211f0c020b200341bc046a29020021800120032802b004210520032902b40421980120032802602003280264200328026810b203200020c0026a208001370200200041086a20980137020020002005360204200041003602002008450d06200f450d062008101d200424000f0b410121050c0c0b410121050c0b0b42ac808080c005210c0b2008101d0b2000200536020420004101360200200041086a200c3702000b200141086a280200217c0240200141106a2802002203450d002003412c6c2105207c21030340200310452003412c6a2103200541546a22050d000b0b2001410c6a280200450d00207c101d0b200424000f0b202120236a22212024470d010b200341c8006a41106a2205200141106a280200360200200341c8006a41086a227c200141086a290200370300200320012902003703482005280200227d20236c2105207c280200227e41586a217c0240024003402005450d01200541546a2105207c41286a2109207c20236a227f217c20092d00004108470d000b200341386a207f104420032802382109200328023c21050c010b410021090b2005410020091b210a207d412c6c2105207e41586a217c200941f8b3c20020091b2181010240024003402005450d01200541546a2105207c41286a2109207c412c6a227f217c20092d0000410a470d000b200341306a207f104420032802302109200328023421050c010b410021090b2005410020091b210b207d412c6c2105207e41586a217c200941f8b3c20020091b2182010240024003404100217f2005450d01200541546a2105207c41286a2109207c412c6a228301217c20092d00004109470d000b20830128020021840141012185010c010b41002185010b2003420037027441f0c0c100218601200341f0c0c100360270411c218701208201200b411c6c6a2188014114218901208101200a41146c6a218a014104218b0141ff01218c014101217c4102218d0141cf00218e01410c218f01412021900141282191014134219201413c21930141d00021940141c8002195014110219601410821970142022180014220219801417f219901410d219a01419403219b01418c03219c014106219d01410b219e014105219f01411821a001418c0221a10141840221a20141fc0121a301412421a401417921a50141940221a60141c40321a70141bc0321a80141cc0021a90141c40021aa0141ffff0321ab01410a21ac0141980321ad0141f40121ae0141b00321af01417a21b001416c21b10141fc0221b201417c21b30142808080807021b40142ffffffff0f21b501410021b601410021b701410021b801410021b901410021ba01410021bb01410421bc01410421bd01410421be01410421bf010c010b4101211f0c010b4102211f0c010b410121050c010b410121050c000b0b102e000b1021000bcdb6020f2b7f017ece017f027e257f017e7b7f017e0c7f017e0d7f017e347f017e237f230041d0006b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410d4b0d00024020040e0e00090607030a0c080e050d02040b000b200141186a2802002105200141146a2802002106200141106a28020021072001410c6a2802002108200141086a2802002109200141046a280200210a200241046a280200200241086a2802002204470d16200441016a220b2004490d5b2004410174220c200b200b200c491b220c4100480d5b2004450d2d20022802002004200c101e220b450d2e0c570b2001410c6a280200210b200141086a2802002107200141046a280200210520012d00012108200241046a280200200241086a2802002204470d0d200441016a22062004490d5a2004410174220d20062006200d491b220d4100480d5a2004450d1c20022802002004200d101e2206450d1d0c540b2001410c6a280200210e200141086a280200210f200141046a2802002110200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d1d200228020020042005101e220b450d1e0c510b2001410c6a2802002111200141086a2802002112200141046a2802002113200241046a280200200241086a2802002204470d0d200441016a220b2004490d5820044101742205200b200b2005491b22054100480d582004450d1e200228020020042005101e220b450d1f0c4e0b200141146a2802002114200141106a28020021152001410c6a2802002116200141086a2802002117200141056a2d00002118200141046a2d00002119200241046a280200200241086a2802002204470d0d200441016a220b2004490d5620044101742205200b200b2005491b22054100480d562004450d1f200228020020042005101e220b450d200c4b0b2001410c6a280200211a200141086a280200211b200141046a280200211c200241046a280200200241086a2802002204470d0d200441016a220b2004490d5620044101742205200b200b2005491b22054100480d562004450d20200228020020042005101e220b450d210c480b2001410c6a280200211d200141086a280200211e200141046a280200211f200241046a280200200241086a2802002204470d0d200441016a220b2004490d5520044101742205200b200b2005491b22054100480d552004450d21200228020020042005101e220b450d220c450b2001410c6a2802002106200141086a2802002120200141046a2802002121200241046a280200200241086a2802002204470d0d200441016a220b2004490d5420044101742205200b200b2005491b22054100480d542004450d22200228020020042005101e220b450d230c420b2001410c6a2802002106200141086a2802002122200141046a2802002123200241046a280200200241086a2802002204470d0d200441016a220b2004490d5320044101742205200b200b2005491b22054100480d532004450d23200228020020042005101e220b450d240c3f0b2001410c6a2802002106200141086a2802002124200141046a2802002125200241046a280200200241086a2802002204470d0e200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d26200228020020042005101e220b450d270c3c0b2001410c6a2802002126200141086a2802002127200141046a2802002128200241046a280200200241086a2802002204470d0e200441016a220b2004490d5120044101742205200b200b2005491b22054100480d512004450d27200228020020042005101e220b450d280c390b200141286a2802002129200141246a280200212a200141206a280200212b2001411c6a2802002108200141186a280200212c200141146a280200212d2001410c6a290200212e200141086a2802002109200141046a280200212f200241046a280200200241086a2802002204470d0e200441016a220b2004490d4f20044101742205200b200b2005491b22054100480d4f2004450d28200228020020042005101e220b450d290c360b2001410c6a2802002130200141086a2802002131200141046a2802002132200241046a280200200241086a2802002204470d0e200441016a220b2004490d4f20044101742205200b200b2005491b22054100480d4f2004450d29200228020020042005101e220b450d2a0c330b2001410c6a2802002133200141086a2802002134200141046a2802002135200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d2a200228020020042005101e220b450d2b0c300b200141046a2802002104200241046a280200200241086a280200220b470d0e200b41016a2205200b490d4d200b4101742206200520052006491b22064100480d4d200b450d2b2002280200200b2006101e2205450d2c0c2d0b200228020021060c470b2002280200210b0c440b2002280200210b0c410b2002280200210b0c3e0b2002280200210b0c3b0b2002280200210b0c380b2002280200210b0c350b2002280200210b0c320b2002280200210b0c410b2002280200210b0c2e0b2002280200210b0c2b0b2002280200210b0c280b2002280200210b0c250b2002280200210b0c220b200228020021050c1f0b200d101f22060d370b200d41011020000b2005101f220b0d330b200541011020000b2005101f220b0d2f0b200541011020000b2005101f220b0d2b0b200541011020000b2005101f220b0d270b200541011020000b2005101f220b0d230b200541011020000b2005101f220b0d1f0b200541011020000b2005101f220b0d1b0b200541011020000b200c101f220b0d290b200c41011020000b2005101f220b0d150b200541011020000b2005101f220b0d110b200541011020000b2005101f220b0d0d0b200541011020000b2005101f220b0d090b200541011020000b2005101f220b0d050b200541011020000b2006101f22050d010b200641011020000b20022005360200200241046a2006360200200241086a280200210b0b200241086a200b41016a3602002005200b6a41083a00004101210d410021064100210b024002400240024003400240200b2006470d0020064101742205200641016a220720072005491b22054100480d24024002402006450d00200d20062005101e220d0d010c040b2005101f220d450d030b200521060b200d200b6a200441807f72200441ff0071200441077622051b3a0000200b41016a210b2005210420050d000b200b417f6a210a200241086a2107200241046a2137200b210503400240024002400240203728020020072802002204470d00200441016a22082004490d2720044101742209200820082009491b22094100480d272004450d01200228020020042009101e22080d020c060b200228020021080c020b2009101f2208450d040b2002200836020020372009360200200728020021040b2007200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b0240200241046a2802002205200241086a28020022046b200a4d0d00200228020021050c040b2004200b6a22072004490d2220054101742204200720072004491b22044100480d22024002402005450d00200228020020052004101e2205450d010c040b2004101f22050d030b200441011020000b200541011020000b200941011020000b20022005360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200520046a200d200b10ce031a4101213702402006450d00200d101d0b4101210d410521040c1c0b2002200b360200200241046a2005360200200241086a28020021040b410121eb01410821ec01200241086a200441016a360200200b20046a410a3a0000410021ed01200341246a22ee0141003602002003420137021c200320023602182035203341186c6a21ef01410721f00141ff0021f10141807f21f201410021f301410021f401203321f5010240024041004100460d004116214d0c010b4115214d411121040c1b0b411121040c1a0b2002200b360200200241046a2005360200200241086a28020021040b410121de01410821df01200241086a200441016a360200200b20046a41063a0000410021e001200341cc006a22e10141003602002003420137024420032002360240203220304104746a21e201410721e30141ff0021e40141807f21e501410021e601410021e701203021e8010240024041004100460d004112214d0c010b4111214d411121040c190b411121040c180b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41003a0000202e422088a72107410121da014100210b4100210541002104202ea722db0121060240024002400340024020052004470d00200441016a220b2004490d1c200441017422dc01200b200b20dc01491b220b4100480d1c024002402004450d0020da012004200b101e22da010d010c040b200b101f22da01450d030b200b21040b20da0120056a200641807f72200641ff0071200641077622dc011b3a0000200541016a210520dc01210620dc010d000b200420056b20db014f0d02200520db016a220b2005490d1a20044101742206200b200b2006491b220b4100480d1a024002402004450d0020da012004200b101e22da01450d010c030b200b101f22da010d020b200b41011020000b200b41011020000b200b21040b20da0120056a202f20db0110ce031a02402009450d00202f101d200b21040b20db0120056a21dc01024002400240024002400340024020dc012004470d00200441016a220b2004490d1e20044101742205200b200b2005491b220b4100480d1e024002402004450d0020da012004200b101e22da010d010c040b200b101f22da01450d030b200b21040b20da0120dc016a200741807f72200741ff0071200741077622051b3a000020dc0141016a21dc012005210720050d000b024002400240202d450d002008210503400240024002400240200b20dc01470d00200b41016a2204200b490d24200b4101742206200420042006491b22044100480d24200b450d0120da01200b2004101e22da010d020c090b200b21040c020b2004101f22da01450d070b200b21dc012004210b0b20da0120dc016a200541807f72200541ff0071200541077622061b3a000020dc0141016a21dc012006210520060d000b200420dc016b20084f0d0620dc0120086a220b20dc01490d1f20044101742205200b200b2005491b220b4100480d1f2004450d0120da012004200b101e22da01450d020c050b200b2104410121dd010c060b200b101f22da010d030b200b41011020000b200b41011020000b200441011020000b200b21040b20da0120dc016a202d200810ce031a20dc0120086a21dc01410021dd01202c450d00202d101d0b202b20294104746a21c1022029210b0240024003400240024002400240200420dc01470d00200441016a22052004490d1e20044101742206200520052006491b222f4100480d1e2004450d0120da012004202f101e22da010d020c050b2004212f0c020b202f101f22da01450d030b200421dc01202f21040b20da0120dc016a200b41807f72200b41ff0071200b41077622051b3a000020dc0141016a21dc012005210b20050d000b02402029450d00411021c202410821c302410c21c402417f21c502410621c602410121c702410021c802410721c90241ff0021ca0241807f21cb02410221cc02410321cd0241c00021ce0241ff0121cf02410421d002410521d102202b21db01411d214d0c020b202b21db01410421040c180b202f41011020000b411121040c160b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41053a0000200341c0006a410c6a220a4100360200200342013702442003200236024020282026410c6c6a21094101210741002105410021042026210b024002400240024002400340024020042005470d00200541016a22062005490d1d20054101742208200620062008491b22064100480d1d024002402005450d00200720052006101e22070d010c040b2006101f2207450d030b200341c0006a41086a200636020020032007360244200621050b200a200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b0240024002400240024002402026450d002026410c6c41746a210b202821040340200441046a28020022054102460d02200320042802002005200441086a280200200341c0006a105120032d00002205411a470d042004410c6a2104200b41746a220b4174470d000c030b0b202821090c010b2004410c6a21090b20282026410c6c6a20096b2104024003402004450d01200441746a21042009280204210b2009410c6a2109200b4102470d000b0b02402027450d002028101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d232004410174220d20072007200d491b220d4100480d232004450d0120052802002004200d101e22070d020c090b200528020021070c020b200d101f2207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d1f200b4101742204200620062004491b22044100480d1f200b450d022005280200200b2004101e220b450d030c070b2005280200210b0c070b20032f000120032d0003411074722107200341086a290300212e200328020421082004410c6a210402400340200b450d01200b41746a210b200428020421062004410c6a210420064102470d000b0b02402027450d002028101d0b0240200341c0006a41086a280200450d002003280244101d0b200020073b0001200020053a0000200041036a20074110763a0000200041086a202e370000200041046a20083600004100219c03410121c6014101210c4101219d030c040b2004101f220b0d040b200441011020000b200641011020000b200d41011020000b410d21040c160b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213d410121374101210d41012138410121394101213a4101213b4101213c410621040c140b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41013a0000202520064104746a21c8014100210b410021c901410021ca01410121cb0120062104024002400340024020c90120ca01470d00200b20c90141016a22052005200b491b22ca014100480d18024020c901450d0020cb0120c90120ca01101e22cb010d010c030b20ca01101f22cb01450d020b20cb0120c9016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20c90141016a21c9012005210420050d000b02402006450d00411021cc01410521cd01410121ce01410021cf01410421d001410221d101410721d20141ff0021d30141807f21d401417f21d501413f21d60141c00021d701202521d8014110214d0c020b202521d901410321040c140b20ca0141011020000b411121040c120b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41073a00002023200641146c6a21b7014100210b410021b801410021b901410121ba0120062104024002400340024020b80120b901470d00200b20b80141016a22052005200b491b22b9014100480d16024020b801450d0020ba0120b80120b901101e22ba010d010c030b20b901101f22ba01450d020b20ba0120b8016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20b80141016a21b8012005210420050d000b02402006450d00411421bb01410421bc01410121bd01411021be01410721bf0141ff0021c00141807f21c101410021c201410221c301202321c401410f214d0c020b202321c501410221040c120b20b90141011020000b411121040c100b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41033a0000202120064102746a21ab014100210b410021ac01410021ad01410121ae01200621040240024002400340024020ac0120ad01470d00200b20ac0141016a22052005200b491b22ad014100480d15024020ac01450d0020ae0120ac0120ad01101e22ae010d010c030b20ad01101f22ae01450d020b20ae0120ac016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ac0141016a21ac012005210420050d000b2006450d01410121af01410421b001410721b10141ff0021b20141807f21b301410021b401410221b501202121b601410e214d0c020b20ad0141011020000b410121040c0f0b411121040c0e0b2002200b360200200241046a2005360200200241086a28020021040b41012188014108218901200241086a200441016a360200200b20046a41023a00004100218a01200341cc006a228b0141003602002003420137024420032002360240201f201d41286c6a218c014107218d0141ff00218e0141807f218f0141002190014100219101201d2192010240024041004100460d00410c214d0c010b410b214d411121040c0d0b411121040c0c0b2002200b360200200241046a2005360200200241086a28020021040b4101216841082169200241086a200441016a360200200b20046a41093a00004100216a200341cc006a226b41003602002003420137024420032002360240201c201a411c6c6a216c4107216d41ff00216e41807f216f4100217041002171201a21720240024041004100460d004107214d0c010b4106214d411121040c0b0b411121040c0a0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41003a00000240024002400240024002404104101f225c450d00205c41eec2b5ab0636000002400240024002400240024002400240024020194101460d00024020194102460d0020194103470d024100215d4101215e2017215f20162160201521614101216241012163410121644101101f2265450d1b410021040c180b2003410036023020034201370328200341306a21094101210741002105410021042017210b0340024020042005470d00200541016a22062005490d1a20054101742208200620062008491b22064100480d1a024002402005450d00200720052006101e22070d010c0b0b2006101f2207450d0a0b2003200636022c20032007360228200621050b2009200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b201620144104746a21d2022014450d03201621d3022017450d04410421d402201620144104746a22d50241706a21d602410021d702410121d802411021d902417f21da02410821db02410721dc0241ff0021dd0241807f21de02411a21df02201721e002410021e102201621e2024105214d0c0c0b4100215e20034100360230200342013703282003410c6a2014360200200341086a20153602002003201636020420032017360200200341c0006a2003200341286a105220032d004022e302411a470d01200341286a41086a2802002161200328022c21602003280228215f41012162410021634100215d41012118410121644101101f22650d090c190b4101215f410021044100210b20152105034002400240024002402004200b470d00200441016a220b2004490d1b20044101742206200b200b2006491b22604100480d1b2004450d01205f20042060101e225f0d020c0b0b200421600c020b2060101f225f450d090b2004210b206021040b205f200b6a200541807f72200541ff0071200541077622061b3a0000200b41016a210b2006210520060d000b2060200b6b20154f0d0c200b20156a2204200b490d1620604101742205200420042005491b22044100480d162060450d03205f20602004101e225f450d040c0b0b20032d0043411074210420032f0041210b200341c0006a41086a29030021f003200328024421f1030240200328022c450d002003280228101d0b200b20047221f203410e21040c140b201621d3020b20d30220d202460d06410f21040c120b2004101f225f0d070b200441011020000b200641011020000b206041011020000b410441011020000b410021040c0c0b411021040c0b0b411121040c0a0b200421600b205f200b6a2017201510ce031a200b20156a21614101215e02402016450d002017101d0b41002163410121624101215d41002118410121644101101f2265450d0b410021040c080b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41043a0000200341c0006a410c6a220a4100360200200342013702442003200236024020132011410c6c6a21094101210741002105410021042011210b0240024002400240024002400340024020042005470d00200541016a22062005490d1020054101742208200620062008491b22064100480d10024002402005450d00200720052006101e22070d010c040b2006101f2207450d030b200341c0006a41086a200636020020032007360244200621050b200a200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b0240024002400240024002402011450d002011410c6c41746a21052013210b0340200b41046a28020022074102460d02200b41086a2802002108200b280200210a0240024002400240200341c0006a41086a2228280200200341c0006a410c6a22262802002204470d00200441016a22062004490d1920044101742227200620062027491b22274100480d192004450d01200328024420042027101e22060d020c0d0b200328024421060c020b2027101f2206450d0b0b20282027360200200320063602440b2026200441016a360200200620046a41f0003a00002003200a20072008200341c0006a105120032d00002206411a470d04200b410c6a210b200541746a22054174470d000c030b0b201321090c010b200b410c6a21090b20132011410c6c6a20096b2104024003402004450d01200441746a21042009280204210b2009410c6a2109200b4102470d000b0b02402012450d002013101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d162004410174220d20072007200d491b220d4100480d162004450d0120052802002004200d101e22070d020c090b200528020021070c020b200d101f2207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d12200b4101742204200620062004491b22044100480d12200b450d022005280200200b2004101e220b450d030c080b2005280200210b0c080b20032f000120032d0003411074722107200341086a290300212e20032802042108200b410c6a2104024003402005450d01200541746a21052004280204210b2004410c6a2104200b4102470d000b0b02402012450d002013101d0b0240200341c0006a41086a280200450d002003280244101d0b200020073b0001200020063a0000200041036a20074110763a0000200041086a202e370000200041046a20083600004100219d03410121c6014101210c0c050b2004101f220b0d050b200441011020000b200641011020000b200d41011020000b202741011020000b410c21040c080b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213e410121374101210d41012138410121394101213a4101213b4101213c4101213d410721040c060b2002200b360200200241046a2005360200200241086a28020021040b4101214241082143200241086a200441016a360200200b20046a410b3a000041002144200341cc006a2245410036020020034201370244200320023602402010200e411c6c6a21464107214741ff00214841807f21494100214a4100214b200e214c0240024041004100460d004101214d0c010b4100214d411121040c050b411121040c040b20022006360200200241046a200d360200200241086a28020021040b200241086a220d200441016a360200200620046a20083a000002400240024002400240200241046a2802002206200d28020022046b200b4f0d002004200b6a22082004490d0920064101742204200820082004491b22044100480d092006450d01200228020020062004101e2206450d020c030b200228020021060c030b2004101f22060d010b200441011020000b20022006360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200620046a2005200b10ce031a410021364101213702402007450d002005101d0b4101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f4101214041012141410821040c020b2002200b360200200241046a200c360200200241086a28020021040b4101210c200241086a200441016a360200410021c601200b20046a41003a0000200341146a2005360200200341106a20063602002003200736020c20032008360208200320093602042003200a360200200341c0006a200320021053200320032900413703282003200341c0006a41086a29000037002f02400240024020032d00402204411a470d00410021c701410121374101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f4101214041012141410121360c010b20002003290328370001200020043a0000200041086a200329002f3700000c010b410921040c010b410b21040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e12000102030405060708090a1c1d1e1f232429290b206520183a0000410121044101210b20612105034002400240024002402004200b470d00200420646a220b2004490de70220042064742206200b200b2006491b22664100480de7022004450d01206520042066101e22650d020c2b0b200421660c020b2066101f2265450d290b2004210b206621040b2065200b6a200541807f72200541ff0071200541077622061b3a0000200b20646a210b2006210520060d000b2066200b6b20614f0d15200b20616a2204200b490de20220664101742205200420042005491b22044100480de2022066450d13206520662004101e2265450d160c140b02402020450d002021101d0b200241086a2105200241046a210720ac01210b03400240024002400240200728020020052802002204470d00200441016a22062004490de70220044101742208200620062008491b22084100480de7022004450d01200228020020042008101e22060d020c280b200228020021060c020b2008101f2206450d260b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20ac014f0d00200420ac016a22052004490de302200b4101742204200520052004491b22044100480de302200b450d0a2002280200200b2004101e220b450d0e0c0b0b2002280200210b0c0b0b20c50120b701460d27034020c501410c6a2802004104460d28024020c50141046a280200450d0020c501280200101d0b20c50141146a22c50120b701470d000c280b0b20d90120c801460d27034020d901410d6a2d00004105460d28024020d90141046a280200450d0020d901280200101d0b20d90141106a22d90120c801470d000c280b0b202b20294104746a210b02400340200b20db01460d0120db01280200210420db0141106a21db0120044108470d000b0b0240202a450d00202b101d0b200241086a2105200241046a210720dc01210b03400240024002400240200728020020052802002204470d00200441016a22062004490de30220044101742208200620062008491b22084100480de3022004450d01200228020020042008101e22060d020c260b200228020021060c020b2008101f2206450d240b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20dc014f0d00200420dc016a22052004490ddf02200b4101742204200520052004491b22044100480ddf02200b450d0c2002280200200b2004101e220b450d0f0c0d0b2002280200210b0c0d0b410121380c5a0b4101213e410721040cdb020b4101213f0c060b410121c701410921040cd9020b2000411a3a0000024020012d00002204410e4b0d000240024002400240024002400240024002400240024002400240024020040e0f0009080703050a0b0d0e0c02060401000b2036450dd902200141086a280200450dd902200141046a280200101d200341d0006a24000f0b2037450dd8020240200141086a280200450d00200141046a280200101d0b0240200141146a2802002202450d00200141186a280200450d002002101d0b200141246a280200450dd802200141206a280200101d200341d0006a24000f0b2039450dd702410c21eb022001410c6a2802002204450d43411821ec02410421ed02200141046a28020022ee02200441186c6a21ef02411421f002411021f102410921f202410821f30241ffffffff0321f402417021f5024121214d0cab020b203f450dd602200141086a280200450dd602200141046a280200101d200341d0006a24000f0b200d450dd502200141046a2d000022044102460d2120044101460d2020040d222001410c6a280200450dd502200141086a280200101d200341d0006a24000f0b203e450dd402200141086a280200450dd402200141046a280200101d200341d0006a24000f0b2038450dd302410c21f6022001410c6a2802002204450d41411c21f702410421f802200141046a28020022f9022004411c6c6a21fa02410821fb02411421fc02411021fd02410921fe0241ffffffff0321ff0241702180034122214d0ca9020b2040450dd20202402001410c6a2802002204450d00200141046a2802002102200441286c210403400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241286a2102200441586a22040d000b0b200141086a280200450dd202200141046a280200101d200341d0006a24000f0b2041450dd10202402001410c6a2802002204450d00200141046a28020021022004410474210403400240200241046a280200450d002002280200101d0b200241106a2102200441706a22040d000b0b200141086a280200450dd102200141046a280200101d200341d0006a24000f0b20c701450dd0020240200141086a280200450d00200141046a280200101d0b200141146a280200450dd002200141106a280200101d200341d0006a24000f0b203d450dcf02200141086a280200450dcf02200141046a280200101d200341d0006a24000f0b203c450dce022001410c6a2802002204450d3e4104218103200141046a28020022820320044104746a21830341102184034109218503410821860341ffffffff0321870341702188034123214d0ca6020b203a450dcd02410c2189032001410c6a2802002204450d3f411c218a034104218b03200141046a280200228c032004411c6c6a218d034108218e034114218f034110219003410921910341ffffffff0321920341702193034124214d0ca7020b203b450dcc0202402001410c6a2802002204450d00200141046a2802002102200441146c210403400240200241046a280200450d002002280200101d0b200241146a21022004416c6a22040d000b0b200141086a280200450dcc02200141046a280200101d200341d0006a24000f0b200110450ccb020b02402031450d002032101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490dde022004410174220d20072007200d491b220d4100480dde022004450d0120052802002004200d101e22070d020c220b200528020021070c020b200d101f2207450d200b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490dda02200b4101742204200620062004491b22044100480dda02200b450d0e2005280200200b2004101e220b450d110c0f0b2005280200210b0c0f0b2004101f220b450d030b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ac016a360200200b20046a20ae0120ac0110ce031a4100213f41012137024020ad01450d0020ae01101d0b4101210d41012138410121394101213a4101213b4101213c4101213d4101213e0b410121400c5f0b200441011020000b2004101f220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420dc016a360200200b20046a20da0120dc0110ce031a0240202f450d0020da01101d0b4101210d41002137202d450ddb0120dd01450ddc01202c450ddd01202d101d0cda010b200441011020000b2004101f2265450d020b200421660b2065200b6a205f206110ce031a02402060450d00205f101d0b200b20616a216702400240024020194102460d00024020194101460d0020190d02205d20164572450d030c2c0b205e450d2b2014450d2a2014410c6c210b201621040340024020042802002205450d00200441046a280200450d002005101d0b2004410c6a2104200b41746a220b0d000c2b0b0b2062450d2a2014450d29410421e402201620144104746a21e502411021e602410c21e702410821e802417421e902201621ea024120214d0c92020b2063201645720d290b2017101d0c280b200441011020000b2004101f220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213c410121374101210d41012138410121394101213a4101213b0cc3020b200441011020000b4101219d03410c21040cc5020b4101219c03410d21040cc4020b4101210b0c450b200041086a20f003370200200041046a20f103360200200020f20341087420e30272360200205c101d0c4a0b0240200141146a2802002204450d002001410c6a28020021022004410c6c2104034002402002280200220b450d00200241046a280200450d00200b101d0b2002410c6a2102200441746a22040d000b0b200141106a280200450db4022001410c6a280200101d200341d0006a24000f0b200141146a2802002204450d50410c21f3032001410c6a28020022f40320044104746a21f503411021f603410821f703410421f803417421f9034125214d0c8f020b2001410c6a280200450db202200141086a280200101d200341d0006a24000f0b411021fa03410c21fb03417421fc03410421fd03411e214d0c80020b2015450d5a2016101d0c5a0b200841011020000b200841011020000b206641011020000b200d41011020000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240204d0e280100031a3c280504071e3f09080b0c0d0e100f37391312152552535455265f60292c2e30325d6769690b200328024421040c010b204a20426a2204204a490dcd02204a204274220b20042004200b491b220b2044480dcd0202400240204a450d002003280244204a200b101e22040d010c87010b200b101f2204450d86010b200341c0006a20436a200b360200200320043602442045280200214b0b2045204b20426a3602002004204b6a204c204972204c204871204c20477622041b3a000002402004450d002004214c200341c0006a20436a280200224a2045280200224b470dad014100214d0ce3010b200e450d15411c214e4118214f41142150410821514107215241ff00215341807f2154200341cc006a21554101215641002157411a2158201021594102214d0ce4010b2059204e6a215a2059280204220a450d152059204f6a2802002108205920506a2802002126205920516a290200212e2059280200210b2059280210210903400240024002400240200341c0006a20516a220528020020552802002204470d00200420566a22062004490dd00220042056742207200620062007491b22072057480dd0022004450d01200328024420042007101e22060d020c720b200328024421060c020b2007101f2206450d700b2005200736020020032006360244205528020021040b2055200420566a360200200620046a200b205472200b205371200b20527622041b3a00002004210b20040d000b2003202e37022c2003200a3602282003200341286a200341c0006a101b20032d0000225b2058470d372008210b03400240024002400240200528020020552802002204470d00200420566a22062004490dd00220042056742207200620062007491b22072057480dd0022004450d01200328024420042007101e22060d020c740b200328024421060c020b2007101f2206450d720b2005200736020020032006360244205528020021040b2055200420566a360200200620046a200b205472200b205371200b20527622041b3a00002004210b20040d000b02400240024002402005280200220b205528020022046b20084f0d00200420086a22062004490dcf02200b2056742204200620062004491b22042057480dcf02200b450d012003280244200b2004101e220b0d020c96010b2003280244210b0c020b2004101f220b450d94010b200520043602002003200b360244205528020021040b2055200420086a360200200b20046a2009200810ce031a02402026450d002009101d0b205a2159205a2046470dac010c170b200328024421040c010b207020686a22042070490dca022070206874220b20042004200b491b220b206a480dca02024002402070450d0020032802442070200b101e22040d010c84010b200b101f2204450d83010b200341c0006a20696a200b36020020032004360244206b28020021710b206b207120686a360200200420716a2072206f722072206e712072206d7622041b3a000002402004450d0020042172200341c0006a20696a2802002270206b2802002271470dae014106214d0ce8010b201a450d15411c21734118217441142175410821764107217741ff00217841807f2179200341cc006a217a4101217b4100217c411a217d4102217e4104217f201c2180014108214d0ce9010b20800120736a2181012080012802042208450d1520800120746a280200210720800120756a28020021820120800120766a290200212e208001280210218301208001280200210b03400240024002400240200341c0006a20766a228401280200207a2802002204470d002004207b6a22052004490dcd022004207b742206200520052006491b2206207c480dcd022004450d01200328024420042006101e22050d020c6f0b200328024421050c020b2006101f2205450d6d0b208401200636020020032005360244207a28020021040b207a2004207b6a360200200520046a200b207972200b207871200b20777622041b3a00002004210b20040d000b2003202e37022c200320083602282003200341286a200341c0006a101b20032d0000228501207d470d362083012007207e746a2186012007210b03400240024002400240208401280200207a2802002204470d002004207b6a22052004490dcd022004207b742206200520052006491b2206207c480dcd022004450d01200328024420042006101e22050d020c710b200328024421050c020b2006101f2205450d6f0b208401200636020020032005360244207a28020021040b207a2004207b6a360200200520046a200b207972200b207871200b20777622041b3a00002004210b20040d000b2007450dbe02208301218701410021040c9b020b200328024421040c010b2090012088016a2204209001490dc60220900120880174220b20042004200b491b220b208a01480dc60202400240209001450d002003280244209001200b101e22040d010c81010b200b101f2204450d80010b200341c0006a2089016a200b36020020032004360244208b012802002191010b208b012091012088016a36020020042091016a209201208f0172209201208e0171209201208d017622041b3a000002402004450d002004219201200341c0006a2089016a280200229001208b01280200229101470dad01410b214d0ceb010b201d450d1441082193014128219401410421950141242196014120219701411c219801411a2199014119219a014114219b014110219c014101219d01200341cc006a219e014100219f0141f00021a001410221a101410321a201417f21a301413f21a40141c00021a50141ff0121a601410721a70141ff0021a80141807f21a901201f21aa01410d214d0cec010b20032093016a220620aa0122042093016a2802003602002003200429020037030020042094016a21aa0120042d00182205209501460d1420042096016a280000212620042097016a280000212820042098016a280000210b20042099016a2d000021112004209a016a2c000021272004209b016a28020021092004209c016a2802002107200428020c2108200341186a2093016a2204200628020036020020032003290300370318200341286a2093016a220a2004280200360200200320032903183703282003200341286a200341c0006a105420032d00002204209901470d42200a20093602002003200736022c200320083602282003200341286a200341c0006a105420032d00002204209901470d4302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402005209d01460d000240200520a101460d00200520a201470d02200341c0006a2093016a220b280200209e012802002204470d052004209d016a22052004490dde022004209d01742206200520052006491b2206209f01480dde022004450d0d200328024420042006101e22050d0e0cae010b200341c0006a2093016a2207280200209e012802002204470d022004209d016a22052004490ddd022004209d01742206200520052006491b2206209f01480ddd022004450d06200328024420042006101e22050d070caa010b200341c0006a2093016a2205280200209e012802002204470d022004209d016a22072004490ddc022004209d01742208200720072008491b2208209f01480ddc022004450d08200328024420042008101e22070d090caa010b200341c0006a2093016a2206280200209e012802002204470d032004209d016a22052004490ddb022004209d01742207200520052007491b2207209f01480ddb022004450d0d200328024420042007101e22050d0e0cac010b200328024421050c050b200328024421070c070b200328024421050c090b200328024421050c0b0b2006101f2205450da3010b2007200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a20a1013a00002003200b20282026200341c0006a105120032d00002204209901460d0c0c650b2008101f2207450da1010b2005200836020020032007360244209e0128020021040b209e012004209d016a360200200720046a209d013a000002402005280200209e012802002204470d002004209d016a22072004490dd2022004209d01742208200720072008491b2208209f01480dd2022004450d07200328024420042008101e22070d080ca1010b200328024421070c080b2006101f2205450da0010b200b200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a20a2013a00000240200b280200209e012802002204470d002004209d016a22052004490dcf022004209d01742206200520052006491b2206209f01480dcf022004450d08200328024420042006101e22050d090ca1010b200328024421050c090b2007101f2205450d9e010b2006200736020020032005360244209e0128020021040b209e012004209d016a360200200520046a209f013a0000034002400240024002402006280200209e012802002204470d002004209d016a22052004490dd0022004209d01742207200520052007491b2207209f01480dd0022004450d01200328024420042007101e22050d020c86010b200328024421050c020b2007101f2205450d84010b2006200736020020032005360244209e0128020021040b209e012004209d016a360200200520046a200b20a90172200b20a80171200b20a7017622041b3a00002004210b20040d000c040b0b2008101f2207450d99010b2005200836020020032007360244209e0128020021040b209e012004209d016a360200200720046a20a0013a00002003200b20282026200341c0006a105120032d00002204209901470d5a0b20aa01208c01470daf010c180b2006101f2205450d98010b200b200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a202720a30173220420a4017120a501722004202720a3014a1b3a00000240024002400240200b280200209e012802002204470d002004209d016a22052004490dc8022004209d01742206200520052006491b2206209f01480dc8022004450d01200328024420042006101e22050d020c9b010b200328024421050c020b2006101f2205450d99010b200b200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a201120a60171209f01473a000020aa01208c01470dad010c150b20ac0120af0174210b20b60120b0016a210620b60128020021040340024020ac0120ad01470d0020ac0120af016a220520ac01490dc502200b20052005200b491b22ad0120b401480dc502024020ac01450d0020ae0120ac0120ad01101e22ae010d010c630b20ad01101f22ae01450d620b20ae0120ac016a200420b30172200420b20171200420b1017622051b3a0000200b20b5016a210b20ac0120af016a21ac012005210420050d000b200621b601200620ab01470dad01410121040cc1020b20c40120bb016a21c50120c40128020c220920bc01460dc70120c401280204210a20c401280200210820b80120bd0174210520c40120be016a280200210b20c401280208220721040340024020b80120b901470d0020b80120bd016a220620b801490dc4022005200620062005491b22b90120c201480dc402024020b801450d0020ba0120b80120b901101e22ba010d010c630b20b901101f22ba01450d620b20ba0120b8016a200420c10172200420c00171200420bf017622061b3a0000200520c3016a210520b80120bd016a21b8012006210420060d000b02400240024020b90120b8016b20074f0d0020b80120076a220420b801490dc50220b90120bd01742205200420042005491b220420c201480dc50220b901450d0120ba0120b9012004101e22ba010d020c85010b20b90121040c010b2004101f22ba01450d83010b20ba0120b8016a2008200710ce031a200720046b20b8016a21050240200a450d002008101d0b024002402005450d00200720b8016a2105200421b9010c010b200420bd016a22052004490dc302200420bd01742206200520052006491b22b90120c201480dc302024002402004450d0020ba01200420b901101e22ba010d010c8a010b20b901101f22ba01450d89010b200421050b20ba0120056a20093a0000200520bd016a21b801200520bd017420c3016a21040340024020b80120b901470d0020b80120bd016a220520b801490dc4022004200520052004491b22b90120c201480dc402024020b801450d0020ba0120b80120b901101e22ba010d010c640b20b901101f22ba01450d630b20ba0120b8016a200b20c10172200b20c00171200b20bf017622051b3a0000200420c3016a210420b80120bd016a21b8012005210b20050d000b20c50121c40120c50120b701470dad010c080b20d80120cc016a21d90120d8012d000d222620cd01460dc70120d8012d000c210420d801280208210920d801280204212820d801280200210a024020ca0120c901470d0020c90120ce016a220b20c901490dc20220c90120ce01742205200b200b2005491b22ca0120cf01480dc202024020c901450d0020cb0120c90120ca01101e22cb010d010c84010b20ca01101f22cb01450d83010b20cb0120c9016a20043a000020c90120ce016a210420c90120ce0174220b20d0016a2108200b20d1016a21052009210b0340200821070240200420ca01470d00200420ce016a22062004490dc3022005200620062005491b22ca0120cf01480dc30202402004450d0020cb01200420ca01101e22cb010d010c640b20ca01101f22cb01450d630b20cb0120046a200b20d40172200b20d30171200b20d2017622061b3a0000200720d1016a2108200520d1016a2105200420ce016a21042006210b20060d000b0240024002402009450d004100210b024003402004200b6a2105200a200b6a2c0000220620d001460d010240200520ca01470d00200520ce016a22082005490dc7022007200820082007491b22ca0120cf01480dc70202402005450d0020cb01200520ca01101e22cb010d010c6d0b20ca01101f22cb01450d6c0b20cb0120046a200b6a200620d50173220520d6017120d701722005200620d5014a1b3a0000200720d1016a21072009200b20ce016a220b470d000b2004200b6a21050b2028450d020c010b200421052028450d010b200a101d0b024002400240024002400240202620d001470d0020ca012005470d02200520ce016a22042005490dc702200520ce0174220b20042004200b491b22ca0120cf01480dc7022005450d0120cb01200520ca01101e22cb010d020c90010b024020ca012005470d00200520ce016a22042005490dc702200520ce0174220b20042004200b491b220420cf01480dc7022005450d0320cb0120052004101e22cb010d040c91010b20ca0121040c030b20ca01101f22cb01450d8e010b20cb0120056a20cf013a00000c020b2004101f22cb01450d8d010b20cb0120056a20ce013a000002400240024002402004200520ce016a2205470d00200420ce016a220b2004490dc602200420ce01742205200b200b2005491b22ca0120cf01480dc6022004450d0120cb01200420ca01101e22cb010d020c91010b200421ca010c020b20ca01101f22cb01450d8f010b200421050b20cb0120056a202620d2017120d301733a00000b200520ce016a21c90120d90121d80120d90120c801470dad010c080b200328024421040c010b20e60120de016a220420e601490dbf0220e60120de0174220b20042004200b491b220b20e001480dbf020240024020e601450d00200328024420e601200b101e22040d010c7b0b200b101f2204450d7a0b200341c0006a20df016a200b3602002003200436024420e10128020021e7010b20e10120e70120de016a360200200420e7016a20e80120e5017220e80120e4017120e80120e3017622041b3a000002402004450d00200421e801200341c0006a20df016a28020022e60120e10128020022e701470dac014111214d0cec010b2030450d102030410474210a411021e9012032210403402004410d6a2d000022094102460d24200441086a28020021ea01200441046a2802002126200428020021282004410c6a2c000021060240024002400240200341c0006a41086a2207280200200341c0006a410c6a2205280200220b470d00200b41016a2208200b490dc302200b4101742227200820082027491b22274100480dc302200b450d012003280244200b2027101e22080d020c8a010b200328024421080c020b2027101f2208450d88010b20072027360200200320083602442005280200210b0b2005200b41016a3602002008200b6a2006417f73220b413f7141c00072200b2006417f4a1b3a0000024002400240024020072802002005280200220b470d00200b41016a2206200b490dc302200b4101742208200620062008491b22084100480dc302200b450d012003280244200b2008101e22060d020c8b010b200328024421060c020b2008101f2206450d89010b20072008360200200320063602442005280200210b0b2005200b41016a3602002006200b6a20094100473a0000200341286a41086a20ea013602002003202636022c20032028360228200441106a210b2003200341286a200341c0006a101b20032d000022ea01411a470d27200b2104200a41706a220a0d000ccc010b0b200328021c21040c010b20f30120eb016a220420f301490dbc0220f30120eb0174220b20042004200b491b220b20ed01480dbc020240024020f301450d00200328021c20f301200b101e22040d010c790b200b101f2204450d780b200341186a20ec016a200b3602002003200436021c20ee0128020021f4010b20ee0120f40120eb016a360200200420f4016a20f50120f2017220f50120f1017120f50120f0017622041b3a000002402004450d00200421f501200341186a20ec016a28020022f30120ee0128020022f401470dac014115214d0cef010b2033450d0e410121f601200341017221f701411821f801411421f901411021fa01410c21fb01200341286a410c6a21fc01420121fd01422021fe01410321ff01410721800241ff0021810241807f21820241002183024108218402200341286a41086a2185024104218602410921870241ffffffff0321880241ac012189024170218a024102218b02200341026a218c02411a218d024178218e02417c218f0241ff01219002417f219102413f21920241c00021930220352194024117214d0cf0010b20940220f8016a219502209402280200229602450d0e20940220f9016a28020021970220940220fa016a28020021980220940228020c219902209402290204212e4100219a0220fc014100360200200320fd0137022c209602202e20fe0188a7229b0220ff01746a219c022003200341186a360228202ea7219d024100219e0241004100460d8c02410121040c8d020b02402022450d002023101d0b200241086a2105200241046a210720b801210b03400240024002400240200728020020052802002204470d00200441016a22062004490dbe0220044101742208200620062008491b22084100480dbe022004450d01200228020020042008101e22060d020c7a0b200228020021060c020b2008101f2206450d780b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20b8014f0d00200420b8016a22052004490dba02200b4101742204200520052004491b22044100480dba02200b450d2f2002280200200b2004101e220b450d320c300b2002280200210b0c300b02402024450d002025101d0b200241086a2105200241046a210720c901210b03400240024002400240200728020020052802002204470d00200441016a22062004490dbd0220044101742208200620062008491b22084100480dbd022004450d01200228020020042008101e22060d020c7a0b200228020021060c020b2008101f2206450d780b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20c9014f0d00200420c9016a22052004490db902200b4101742204200520052004491b22044100480db902200b450d2a2002280200200b2004101e220b450d2d0c2b0b2002280200210b0c2b0b2010215a0b205a2046460d01411c21a602411421a702410c21a802410821a902410421aa02411021ab02410921ac0241ffffffff0321ad02417021ae024103214d0ccf010b205a2802042205450d00205a20a7026a2802002106205a20a9026a2802002107205a28021021080240205a20a8026a2802002204450d00200420aa0274210b200521040340024020042d000020ac02470d00200420a9026a28020020ad0271450d00200420aa026a280200101d0b200420ab026a2104200b20ae026a220b0d000b0b02402007450d002005101d0b205a20a6026a215a02402006450d002008101d0b205a2046470d96010b0240200f450d002010101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490db8022004410174220d20072007200d491b220d4100480db8022004450d0120052802002004200d101e22070d020c770b200528020021070c020b200d101f2207450d750b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490db402200b4101742204200620062004491b22044100480db402200b450d2e2005280200200b2004101e220b450d320c2f0b2005280200210b0c2f0b201c2181010b208101206c460da902411c21af02411421b002410c21b102410821b202410421b302411021b402410921b50241ffffffff0321b602417021b7024109214d0cd3010b2081012802042205450da80220810120b0026a280200210620810120b2026a28020021072081012802102108024020810120b1026a2802002204450d00200420b30274210b200521040340024020042d000020b502470d00200420b2026a28020020b60271450d00200420b3026a280200101d0b200420b4026a2104200b20b7026a220b0d000b0b02402007450d002005101d0b20810120af026a21810102402006450d002008101d0b208101206c470d96010ca8020b201f21aa010b20aa01208c01460d00034020aa0141186a2d00004104460d0120aa0141106a280200210420aa01410c6a280200210b024020aa0141046a280200450d0020aa01280200101d0b02402004450d00200b101d0b20aa0141286a22aa01208c01470d000b0b0240201e450d00201f101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490db3022004410174220d20072007200d491b220d4100480db3022004450d0120052802002004200d101e22070d020c720b200528020021070c020b200d101f2207450d700b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b200541046a280200220b200541086a28020022046b20374f0d05200420376a22062004490dae02200b4101742204200620062004491b22044100480dae02200b450d352005280200200b2004101e220b450d3a0c360b203222b80220e201470d130cbc010b20352195020b20950220ef01460d9d02411821b902411421ba02411021bb02410421bc02410921bd02410821be0241ffffffff0321bf02417021c0024118214d0ce1010b209502280200220b450d9c0220950220ba026a280200210420950220bb026a280200210620950228020c21050240209502280204450d00200b101d0b02402004450d00200420bc0274210b200521040340024020042d000020bd02470d00200420be026a28020020bf0271450d00200420bc026a280200101d0b200420bb026a2104200b20c0026a220b0d000b0b20950220b9026a21950202402006450d002005101d0b20950220ef01470d9b010c9c020b20db01220520c2026a21db012005280200220620c302460db101200520c3026a280200210b2005280204210402400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200620c5026a220620c6024b0d00200520c4026a2802002108024002400240024020060e0700050203010607000b202f20dc01470d0b202f20c7026a2205202f490dda02202f20c702742206200520052006491b220620c802480dda02202f450d1b20da01202f2006101e22da010d1c0cb3010b202f20dc01470d06202f20c7026a2205202f490dd902202f20c702742206200520052006491b220720c802480dd902202f450d0e20da01202f2007101e22da010d0f0caf010b202f20dc01470d06202f20c7026a2205202f490dd802202f20c702742206200520052006491b220720c802480dd802202f450d1020da01202f2007101e22da010d110caf010b202f20dc01470d06202f20c7026a2205202f490dd702202f20c702742206200520052006491b220720c802480dd702202f450d1220da01202f2007101e22da010d130caf010b202f20dc01470d06202f20c7026a2205202f490dd602202f20c702742206200520052006491b220620c802480dd602202f450d1420da01202f2006101e22da010d150cab010b202f20dc01470d07202f20c7026a2205202f490dd502202f20c702742206200520052006491b220620c802480dd502202f450d1920da01202f2006101e22da010d1a0caf010b202f20dc01470d07202f20c7026a2205202f490dd402202f20c702742206200520052006491b220620c802480dd402202f450d1b20da01202f2006101e22da010d1c0caf010b202f20dc01470d07202f20c7026a2205202f490dd302202f20c702742206200520052006491b220620c802480dd302202f450d1d20da01202f2006101e22da010d1e0caf010b202f21070c090b202f21070c0b0b202f21070c0d0b202f21060c0f0b202f21060c110b202f21060c130b202f21060c150b202f21060c170b2007101f22da01450da0010b202f21dc010b20da0120dc016a20d1023a000020dc0120c7026a21050340024002400240024020072005470d00200720c7026a22052007490dcd02200720c702742206200520052006491b220620c802480dcd022007450d0120da0120072006101e22da010d020c760b200721060c020b2006101f22da01450d740b20072105200621070b20da0120056a200420cb0272200420ca0271200420c9027622dc011b3a0000200520c7026a210520dc01210420dc010d000b0340024002400240024020062005470d00200620c7026a22042006490dcd02200620c702742205200420042005491b220420c802480dcd022006450d0120da0120062004101e22da010d020c770b200621040c020b2004101f22da01450d750b20062105200421060b20da0120056a200b20cb0272200b20ca0271200b20c9027622dc011b3a0000200520c7026a210520dc01210b20dc010d000b200820ce027121dc01200820ca027121090240024002400240200820c90275220b0d0020dc01450d010b0340024020dc0120cf0271450d00200b20c502460d020b024002400240024020042005470d00200420c7026a22052004490dd002200420c702742206200520052006491b220620c802480dd0022004450d0120da0120042006101e22da010d020c93010b200421060c020b2006101f22da01450d91010b20042105200621040b20da0120056a200820cb02723a0000200b20ce027121dc01200b20ca02712109200520c7026a2105200b2108200b20c902752207210b20070d00200621042007210b20dc010d000b20062005470d020c010b200422062005470d010b200620c7026a22042006490dc902200620c70274220b20042004200b491b222f20c802480dc9022006450d1720da012006202f101e22da010d180ca6010b2006212f0c180b2007101f22da01450d9e010b202f21dc010b20da0120dc016a20cd023a000020dc0120c7026a21050340024002400240024020072005470d00200720c7026a22052007490dca02200720c702742206200520052006491b220620c802480dca022007450d0120da0120072006101e22da010d020c750b200721060c020b2006101f22da01450d730b20072105200621070b20da0120056a200420cb0272200420ca0271200420c9027622dc011b3a0000200520c7026a210520dc01210420dc010d000b0340024002400240024020062005470d00200620c7026a22042006490dca02200620c702742205200420042005491b220420c802480dca022006450d0120da0120062004101e22da010d020c760b200621040c020b2004101f22da01450d740b20062105200421060b20da0120056a200b20cb0272200b20ca0271200b20c9027622dc011b3a0000200520c7026a210520dc01210b20dc010d000b200820ce027121dc01200820ca027121090240024002400240200820c90275220b0d0020dc01450d010b0340024020dc0120cf0271450d00200b20c502460d020b024002400240024020042005470d00200420c7026a22052004490dcd02200420c702742206200520052006491b220620c802480dcd022004450d0120da0120042006101e22da010d020c91010b200421060c020b2006101f22da01450d8f010b20042105200621040b20da0120056a200820cb02723a0000200b20ce027121dc01200b20ca02712109200520c7026a2105200b2108200b20c902752207210b20070d00200621042007210b20dc010d000b20062005470d020c010b200422062005470d010b200620c7026a22042006490dc602200620c70274220b20042004200b491b222f20c802480dc6022006450d1720da012006202f101e22da010d180ca4010b2006212f0c180b2007101f22da01450d9c010b202f21dc010b20da0120dc016a20d0023a000020dc0120c7026a21050340024002400240024020072005470d00200720c7026a22052007490dc702200720c702742206200520052006491b220620c802480dc7022007450d0120da0120072006101e22da010d020c740b200721060c020b2006101f22da01450d720b20072105200621070b20da0120056a200420cb0272200420ca0271200420c9027622dc011b3a0000200520c7026a210520dc01210420dc010d000b0340024002400240024020062005470d00200620c7026a22042006490dc702200620c702742205200420042005491b220420c802480dc7022006450d0120da0120062004101e22da010d020c750b200621040c020b2004101f22da01450d730b20062105200421060b20da0120056a200b20cb0272200b20ca0271200b20c9027622dc011b3a0000200520c7026a210520dc01210b20dc010d000b200820ce027121dc01200820ca027121090240024002400240200820c90275220b0d0020dc01450d010b0340024020dc0120cf0271450d00200b20c502460d020b024002400240024020042005470d00200420c7026a22052004490dca02200420c702742206200520052006491b220620c802480dca022004450d0120da0120042006101e22da010d020c8f010b200421060c020b2006101f22da01450d8d010b20042105200621040b20da0120056a200820cb02723a0000200b20ce027121dc01200b20ca02712109200520c7026a2105200b2108200b20c902752207210b20070d00200621042007210b20dc010d000b20062005470d020c010b200422062005470d010b200620c7026a22042006490dc302200620c70274220b20042004200b491b222f20c802480dc3022006450d1720da012006202f101e22da010d180ca2010b2006212f0c180b2006101f22da01450d96010b202f21dc010b20da0120dc016a20c8023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dc402200620c7027422dc012005200520dc01491b220520c802480dc4022006450d0120da0120062005101e22da010d020c6b0b200621050c020b2005101f22da01450d690b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dc402200520c702742206200420042006491b222f20c802480dc4022005450d0120da012005202f101e22da010d020c6c0b2005212f0c020b202f101f22da01450d6a0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c0d0b0b2006101f22da01450d97010b202f21dc010b20da0120dc016a20c7023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dc102200620c7027422dc012005200520dc01491b220520c802480dc1022006450d0120da0120062005101e22da010d020c700b200621050c020b2005101f22da01450d6e0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dc102200520c702742206200420042006491b222f20c802480dc1022005450d0120da012005202f101e22da010d020c710b2005212f0c020b202f101f22da01450d6f0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c0a0b0b2006101f22da01450d95010b202f21dc010b20da0120dc016a20cc023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dbe02200620c7027422dc012005200520dc01491b220520c802480dbe022006450d0120da0120062005101e22da010d020c6f0b200621050c020b2005101f22da01450d6d0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dbe02200520c702742206200420042006491b222f20c802480dbe022005450d0120da012005202f101e22da010d020c700b2005212f0c020b202f101f22da01450d6e0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c070b0b2006101f22da01450d93010b202f21dc010b20da0120dc016a20c6023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dbb02200620c7027422dc012005200520dc01491b220520c802480dbb022006450d0120da0120062005101e22da010d020c6e0b200621050c020b2005101f22da01450d6c0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dbb02200520c702742206200420042006491b222f20c802480dbb022005450d0120da012005202f101e22da010d020c6f0b2005212f0c020b202f101f22da01450d6d0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c040b0b2006101f22da01450d91010b202f21dc010b20da0120dc016a20c9023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490db802200620c7027422dc012005200520dc01491b220520c802480db8022006450d0120da0120062005101e22da010d020c6d0b200621050c020b2005101f22da01450d6b0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490db802200520c702742206200420042006491b222f20c802480db8022005450d0120da012005202f101e22da010d020c6e0b2005212f0c020b202f101f22da01450d6c0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000b0b20db0120c102470da9010c090b202f101f22da01450d8e010b200621050b20da0120056a20093a0000200520c7026a21dc0120db0120c102470da7010c060b202f101f22da01450d8c010b200621050b20da0120056a20093a0000200520c7026a21dc0120db0120c102470da6010c030b202f101f22da01450d8a010b200621050b20da0120056a20093a0000200520c7026a21dc0120db0120c102470da2010b20c10221db010cb0010b2005280200210b0c310b20e202210502400340200520d4026a28020022080d0120e10220d8026a21e10220d502200520d9026a2205470d000cbd010b0b200520d9026a21e20220e10220d8026a212620e00220da026a21e002200520db026a290200212e2005280200210a200341286a20db026a22092802002104200328022c210b034002400240024002402004200b470d00200b20d8026a2206200b490dab02200b20d802742207200620062007491b220720d702480dab02200b450d012003280228200b2007101e22060d020c780b200328022821060c020b2007101f2206450d760b2003200736022c200320063602282007210b0b2009200420d8026a2207360200200620046a20e10220de027220e10220dd027120e10220dc027622061b3a000020072104200621e10220060d000b200320db026a202e370300200320083602042003200a360200200341c0006a2003200341286a105220032d004022e30220df02470d3f024020d6022005460d00202621e10220e0020d8b010b200541106a22d30220d202470dba010cb9010b20ea02220620e6026a21ea02024020062802042204450d000240200620e7026a280200220b450d00200b20e7026c210b0340024020042802002205450d00200420e4026a280200450d002005101d0b200420e7026a2104200b20e9026a220b0d000b0b200620e8026a280200450d00200620e4026a280200101d0b20ea0220e502470da2010b2015450d002016101d0b200341146a2067360200200341106a20663602002003206536020c20034284808080c0003702042003205c360200200341c0006a200320021053200320032900413703282003200341c0006a41086a29000037002f20032d00402204411a470d084100210d41012137410521040ca2020b024020ee0220ed026a280200450d0020ee02280200101d0b024020ee0220f0026a280200220b450d0020ee0228020c2104200b20ed0274210b0340024020042d000020f202470d00200420f3026a28020020f40271450d00200420ed026a280200101d0b200420f1026a2104200b20f5026a220b0d000b0b20ee0220ec026a2104024020ee0220f1026a280200450d0020ee0220eb026a280200101d0b200421ee02200420ef02470da0010b200141086a280200450d9302200141046a280200101d200341d0006a24000f0b024020f90220f6026a280200220b450d0020f9022802042104200b20f80274210b0340024020042d000020fe02470d00200420fb026a28020020ff0271450d00200420f8026a280200101d0b200420fd026a2104200b2080036a220b0d000b0b024020f90220fb026a280200450d0020f90220f8026a280200101d0b20f90220f7026a2104024020f90220fc026a280200450d0020f902280210101d0b200421f902200420fa02470d9f010b200141086a280200450d9102200141046a280200101d200341d0006a24000f0b0240208203280208220b450d002082032802002104200b20810374210b0340024020042d0000208503470d0020042086036a28020020870371450d0020042081036a280200101d0b20042084036a2104200b2088036a220b0d000b0b2082032084036a210402402082032081036a280200450d00208203280200101d0b20042182032004208303470d9e010b200141086a280200450d8f02200141046a280200101d200341d0006a24000f0b0240208c032089036a280200220b450d00208c032802042104200b208b0374210b0340024020042d0000209103470d002004208e036a28020020920371450d002004208b036a280200101d0b20042090036a2104200b2093036a220b0d000b0b0240208c03208e036a280200450d00208c03208b036a280200101d0b208c03208a036a21040240208c03208f036a280200450d00208c03280210101d0b2004218c032004208d03470d9d010b200141086a280200450d8d02200141046a280200101d200341d0006a24000f0b20002003290328370001200020043a0000200041086a200329002f3700000c210b200441106a22b80220e201460daa010b4110219403410d219503410221960341042197034109219803410821990341ffffffff03219a034170219b034113214d0cc8010b20b8022095036a2d0000209603460da60120b802280204210620b8022802002105024020b8022802082204450d00200420970374210b200521040340024020042d0000209803470d0020042099036a280200209a0371450d0020042097036a280200101d0b20042094036a2104200b209b036a220b0d000b0b20b8022094036a21b80202402006450d002005101d0b20b80220e201470d8601410a21040c96020b20032d0003219e0320032f0001219f03200341086a29030021a003200328020421a103200b20e201460d01411021a203200441106a21a303410d21a403410221a503410421a603410921a703410821a80341ffffffff0321a903417021aa034114214d0cc8010b20a30320a4036a2d000020a503460d0020a303280204210620a3032802002105024020a3032802082204450d00200420a60374210b200521040340024020042d000020a703470d00200420a8036a28020020a90371450d00200420a6036a280200101d0b200420a2036a2104200b20aa036a220b0d000b0b20a30320a2036a21a30302402006450d002005101d0b20a30320e201470d85010b209e0320e90174210402402031450d002032101d0b209f0320047221040240200341c0006a41086a280200450d002003280244101d0b200020043b0001200020ea013a0000200041036a20044110763a0000200041086a20a003370000200041046a20a1033600004100210b410121c6014101210c4101219d034101219c030c150b20032d000321ab0320032f000121ac03200341086a29030021ad03200328020421ae0302402026450d002009101d0b411021af03205a2046460d01411c21b003411421b103410c21b203410821b303410421b403411021b503410921b60341ffffffff0321b703417021b8034104214d0caf010b205a2802042205450d00205a20b1036a2802002106205a20b3036a2802002107205a28021021080240205a20b2036a2802002204450d00200420b40374210b200521040340024020042d000020b603470d00200420b3036a28020020b70371450d00200420b4036a280200101d0b200420b5036a2104200b20b8036a220b0d000b0b02402007450d002005101d0b205a20b0036a215a02402006450d002008101d0b205a2046470d750b20ab0320af037421040240200f450d002010101d0b20ac0320047221040240200341c0006a41086a280200450d002003280244101d0b200020043b00012000205b3a0000200041036a20044110763a0000200041086a20ad03370000200041046a20ae0336000041002105410121c6014101210c4101219d034101219c034101210b41012106410121070ce8010b20032d000321b90320032f000121ba03200341086a29030021bb03200328020421bc030240208201450d00208301101d0b411021bd03208101206c460d01411c21be03411421bf03410c21c003410821c103410421c203411021c303410921c40341ffffffff0321c503417021c603410a214d0cb4010b2081012802042205450d0020810120bf036a280200210620810120c1036a28020021072081012802102108024020810120c0036a2802002204450d00200420c20374210b200521040340024020042d000020c403470d00200420c1036a28020020c50371450d00200420c2036a280200101d0b200420c3036a2104200b20c6036a220b0d000b0b02402007450d002005101d0b20810120be036a21810102402006450d002008101d0b208101206c470d760b20b90320bd037421040240201b450d00201c101d0b20ba0320047221040240200341c0006a41086a280200450d002003280244101d0b200020043b000120002085013a0000200041036a20044110763a0000200041086a20bb03370000200041046a20bc0336000041002106410121c6014101210c4101219d034101219c034101210b0c100b2004101f220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420c9016a360200200b20046a20cb0120c90110ce031a4100214141012137024020ca01450d0020cb01101d0b4101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f410121400c170b200441011020000b2004101f220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420b8016a360200200b20046a20ba0120b80110ce031a4100213b41012137024020b901450d0020ba01101d0b4101210d41012138410121394101213a0c81020b200441011020000b2004101f220b450d030b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b41002138410121374101210d0b410121390cf6010b200441011020000b20032f000120032d0003411074722109200341086a290300212e200328020421062007450d152008101d20aa01208c01470d160c170b20032f000120032d0003209c01747221090c130b410121060b410121070cd3010b024020ca0320c9036a280200450d0020ca03280200101d0b024020ca0320cc036a280200220b450d0020ca0328020c2104200b20c90374210b0340024020042d000020ce03470d00200420cf036a28020020d00371450d00200420c9036a280200101d0b200420cd036a2104200b20d1036a220b0d000b0b20ca0320c8036a2104024020ca0320cd036a280200450d0020ca0320c7036a280200101d0b200421ca03200420cb03470d6f0cd5010b024020d50320d2036a280200220b450d0020d5032802042104200b20d40374210b0340024020042d000020da03470d00200420d7036a28020020db0371450d00200420d4036a280200101d0b200420d9036a2104200b20dc036a220b0d000b0b024020d50320d7036a280200450d0020d50320d4036a280200101d0b20d50320d3036a2104024020d50320d8036a280200450d0020d503280210101d0b200421d503200420d603470d6f0cd9010b024020de03280208220b450d0020de032802002104200b20dd0374210b0340024020042d000020e103470d00200420e2036a28020020e30371450d00200420dd036a280200101d0b200420e0036a2104200b20e4036a220b0d000b0b20de0320e0036a2104024020de0320dd036a280200450d0020de03280200101d0b200421de03200420df03470d6f0cde010b024020e80320e5036a280200220b450d0020e8032802042104200b20e70374210b0340024020042d000020ed03470d00200420ea036a28020020ee0371450d00200420e7036a280200101d0b200420ec036a2104200b20ef036a220b0d000b0b024020e80320ea036a280200450d0020e80320e7036a280200101d0b20e80320e6036a2104024020e80320eb036a280200450d0020e803280210101d0b200421e803200420e903470d6f0cdf010b41002108410121c6014101210c4101219d034101219c034101210b41012106410121074101210520012d00002204410e4d0dd0010ce0010b2004101f220b450d040b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b41002140410121374101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f0b410121410b41012136410821040cf2010b200441011020000b20f403220620f6036a21f403024020062802042204450d000240200620f3036a280200220b450d00200b20f3036c210b0340024020042802002205450d00200420f8036a280200450d002005101d0b200420f3036a2104200b20f9036a220b0d000b0b200620f7036a280200450d00200620f8036a280200101d0b20f40320f503470d730b200141106a280200450de2012001410c6a280200101d200341d0006a24000f0b20d302220420fa036a21d302024020042802042206450d00200428020821070240200420fb036a2802002204450d00200420fb036c210b200621040340024020042802002205450d00200420fd036a280200450d002005101d0b200420fb036a2104200b20fc036a220b0d000b0b2007450d002006101d0b20d30220d202470d6a411021040cee010b209502280200220b450dc30120950220ff036a28020021042095022080046a280200210620950228020c21050240209502280204450d00200b101d0b02402004450d00200420810474210b200521040340024020042d0000208204470d0020042083046a28020020840471450d0020042081046a280200101d0b20042080046a2104200b2085046a220b0d000b0b20950220fe036a21950202402006450d002005101d0b20950220ef01470d6a0cc3010b20032f000120032d0003411074722109200341086a290300212e2003280204210620aa01208c01470d030c040b20032f000120032d0003209c01747221090b2006290300212e200328020421060b20aa01208c01460d010b034020aa0141186a2d00004104460d0120aa0141106a280200210b20aa01410c6a2802002105024020aa0141046a280200450d0020aa01280200101d0b0240200b450d002005101d0b20aa0141286a22aa01208c01470d000b0b0240201e450d00201f101d0b0240200341c0006a41086a280200450d002003280244101d0b200020093b0001200020043a0000200041036a20094110763a0000200041086a202e370000200041046a20063600004100210c410121c601410b21040ce7010b20870422062089046a218704024020062802042204450d00024020062086046a280200220b450d00200b2086046c210b0340024020042802002205450d002004208b046a280200450d002005101d0b20042086046a2104200b208c046a220b0d000b0b2006208a046a280200450d002006208b046a280200101d0b208704208804470d6a0cd2010b20032d0043218d0420032f0041218e04200341c0006a20db026a29030021f003200328024421f1034104218f04201620144104746a41706a2005460d014110219004200541106a219104410c21920441742193044127214d0cb8010b20910422042090046a219104024020042802042206450d0020042802082107024020042092046a2802002204450d0020042092046c210b200621040340024020042802002205450d002004208f046a280200450d002005101d0b20042092046a2104200b2093046a220b0d000b0b2007450d002006101d0b20910420d202470d690b02402015450d002016101d0b20e302411a470d010b200341306a2802002161200328022c21602003280228215f41022118410021624101215e410021634100215d410121644101101f22650d680ce5010b208d0420d9027421040240200328022c450d002003280228101d0b208e0420047221f2030c740b20ad0141011020000b20b90141011020000b20b90141011020000b20ca0141011020000b200741011020000b200641011020000b200741011020000b200641011020000b20ca0141011020000b200541011020000b202f41011020000b200641011020000b200441011020000b200641011020000b200441011020000b200641011020000b200441011020000b200541011020000b202f41011020000b200541011020000b202f41011020000b200541011020000b202f41011020000b200541011020000b202f41011020000b200741011020000b200b41011020000b200b41011020000b200b41011020000b200b41011020000b200b41011020000b200841011020000b200841011020000b200d41011020000b200d41011020000b200441011020000b20ca0141011020000b200641011020000b200641011020000b200641011020000b20b90141011020000b200441011020000b202741011020000b200841011020000b20ca0141011020000b200441011020000b20ca0141011020000b200741011020000b200641011020000b200841011020000b200841011020000b200641011020000b200741011020000b200641011020000b200641011020000b200641011020000b200741011020000b200741011020000b200741011020000b200641011020000b200641011020000b200641011020000b200641011020000b202f41011020000b202f41011020000b202f41011020000b4101214d0c360b4102214d0c370b4103214d0c380b4104214d0c390b4105214d0c390b4107214d0c3a0b4109214d0c3c0b410a214d0c3d0b410c214d0c3e0b410d214d0c3f0b410d214d0c3f0b410e214d0c3f0b410f214d0c3f0b4110214d0c3f0b4112214d0c400b4113214d0c410b4114214d0c420b4116214d0c430b4118214d0c450b4119214d0c450b411a214d0c450b411b214d0c450b411c214d0c450b411d214d0c450b411d214d0c450b411d214d0c450b411d214d0c450b411e214d0c460b411f214d0c460b4120214d0c470b4121214d0c480b4122214d0c490b4123214d0c4a0b4124214d0c4b0b4125214d0c4c0b4126214d0c4c0b4127214d0c4c0b410021040c790b410221040c780b410321040c770b410421040c760b410421040c750b410521040c740b410521040c730b410521040c720b410521040c710b410a21040c700b410a21040c6f0b410a21040c6e0b410a21040c6d0b410e21040c6c0b411021040c6b0b410f21040c6a0b411021040c690b411121040c680b411121040c670b411121040c660b411121040c650b411121040c640b411121040c630b411121040c620b411121040c610b411121040c600b411121040c5f0b411121040c5e0b411121040c5d0b411121040c5c0b411121040c5b0b411121040c5a0b411121040c590b411121040c580b411121040c570b411121040c560b411121040c550b411121040c540b411121040c530b411121040c520b411121040c510b411121040c500b411121040c4f0b411121040c4e0b411121040c4d0b411121040c4c0b411121040c4b0b411121040c4a0b411121040c490b411121040c480b411121040c470b411121040c460b411121040c450b411121040c440b411121040c430b411121040c420b411121040c410b411121040c400b411121040c3f0b411121040c3e0b411121040c3d0b411121040c3c0b411121040c3b0b411121040c3a0b411121040c390b411121040c380b411121040c370b411121040c360b411121040c350b411121040c340b411121040c330b411121040c320b411121040c310b411121040c300b411121040c2f0b411121040c2e0b411121040c2d0b411121040c2c0b410221040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000102040607070b208701207f6a2107208701280200210b03400240024002400240208401280200207a2802002204470d002004207b6a22052004490d4b2004207b742206200520052006491b2206207c480d4b2004450d01200328024420042006101e22050d020c0d0b200328024421050c020b2006101f2205450d0b0b208401200636020020032005360244207a28020021040b207a2004207b6a360200200520046a200b207972200b207871200b20777622041b3a00002004210b20040d000b20072187012007208601470d130c3c0b200328022c21040c010b209a0220f6016a2204209a02490d44209a0220f60174220b20042004200b491b220b208302480d4402400240209a02450d00200328022c209a02200b101e22040d010c0a0b200b101f2204450d090b208502200b3602002003200436022c20fc01280200219e020b20fc01209e0220f6016a3602002004209e026a209b0220820272209b0220810271209b022080027622041b3a000002402004450d002004219b02208502280200229a0220fc01280200229e02470d12410221040c170b209c02209602460d01209602219f02410321040c160b209f022084026a21a002209f02290200222e20fe0188a7220420900271208602460d13200420f8017420f801752107202ea7210b0340024002400240024020850228020020fc012802002204470d00200420f6016a22052004490d47200420f601742206200520052006491b2206208302480d472004450d01200328022c20042006101e22050d020c0a0b200328022c21050c020b2006101f2205450d080b20850220063602002003200536022c20fc0128020021040b20fc01200420f6016a360200200520046a200b20820272200b20810271200b2080027622041b3a00002004210b20040d000b024002400240024020850228020020fc012802002204470d00200420f6016a220b2004490d46200420f601742205200b200b2005491b2205208302480d462004450d01200328022c20042005101e220b0d020c0c0b200328022c210b0c020b2005101f220b450d0a0b20850220053602002003200b36022c20fc0128020021040b20fc01200420f6016a360200200b20046a20072091027322042092027120930272200420072091024a1b3a000020a002219f0220a002209c02470d11209c02209c0222a002470d140c030b20960221a002410421040c140b209c0220a002460d01410521040c130b20a0022d0004210420a0022084026a21a0022004208602470d0f0b0240209d02450d00209602101d0b2099022097022086027422046a2106024002400240024002400240024002400240209702450d0020990220f8016a210b2004208a026a21072099022104034020042d00002105208c02200420ff016a2d00003a00002003200420f6016a2f00003b01002005208902460d022003413c6a208b026a2208208c022d00003a0000200320032f01003b013c20042086026a290200212e200320fb016a200420fb016a28020036020020f70120032f013c3b000020f701208b026a20082d00003a0000200320053a00002003202e370204200341c0006a2003200341286a102d20032d004022a102208d02462205450d05200b20fa016a210b2007208a026a2107200420fa016a22042006470d000c040b0b20990222042006460d020c010b200420fa016a22042006460d010b03400240024020042d0000220b208702460d00200b208902470d010c030b20042084026a28020020880271450d0020042086026a280200101d0b200420fa016a22042006470d000b0b0240209802450d00209902101d0b2085022802002126200328022c2194022003280228210520fc01280200220a210b0340024002400240024020052084026a2208280200200520fb016a22062802002204470d00200420f6016a22072004490d48200420f601742209200720072009491b2209208302480d482004450d0120052086026a28020020042009101e22070d020c0d0b20052086026a28020021070c020b2009101f2207450d0b0b2008200936020020052086026a2007360200200628020021040b2006200420f6016a360200200720046a200b20820272200b20810271200b2080027622041b3a00002004210b20040d000b02402008280200220b200628020022046b200a4f0d002004200a6a22072004490d44200b20f601742204200720072004491b2204208302480d44200b450d0220052086026a280200200b2004101e220b0d030c0b0b20052086026a280200210b0c030b20032d004321a20220032f004121a302200341c0006a2084026a29030021a402200328024421a50202402007450d00034002400240200b208e026a22042d00002207208702460d002007208902470d010c030b200b28020020880271450d00200b208f026a280200101d0b200b20fa016a210b200420fa016a2006470d000b0b0240209802450d00209902101d0b0240208502280200450d00200328022c101d0b2005450d0320950221940220950220ef01470d0b0c340b2004101f220b450d080b2008200436020020052086026a200b360200200628020021040b20062004200a6a360200200b20046a209402200a10ce031a02402026450d00209402101d0b20950221940220950220ef01470d070c310b20950220ef01460d12411821fe03411421ff03411021800441042181044109218204410821830441ffffffff032184044170218504411f214d0c0a0b200641011020000b200641011020000b200b41011020000b200941011020000b200541011020000b200441011020000b4117214d0c010b4117214d0c010b411121040c330b411121040c320b411121040c310b410021040c050b410121040c040b410321040c030b410421040c020b410421040c010b410521040c000b0b20a20220fa0174210402402034450d002035101d0b20a30220047221040240200341186a41086a280200450d00200328021c101d0b200020043b0001200020a1023a0000200041036a20044110763a0000200041086a20a402370000200041046a20a50236000041002107410121c6014101210c4101219d034101219c034101210b410121060b410121050b4101210820012d00002204410e4b0d100b02400240024020040e0f000b0a0904060c0d11120f02070501000b200141086a280200450d1b200141046a280200101d200341d0006a24000f0b0240200141086a280200450d00200141046a280200101d0b0240200141146a2802002202450d00200141186a280200450d002002101d0b200141246a280200450d1a200141206a280200101d200341d0006a24000f0b2007450d19410c21c7032001410c6a2802002204450d00411821c803410421c903200141046a28020022ca03200441186c6a21cb03411421cc03411021cd03410921ce03410821cf0341ffffffff0321d003417021d1034119214d0c140b200141086a280200450d18200141046a280200101d200341d0006a24000f0b200141086a280200450d17200141046a280200101d200341d0006a24000f0b2008450d16200141046a2d000022044102460d0e20044101460d0d20040d102001410c6a280200450d16200141086a280200101d200341d0006a24000f0b209d03450d15200141086a280200450d15200141046a280200101d200341d0006a24000f0b2005450d14410c21d2032001410c6a2802002204450d00411c21d303410421d403200141046a28020022d5032004411c6c6a21d603410821d703411421d803411021d903410921da0341ffffffff0321db03417021dc03411a214d0c100b200141086a280200450d13200141046a280200101d200341d0006a24000f0b200c450d1202402001410c6a2802002204450d00200141046a2802002102200441286c210403400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241286a2102200441586a22040d000b0b200141086a280200450d12200141046a280200101d200341d0006a24000f0b02402001410c6a2802002204450d00200141046a28020021022004410474210403400240200241046a280200450d002002280200101d0b200241106a2102200441706a22040d000b0b200141086a280200450d11200141046a280200101d200341d0006a24000f0b20c601450d100240200141086a280200450d00200141046a280200101d0b200141146a280200450d10200141106a280200101d200341d0006a24000f0b209c03450d0f200141086a280200450d0f200141046a280200101d200341d0006a24000f0b200b450d0e2001410c6a2802002204450d00410421dd03200141046a28020022de0320044104746a21df03411021e003410921e103410821e20341ffffffff0321e303417021e403411b214d0c0b0b200141086a280200450d0d200141046a280200101d200341d0006a24000f0b2006450d0c410c21e5032001410c6a2802002204450d00411c21e603410421e703200141046a28020022e8032004411c6c6a21e903410821ea03411421eb03411021ec03410921ed0341ffffffff0321ee03417021ef03411c214d0c0a0b200141086a280200450d0b200141046a280200101d200341d0006a24000f0b02402001410c6a2802002204450d00200141046a2802002102200441146c210403400240200241046a280200450d002002280200101d0b200241146a21022004416c6a22040d000b0b200141086a280200450d0a200141046a280200101d200341d0006a24000f0b20011045200341d0006a24000f0b0240200141146a2802002204450d002001410c6a28020021022004410c6c2104034002402002280200220b450d00200241046a280200450d00200b101d0b2002410c6a2102200441746a22040d000b0b200141106a280200450d082001410c6a280200101d200341d0006a24000f0b200141146a2802002204450d00410c2186042001410c6a28020022870420044104746a21880441102189044108218a044104218b044174218c044126214d0c060b200141106a280200450d062001410c6a280200101d200341d0006a24000f0b2001410c6a280200450d05200141086a280200101d200341d0006a24000f0b411121040c110b411121040c100b411121040c0f0b411121040c0e0b411121040c0d0b200341d0006a24000f0b02402034450d002035101d0b200341186a41086a280200213d200328021c21092003280218220541046a2108200341246a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d122004410174220d20072007200d491b220d4100480d122004450d0120052802002004200d101e22070d020c070b200528020021070c020b200d101f2207450d050b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d11200b4101742204200620062004491b22044100480d11200b450d012005280200200b2004101e220b450d050c020b2005280200210b0c020b2004101f220b450d030b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b41002139410121374101210d410121380b4101213a0c040b200441011020000b200d41011020000b0240208201450d00208301101d0b208101218001208101206c470d060b0240201b450d00201c101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d0d2004410174220d20072007200d491b220d4100480d0d2004450d0120052802002004200d101e22070d020c090b200528020021070c020b200d101f2207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d0c200b4101742204200620062004491b22044100480d0c200b450d012005280200200b2004101e220b450d070c020b2005280200210b0c020b2004101f220b450d050b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213a410121374101210d41012138410121390b4101213b0b4101213c0b4101213d410621040c030b200441011020000b200d41011020000b4108214d411121040c000b0b1021000b1021000b410141011020000bdf0401077f200441046a210502400240024002400240024002400240200441086a2802002004410c6a2802002206470d00200641016a22072006490d0520064101742208200720072008491b22074100480d052006450d01200528020020062007101e2208450d020c030b200528020021080c030b2007101f22080d010b200741011020000b200441086a2007360200200441046a20083602002004410c6a28020021060b2004410c6a2207200641016a360200200820066a20024101463a0000200441086a2109200441046a210a03400240024002400240200928020020072802002206470d00200641016a22082006490d052006410174220b20082008200b491b220b4100480d052006450d0120052802002006200b101e22080d020c060b200528020021080c020b200b101f2208450d040b2009200b360200200a2008360200200728020021060b2007200641016a360200200820066a200141807f72200141ff0071200141077622061b3a00002006210120060d000b024020024101470d002004410c6a2101200441086a2108200441046a210b03400240024002400240200828020020012802002206470d00200641016a22072006490d0620064101742209200720072009491b22094100480d062006450d01200528020020062009101e22070d020c080b200528020021070c020b2009101f2207450d060b20082009360200200b2007360200200128020021060b2001200641016a360200200720066a200341807f72200341ff0071200341077622061b3a00002006210320060d000b0b2000411a3a00000f0b1021000b200b41011020000b200941011020000bfe07030f7f017e017f200241086a2103200241046a21042001280200220521060240024002400240024003400240024002400240200428020020032802002207470d00200741016a22082007490d0520074101742209200820082009491b22094100480d052007450d01200228020020072009101e22080d020c060b200228020021080c020b2009101f2208450d040b2002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b200141086a280200210a2001280204220b2107024002402001410c6a280200220c450d00200b21072005450d00200b200c410c6c6a220d41746a210e200241086a210341002107200b210f0340200f210802400340200828020022100d01200741016a2107200d2008410c6a2208470d000c040b0b2008410c6a210f200741016a21112005417f6a2105200841046a290200211203400240024002400240200241046a220428020020032802002206470d00200641016a22092006490d0820064101742201200920092001491b22014100480d082006450d01200228020020062001101e22090d020c0a0b200228020021090c020b2001101f2209450d080b2002200936020020042001360200200328020021060b2003200641016a360200200920066a200741807f72200741ff0071200741077622061b3a00002006210720060d000b2012422088a72213210603400240024002400240200428020020032802002207470d00200741016a22092007490d0820074101742201200920092001491b22014100480d082007450d01200228020020072001101e22090d020c0b0b200228020021090c020b2001101f2209450d090b2002200936020020042001360200200328020021070b2003200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b024002400240024020042802002206200328020022076b20134f0d00200720136a22092007490d0720064101742207200920092007491b22074100480d072006450d01200228020020062007101e22060d020c0b0b200228020021060c020b2007101f2206450d090b2002200636020020042007360200200328020021070b2003200720136a360200200620076a2010201310ce031a02402012a7450d002010101d0b0240200e2008460d002011210720050d010b0b2008410c6a21070b2007200b200c410c6c6a2202460d000340024020072802002206450d00200741046a280200450d002006101d0b2007410c6a22072002470d000b0b0240200a450d00200b101d0b2000411a3a00000f0b1021000b200941011020000b200141011020000b200141011020000b200741011020000bd806010a7f200128020421032001280200210441002105410121064100210720012802082208210902400240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d05024002402005450d0020062005200a101e22060d010c040b200a101f2206450d030b200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d032005410174220a20092009200a491b22094100480d03024002402005450d00200620052009101e2206450d010c030b2009101f22060d020b200941011020000b200a41011020000b200921050b200620076a2004200810ce031a02402003450d002004101d0b200128020c210c02400240024002400240200520086b20076b200141146a28020022094f0d00200820076a220a20096a2203200a490d052005410174220a20032003200a491b220a4100480d052005450d0120062005200a101e2206450d020c030b200820096a20076a21030c030b200a101f22060d010b200a41011020000b200a21050b200620086a20076a200c200910ce031a200241086a210a200241046a210820032109034002400240024002402008280200200a2802002207470d00200741016a220b2007490d0520074101742204200b200b2004491b22044100480d052007450d01200228020020072004101e220b0d020c060b2002280200210b0c020b2004101f220b450d040b2002200b36020020082004360200200a28020021070b200a200741016a360200200b20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b024002400240200241046a2802002209200241086a28020022076b20034f0d00200720036a220a2007490d0320094101742207200a200a2007491b22074100480d032009450d01200228020020092007101e2209450d020c050b200228020021090c050b2007101f22090d030b200741011020000b1021000b200441011020000b20022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a2006200310ce031a02402005450d002006101d0b2000411a3a00000240200141106a280200450d00200c101d0b0bb70301087f2002410c6a2103200241046a2104200141086a28020022052106024002400240024003400240024002400240200241086a220728020020032802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120042802002008200a101e22090d020c060b200428020021090c020b200a101f2209450d040b2007200a36020020042009360200200328020021080b2003200841016a360200200920086a200641807f72200641ff0071200641077622081b3a00002008210620080d000b2001280204210920012802002106024002400240200241086a28020022032002410c6a28020022086b20054f0d00200820056a22072008490d0320034101742208200720072008491b22084100480d032003450d01200241046a28020020032008101e2203450d020c050b200241046a28020021030c050b2008101f22030d030b200841011020000b1021000b200a41011020000b200241086a2008360200200241046a20033602002002410c6a28020021080b2002410c6a200820056a360200200320086a2006200510ce031a02402009450d002006101d0b2000411a3a00000ba707010c7f230041c080016b2202240041002103200141086a2104200141046a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d08200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff01714104490d030b200241086a41004180800110cd031a2006450d03200141086a210a200141046a210b41002108410021074101210c410021040340200b280200220d200a28020022096b200620046b220341808001200341808001491b2203490d06200920036a22052009490d09200d2005490d0a200241086a200128020020096a200310ce031a200a20053602000240024002400240200720086b20034f0d00200820036a22092008490d0f20074101742205200920092005491b22054100480d0f2007450d01200c20072005101e220c0d020c100b200320086a21090c020b2005101f220c450d0e0b200521070b200c20086a200241086a200310ce031a200921082006200320046a22044b0d000c050b0b410f21030c010b200241013a00b880012002411c6a41013602002002410136029480012002420137020c20024190afc4003602082002200241b880016a360290800120022002419080016a360218200241a080016a200241086a1028410521030b2000200336020420004101360200200041086a20022902a08001370200200041106a200241a080016a41086a2802003602000c090b4101210c41002107410021090b2000200c36020420004100360200200041146a2009360200200041106a41003602002000410c6a2009360200200041086a2007360200200241c080016a24000f0b200241013a008f8001200241b480016a4101360200200241013602bc8001200242013702a4800120024190afc4003602a0800120022002418f80016a3602b880012002200241b880016a3602b080012002419080016a200241a080016a1028200241ab80016a2002419880016a2802003600002002200229039080013700a38001200041053a000420004101360200200020022900a080013700052000410c6a200241a780016a2900003700002007450d06200c101d200241c080016a24000f0b417f2009102a000b20092007102b000b20092005102a000b2005200d102b000b1021000b200541011020000b200241c080016a24000be007010a7f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204470d00200241013a000f2002413c6a4101360200200241013602242002420137022c20024190afc40036022820022002410f6a3602202002200241206a360238200241106a200241286a1028200241326a200241186a2802003601002002200229031037012a20022002412e6a29010037010620022002290128370300410521050c010b200441016a21062004417f460d0b20032006490d0c2001280200220720046a2d00002108410c21052001410c6a2006360200410021064100210902402008450d004101210920084101470d010b410120036b210a200441026a21042001410c6a210b4100210503402006411f4b0d02200a20046a4102460d032004450d0a20032004490d0b200720046a417f6a2d00002108200b2004360200200841ff00712006411f71742005722105200441016a2104200641076a21062008418001710d000b024020064120490d00410d210620086741686a41ff017141034d0d040b2009450d042004417f6a2104410021062001410c6a210b4100210a03402006411f4b0d0720032004460d082004417f460d0e2003200441016a2201490d0f200720046a2d00002108200b2001360200200841ff00712006411f7174200a72210a200641076a2106200121042008418001710d000b024020064120490d00410d210420086741686a41ff017141034d0d090b410121040c050b200020083a0005200020053a000420002002290300370106200041013602002000410c6a2002290106370100200241c0006a24000f0b410f21060c010b200241013a00102002413c6a4101360200200241013602242002420137022c20024190afc4003602282002200241106a3602202002200241206a3602382002200241286a1028410521060b2000200636020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b410021040b20002005360204200041003602002000410c6a200a360200200041086a2004360200200241c0006a24000f0b410f21040c010b200241013a00102002413c6a4101360200200241013602242002420137022c20024190afc4003602282002200241106a3602202002200241206a3602382002200241286a1028410521040b2000200436020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b417f2004102a000b20042003102b000b417f2006102a000b20062003102b000b417f200441016a102a000b200441016a2003102b000bbd0602057f027e0240024002402002450d00200241796a4100200241074b1b2103410021040340024002400240024002400240024002400240024002400240024002400240200120046a22052d0000220641187441187522074100480d002005410371450d01200441016a22042002490d0f0c100b4280808080102108200641f6b1c2006a2d000022054104460d0120054103460d0220054102470d08200441016a220620024f0d094280808080802021094280808080102108200120066a2d000041c00171418001460d0d0c110b0240200420034f0d000340200120046a220641046a280200200628020072418081828478710d01200441086a22042003490d000b0b0240200420024f0d000340200120046a2c00004100480d01200441016a22042002490d000b0b20042002490d0d0c0e0b42002109200441016a220520024f0d08200120056a2d00002105200641f001460d01200641f401470d022005411874411875417f4a0d06200541ff0171418f014d0d030c060b42002109200441016a220520024f0d07200120056a2d00002105200641e001460d03200641ed01470d042005411874411875417f4a0d05200541ff017141a001490d090c050b200541f0006a41ff01714130490d010c040b200541ff017141bf014b0d032007410f6a41ff017141024b0d03200541187441187541004e0d030b200441026a220620024f0d04200120066a2d000041c00171418001470d0a42002108200441036a220620024f0d0b200120066a2d000041c00171418001460d070c050b200541e0017141a001470d010c050b02402007411f6a41ff0171410c4f0d002005411874411875417f4a0d01200541ff017141bf014d0d050c010b200541ff017141bf014b0d00200741fe017141ee01470d0020054118744118754100480d040b4280808080802021090c080b420021090b420021080c060b428080808080e000210942808080801021080c050b42002108200441026a220620024f0d04200120066a2d000041c00171418001470d030b200641016a22042002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210942808080801021080b200020092008842004ad84370204200041013602000bca07010d7f230041c0086b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d082001280200220a20086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d03200241086a410041800810cd031a2001410c6a210b200141086a210c4101210d4100210e41002108410021040340200720096b200620046b22034180082003418008491b2203490d05200920036a22052009490d0920072005490d0a200241086a200a20096a200310ce031a200b20053602000240024002400240200e20086b20034f0d00200820036a22052008490d0f200e4101742209200520052009491b22094100480d0f200e450d01200d200e2009101e220d0d020c100b200320086a21050c020b2009101f220d450d0e0b2009210e0b200d20086a200241086a200310ce031a02402006200320046a22044d0d00200b2802002109200c28020021072001280200210a200521080c010b0b200241086a200d2005105720022802084101470d050240200e450d00200d101d0b200041083a000420004101360200200241c0086a24000f0b410f21030c010b200241013a0098082002411c6a41013602002002410136028c082002420137020c20024190afc400360208200220024198086a36028808200220024188086a360218200241a8086a200241086a1028410521030b2000200336020420004101360200200041086a20022902a808370200200041106a200241a8086a41086a2802003602000c090b2000428080808010370200200041086a4200370200200241c0086a24000f0b200241013a009708200241bc086a41013602002002410136028c08200242013702ac0820024190afc4003602a808200220024197086a36028808200220024188086a3602b80820024198086a200241a8086a1028200241b3086a200241a0086a28020036000020022002290398083700ab08200041053a000420004101360200200020022900a8083700052000410c6a200241af086a290000370000200e450d07200d101d200241c0086a24000f0b2000200d3602042000410c6a2005360200200041086a200e36020020004100360200200241c0086a24000f0b417f2009102a000b20092007102b000b20092005102a000b20052007102b000b1021000b200941011020000b200241c0086a24000bb70b05077f017e037f017e017f230041d0016b22022400200241b0016a41186a22034200370300200241b0016a41106a22044200370300200241b0016a41086a22054200370300200242003703b001200241b0016a2001280200220620012802042207412020074120491b220810ce031a2001200720086b3602042001200620086a360200024002402007411f4d0d0020024190016a41186a2207200329030037030020024190016a41106a2208200429030037030020024190016a41086a22062005290300370300200220022903b00137039001200241f0006a41186a2007290300370300200241f0006a41106a2008290300370300200241f0006a41086a20062903003703002002200229039001370370410121070c010b410021070b200241b0016a41186a2208200241f0006a41186a290300370300200241b0016a41106a2206200241f0006a41106a290300370300200241b0016a41086a2203200241f0006a41086a290300370300200220022903703703b001024002400240024002402007450d00200241306a41186a2008290300370300200241306a41106a2006290300370300200241306a41086a2003290300370300200220022903b00137033020022001105a2002290300a7450d0120022903082109200241b0016a41186a22054200370300200241b0016a41106a220a4200370300200241b0016a41086a220b4200370300200242003703b001200241b0016a20012802002204200141046a22032802002207412020074120491b220810ce031a2003200720086b22063602002001200420086a22083602002007411f4d0d0220024190016a41186a2207200529030037030020024190016a41106a2204200a29030037030020024190016a41086a2205200b290300370300200220022903b00137039001200241d0006a41186a2007290300370300200241d0006a41106a2004290300370300200241d0006a41086a20052903003703002002200229039001370350200241b0016a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd031a200241b0016a2008200710ce031a2003200620076b3602002001200820076a3602002006411f4d0d0320024190016a41186a2207200241b0016a41186a220329030037030020024190016a41106a2208200241b0016a41106a220429030037030020024190016a41086a2206200241b0016a41086a2205290300370300200220022903b00137039001200241f0006a41186a220a2007290300370300200241f0006a41106a220b2008290300370300200241f0006a41086a220c20062903003703002002200229039001370370200241b0016a2001105b20022802b0012201450d0420022902b401210d2003200241306a41186a2903003703002004200241306a41106a2903003703002005200241306a41086a2903003703002006200241d0006a41086a2903003703002008200241d0006a41106a2903003703002007200241d0006a41186a290300370300200241106a41086a220e200c290300370300200241106a41106a220c200b290300370300200241106a41186a220b200a290300370300200220022903303703b0012002200229035037039001200220022903703703102000200d37020c2000200136020820002009370300200041146a20022903b0013702002000411c6a2005290300370200200041246a20042903003702002000412c6a2003290300370200200041346a2002290390013702002000413c6a2006290300370200200041c4006a2008290300370200200041cc006a2007290300370200200041ec006a200b290300370200200041e4006a200c290300370200200041dc006a200e290300370200200041d4006a2002290310370200200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000bbe0503057f027e037f230041106b22022400200241003a0008200241086a2001280200220320012802042204410047220510ce031a02400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d0020022d00082204ad210702400240200441037122034102460d00024020034101460d0020030d022004410276ad2107420121080c050b200241003a0008200241086a20052006410047220410ce031a20062004490d07200141046a200620046b3602002001200520046a3602002006450d0220023100084208862007844202882107420121080c040b200241003a0006200241003b0104200241046a200520064103200641034922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d0120023301042002310006421086844208862007844202882107420121080c030b02400240200441027622044104460d0020040d0120024100360208200241086a200520064104200641044922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d0220023502082107420121080c040b4200210820024200370308200241086a200520064108200641084922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d0220022903082107420121080c030b200441046a220941084b0d0042002107200141046a210a410021030340200241003a0008200241086a20052006410047220410ce031a20062004490d05200a200620046b220b3602002001200520046a22053602002006450d0120023100082003410374413871ad86200784210742012108200b2106200341016a22042103200441ff01712009490d000c030b0b420021080b0b2000200737030820002008370300200241106a24000f0b20052004102a000b20042006102a000b20042006102a000bdd1805027f017e147f017e097f230041f0026b22022400200241186a200110b501024002400240024002400240024002400240024002402002280218450d00200228021c2203ad42287e2204422088a70d0a2004a72205417f4c0d0a2005450d012005101f2206450d032003450d020c040b20004100360200200241f0026a24000f0b4108210620030d020b41002116410021120c020b200541081020000b200241ec016a2105200241d8016a41086a2107200241d8016a41047221082002419d016a2109200241d8016a41076a210a200241206a410172210b200241a0026a210c200241eb016a220d41056a210e4100210f4100211041002111200321120340200141046a22132802002114200241003a00d801200241d8016a200128020022152014410047221610ce031a024002400240024002400240024020142016490d002013201420166b22173602002001201520166a22163602002014450d0920022d00d801221441044b0d090240024002400240024002400240024002400240024020140e050004020301000b200241086a200110b5012002280208450d13200228020c2214417f4c0d172014450d04201410792215450d0b2015200128020020132802002216201420162014491b221610ce031a201328020022172016490d0c2013201720166b3602002001200128020020166a36020020162014460d050c090b200241003602d801200241d8016a201620174104201741044922151b221410ce031a2013201720146b3602002001201620146a36020020150d1220022802d8012116200241106a200110b5012002280210450d1220022802142214417f4c0d162014450d06201410792217450d0c2017200128020020132802002215201420152014491b221510ce031a201328020022182015490d0d2013201820156b3602002001200128020020156a36020020152014470d070c0e0b200241d8016a2017412020174120491b22146a41004100412020146b2014411f4b1b10cd031a200241d8016a2016201410ce031a2013201720146b3602002001201620146a3602002017411f4d0d11200241c8016a41086a200a41086a2800003602002002200a2900003703c8012002200d290000370390012002200e2900003700950120022f01d801211420022d00da01211620022800db0121152009411f6a200241d8016a411f6a290000370000200941186a200241d8016a41186a290000370000200941106a200241d8016a41106a290000370000200941086a2007290000370000200920022900d8013700002015410876211a20142016411074722116410121180c0e0b200242003703d801200241d8016a20162017410820174108491b221410ce031a2013201720146b22153602002001201620146a2216360200201741074d0d1020022903d8012104200241d8016a201541c000201541c000491b22146a4100410041c00020146b2014413f4b1b10cd031a200241d8016a2016201410ce031a2013201520146b3602002001201620146a3602002015413f4d0d10200241c8016a41086a200a41086a28000036020020024190016a41086a200d41086a29000037030020024190016a41106a200d41106a29000037030020024190016a41186a200d41186a29000037030020024190016a41206a200d41206a29000037030020024190016a41256a200d41256a2900003700002002200a2900003703c8012002200d2900003703900120022800db012215410876211a20022f01d80120022d00da01411074722116410221180c0d0b200241a8026a200110b90220022802a8022215450d0f20022902ac022104200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220043703c80120022008290200370390012015410876211a410021180c020b4101211541002014470d040b200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220082902003703900120022014ad22044220862004843703c8012015410876211a410421180b0c090b4101211741002014460d070b2014450d0a2017101d0c0a0b2014450d092015101d0c090b20162014102a000b201441011020000b20162017102a000b201441011020000b20152018102a000b2017450d032016411876211520022014ad22194220862019843702cc01200220173602c801410321180b200241e0026a41086a221b200241c8016a41086a280200360200200241a8026a41086a221420024190016a41086a290300370300200241a8026a41106a221320024190016a41106a290300370300200241a8026a41186a221720024190016a41186a290300370300200241a8026a41206a221c20024190016a41206a290300370300200241a8026a41286a221d20024190016a41286a290300370300200241a8026a41306a221e20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a80220024180016a41086a221f201b280200360200200241c8006a41086a221b2014290300370300200241c8006a41106a22202013290300370300200241c8006a41186a22212017290300370300200241c8006a41206a2222201c290300370300200241c8006a41286a221c201d290300370300200241c8006a41306a221d201e280200360200200220022903e00237038001200220022903a8023703482007200229038001370000200741086a201f28020036000020052002290348370000200541086a201b290300370000200541106a2020290300370000200541186a2021290300370000200541206a2022290300370000200541286a201c290300370000200541306a201d2802003600002002201a410874201541ff0171723602dc01200220183a00d801200220163b00d901200220164110763a00db01200c2004370300200241206a200241d8016a10b70220022d00202115200241a8026a411f6a2218200b411f6a2900003700002017200b41186a2900003703002013200b41106a2900003703002014200b41086a2900003703002002200b2900003703a80220154103460d03201141016a2116200241d8016a411f6a221b2018290000370000200241d8016a41186a22182017290300370300200241d8016a41106a2217201329030037030020072014290300370300200220022903a8023703d801024020112012470d00200f20162016200f491b2212ad42287e2219422088a70d052019a722144100480d0502402011450d00200620102014101e22060d010c070b2014101f2206450d060b200620106a221420153a0000201441206a201b290000370000201441196a2018290300370000201441116a2017290300370000201441096a2007290300370000201441016a20022903d801370000200f41026a210f201041286a21102016211120162003490d000b0b2000201236020420002006360200200041086a2016360200200241f0026a24000f0b200241e0026a41086a200241c8016a41086a280200360200200241a8026a41086a220520024190016a41086a290300370300200241a8026a41106a220120024190016a41106a290300370300200241a8026a41186a221420024190016a41186a290300370300200241a8026a41206a20024190016a41206a290300370300200241a8026a41286a20024190016a41286a290300370300200241a8026a41306a20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a802200241033a0020200241a8026a411f6a200b411f6a2900003700002014200b41186a2900003703002001200b41106a2900003703002005200b41086a2900003703002002200b2900003703a8020b2000410036020002402011450d00200621050340024020052d00002201450d00024020014101470d00200541086a280200450d01200541046a280200101d200541286a2105201041586a22100d020c030b200541106a280200450d002005410c6a280200101d0b200541286a2105201041586a22100d000b0b02402012450d002006101d0b200241f0026a24000f0b1021000b201441081020000b102e000b900d010a7f23004180026b2202240002400240024002402001411041f8b3c200410041001002417f460d00200241e0016a41186a22034200370300200241e0016a41106a4200370300200241e0016a41086a22044200370300200242003703e001410020014110200241e0016a41204100100222052005417f461b220541204922060d03200241c0016a41186a2003290300370300200241c0016a41106a2203200241e0016a41106a290300370300200241c0016a41086a2004290300370300200220022903e0013703c001200241003a00e00120014110200241e0016a41012005412020061b2204100241016a41014b2205450d0320022d00e0012106200241186a200241c0016a41186a290300370300200241106a2003290300370300200241086a200241c0016a41086a290300370300200220022903c001370300200241003a00e00120014110200241e0016a4101200420056a2203100241016a41014b2204450d03200320046a210320022d00e0012204450d0120044101470d03200241f8016a4200370300200241e0016a41106a4200370300200241e8016a4200370300200242003703e00120014110200241e0016a4120200310022204417f460d032004411f4d0d03200241c0016a41186a2204200241e0016a41186a290300370300200241c0016a41106a2205200241e0016a41106a290300370300200241c0016a41086a2207200241e0016a41086a290300370300200220022903e0013703c001200241a0016a41186a22082004290300370300200241a0016a41106a22042005290300370300200241a0016a41086a22052007290300370300200220022903c0013703a00120024180016a41186a200829030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903a00137038001200341206a2103410121050c020b200041023a002120024180026a24000f0b410021050b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a2903003703002002200229038001370360200241003a00e00120014110200241e0016a41012003100241016a41014b2207450d0041002104024020022d00e0012208450d0020084101470d01200241f8016a4200370300200241e0016a41106a4200370300200241e8016a4200370300200242003703e00120014110200241e0016a4120200320076a10022201417f460d012001411f4d0d01200241c0016a41186a2201200241e0016a41186a290300370300200241c0016a41106a2203200241e0016a41106a290300370300200241c0016a41086a2204200241e0016a41086a290300370300200220022903e0013703c001200241a0016a41186a22072001290300370300200241a0016a41106a22012003290300370300200241a0016a41086a22032004290300370300200220022903c0013703a00120024180016a41186a200729030037030020024180016a41106a200129030037030020024180016a41086a2003290300370300200220022903a00137038001410121040b200241206a41186a220120024180016a41186a290300370300200241206a41106a220320024180016a41106a290300370300200241206a41086a220720024180016a41086a2903003703002002200229038001370320200241c0006a41186a2208200241e0006a41186a290300370300200241c0006a41106a2209200241e0006a41106a290300370300200241c0006a41086a220a200241e0006a41086a29030037030020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200241e0016a41186a220b2008290300370300200241e0016a41106a22082009290300370300200241e0016a41086a2209200a290300370300200241c0016a41086a220a2007290300370300200241c0016a41106a22072003290300370300200241c0016a41186a22032001290300370300200220022903403703e001200220022903203703c001200020053a0021200020063a0020200041c2006a20043a0000200020022903e0013700222000412a6a2009290300370000200041326a20082903003700002000413a6a200b290300370000200041c3006a20022903c001370000200041cb006a200a290300370000200041d3006a2007290300370000200041db006a200329030037000020024180026a24000f0b41df88c0004133103a000be90101047f230041b0016b220224000240024002402001411041f8b3c200410041001002417f460d002002421037020c20022001360208200241d8006a200241086a105e20022802582201450d02200241e0006a2802002103200228025c2104200241e8006a200241086a105f20022d006822054102460d01200241156a200241e8006a41017241c10010ce031a200020053a000c2000200336020820002004360204200020013602002000410d6a200241156a41c30010ce031a200241b0016a24000f0b200041023a000c200241b0016a24000f0b2004450d002001101d0b41df88c0004133103a000bdd0403027f017e0d7f230041d0006b22022400200241086a200110d50102400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210d0c030b102e000b200541011020000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d03402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001002220f200f417f461b220f4120200f4120491b20052802006a360200200f411f4d0d02200c41016a2105200241106a41186a220f2007290300370300200241106a41106a22102008290300370300200241106a41086a2211200e290300370300200220022903303703100240200c200d470d00200a20052005200a491b220dad4205862204422088a70d042004a7220e4100480d040240200c450d002006200b200e101e22060d010c060b200e101f2206450d050b2006200b6a220c2002290310370000200c41186a200f290300370000200c41106a2010290300370000200c41086a2011290300370000200a41026a210a200b41206a210b2005210c20052003490d000b0b2000200d36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200d450d002006101d0b200241d0006a24000f0b1021000b200e41011020000bd10901087f230041a0016b2202240041002103200241003a0080012001280200200128020420024180016a410120012802081002210420012001280208200441016a41014b22046a2205360208024002402004450d00024020022d0080012204450d0020044101470d0120024180016a41186a2206420037030020024180016a41106a2207420037030020024180016a41086a220842003703002002420037038001200141086a220341002001280200200141046a28020020024180016a41202005100222042004417f461b2204412020044120491b20032802006a22053602002004411f4d0d01200241e0006a41186a22042006290300370300200241e0006a41106a22032007290300370300200241e0006a41086a220620082903003703002002200229038001370360200241c0006a41186a22072004290300370300200241c0006a41106a22042003290300370300200241c0006a41086a2203200629030037030020022002290360370340200241206a41186a2007290300370300200241206a41106a2004290300370300200241206a41086a200329030037030020022002290340370320410121030b200241186a200241206a41186a290300370300200241106a200241206a41106a290300370300200241086a200241206a41086a2903003703002002200229032037030041002106200241003a0080012001280200200141046a28020020024180016a4101200510022104200141086a22052005280200200441016a41014b22046a22053602002004450d01024020022d0080012204450d0020044101470d0220024180016a41186a2206420037030020024180016a41106a2207420037030020024180016a41086a220842003703002002420037038001200141086a220441002001280200200141046a28020020024180016a41202005100222012001417f461b2201412020014120491b20042802006a3602002001411f4d0d02200241e0006a41186a22012006290300370300200241e0006a41106a22042007290300370300200241e0006a41086a220520082903003703002002200229038001370360200241c0006a41186a22062001290300370300200241c0006a41106a22012004290300370300200241c0006a41086a2204200529030037030020022002290360370340200241206a41186a2006290300370300200241206a41106a2001290300370300200241206a41086a200429030037030020022002290340370320410121060b200241e0006a41186a2201200241206a41186a290300370300200241e0006a41106a2204200241206a41106a290300370300200241e0006a41086a2205200241206a41086a2903003703002002200229032037036020024180016a41186a2207200241186a29030037030020024180016a41106a2208200241106a29030037030020024180016a41086a2209200241086a2903003703002002200229030037038001200020033a0000200041216a20063a00002000200229038001370001200041096a2009290300370000200041116a2008290300370000200041196a2007290300370000200041226a20022903603700002000412a6a2005290300370000200041326a20042903003700002000413a6a2001290300370000200241a0016a24000f0b200041023a0000200241a0016a24000f0b200041023a0000200241a0016a24000b8b0202037f017e230041206b22022400024002402001411041f8b3c200410041001002417f460d002002411036020420022001360200200242003703102002410020014110200241106a41084100100222032003417f461b2203410820034108491b2204360208200341074d0d012002290310210520024100360210200241086a410020014110200241106a41042004100222012001417f461b22014104200141044922011b20046a36020020010d0120022802102101200241106a2002105e20022802102203450d01200020022902143703102000200336020c2000200136020820002005370300200241206a24000f0b2000410036020c200241206a24000f0b41df88c0004133103a000bc60401067f230041106b220224002002410036020820024201370300200120021062200141046a20021062200141086a20021062200228020421032002280208210402400240024002400240024002400240024002400240024002400240024020012d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22054100480d0c2004450d03200228020020042005101e2203450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22054100480d0b2004450d04200228020020042005101e2203450d050c060b200228020021030c080b200228020021030c050b2005101f22030d050b200541011020000b2005101f22030d010b200541011020000b20022005360204200220033602000b200241086a200441016a360200200320046a41003a00000c020b20022005360204200220033602000b200241086a200441016a360200200320046a41013a00000b200128020c21062002200141146a280200220136020c2002410c6a2002106202400240024020022802042205200241086a28020022036b20014f0d00200320016a22042003490d0320054101742207200420042007491b22074100480d032005450d01200228020020052007101e2204450d020c040b200228020021040c040b2007101f22040d020b200741011020000b1021000b2002200736020420022004360200200721050b200420036a2006200110ce031a200041102004200320016a100302402005450d002004101d0b200241106a24000b9d0701037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002202413f4b0d00200141046a280200200141086a2802002200470d01200041016a22032000490d1120004101742204200320032004491b22044100480d112000450d05200128020020002004101e2203450d060c170b2002418080014f0d01200141046a2802002203200141086a28020022006b41024f0d02200041026a22042000490d1020034101742200200420042000491b22004100480d102003450d08200128020020032000101e2203450d090c140b200128020021030c160b20024180808080044f0d01200141046a2802002203200141086a28020022006b41044f0d04200041046a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d08200128020020032000101e22030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004101e22030d0a0c0e0b2004101f22030d110b200441011020000b200128020021030c050b200128020021030c070b2000101f22030d0b0b200041011020000b2000101f2203450d060b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b2004101f2203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200028020021030240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0420024101742200200420042000491b22004100480d042002450d01200128020020022000101e22020d020c070b200128020021020c020b2000101f2202450d050b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b1021000b200041011020000b200441011020000b200041011020000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000bcf0101047f200020014105746a210320002104024002400340200320046b41ff004d0d014101210520042002460d0220042002412010d003450d02200441206a22062002460d0220062002412010d003450d02200441c0006a22062002460d0220062002412010d003450d02200441e0006a22062002460d0220044180016a210420062002412010d0030d000c020b0b024020042003460d00200020014105746a210603404101210520022004460d0220042002412010d003450d022006200441206a2204470d000b0b41000f0b20050b5201027e02402003450d0020022802000d00200128022c220342002003290308220420023502047d220520052004562005507222021b37030820004105410420021b3602000f0b41e8dac00041f403103a000bbc0d05057f027e017f017e047f230041b00a6b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042105200241146a2802002106200241246a2802002107200241346a2802002108200441186a200128022429033042004220420010d203200128022c2202420020022903082209427f200429031820042903204200521b7d220a200a200956200a507222031b37030841052102024020030d004120101f220b450d05200b4200370000200b41176a4200370000200b41106a4200370000200b41086a4200370000200b411f6a41003a0000024020012802282802082005200b412010102203417e460d0020030d07024002400240024002402006450d00200441086a200141246a28020029033042002008ad220c420010d2032001412c6a2802002203420020032903082209427f200429030820042903104200521b7d220a200a200956200a507222031b37030820030d052008450d0120084100480d102008101f220d450d1141012103200d2105024020084102490d00200d41002008417f6a220310cd0320036a2105200821030b200541003a00000c020b4100210d0c020b410021034101210d4200210c0b200141286a2802002802082007200d200310102205417e460d0120050d0c200d450d02200c2003ad42208684210a0b200128020028021821064120101f220e450d09200e200b290000370000200e41186a200b41186a290000370000200e41106a200b41106a290000370000200e41086a200b41086a290000370000200628020c0d0a2006410c6a417f360200200441f8096a41186a200641e4006a290000370300200441f8096a41106a200641dc006a290000370300200441f8096a41086a200641d4006a2900003703002004200629004c3703f80902400240200641106a220f280200220541f0c0c100460d00200641146a28020021070c010b418009101f2205450d0f41002107200541003b010620054100360200200541086a20044180016a41f80810ce031a200641146a4100360200200641106a20053602000b0240024002400240034020052f01062210410574210841002102410021030240034020082002460d01200441f8096a200520026a41086a412010d0032201450d03200241206a2102200341016a21032001417f4a0d000b2003417f6a21100b02402007450d002007417f6a2107200520104102746a4180096a28020021050c010b0b200441286a41186a200441f8096a41186a290300370300200441286a41106a200441f8096a41106a290300370300200441286a41086a200441f8096a41086a290300370300200420042903f809370328200641186a2102410021072010210341000d010c020b200641186a21024101450d010b20044198016a420037030020044194016a41f0c0c100360200200441003602a00120044100360290012004420037038801200441f0c0c1003602840120044100360280012005200341c8006c6a41e8026a210220044180016a10320c010b200441f8096a411c6a200441286a41086a2903003702002004419c0a6a200441286a41106a290300370200200441a40a6a200441286a41186a290300370200200420023602880a200420033602840a2004200f3602800a200420053602fc09200420073602f8092004200429032837028c0a20044180016a411c6a420037020020044180016a41106a200441f0006a41086a290300370300200441a5016a2004290048370000200441ad016a200441c8006a41086a290000370000200441b5016a200441c8006a41106a290000370000200441bd016a200441c8006a41186a290000370000200441c4016a200441e7006a2800003600002004420037038001200441023a00a401200441f0c0c100360298012004200429037037038801200441f8096a20044180016a103121020b200442a0808080800437024c2004200e3602482004200a3702fc092004200d3602f80920044180016a200241186a200441c8006a200441f8096a10f8010240200428028001450d002004280284012202450d0020044188016a280200450d002002101d0b2006410c6a2202200228020041016a360200200b101d410421020c020b200c500d00200d101d0b200b101d0b20002002360200200441b00a6a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b412041011020000b4198afc400102c000b412041011020000b10f901000b4198afc400102c000b1021000b200841011020000b41800941081020000bd50303017f027e017f230041c0006b220424000240024002402003450d0020022802000d00200228020421032004200128022429033042004220420010d203200128022c2202420020022903082205427f200429030020042903084200521b7d220620062005562006507222021b37030802400240024020020d004120101f2202450d0420024200370000200241176a4200370000200241106a4200370000200241086a42003700002002411f6a41003a00000240200128022828020820032002412010102203417e460d0020030d06200441106a20012802002802182203410c6a200341cc006a2003410020032802001b2002412010f7012004280210450d02200441206a41086a200441106a41086a220328020036020020042004290310370320200441306a41086a2207200328020036020020042004290310370330200141186a210302402001411c6a280200450d002003280200101d0b20032004290330370200200341086a2007280200360200410021010c030b2002101d0b20004105360200200441c0006a24000f0b200141206a4100360200410121010b2002101d2000410036020020002001360204200441c0006a24000f0b41e8dac00041f403103a000b412041011020000b4198afc400102c000ba80d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a20012802242903304200200241146a2802002202ad420010d203200128022c220342002003290308220b427f200429032020042903284200521b7d220c200c200b56200c507222031b37030820030d0e024002402002450d0020024100480d0a2002101f2203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e10cd03200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e10102205417e460d0020050d0a2003450d1120044180016a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b10cd031a20044180016a2003200510ce031a200d0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d002003101d0b200441106a200141246a28020029033042002008ad420010d2032001412c6a280200220242002002290308220b427f200429031020042903184200521b7d220c200c200b56200c507222021b37030820020d112008450d0120084100480d0b2008101f2202450d0e2002210541002103024020084102490d00200241002008417f6a220310cd0320036a21050b200541003a0000200341016a21030c020b2002450d102003101d0c100b4100210841012102410021030b024002400240200141286a28020028020820072002200310102205417e460d0020050d0d2002450d112004420037038801200442003703800120044180016a20022003411020034110491b10ce031a2003410f4d0d0020044188016a290300210f200429038001211002402008450d002002101d0b2004200141246a2802002903304200200aad420010d2032001412c6a280200220242002002290308220b427f200429030020042903084200521b7d220c200c200b56200c507222021b37030820020d11200a450d01200a4100480d0b200a101f2202450d1041012103200221050240200a4102490d0020024100200a417f6a220310cd0320036a2105200a21030b200541003a00000c020b2008450d102002101d0c100b4100210a41012102410021030b02400240024002400240200141286a28020028020820092002200310102205417e460d0020050d112002450d13200141206a41003602002001411c6a280200210e20012802182108200142013702182001412c6a2802002205290308220b210c2006500d012006210c200b20065a0d0141012103200e450d022008101d200a0d030c040b200a450d122002101d0c120b2005200b200c7d3703082005290310210b200441d0006a41186a200541186a2903003703002004200c3703582004200c3703502004200b3703602001280200280218210720044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a8012004200e3602a401200420083602a001200441f0006a200720044180016a2010200f200441d0006a20022003200441a0016a1041200441f0006a41086a290300210c2004280274210e200428027021082005200429035820052903087c3703084101210320084101460d00200e450d0002402001411c6a2203280200450d00200141186a280200101d0b2003200c370200200141186a200e360200410021030b200a450d010b2002101d0b2000410036020020002003360204200441b0016a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b4198afc400102c000b1021000b200241011020000b4198afc400102c000b200841011020000b4198afc400102c000b200a41011020000b20004105360200200441b0016a24000b961006027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a20012802242903304200200241146a2802002202ad420010d203200128022c220342002003290308220b427f200429032820042903304200521b7d220c200c200b56200c507222031b37030820030d13024002402002450d0020024100480d0a2002101f2203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e10cd03200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e10102205417e460d0020050d0a2003450d16200441f8006a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b10cd031a200441f8006a2003200510ce031a200d0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d002003101d0b200441186a200141246a28020029033042002008ad420010d2032001412c6a280200220242002002290308220b427f200429031820042903204200521b7d220c200c200b56200c507222021b37030820020d162008450d0120084100480d0b2008101f2202450d0e2002210541002103024020084102490d00200241002008417f6a220310cd0320036a21050b200541003a0000200341016a21030c020b2002450d152003101d0c150b4100210841012102410021030b024002400240200141286a28020028020820072002200310102205417e460d0020050d0d2002450d16200442003703c001200442003703b801200441b8016a20022003411020034110491b10ce031a2003410f4d0d00200441c0016a290300210f20042903b801211002402008450d002002101d0b200441086a200141246a2802002903304200200aad420010d2032001412c6a280200220242002002290308220b427f200429030820042903104200521b7d220c200c200b56200c507222021b37030820020d16200a450d01200a4100480d0b200a101f2202450d1041012103200221050240200a4102490d0020024100200a417f6a220310cd0320036a2105200a21030b200541003a00000c020b2008450d152002101d0c150b4100210a41012102410021030b02400240200141286a28020028020820092002200310102205417e460d0020050d0e2002450d15200141206a41003602002001412c6a2802002205290308220b210c02402006500d004101210e2006210c200b2006540d130b2005200b200c7d3703082005290310210b20044198016a41186a200541186a2903003703002004200c3703a0012004200c370398012004200b3703a801200441b8016a20012802002802182010200f20044198016a200441386a20022003102f4101210e20042d00b8014101470d01200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200541086a220320044198016a41086a29030020032903007c37030020042004290378370358200a0d130c140b200a450d142002101d0c140b200441f8006a41186a2203200441d1016a290000370300200441f8006a41106a220e200441c9016a290000370300200441f8006a41086a2208200441c1016a290000370300200420042900b901370378200441d8006a41086a22072008290300370300200441d8006a41106a2208200e290300370300200441d8006a41186a220e2003290300370300200541086a220320044198016a41086a29030020032903007c37030020042004290378370358200441b8016a41186a200e290300370300200441b8016a41106a2008290300370300200441b8016a41086a2007290300370300200420042903583703b8010240024002402001411c6a2802002205200141206a28020022036b41204f0d00200341206a220e2003490d0b20054101742203200e200e2003491b22034100480d0b2005450d01200141186a28020020052003101e2205450d020c110b200141186a28020021050c110b2003101f22050d0f0b200341011020000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b4198afc400102c000b1021000b200241011020000b4198afc400102c000b200841011020000b4198afc400102c000b200a41011020000b2001411c6a2003360200200141186a2005360200200141206a28020021030b200141206a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210e0b200a450d010b2002101d0b200041003602002000200e360204200441e0016a24000f0b20004105360200200441e0016a24000bd30403027f027e057f230041106b22042400024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903184200200241146a2802002202ad420010d203200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b37030820030d09200128020c21032001410036020c2003450d02200141106a29020022074280808080105a0d03024002400240024020022007422088a722084d0d002007a7220920086b200220086b220a4f0d012008200a6a220b2008490d082009410174220c200b200b200c491b220b4100480d082009450d0220032009200b101e2203450d030c090b2002200820022008491b21020c0b0b2003200822096a210b200a4102490d090c080b200b101f22030d060b200b41011020000b41e8dac00041f403103a000b41e8dac00041f403103a000b41dcdec00041fd00103a000b41d0cfc200102c000b1021000b20074220882106200bad210720032006a722096a210b200a4102490d010b200b410020022008417f7322086a10cd031a2003200920026a20086a22096a210b0b200b41003a0000200941016a21020b0240200128022828020820052003200210102208417e460d0020080d022007a72108024020012802302205450d00200141346a280200450d002005101d0b200141386a2002360200200141346a2008360200200141306a20033602000c010b2007a7450d002003101d0b20004105360200200441106a24000f0b4198afc400102c000b900101027f2001280200210402404120101f2205450d002005200429001c370000200541186a200441346a290000370000200541106a2004412c6a290000370000200541086a200441246a29000037000002402001411c6a2204280200450d00200141186a280200101d0b20004104360200200442a08080808004370200200141186a20053602000f0b412041011020000b960101027f2001280200280218210402404120101f2205450d002005200429004c370000200541186a200441e4006a290000370000200541106a200441dc006a290000370000200541086a200441d4006a29000037000002402001411c6a2204280200450d00200141186a280200101d0b20004104360200200442a08080808004370200200141186a20053602000f0b412041011020000b7703017f027e017f200128022c220441186a29030021052004290310210602404110101f2204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a280200101d0b20004104360200200742908080808002370200200141186a20043602000f0b411041011020000b6202017e027f200128022c290308210402404108101f2205450d002005200437000002402001411c6a2206280200450d00200141186a280200101d0b20004104360200200642888080808001370200200141186a20053602000f0b410841011020000bab03020b7f027e230041106b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220b41086a210c200b2f0106220a41057421064100210d0240024003402006450d012007200c412010d003220e450d02200641606a2106200d41016a210d200c41206a210c200e417f4a0d000b200d417f6a210a0b2009450d022009417f6a2109200b200a4102746a4180096a21060c010b0b200b41e8026a200d41c8006c6a2206450d002006280200450d00200641106a290300210f200641086a29030021100c010b20042005411c6a2802002007200541206a280200280214110100200441086a290300210f200528020c2108200429030021100b2005410c6a2008417f6a3602004110101f2206450d01200620103700002006200f37000802402001411c6a220c280200450d00200141186a280200101d0b20004104360200200c42908080808002370200200141186a2006360200200441106a24000f0b103f000b411041011020000b7703017f027e017f2001280200220441086a29030021052004290300210602404110101f2204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a280200101d0b20004104360200200742908080808002370200200141186a20043602000f0b411041011020000b930101027f2001280200210402404120101f2205450d002005200429003c370000200541186a200441d4006a290000370000200541106a200441cc006a290000370000200541086a200441c4006a29000037000002402001411c6a2204280200450d00200141186a280200101d0b20004104360200200442a08080808004370200200141186a20053602000f0b412041011020000b6202017e027f2001280200290310210402404108101f2205450d002005200437000002402001411c6a2206280200450d00200141186a280200101d0b20004104360200200642888080808001370200200141186a20053602000f0b410841011020000bd70a04027f027e027f047e23004180036b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802242903304200200241146a2802002202ad420010d203200128022c2203420020032903082206427f200429032820042903304200521b7d220720072006562007507222031b37030820030d0a024002402002450d0020024100480d052002101f2203450d062003210841002109024020024102490d00200341002002417f6a220910cd0320096a21080b200841003a0000200941016a21090c010b4100210241012103410021090b02400240200128022828020820052003200910102205417e460d0020050d042003450d0c2004200936029c01200420033602980120044180026a20044198016a10b7012004280280022205410f470d010b2002450d0b2003101d0c0b0b200441a0016a20044180026a41047241dc0010ce031a20042005360238200441386a410472200441a0016a41dc0010ce031a02402002450d002003101d0b20044100360288022004420137038002200441386a20044180026a10b20120042802880221030240200428028402450d00200428028002101d0b4200210720044180026a41086a22024200370300200442003703800241eaf3c100411b20044180026a1001200441a0016a41086a2205200229030037030020042004290380023703a00102400240200441a0016a411041f8b3c200410041001002417f460d0020044200370388022004420037038002200441a0016a411020044180026a4110410010022209417f460d072009410f4d0d0720044188026a2903002106200429038002210a0c010b4200210a420021060b2002420037030020044200370380024185f4c100411b20044180026a10012005200229030037030020042004290380023703a00102400240200441a0016a411041f8b3c200410041001002417f460d0020044200370388022004420037038002200441a0016a411020044180026a4110410010022202417f460d082002410f4d0d0820044188026a290300210b20042903800221070c010b4200210b0b2001412c6a2802002202290310220c200241186a290300220d844200510d07200441186a2007200b2003ad420010d203200441086a20042903182207200a7c220a200441186a41086a29030020067c200a200754ad7c200c200d10d103200242002002290308220620042903087d220720072006562007507222031b37030802402003450d00200441386a103c0c0b0b20012802002102200441a0016a200441386a41e00010ce031a20044198026a2002280218220241e4006a29000037030020044190026a200241dc006a29000037030020044180026a41086a200241d4006a2900003703002004200229004c37038002200441a0026a200441a0016a41e00010ce031a2002413c6a22032802002201200241386a280200470d09200141016a22052001490d0320014101742209200520052009491b2205ad4207862207422088a70d032007a722094100480d03024002402001450d00200241346a28020020014107742009101e2201450d010c0a0b2009101f22010d090b200941081020000b41e8dac00041f403103a000b41e8dac00041f403103a000b4198afc400102c000b1021000b200241011020000b41df88c0004133103a000b41df88c0004133103a000b4180dac300102c000b200241386a2005360200200241346a20013602002002413c6a28020021010b200241346a28020020014107746a20044180026a41800110ce031a2003200328020041016a360200410421020c010b410521020b2000200236020020044180036a24000b1600200041003602002000200141086a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141086a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128022429033842002005ad420010d203200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510112202417e460d0020020d04410421030b20002003360200200441106a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41b0afc400102c000b1600200041003602002000200141206a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141206a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021821082004200128022429033842002005ad420010d203200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510112202417e460d0020020d04410421030b20002003360200200441106a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41b0afc400102c000ba60703037f037e057f230041f0006b220424000240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441106a200128022422032903204200200241146a2802002206ad2207420010d203200128022c2102427f2108024020042903184200520d00427f2004290310220820032903287c220920092008541b21080b200242002002290308220920087d220820082009562008507222031b37030841052102024020030d002004200141246a28020029033042002007420010d2032001412c6a2802002203420020032903082209427f200429030020042903084200521b7d220820082009562008507222031b37030820030d00024002402006450d0020064100480d052006101f2203450d074101210a2003210b024020064102490d00200341002006417f6a220a10cd03200a6a210b2006210a0b200b41003a00000c010b4100210a41012103420021070b0240024002400240200128022828020820052003200a10102206417e460d0020060d082003450d04200441d0006a41186a22052001280200280218220241e4006a290000370300200441d0006a41106a220b200241dc006a290000370300200441d0006a41086a220c200241d4006a2900003703002004200229004c370350200241306a220628020022012002412c6a280200470d03200141016a220d2001490d072001410174220e200d200d200e491b220dad42d8007e2208422088a70d072008a7220e4100480d072001450d01200241286a280200200141d8006c200e101e22010d020c0a0b2007500d032003101d0c030b200e101f2201450d080b2002412c6a200d360200200241286a2001360200200241306a28020021010b200241286a280200200141d8006c6a22022004290350370001200241053a0000200220042f004d3b002120022007200aad422086843700282002200336002420022004290320370330200241096a200c290300370000200241116a200b290300370000200241196a2005290300370000200241236a200441cf006a2d00003a0000200241d0006a200441c0006a290300370300200241c8006a200441206a41186a290300370300200241c0006a200441206a41106a290300370300200241386a200441206a41086a2903003703002006200628020041016a360200410421020b20002002360200200441f0006a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b1021000b4198afc400102c000b200641011020000b200e41081020000bba0603027f017e087f230041d0006b220424002004200136021c2004200041f8b3c20020011b360218200441106a200441186a10b50102400240024002400240024002402004280210450d000240024002400240024020042802142205ad2206421c88a70d002006420486a72201417f4c0d00024002402001450d002001101f2207450d032005450d010c040b4108210720050d030b410021014100210b2007450d050c030b102e000b200141081020000b200441306a4104722108410021094100210a410021002005210b0340200441306a200441186a107a200441c0006a41086a220c200841086a280200360200200420082902003703402004280230220d4104460d02200041016a2101200441206a41086a220e200c2802003602002004200429034037032002402000200b470d002009200120012009491b220bad4204862206422088a70d052006a7220c4100480d0502402000450d002007200a200c101e22070d010c070b200c101f2207450d060b2007200a6a2200200d3602002000410c6a200e280200360200200041046a2004290320370200200941026a2109200a41106a210a2001210020012005490d000b2007450d020b200420013602282004200b36022420042007360220200441086a200441206a1044200441306a20022004280208200428020c20031102002004410036024820044201370340200428023021004101101f21010240024020004105470d002001450d06200141013a0000200442818080801037024420042001360240420121060c010b2001450d06200141003a0000200442818080801037024420042001360240200141014102101e2101024020004104470d002001450d08200141003a0001200442828080802037024420042001360240420221060c010b2001450d08200141013a0001200442828080802037024420042001360240200441306a200441c0006a10d101200441c8006a3502002106200428024021010b2001ad422086200684210602402004280224450d002004280220101d0b200441d0006a240020060f0b200b450d002007101d0b41ffbac00041f000103a000b1021000b200c41081020000b410141011020000b410141011020000b410241011020000b410241011020000b0700200010c0030bcb0401057f230041106b22022400200241003a0008200241086a2001280200220320012802042204410047220510ce031a024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002402004450d0020022d0008417f6a220441034b0d04024020040e0400030204000b20024100360208200241086a20052006410420064104491b220410ce031a200141046a200620046b3602002001200520046a360200200641034d0d052000200228020836020420004100360200200241106a24000f0b20004104360200200241106a24000f0b20024100360208200241086a20052006410420064104491b220410ce031a200141046a200620046b3602002001200520046a360200200641034d0d042000200228020836020420004102360200200241106a24000f0b20024200370308200241086a20052006410820064108491b220410ce031a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004101360200200241106a24000f0b20024200370308200241086a20052006410820064108491b220410ce031a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004103360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20052004102a000bb10201027f200128023021030240024002400240200241ff017122024103470d0020030d0320004100360200200128020c22000d010c020b200141346a2802002104024020024102470d002003450d00200141386a2802002102200041013602002000410c6a2002360200200041086a2004360200200041046a2003360200200128020c22000d010c020b20004102360200200041086a4110360200200041046a4180d9c00036020002402003450d002004450d002003101d0b200128020c2200450d010b200141106a280200450d002000101d0b02402001411c6a280200450d002001280218101d0b200128022822012001280200417f6a22003602000240024020000d002001280208100520012001280204417f6a22003602042000450d010b0f0b2001101d0f0b41908ec300102c000b0a0041a0d0c200102c000ba50201027f230041306b2202240020024106360214200241df8ac00036021020022001200241106a107e0240024002400240200228020022012002280208220341f8b3c200410041001002417f460d00200241286a4200370300200241206a4200370300200241186a42003703002002420037031020012003200241106a4120410010022203417f460d012003411f4d0d0120002002290310370000200041186a200241106a41186a290300370000200041106a200241106a41106a290300370000200041086a200241106a41086a2903003700002002280204450d030c020b20004200370000200041186a4200370000200041106a4200370000200041086a420037000020022802040d010c020b41df88c0004133103a000b2001101d0b200241306a24000bb30101037f024002400240024020022802042203417f4c0d00200228020021044101210202402003450d002003101f2202450d030b20022004200310ce03210520034101742204200341046a220220022004491b22044100480d01024002402003450d00200520032004101e2205450d010c050b2004101f22050d040b200441011020000b102e000b1021000b200341011020000b200020023602082000200436020420002005360200200520036a20013600000bcd0f02077f017e230041106b22022400200241003602082002420137030002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220341034b0d00024020030e0400040203000b200128020421014101101f2203450d1120024101360204200241086a22042004280200220541016a36020020022003360200200320056a41023a000020022802042205200428020022036b41204f0d06200341206a22042003490d1c20054101742203200420042003491b22034100480d1c2005450d0c200228020020052003101e2204450d0d0c1f0b200141086a2802002103200128020421014101101f2204450d11200241086a22052005280200220541016a3602002002410136020420022004360200200420056a41013a00002002200336020c2002410c6a200210622003450d2020034105742106200241086a220728020021042002280204210503400240024002400240200520046b41204f0d00200441206a22032004490d2020054101742204200320032004491b22044100480d202005450d01200228020020052004101e22080d020c140b20022802002108200421030c020b2004101f2208450d120b200220043602042002200836020020072802002103200421050b2007200341206a2204360200200820036a220341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a29000037000020032001290000370000200141206a2101200641606a22060d000c210b0b2001410c6a2802002103200141086a2802002108200128020421064101101f2201450d1120024101360204200241086a22042004280200220541016a36020020022001360200200120056a41043a000020022802042205200428020022016b41044f0d02200141046a22042001490d1a20054101742201200420042001491b22014100480d1a2005450d06200228020020052001101e2204450d070c180b200141086a2802002103200128020421084101101f2201450d1120024101360204200241086a22042004280200220541016a36020020022001360200200120056a41003a00002002200336020c2002410c6a2002106220022802042205200428020022016b20034f0d02200120036a22042001490d1920054101742201200420042001491b22014100480d192005450d07200228020020052001101e2204450d080c150b200141086a2802002103200128020421054101101f2201450d1120024101360204200241086a22042004280200220841016a36020020022001360200200120086a41033a00002005290300210920022802042205200428020022016b41084f0d03200141086a22042001490d1820054101742201200420042001491b22014100480d182005450d0a200228020020052001101e2204450d0b0c120b200228020021040c160b200228020021040c130b200228020021040c190b200228020021040c0f0b2001101f22040d110b200141011020000b2001101f22040d0d0b200141011020000b2003101f22040d120b200341011020000b2001101f22040d070b200141011020000b200441011020000b410141011020000b410141011020000b410141011020000b410141011020000b410141011020000b2002200136020420022004360200200241086a28020021010b200241086a2205200141086a360200200420016a20093700000240024002400240024020022802042204200528020022016b41c0004f0d00200141c0006a22052001490d0920044101742201200520052001491b22014100480d092004450d01200228020020042001101e2204450d020c030b200228020021040c030b2001101f22040d010b200141011020000b2002200136020420022004360200200241086a28020021010b200241086a200141c0006a360200200420016a220141086a200341086a290000370000200141106a200341106a290000370000200141186a200341186a290000370000200141206a200341206a290000370000200141286a200341286a290000370000200141306a200341306a290000370000200141386a200341386a290000370000200120032900003700000c090b2002200136020420022004360200200241086a28020021010b200241086a200120036a360200200420016a2008200310ce031a0c070b2002200136020420022004360200200241086a28020021010b200241086a2205200141046a360200200420016a20062800003600002002200336020c2002410c6a2002106202400240024020022802042204200528020022016b20034f0d00200120036a22052001490d0320044101742201200520052001491b22014100480d032004450d01200228020020042001101e2204450d020c040b200228020021040c040b2001101f22040d020b200141011020000b1021000b2002200136020420022004360200200241086a28020021010b200241086a200120036a360200200420016a2008200310ce031a0c020b2002200336020420022004360200200241086a28020021030b200241086a200341206a360200200420036a220341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a290000370000200320012900003700000b20002002290300370200200041086a200241086a280200360200200241106a24000be30203047f017e017f230041306b220124002001410636020c200141df8ac000360208200141106a41a68ec100200141086a108101410021020240024002400240200128021022032001280218220441f8b3c200410041001002417f460d002001410036020820032004200141086a41044100100241016a41044d0d01200128020821020b02402001280214450d002003101d0b024002402002450d002002ad4205862205422088a70d032005a722034100480d032003101f2206450d0441002104200621030340200141106a2004107d200341186a200141106a41186a290000370000200341106a200141106a41106a290000370000200341086a200141106a41086a29000037000020032001290010370000200341206a21032002200441016a2204470d000c020b0b410121060b200020023602082000200236020420002006360200200141306a24000f0b41df88c0004133103a000b1021000b200341011020000bc80101037f024002400240024020022802042203417f4c0d00200228020021044101210202402003450d002003101f2202450d030b20022004200310ce03210520034101742204200341036a220220022004491b22044100480d01024002402003450d00200520032004101e2205450d010c050b2004101f22050d040b200441011020000b102e000b1021000b200341011020000b200020023602082000200436020420002005360200200520036a220320012f00003b0000200341026a200141026a2d00003a00000bcf0703057f017e057f230041c0006b22012400200141206a41086a2202420037030020014200370320419590c000411d200141206a1001200141086a20022903003703002001200129032037030002400240024002400240024002402001411041f8b3c200410041001002417f460d002001421037021420012001360210200141206a200141106a105e20012802202202450d0102402001280224450d002002101d0b20002802002202450d06200041046a280200450d062002101d200141c0006a24000f0b024002400240024020002802002203450d00200041086a2802002104200028020421050c010b20014106360204200141df8ac000360200200141206a41a68ec1002001108101410021040240200128022022002001280228220241f8b3c200410041001002417f460d002001410036020020002002200141044100100241016a41044d0d05200128020021040b02402001280224450d002000101d0b02402004450d002004ad4205862206422088a70d022006a722004100480d022000101f2203450d0641002102200321000340200141206a2002107d200041186a200141206a41186a290000370000200041106a200141206a41106a290000370000200041086a200141206a41086a29000037000020002001290020370000200041206a21002004200241016a2202470d000b200421050c010b4101210341002104410021050b200141206a41086a2200420037030020014200370320419590c000411d200141206a1001200141086a200029030037030020012001290320370300200141003602282001420137032020012004360210200141106a200141206a106202402004450d00200441057421074100200028020022026b2108200128022021092001280224210a2003210003400240200a20086a411f4b0d00200241206a22042002490d03200a410174220b20042004200b491b22044100480d0302400240200a450d002009200a2004101e22090d010c060b2004101f2209450d050b2004210a0b200920026a22042000290000370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a290000370000200841606a2108200241206a2102200041206a2100200741606a22070d000b200141286a20023602002001200a3602242001200936022020014110200920021003200a450d070c060b2001280224210220014110200128022022092000280200100320020d050c060b1021000b200441011020000b41df88c0004133103a000b41df88c0004133103a000b200041011020000b2009101d0b2005450d002003101d0b200141c0006a24000b130020004107360204200041d8d1c2003602000b130020004109360204200041d893c0003602000b130020004101360204200041ccd5c2003602000b8e1605017f017e037f017e067f23004180066b22042400200441b8036a200141e80110ce031a200441a0026a200441b8036a10870102400240024020042802a0024101470d00200041086a20042902a4023702002000420137020020032802002200450d020c010b200441a0026a41086a290300210520044198016a200441a0026a41106a41880110ce031a20042005370308200441086a41086a20044198016a41880110ce03210620044198016a41086a22014200370300200442003703980141b2b4c000411720044198016a1001200441b8036a41086a200129030037030020042004290398013703b80341002101024002400240024002400240024002400240024002400240024002400240200441b8036a411041f8b3c200410041001002417f460d00200441003602a002200441b8036a4110200441a0026a41044100100241016a41044d0d0120042802a00221010b41042107200120026a41808080024b0d0d410021080240200441106a410020042903084201511b2201450d002001450d000240024002402001108801220520012903202209520d0041032107200120021089010d114113101f2207450d0d2007410f6a41002800c1ba40360000200741086a41002900baba40370000200741002900b2ba40370000200741134133101e2207450d0e200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a29000037000020044198016a41086a220a420037030020044200370398012007413320044198016a1001200441b8036a41086a200a29030037030020042004290398013703b803200441b8036a411041f8b3c200410041001002417f460d01200442003703a002200441b8036a4110200441a0026a41084100100241016a41084d0d0820042903a00242017c21052007101d4113210a4113101f22070d020c0f0b4101410220092005541b21070c100b420121052007101d4113210a4113101f2207450d0d0b2007410f6a41002800c1ba40360000200741086a41002900baba40370000200741002900b2ba403700002007200a4133101e2207450d0d200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a29000037000020044198016a41086a2201420037030020044200370398012007413320044198016a1001200441b8036a41086a200129030037030020042004290398013703b803200420053703a002200441b8036a4110200441a0026a410810032007101d0b024020032802002207450d00200341086a28020021012003280204210b4100210c0240419bb5c000411041f8b3c200410041001002417f460d00200441003602b803419bb5c0004110200441b8036a41044100100241016a41044d0d0520042802b803210c0b4114101f2208450d06200841106a41002800b4b640360000200841086a41002900acb640370000200841002900a4b640370000200841144128101e220a450d07200a200c36001420044198016a41086a220842003703002004420037039801200a411820044198016a1001200441b8036a41086a200829030037030020042004290398013703b803200441003602a802200442013703a002200420013602980120044198016a200441a0026a1062024002400240024020042802a402220d20042802a802220c6b20014f0d00200c20016a2208200c490d0c200d410174220e20082008200e491b220e4100480d0c200d450d0120042802a002200d200e101e22080d020c0d0b20042802a00221080c020b200e101f2208450d0b0b2004200e3602a402200420083602a002200e210d0b2008200c6a2007200110ce031a200441b8036a41102008200c20016a10030240200d450d002008101d0b200a101d41012108200b450d002007101d0b20042903082105200441b8036a200441306a41e80010ce031a200441a0026a200441b8036a41086a41e00010ce031a20044198016a41186a220a200641186a29030037030020044198016a41106a220c200641106a29030037030020044198016a41086a220d200641086a290300370300200420062903003703980141002101024020054201520d00200441c0056a41186a200a290300370300200441c0056a41106a200c290300370300200441c0056a41086a200d29030037030020042004290398013703c005410121010b20044198016a200441a0026a41e00010ce031a200441e0056a41186a2206200441c0056a41186a220a290300370300200441e0056a41106a220c200441c0056a41106a220d290300370300200441e0056a41086a220b200441c0056a41086a220e290300370300200420042903c0053703e005200441a0026a20044198016a41e00010ce031a200441a0056a41186a220f2006290300370300200441a0056a41106a2206200c290300370300200441a0056a41086a220c200b290300370300200420042903e0053703a005200441b8036a200441a0026a41e00010ce031a200a200f290300370300200d2006290300370300200e200c290300370300200420042903a0053703c0054102210602402001450d00200441e0056a41186a200441c0056a41186a290300370300200441e0056a41106a200441c0056a41106a290300370300200441e0056a41086a200441c0056a41086a290300370300200420042903c0053703e005410121060b200441a2016a200441e0056a41086a290300370100200441aa016a200441e0056a41106a290300370100200441b2016a200441f8056a290300370100200420063a009901200441003a009801200420042903e00537019a012004200441b8036a20044198016a108a012004280204210620042802002101200441003a00b803200420014100473a00b903200441b8036a108b0102400240419bb5c000411041f8b3c200410041001002417f460d00200441003602b803419bb5c0004110200441b8036a41044100100241016a41044d0d0320042802b80341016a210a0c010b4101210a0b20044198016a41086a220c4200370300200442003703980141b2b4c000411720044198016a1001200441b8036a41086a200c29030037030020042004290398013703b80302400240200441b8036a411041f8b3c200410041001002417f460d002004410036029801200441b8036a411020044198016a41044100100241016a41044d0d04200428029801210c0c010b4100210c0b2004200a3602b803419bb5c0004110200441b8036a4104100320044198016a41086a220a4200370300200442003703980141b2b4c000411720044198016a1001200441b8036a41086a200a29030037030020042004290398013703b8032004417f2002200c6a220a200a2002491b36029801200441b8036a411020044198016a410410030240024002402001450d0002402006411b470d00200141ebbec100460d02200141ebbec100411b10d003450d020b20002001360204200041086a200636020020004100360200200745200872450d020c120b20004100360204200041086a200636020020004100360200200745200872450d010c110b20004104360204200041013602002007452008720d100b200341046a280200450d0f2007101d0c0f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411441011020000b412841011020000b1021000b200e41011020000b411341011020000b413341011020000b200a41011020000b413341011020000b2000410136020020002007360204200441386a108c0120032802002200450d010b200341046a280200450d002000101d20044180066a24000f0b20044180066a24000beb1607017f027e037f017e017f037e047f23004180046b2202240002400240200129037022034202520d00200241086a20014188016a41e00010ce031a420021030c010b20024186016a2001410b6a2d00003a0000200241e8006a41086a2001411c6a290200370300200241e8006a410d6a200141216a290000370000200220012f00093b018401200220012902143703682001410c6a280200210520012d0008210620012802102107200241c0016a200141e4006a290000370300200241b8016a200141dc006a290000370300200241b0016a200141d4006a290000370300200241a8016a200141cc006a290000370300200241a0016a200141c4006a29000037030020024188016a41106a2001413c6a29000037030020024188016a41086a200141346a2900003703002002200129002c3703880120012903002108200241c8016a41106a200141f0006a220941106a290300370300200241c8016a41086a200941086a290300370300200220092903003703c80120014180016a290300210a2001290378210b4200210c200241a8026a41086a22094200370300200242003703a802418cb9c000410d200241a8026a1001200241086a41086a2009290300370300200220022903a80237030842002104024002400240024002400240024002400240024002400240200241086a411041f8b3c200410041001002417f460d00200242003703a802200241086a4110200241a8026a41084100100241016a41084d0d0120022903a80221040b024020034201520d00200b500d022004200a200a2004541b22032003200a7d200b827d210c0b200241a8026a200c10af01200241fc016a41026a20022d00aa023a0000200241086a41086a2209200241bb026a290000370300200241086a410d6a220d200241c0026a290000370000200220022f01a8023b01fc01200220022900b30237030820022800ab02210e20022800af02210f200241e0016a410d6a200d290000370000200241e0016a41086a2009290300370300200220022903083703e001200241ec036a41026a220920024184016a41026a2d00003a0000200241a8026a41086a220d200241e8006a41086a290300370300200241a8026a410d6a2210200241e8006a410d6a290000370000200220022f0184013b01ec03200220022903683703a8020240024002400240024002400240200641ff01714101470d00200241f0036a200541067610b00120022802f003210920022802f8032005413f7122054d0d01200241e8036a41026a200920054105746a220541026a2d00003a0000200241d0036a200541136a290000370300200241d5036a200541186a290000370000200220052f00003b01e8032002200529000b3703c80320052800072107200528000321054101210620022802f4030d020c030b200241e8036a41026a20092d00003a0000200241c8036a41086a200d290300370300200241c8036a410d6a2010290000370000200220022f01ec033b01e803200220022903a8023703c8030c030b4100210620022802f403450d010b2009101d0b2006450d010b200241f0036a41026a200241e8036a41026a2d00003a0000200241a8026a41086a200241c8036a41086a290300370300200241a8026a410d6a200241c8036a410d6a290000370000200220022f01e8033b01f003200220022903c8033703a802410021090c010b410121094115210741d7c0c10021050b200241a4026a41026a2206200241f0036a41026a2d00003a0000200241086a41086a220d200241a8026a41086a2210290300370300200241086a41106a200241a8026a41106a290300370300200220022f01f0033b01a402200220022903a80237030802402009450d002000200536020420004101360200200041086a200736020020014188016a108c0120024180046a24000f0b20024193026a200d29030037000020024198026a200241086a410d6a290000370000200220022f01a4023b018002200220073600870220022005360083022002200229030837008b02200220062d00003a008202200220083703a802201020014188016a41e00010ce03210d200241af036a200f360000200241ab036a200e360000200241a0036a200241c8016a41106a29030037030020024198036a2201200241c8016a41086a290300370300200241aa036a200241fc016a41026a2d00003a0000200241b3036a20022903e001370000200241bb036a200241e0016a41086a290300370000200241c0036a200241e0016a410d6a290000370000200220022903c80137039003200220022f01fc013b01a8032002410036021020024201370308200241a8026a200241086a10b101200d200241086a10b2010240024002400240024002402002290390034201520d0020012903002203420c882204420120044201561b22044200510d08200241a0036a2903002004802104200228020c2205200241106a28020022016b41024f0d01200141026a22092001490d0e20054101742201200920092001491b22014100480d0e2005450d04200228020820052001101e2205450d050c0b0b0240200228020c200241106a2802002201470d00200141016a22052001490d0e20014101742209200520052009491b22094100480d0e2001450d02200228020820012009101e2205450d030c090b200228020821050c090b200228020821050c0a0b2009101f22050d060b200941011020000b2001101f22050d060b200141011020000b41df88c0004133103a000b41c8b0c400102c000b41a88ec300102c000b2002200936020c20022005360208200241106a28020021010b200241106a200141016a360200200520016a41003a00000c020b2002200136020c20022005360208200241106a28020021010b200241106a200141026a360200200520016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b024002400240200228020c2206200241106a28020022016b41204f0d00200141206a22052001490d0320064101742201200520052001491b22094100480d032006450d01200228020820062009101e2205450d020c040b200228020821050c040b2009101f22050d020b200941011020000b1021000b2002200936020c20022005360208200241106a2802002101200921060b200520016a2209200241a8036a2207290000370000200941186a200741186a290000370000200941106a200741106a290000370000200941086a200741086a2900003700000240024002400240200141206a2201418102490d00200241086a41186a22094200370300200241086a41106a22074200370300200241086a41086a220e42003703002002420037030820052001200241086a1000200241c8036a41186a2009290300370300200241c8036a41106a2007290300370300200241c8036a41086a200e290300370300200220022903083703c803200241c8036a412020024188016a20024180026a100b450d01200241c8036a412020024188016a20024180026a100c45210120060d020c030b2005200120024188016a20024180026a100b450d002005200120024188016a20024180026a100c45210120060d010c020b410121012006450d010b2005101d0b02402001450d00200241c8036a41186a20024180026a41186a290300370300200241c8036a41106a20024180026a41106a290300370300200241c8036a41086a20024180026a41086a29030037030020022002290380023703c80320022903a8022104200241086a200d41e00010ce031a420121030c010b200041d998c00036020420004101360200200041086a411a360200200d108c0120024180046a24000f0b200041086a2003370300200041306a2004370300200041106a20022903c803370300200041186a200241c8036a41086a290300370300200041206a200241c8036a41106a290300370300200041286a200241c8036a41186a290300370300200041386a200241086a41e00010ce031a2000410036020020024180046a24000bb00202027f017e230041206b22012400024002404113101f2202450d002002410f6a41002800c1ba40360000200241086a41002900baba40370000200241002900b2ba40370000200241134133101e2202450d01200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a29000037000042002103200141106a41086a220042003703002001420037031020024133200141106a1001200141086a200029030037030020012001290310370300024002402001411041f8b3c200410041001002417f460d002001420037031020014110200141106a41084100100241016a41084d0d01200129031021030b2002101d200141206a240020030f0b41df88c0004133103a000b411341011020000b413341011020000b9e0604017f017e037f047e230041c0006b2202240042002103200241186a41086a220442003703002002420037031841dfb9c000411b200241186a1001200241306a41086a220520042903003703002002200229031837033002400240024002400240200241306a411041f8b3c200410041001002417f460d002002420037032020024200370318200241306a4110200241186a4110410010022206417f460d022006410f4d0d02200241206a2903002107200229031821080c010b42002108420021070b200442003703002002420037031841fab9c000411b200241186a1001200520042903003703002002200229031837033002400240200241306a411041f8b3c200410041001002417f460d002002420037032020024200370318200241306a4110200241186a4110410010022204417f460d032004410f4d0d03200241206a2903002109200229031821030c010b420021090b4200210a200241086a200320092001ad420010d203200241186a20002002290308220320087c2208200241086a41086a29030020077c2008200354ad7c410110f001024020022802184101470d00200228021c2104200241c0006a240020040f0b200241186a41106a2903002108200241186a41086a22042903002107200442003703002002420037031841aeb9c0004116200241186a1001200241306a41086a20042903003703002002200229031837033002400240200241306a411041f8b3c200410041001002417f460d002002420037032020024200370318200241306a4110200241186a4110410010022204417f460d042004410f4d0d04200241206a29030021032002290318210a0c010b420021030b200241186a41086a220442003703002002420037031841aeb9c0004116200241186a1001200241306a41086a20042903003703002002200229031837033020024200200320087d200a200754ad7d2208200a20077d2207200a56200820035620082003511b22041b37032020024200200720041b370318200241306a4110200241186a41101003200241c0006a240041000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000bf78a0109027f017e087f017e037f037e037f0b7e077f23004190086b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2204410d4b0d00024002400240024002400240024020040e0e004805090d0c0608040b030a0102000b20034188076a41086a200141106a2903003703002003200141086a2903002205370388072005a7417f6a220441064b0d49200241096a2800002106200241056a280000210720022d0001210820022d00002102024020040e070018161715191a000b20034190076a2802002109200328028c07210a200241ff0171450d2f41f1b4c0002104412a2108410021064101210b2009450d750c740b200341dc016a41026a2001410b6a2d00003a0000200341c0016a41086a200141c0006a290300370300200341c0016a41106a200141c8006a290300370300200320012f00093b01dc012003200141386a2903003703c0012001410c6a280200210c200141106a280200210d200141146a280200210b200141186a2903002105200141206a290300210e200141286a280200210a2001412c6a280200210f200141306a2802002110200141346a2802002111200141086a2d00002106200141d8006a2903002112200141d0006a2903002113200341fc016a41026a200241046a2d00003a0000200341e0016a41086a200241156a290000370300200341e0016a410d6a2002411a6a2900003700002003200241026a2f01003b01fc0120032002410d6a2900003703e0012006417f6a220741034b0d49200241096a2800002108200241056a280000210420022d0001210920022d00002102024020070e0400131112000b200920027241ff0171450d2541c9b4c0002104412821080c6e0b20034190036a41206a200141246a29020037030020034190036a41186a2001411c6a29020037030020034190036a41106a200141146a29020037030020034190036a41086a2001410c6a290200370300200320012902043703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341b8016a20034190036a20034188076a10c70220032802bc01210820032802b801210441002107410121064101210b410121094101210a4101210d4101210c410121104101211120012802002202410d4d0d7d0c7e0b200141086a28020021072001280204210b20022d00000d0a4101210620022d00014101470d0a200241096a280000210802402007450d00200b101d0b410021104101210b410121094101210a4101210d4101210c41012111410121074100210420012802002202410d4d0d7c0c7d0b20034190036a41206a200141246a29020037030020034190036a41186a2001411c6a29020037030020034190036a41106a200141146a29020037030020034190036a41086a2001410c6a290200370300200320012902043703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341286a20034190036a20034188076a10a603200328022c2108200328022821044100210c410121064101210b410121094101210a4101210d0c780b20034190036a200141086a41c80010ce031a20034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200320034190036a20034188076a10f40120032802042108200328020021040c190b20034190036a41386a200141c0006a29030037030020034190036a41306a200141386a29030037030020034190036a41286a200141306a29030037030020034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341186a20034190036a20034188076a108e02200328021c2108200328021821044100210a410121064101210b410121090c740b200141086a29030020022d000020022d000110c8022104412d21080c170b20034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341206a20034190036a20034188076a10cc0220032802242108200328022021044100210d410121064101210b410121094101210a0c730b20034180026a41046a22092001410e6a2f01003b0100200341a8066a41086a220a200141206a290300370300200341a8066a41106a220d200141286a2903003703002003200128010a360280022003200141186a2903003703a806200141106a2903002105200141086a2d0000210420012d0009210b200341b0056a41086a220c200241156a290000370300200341b0056a410d6a22102002411a6a29000037000020032002410d6a2900003703b00520022d0001210720022d0000210620044101460d0720044102460d0520044103470d42200720067241ff01710d062003200b3a009003200341f0026a41086a22024200370300200342003703f00241e9a4c1004119200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002200341a0026a411020034190036a410110030c140b20034190036a41306a200141386a29030037030020034190036a41286a200141306a29030037030020034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341306a20034190036a20034188076a10e20220032802342108200328023021040c140b41f7b5c0002104412d21084101210620022d00000d1420022d000141ff01714102470d14200141086a29030021054200210e200341f0026a41086a22024200370300200342003703f00241878bc0004110200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002200341a0026a411041f8b3c200410041001002417f470d4120024200370300200342003703f002418cb9c000410d200341f0026a100120034190036a41086a2002290300370300200320032903f00237039003024020034190036a411041f8b3c200410041001002417f460d00200342003703880720034190036a411020034188076a41084100100241016a41084d0d3e200329038807210e0b200e2005540d42200341f0026a41086a22024200370300200342003703f00241878bc0004110200341f0026a100120034190036a41086a2002290300370300200320032903f00237039003200320053703880720034190036a411020034188076a41081003410021040c140b20034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341106a20034190036a20034188076a10c901200328021421082003280210210441002109410121064101210b0c6d0b20034190036a41306a200141386a29030037030020034190036a41286a200141306a29030037030020034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341086a20034190036a20034188076a108b03200328020c2108200328020821044100210b410121060c6b0b41f1b4c0002104412a2108410021104101210602402007450d00200b101d0b4101210b410121094101210a4101210d4101210c0c6f0b200720067241ff0171450d0d0b41c9b4c0002104412821080c0e0b200241046a2d00002104200241026a2f01002111200241096a2800002108200241056a280000210f200341d7046a200a290300370000200341df046a200d2d00003a00002003200b3a00c004200320053700c70420032003280280023600c104200320032903a8063700cf04200320092f01003b00c504200341f0056a410d6a2010290000370000200341f0056a41086a200c290300370300200320032903b0053703f0050240200641ff01710d00200341c8026a410d6a2202200341f0056a410d6a290000370000200341c8026a41086a2206200341f0056a41086a290300370300200320032903f0053703c802200741ff01714101470d0020034190036a410d6a200229000037000020034190036a41086a22022006290300370300200320032903c8023703900320034188076a41106a20034190036a41106a220729030037030020034188076a41086a22062002290300370300200320032903900337038807200341d0056a410d6a220b20034188076a410d6a2209290000370000200341d0056a41086a220a200629030037030020032003290388073703d0052009200b2900003700002006200a290300370300200320032903d0053703880720034190036a41186a200341c0046a41186a2903003703002007200341c0046a41106a2903003703002002200341c0046a41086a290300370300200320032903c004370390034112101f2202450d3f200241106a41002f00cca8413b0000200241086a41002900c4a841370000200241002900bca841370000200241124132101e2202450d402002201120044110747222043b0012200220083600192002200f360015200220032903880737001d200241146a20044110763a0000200241256a20034188076a41086a2903003700002002412a6a20034195076a290000370000200341f0026a41086a22044200370300200342003703f00220024132200341f0026a1001200341a0026a41086a2004290300370300200320032903f0023703a0024120101f2204450d412004200329039003370000200441186a20034190036a41186a290300370000200441106a20034190036a41106a290300370000200441086a20034190036a41086a290300370000200341a0026a41102004412010032004101d2002101d410021040c0e0b20034188076a41106a20034190036a41106a29020037030020034188076a41086a20034190036a41086a290200370300200320032902900337038807412a210841f1b4c00021040c0d0b200341d0016a290300211220032903c801211420032802c0012115200341f0056a41086a2207200341e0016a41086a290300370300200341f0056a410d6a2216200341e0016a410d6a2900003700002003200341fe016a2d00003a00a206200320032f01fc013b01a006200320032903e0013703f005200241ff0171450d0e410121020c0f0b200341c0016a41086a290300211220032903c001211420032903d00121132003200a3a009f022003200e370097022003200537008f022003200b36008b022003200d360087022003200c360083022003200341dc016a41026a2d00003a008202200320032f01dc013b018002200341f0056a41086a2207200341e0016a41086a290300370300200341f0056a410d6a220b200341e0016a410d6a2900003700002003200341fc016a41026a2d00003a00a206200320032f01fc013b01a006200320032903e0013703f005200241ff0171450d10410121020c110b200341f0056a41086a2206200341e0016a41086a290300370300200341f0056a410d6a2207200341e0016a410d6a2900003700002003200341fe016a2d00003a00a206200320032f01fc013b01a006200320032903e0013703f005200241ff0171450d13410121020c140b20034190076a2802002104200328028c072107200820027241ff0171450d17410021064101210b02402004450d002007101d0b410121090c060b20034190076a2802002109200328028c07210a200241ff0171450d1741f1b4c0002104412a2108410021074101210b2009450d5c0c5b0b200820027241ff0171450d170c590b41f7b5c000410041f7b5c000200841ff01714102461b200241ff01711b2104412d21084101210b4101210a41012109410121070c5b0b20034194076a280200210620034190076a280200210a200328028c072107200820027241ff0171450d1702402006450d00200641186c21042007210203400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200441686a22040d000b0b410021094101210b200a450d012007101d0c010b20034188076a410c6a280200210620034190076a280200210d200328028c072107200820027241ff0171450d1702402006450d002006410c6c21042007210203400240200241046a280200450d002002280200101d0b2002410c6a2102200441746a22040d000b0b410121094100210b200d450d002007101d0b410121060b200328028807417f6a220241064b0d5441c9b4c000210441282108024020020e07005c1c551e1f1d000b20034190076a280200450d5b200328028c07101d0c5b0b200341f0026a41086a22024200370300200342003703f00241fabac1004119200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a0022003200537039003200341a0026a411020034190036a410810030b410021040b410121060b4101210b0c580b200341d0056a41086a2007290300370300200341d0056a410d6a2016290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d00541012102200941ff01714101470d00200341c2046a20032d009a063a000020034190036a41086a200341d0056a41086a29030037030020034190036a410d6a200341d0056a410d6a290000370000200320032f0198063b01c004200320032903d00537039003410021020c010b412a210841f1b4c00021040b200341a8066a41026a2207200341c0046a41026a2d00003a000020034188076a41086a220920034190036a41086a29030037030020034188076a41106a20034190036a41106a290300370300200320032f01c0043b01a80620032003290390033703880720020d4420034183036a200929030037000020034188036a20034195076a290000370000200320032f01a8063b01f002200320083600f702200320043600f30220032003290388073700fb02200320072d00003a00f202200c41ff01714101470d0720034190036a200d41067610b0012003280290032104200328029803200d413f7122024d0d18200420024105746a22022f0000200241026a2d000041107472210720022d001f2109200228001b210a2002290013210e200229000b2105200228000721082002280003210b41012102200328029403450d420c410b200341d0056a41086a2007290300370300200341d0056a410d6a200b290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d00541012102200941ff01714101470d00200341c2046a20032d009a063a000020034190036a41086a200341d0056a41086a29030037030020034190036a410d6a200341d0056a410d6a290000370000200320032f0198063b01c004200320032903d00537039003410021020c010b412a210841f1b4c00021040b200341a8066a41026a2207200341c0046a41026a2d00003a000020034188076a41086a220b20034190036a41086a29030037030020034188076a41106a20034190036a41106a290300370300200320032f01c0043b01a80620032003290390033703880720020d3b200341b3026a200b290300370000200341a0026a41186a220220034195076a290000370000200320032f01a8063b01a002200320083600a702200320043600a30220032003290388073700ab02200320072d00003a00a20220034190036a200341a0026a201310e902410121172003280290034101470d052003280298032108200328029403210420100d3c0c3d0b20032903d001211420032903c801211820032903c0012119200341f0026a41086a22024200370300200342003703f00241878ec2004118200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002410021020240200341a0026a411041f8b3c200410041001002417f460d002003421037028c072003200341a0026a3602880720034190036a20034188076a10a4032003290390034201520d2c200341a0036a290300211a200341a8036a290300211b200341b0036a290300211c200341b8036a290300211d200341c0036a290300211e200341c8036a290300211f200341d0036a2903002120200341d8036a2802002102200341dc036a290200212120032903980321222003200341e4036a2802003602dc03200320213702d403200320023602d003200320203703c8032003201f3703c0032003201e3703b8032003201d3703b0032003201c3703a8032003201b3703a0032003201a3703980320032022370390030b419f8ec20021044135210820022013a722064f0d4820034190036a410c6a200636020020034190036a41086a220241033a00002003410b3a00900320034190036a108b01200341f0026a41086a22044200370300200342003703f00241878ec2004118200341f0026a100120022004290300370300200320032903f002370390034104101f2202450d2d2002200636000020024104410c101e2202450d2e2002200bad422086200dad843700042002410c4118101e2202450d2f2002200537000c200241184130101e2202450d302002200e37001420022011ad4220862010ad843700242002200fad422086200aad8437001c2002413041e000101e2202450d31200220123e004820022013422088a73600442002201437003c200220183700342002201937002c20034190036a4110200241cc0010032002101d410021040c480b200341d0056a41086a2006290300370300200341d0056a410d6a2007290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d00541012102200941ff01714101470d00200341c2046a20032d009a063a000020034190036a41086a200341d0056a41086a29030037030020034190036a410d6a200341d0056a410d6a290000370000200320032f0198063b01c004200320032903d00537039003410021020c010b412a210841f1b4c00021040b200341c8026a41026a2206200341c0046a41026a2d00003a000020034188076a41086a220720034190036a41086a29030037030020034188076a41106a20034190036a41106a290300370300200320032f01c0043b01c80220032003290390033703880720020d44200341bb066a2007290300370000200341a8066a41186a20034195076a290000370000200320032f01c8023b01a806200320083600af06200320043600ab0620032003290388073700b306200320062d00003a00aa06200341f0026a41086a22024200370300200342003703f00241878ec2004118200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002200341a0026a411041f8b3c200410041001002417f460d0b200342103702c4042003200341a0026a3602c00420034190036a200341c0046a10a4032003290390034201520d24200341a0036a290300210e200341a8036a2903002113200341b0036a2903002112200341b8036a2903002114200341c0036a2903002118200341c8036a2903002119200341d0036a290300211a200341d8036a2802002102200341dc036a2802002104200341e0036a2802002108200329039803211b2003200341e4036a28020022063602dc03200320083602d803200320043602d403200320023602d0032003201a3703c803200320193703c003200320183703b803200320143703b003200320123703a803200320133703a0032003200e370398032003201b37039003200320063602d407200320083602d007200320043602cc07200320023602c8072003201a3703c007200320193703b807200320183703b007200320143703a807200320123703a00720032013370398072003200e370390072003201b370388070c0c0b200c4108762107200d2104200f21090c3b0b20034190036a41306a290300210e20034190036a41286a2903002105200341f0026a41186a20034190036a41206a290300370300200341f0026a41106a20034190036a41186a290300370300200341f0026a41086a20034190036a41106a29030037030020032003290398033703f00220034190036a10a703200320034190036a3602c402200320034190036a3602bc0420034188076a41186a200229030037030020034188076a41106a2209200341a0026a41106a220429030037030020034188076a41086a220a200341a0026a41086a2208290300370300200320032903a00237038807200341c0046a20034188076a103320032802c804210720032902cc042113200341fc046a4100360200200341ec046a220b4200370200200341c0046a41206a41e8cfc200360200200341dc046a41f8b3c200360200200341d4046a22164200370200200341c0046a41106a41f0c0c100360200200341a4056a20022903003702002003419c056a200429030037020020034194056a2008290300370200200342083702f4042003428080808080013702e404200341003602cc04200320133702c404200320073602c004200320032903a00237028c052003200341bc046a360288052003200341c4026a36028405200320034190036a36028005200341c8026a200341c0046a20142012200341f0026a20034180026a200f2011102f20032d00c80222230d18200a2016290200370300200341a8066a41086a20034194076a280200360200200320032902cc04370388072003200329028c073703a80620034188086a200341a8066a10d502200341c0046a41286a2802002216200341c0046a41306a280200220441d8006c6a2108200b2802002115201621022004450d1620034191076a210720034190076a210b20162102034020022d00002104200341a8066a200241016a41d70010ce031a20044106460d16200b20043a00002003410b3a0088072007200341a8066a41d70010ce031a20034188076a108b01200241d8006a22022008470d000c180b0b41a39ac0004105200720034194076a28020010034101210b02402004450d002007101d0b410021094101210a0c060b4101210b2006412a200841ff017141014622021b21082002450d1002402009450d00200a101d0b410021074101210a41012109410121060c060b20034188076a41086a29030021054108101f2202450d242002200537000041999ac000410a2002410810032002101d410021044101210b4101210a4101210941012107410121060c470b4101210b2006412a200841ff017141014622021b21082002450d0f02402009450d00200a101d0b410021064101210a41012109410121070c040b0240200641186c2202450d00200720026a21042007210203402002280200200241086a2802002002410c6a280200200241146a2802001003200241186a22022004470d000b0b02402006450d00200641186c21042007210203400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200441686a22040d000b0b4101210b0240200a450d002007101d0b4100210a0c010b02402006410c6c2202450d00200720026a21042007210203402002280200200241086a28020010092002410c6a22022004470d000b0b02402006450d002006410c6c21042007210203400240200241046a280200450d002002280200101d0b2002410c6a2102200441746a22040d000b0b4101210a0240200d450d002007101d0b4100210b0b410121090b41012107410121060b410021040c410b200341103602d007200342013703c007200342013703b807200342013703b007200342013703a807200342013703a007200342013703980720034201370390072003420137038807200342808080808080c0003703c8070b20034190036a200341a8066a200510e90202402003280290034101470d00200328029803210820032802940321040c380b200341b0036a2903002114200341a8036a2903002118200341c0036a290300210e200341b8036a2903002105200341a0036a29030021132003290398032119200341d8006a2003290388074200200bad420010d2032013427f200329035820032903604200521b7d2212201356201250722204450d05412c210841a8d4c000210641012102200d0d060c290b20034190076a280200450d3f200328028c07101d0c3f0b200b450d3e024020034188076a410c6a2802002206450d00200328028c0721022006410c6c210603400240200241046a280200450d002002280200101d0b2002410c6a2102200641746a22060d000b0b20034190076a280200450d3e200328028c07101d0c3e0b2006450d3d20034190076a280200450d3d200328028c07101d0c3d0b2009450d3c024020034188076a410c6a2802002206450d00200328028c072102200641186c210603400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200641686a22060d000b0b20034190076a280200450d3c200328028c07101d0c3c0b410021022003280294030d280c290b20034190036a200c200b20034188076a10422003280290034101470d0320034198036a2802002108200328029403210641012102200d450d230b200c101d0c220b200741f1b4c00020021b2104410021074101210b20090d320c330b200741f1b4c00020021b2104410021064101210b20090d340c350b200341f0056a41186a220720034190036a410472220241186a280200360200200341f0056a41106a2209200241106a290200370300200341f0056a41086a220a200241086a290200370300200320022902003703f005200341c0046a41186a22024200370300200341c0046a41106a4200370300200341c0046a41086a22104200370300200342003703c004200c200b200341c0046a100020034180026a41026a221120032d00c2043a0000200341c8026a41086a220f200341d3046a290000370300200341c8026a410d6a22162002290000370000200320032f01c0043b018002200320032900cb043703c80220032800c304210620032800c7042108200341d0056a41026a20112d00003a00002010200f290300370300200341c0046a410d6a2016290000370000200320032f0180023b01d005200320032903c8023703c00420034190036a41186a200728020036020020034190036a41106a200929030037030020034190036a41086a200a290300370300200320032903f005370390034114101f2202450d18200241106a41002800c2f341360000200241086a41002900baf341370000200241002900b2f341370000200241144134101e2202450d19200220032f01d0053b00142002200836001b20022006360017200220032903c00437001f200241166a200341d0056a41026a2d00003a0000200241276a200341c0046a41086a2903003700002002412c6a200341c0046a410d6a290000370000200341f0026a41086a22074200370300200342003703f00220024134200341f0026a1001200341a0026a41086a2007290300370300200320032903f0023703a002200341a0026a20034190036a10612002101d0240200341a0036a280200450d00200328029c03101d0b200341b0056a41026a20034180026a41026a2d00003a000020034190036a41086a200341c8026a41086a29030037030020034190036a410d6a200341c8026a410d6a290000370000200320032f0180023b01b005200320032903c802370390034115101f2202450d1a2002410d6a4100290094f341370000200241086a410029008ff34137000020024100290087f341370000200241154135101e2202450d1b200220032f01b0053b00152002200836001c200220063600182002200329039003370020200241176a200341b2056a2d00003a0000200241286a20034190036a41086a2903003700002002412d6a20034190036a410d6a290000370000200341f0026a41086a22074200370300200342003703f00220024135200341f0026a1001200341a0026a41086a2007290300370300200320032903f0023703a002200341003602c804200342013703c0042003200b3602d005200341d0056a200341c0046a1062024020032802c404220a20032802c80422096b200b4f0d002009200b6a22072009490d1d200a4101742210200720072010491b22104100480d1d200a450d0520032802c004200a2010101e2207450d060c1e0b20032802c00421070c1e0b200241d8006a21020b20022008460d00034020022d000022044106460d01024020044105490d00200241286a280000450d00200241246a280000101d0b200241d8006a22022008470d000b0b410021172015450d002016101d0b20034198016a20032903800320034188036a29030020032903f8022213420010d20320032903f00220137d10a503200341a8016a200341a0026a20032903980120034198016a41086a290300109f012009200e200341a8016a41086a29030022127d200520032903a801221354ad7d2012200e7d2013200554ad7d20132005582012200e582012200e5122021b22041b22143703002003200520137d201320057d20041b221837039007200320132005562012200e5620021b2202ad370388070240024020020d002018201410f3010c010b200a10f5010b200341f4046a2802002228200341fc046a28020022044107746a2116200341f8046a2802002129202821020240024002402004450d0020034191076a2104200341f0056a410272210820034188076a4104722127200341b1076a21252028210202400340200341b0056a41186a220b200241186a290300370300200341b0056a41106a2209200241106a290300370300200341b0056a41086a220a200241086a290300370300200320022903003703b005200241206a2802002107200341a8066a200241246a41dc0010ce031a2007410f460d01200341d0056a41186a2215200b290300370300200341d0056a41106a22242009290300370300200341d0056a41086a2226200a290300370300200320032903b0053703d00520032007360288072027200341a8066a41dc0010ce031a200820032903b005370000200841086a200a290300370000200841106a2009290300370000200841186a200b29030037000020034180023b01f00520034190016a20034188076a200341f0056a108a01200328029001210720034188076a41086a41043a000020252007453a0000200420032903d005370000200441086a2026290300370000200441106a2024290300370000200441186a20152903003700002003410b3a00880720034188076a108b0120024180016a22022016470d000b201622022016470d020c030b20024180016a21020b20022016460d010b20034188076a41206a210920034188076a410b6a210820034188076a41246a2127200341f0056a410d6a2107200341f0056a41086a210b0340200320022f01003b01a0062003200241026a2d00003a00a206200241036a280000210a200241076a28000021152007200241186a290000370000200b200241136a29000037030020032002410b6a2900003703f005200241206a280200210420034188076a200241246a41dc0010ce031a2004410f460d01200341d0056a41086a2224200b290300370300200341d0056a410d6a22262007290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d005200341a8066a20034188076a41dc0010ce031a20092004360200200820032903d005370000200841086a20242903003700002008410d6a20262900003700002003201536008f072003200a36008b07200320032d009a063a008a07200320032f0198063b0188072027200341a8066a41dc0010ce031a2009103c20024180016a22022016470d000b0b02402029450d002028101d0b200341d0026a280200210841002104024020234101470d0020032802cc0221040b024020032802c0042202450d0020032802c404450d002002101d0b2017450d1c200341c0046a41186a280200210a200341d0046a280200210202400240200341c0046a41146a280200220b450d00200b210920022107034020072802800921072009417f6a22090d000b0340200220022f01064102746a4180096a2802002102200b417f6a220b0d000c020b0b200221070b200341a4076a20022f010636020020034188076a41186a410036020020034188076a41146a20023602002003200a3602a807200341003602980720034200370390072003200736028c07200341003602880720034188076a103b0240200341f0046a2802002207450d00200341c0046a41286a2802002102200741d8006c21070340024020022d00004105490d00200241286a280200450d00200241246a280200101d0b200241d8006a2102200741a87f6a22070d000b0b200341ec046a280200450d1c200341e8046a280200101d20100d1d0c1e0b2010101f22070d180b201041011020000b10f002000b41df88c0004133103a000b200341a4036a4101360200200341183602c404200341c0adc4003602c0042003420137029403200341c8adc400360290032003200341c0046a3602a00320034190036a4184d9c20010cf01000b20034190036a41146a41013602002003411836028c07200341c0adc400360288072003420137029403200341c8adc40036029003200320034188076a3602a00320034190036a41bca4c40010cf01000b200341a4036a4101360200200341183602c404200341c0adc4003602c0042003420137029403200341c8adc400360290032003200341c0046a3602a00320034190036a4184d9c30010cf01000b41b8d0c200102c000b41d0d0c200102c000b41df88c0004133103a000b411241011020000b413241011020000b412041011020000b41df88c0004133103a000b410841011020000b410441011020000b410c41011020000b411841011020000b413041011020000b41e00041011020000b411441011020000b413441011020000b411541011020000b413541011020000b1021000b200320103602c404200320073602c0042010210a0b200720096a200c200b10ce031a200341a0026a411020072009200b6a10030240200a450d002007101d0b2002101d0240200d450d00200c101d0b200341d0056a41026a220220034180026a41026a2d00003a0000200341c0046a41086a2207200341c8026a41086a290300370300200341c0046a410d6a220b200341c8026a410d6a290000370000200320032f0180023b01d005200320032903c8023703c00420034190036a41086a41023a0000200341a0036a20083602002003419c036a200636020020034199036a20032f01d0053b0000200341a4036a20032903c004370200200341ac036a2007290300370200200341b1036a200b29000037000020022d000021022003410b3a00900320034190036a410b6a20023a000020034190036a108b01410021020b200341386a201820144200201220041b2213420010d203201920137d10a503200341c8006a200341a8066a2003290338200341386a41086a290300109f01200341a0036a200e200341c8006a41086a29030022127d20052003290348221354ad7d2012200e7d2013200554ad7d20132005582012200e582012200e5122041b22071b22143703002003200520137d201320057d20071b221837039803200320132005562012200e5620041b2204ad370390030240024020040d002018201410f3014100210420020d010c100b20034190036a41086a10f501410021042002450d0f0b200621040c0e0b2010450d010b200f101d0b4101210241002107200641044d0d060c070b2004101d0b200b41d7c0c10020021b21042008411520021b21082002450d012008210b0b20034190036a200341f0026a201310e9024101211702402003280290034101470d002003280298032108200328029403210420110d020c030b20034190036a41306a290300211820034190036a41286a2903002113200341b0056a41186a221620034190036a41206a290300370300200341b0056a41106a20034190036a41186a290300370300200341b0056a41086a20034190036a41106a29030037030020032003290398033703b00520034190036a10a703200320034190036a3602bc04200320034190036a3602800220034188076a41186a200341f0026a41186a220229030037030020034188076a41106a2224200341f0026a41106a220829030037030020034188076a41086a2225200341f0026a41086a2226290300370300200320032903f00237038807200341c0046a20034188076a103320032802c804212720032902cc042119200341fc046a4100360200200341ec046a22284200370200200341c0046a41206a41e8cfc200360200200341dc046a41f8b3c200360200200341d4046a22294200370200200341c0046a41106a41f0c0c100360200200341a4056a20022903003702002003419c056a200829030037020020034194056a2026290300370200200342083702f4042003428080808080013702e404200341003602cc04200320193702c404200320273602c004200320032903f00237028c05200320034180026a360288052003200341bc046a36028405200320034190036a36028005200320093a00a7072003200a3600a3072003200e37009b0720032005370093072003200b36008f072003200436008b07200320073b018807200320074110763a008a07200341003602b006200342013703a806200341a0026a200341c0046a20034188076a20142012200341b0056a20102015200341a8066a1041024020032802a00222230d0020252029290200370300200341a8066a41086a20034194076a280200360200200320032902cc04370388072003200329028c073703a80620034188086a200341a8066a10d502200341c0046a41286a2802002209200341c0046a41306a280200220441d8006c6a21082028280200210a20092102024002402004450d0020034191076a210720034190076a210b200921020240034020022d00002104200341a8066a200241016a41d70010ce031a20044106460d01200b20043a00002003410b3a0088072007200341a8066a41d70010ce031a20034188076a108b01200241d8006a22022008470d000c030b0b200241d8006a21020b20022008460d00034020022d000022044106460d01024020044105490d00200241286a280000450d00200241246a280000101d0b200241d8006a22022008470d000b0b41002117200a450d002009101d0b200341f0006a20032903c005201629030020032903b8052205420010d20320032903b00520057d10a50320034180016a200341f0026a2003290370200341f0006a41086a290300109f012024201820034180016a41086a290300220e7d2013200329038001220554ad7d200e20187d2005201354ad7d2005201358200e201858200e20185122021b22041b22123703002003201320057d200520137d20041b22143703900720032005201356200e20185620021b2202ad370388070240024020020d002014201210f3010c010b202510f5010b200341f4046a2802002228200341fc046a28020022044107746a2116200341f8046a2802002129202821020240024002402004450d0020034191076a2104200341f0056a410272210820034188076a4104722127200341b1076a21252028210202400340200341d0056a41186a220b200241186a290300370300200341d0056a41106a2209200241106a290300370300200341d0056a41086a220a200241086a290300370300200320022903003703d005200241206a2802002107200341a8066a200241246a41dc0010ce031a2007410f460d01200341c8026a41186a2215200b290300370300200341c8026a41106a22242009290300370300200341c8026a41086a2226200a290300370300200320032903d0053703c80220032007360288072027200341a8066a41dc0010ce031a200820032903d005370000200841086a200a290300370000200841106a2009290300370000200841186a200b29030037000020034180023b01f005200341e8006a20034188076a200341f0056a108a012003280268210720034188076a41086a41043a000020252007453a0000200420032903c802370000200441086a2026290300370000200441106a2024290300370000200441186a20152903003700002003410b3a00880720034188076a108b0120024180016a22022016470d000b201622022016470d020c030b20024180016a21020b20022016460d010b20034188076a41206a210920034188076a410b6a210820034188076a41246a2127200341f0056a410d6a2107200341f0056a41086a210b0340200320022f01003b01a0062003200241026a2d00003a00a206200241036a280000210a200241076a28000021152007200241186a290000370000200b200241136a29000037030020032002410b6a2900003703f005200241206a280200210420034188076a200241246a41dc0010ce031a2004410f460d01200341d0056a41086a2224200b290300370300200341d0056a410d6a22262007290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d005200341a8066a20034188076a41dc0010ce031a20092004360200200820032903d005370000200841086a20242903003700002008410d6a20262900003700002003201536008f072003200a36008b07200320032d009a063a008a07200320032f0198063b0188072027200341a8066a41dc0010ce031a2009103c20024180016a22022016470d000b0b02402029450d002028101d0b200341a8026a280200210820032802a40221020240024002402023450d002002210420032802c00422020d010c020b2003200341ac026a280200360290072003200836028c0720032002360288074100210402402008450d002002101d0b20032802c0042202450d010b20032802c404450d002002101d0b2017450d00200341c0046a41186a280200210a200341d0046a280200210202400240200341c0046a41146a280200220b450d00200b210920022107034020072802800921072009417f6a22090d000b0340200220022f01064102746a4180096a2802002102200b417f6a220b0d000c020b0b200221070b200341a4076a20022f010636020020034188076a41186a410036020020034188076a41146a20023602002003200a3602a807200341003602980720034200370390072003200736028c07200341003602880720034188076a103b0240200341f0046a2802002207450d00200341c0046a41286a2802002102200741d8006c21070340024020022d00004105490d00200241286a280200450d00200241246a280200101d0b200241d8006a2102200741a87f6a22070d000b0b200341ec046a280200450d00200341e8046a280200101d20110d010c020b2011450d010b2010101d0b4100210241012107200641044b0d010b024020060e050505040002050b2011452007720d042010101d0c040b20100d010c030b2010452002720d020b200f101d0c010b200d450d00200c101d0b41002111410121064101210b410121094101210a4101210d4101210c410121100c0e0b20034188076a10b30141c9b4c0002104412821080c060b200a101d0b4101210a410121090b410121060c020b200a101d0b4101210a41012109410121070b024002400240200328028807417f6a220241064b0d0002400240024020020e0700060103040502000b2006450d0520034190076a280200450d05200328028c07101d0c050b2007450d0420034190076a280200450d04200328028c07101d0c040b200b450d03024020034188076a410c6a2802002206450d00200328028c0721022006410c6c210603400240200241046a280200450d002002280200101d0b2002410c6a2102200641746a22060d000b0b20034190076a280200450d03200328028c07101d0c030b20034188076a10b3010c020b2009450d0120034190076a280200450d01200328028c07101d0c010b200a450d00024020034188076a410c6a2802002206450d00200328028c072102200641186c210603400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200641686a22060d000b0b20034190076a280200450d00200328028c07101d0b4101210b410021060b410121090b4101210a0b4101210d0b4101210c0b410121100b410121110b4101210720012802002202410d4b0d010b024002400240024002400240024002400240024002400240024020020e0e0e050e0e0e03070206000e010e040e0b200c450d0d20012d00044101470d0d2001410c6a2201280200108c012001280200101d0c0d0b2010450d0c200141086a280200450d0c2001280204101d0c0c0b200a450d0b200141086a28020022024102460d0520024101470d0b200141106a280200450d0b2001410c6a280200101d0c0b0b200b450d0a200141086a2d00002202410e4b0d0820024106470d0a200141106a280200450d0a2001410c6a280200101d0c0a0b2011450d09200141086a2d000022024102490d0920024103460d0520024102470d06200141106a280200450d092001410c6a280200101d0c090b2006450d08200141086a10b3010c080b200d450d07200141086a2d00004101470d072001410c6a2201280200108c012001280200101d0c070b2009450d06200141086a2d000022024105460d0120024101470d062001410c6a2201280200108c012001280200101d0c060b200141106a280200450d052001410c6a280200101d0c050b2001410c6a2201280200108c012001280200101d0c040b200141346a280200450d03200141306a280200101d0c030b200141306a280200450d022001412c6a280200101d0c020b200141106a280200450d012001410c6a280200101d0c010b2007450d0020012802044101470d00200141086a2201280200108c012001280200101d0b200020083602042000200436020020034190086a24000bcf0e03067f017e0a7f23004180036b2201240002400240024002400240024002400240024002400240024002400240419bb5c000411041f8b3c200410041001002417f460d00200141003602a001419bb5c0004110200141a0016a41044100100241016a41044d0d0220012802a0012102410021030c010b410121030b41082104200141a0016a41086a22054200370300200142003703a00141a5bac000410d200141a0016a1001200141106a41086a2005290300370300200120012903a001370310024002400240200141106a411041f8b3c200410041001002417f460d00200142103702242001200141106a360220200141086a200141206a10d5012001280208450d07200128020c2206ad42f8007e2207422088a70d042007a72205417f4c0d042005450d012005101f2204450d052006450d020c060b4100210e4100210c0c070b4108210420060d040b4100210c4100210e2004450d040c050b41df88c0004133103a000b102e000b200541081020000b200141a0016a4101722108200141286a21094100210a410021054100210b2006210c02400340200141003a0090022001280220200128022420014190026a410120092802001002210d20092009280200200d41016a41014b220d6a220e360200200d450d014101210f024020012d009002220d4101460d00200d0d02200141003602a0012009410020012802202001280224200141a0016a4104200e1002220d200d417f461b220d4104200d4104491b20092802006a360200200d41034d0d0220012802a00121104100210f0b200141a0016a200141206a10d60120012d00a001210d20014190026a200841ef0010ce031a200d410d460d01200b41016a210e200141316a20014190026a41ef0010ce031a200141a0016a200141316a41ef0010ce031a0240200b200c470d00200a200e200e200a491b220cad42f8007e2207422088a70d072007a722114100480d070240200b450d00200420052011101e22040d010c060b2011101f2204450d050b200420056a220b200d3a0000200b41016a200141a0016a41ef0010ce031a200b41f4006a2010360200200b41f0006a200f360200200a41026a210a200541f8006a2105200e210b200e2006490d000c030b0b0240200b450d00200421010340200110d701200141f8006a2101200541887f6a22050d000b0b200c450d002004101d0b41df88c0004133103a000b200141a0016a200041f00010ce031a200c200e470d01200e41016a2205200e490d02200e4101742209200520052009491b220cad42f8007e2207422088a70d022007a722054100480d0202400240200e450d002004200e41f8006c2005101e2204450d010c030b2005101f22040d020b200541081020000b201141081020000b2004200e41f8006c220b6a200141a0016a41f00010ce03220541f4006a200236020020052003360270200141a0016a41086a22094200370300200142003703a00141a5bac000410d200141a0016a1001200141106a41086a2009290300370300200120012903a001370310200141003602a801200142013703a0012001200e41016a22063602900220014190026a200141a0016a106202402006450d00200b41f8006a210a2004210503400240024002400240024002400240024002400240200541f0006a2802004101470d00200141013a00900220012802a4012009280200220b470d01200b41016a220d200b490d0c200b410174220f200d200d200f491b220f4100480d0c200b450d0320012802a001200b200f101e220d0d040c0d0b200141003a00900220012802a4012009280200220b470d01200b41016a220d200b490d0b200b410174220f200d200d200f491b220f4100480d0b200b450d0520012802a001200b200f101e220d0d060c0d0b4101210f20012802a001210d0c030b4100210f20012802a001210d0c050b200f101f220d450d090b2001200f3602a4012001200d3602a0012009280200210b20012d009002210f0b2009200b41016a360200200d200b6a200f3a00000c030b200f101f220d450d070b2001200f3602a4012001200d3602a0012009280200210b20012d009002210f0b2009200b41016a360200200d200b6a200f3a0000200541f4006a280200210f024002400240024020012802a401220d2009280200220b6b41044f0d00200b41046a2210200b490d07200d410174220b20102010200b491b220b4100480d07200d450d0120012802a001200d200b101e220d0d020c0a0b20012802a001210d0c020b200b101f220d450d080b2001200b3602a4012001200d3602a0012009280200210b0b2009200b41046a360200200d200b6a200f3600000b2005200141a0016a10d801200541f8006a2105200a41887f6a220a0d000b0b20012802a4012105200141106a411020012802a001220b2009280200100302402005450d00200b101d0b02402006450d00200e41f8006c41f8006a2109200421050340200510d701200541f8006a2105200941887f6a22090d000b0b0240200c450d002004101d0b20014180036a24000f0b1021000b200f41011020000b200f41011020000b200b41011020000bef0301017f02400240024002400240024002400240024002400240024002400240024020002802002201410d4b0d0020010e0e0e010e0e0e02030405060e070e080e0b20002802044101470d0d200041086a2200280200108c012000280200101d0f0b200041086a10b3010f0b200041086a2d00002201410e4b0d0a20014106470d0b200041106a280200450d0b2000410c6a280200101d0f0b200041086a2d000022014105460d0520014101470d0a2000410c6a2200280200108c012000280200101d0f0b200041086a28020022014102460d0520014101470d09200041106a280200450d092000410c6a280200101d0f0b200041086a2d00004101470d082000410c6a2200280200108c012000280200101d0f0b20002d00044101470d072000410c6a2200280200108c012000280200101d0f0b200041086a280200450d062000280204101d0f0b200041086a2d000022014102490d0520014103460d0220014102470d03200041106a280200450d052000410c6a280200101d0f0b2000410c6a2200280200108c012000280200101d0f0b200041106a280200450d032000410c6a280200101d0f0b200041346a280200450d02200041306a280200101d0f0b200041306a280200450d012000412c6a280200101d0f0b200041106a280200450d002000410c6a280200101d0f0b0bf7ce0135037f017e027f017e027f027e057f037e167f027e027f017e027f027e0d7f027e067f027e097f077e027f037e127f027e017f017e0e7f017e067f017e227f017e017f017e017f017e017f027e027f017e027f027e037f027e027f017e0c7f017e057f017e027f017e067f23004190096b22012400200141a0056a41086a22024200370300200142003703a00541838cc1004113200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b8030240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141b8036a411041f8b3c200410041001002417f460d00200141003a009008200141b8036a411020014190086a41014100100241016a41014d0d0220012d0090082102200141b8036a411010092002450d00200141a0056a41086a22024200370300200142003703a005419590c000411d200141a0056a100120014190086a41086a2002290300370300200120012903a00537039008024020014190086a411041f8b3c200410041001002417f460d00200142103702ac04200120014190086a3602a804200141c0056a200141a8046a105e20012802c0052203450d0420012902c405210420014190086a41101009200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a1081014100210502402001280290082202200128029808220641f8b3c200410041001002417f460d00200141003602c00520022006200141c0056a41044100100241016a41044d0d0320012802c00521050b0240200128029408450d002002101d0b024002402005450d002005ad4205862207422088a70d212007a722024100480d212002101f2208450d084100210620082102034020014190086a2006107d200241186a20014190086a41186a290000370000200241106a20014190086a41106a290000370000200241086a20014190086a41086a2900003700002002200129009008370000200241206a21022005200641016a2206470d000c020b0b410121080b02400240024020052004422088a7470d00024020082003460d002005450d00410021092008210220032106034020022006412010d0030d02200241206a2102200641206a2106200941016a22092005490d000b0b2005450d012008101d2004a70d020c030b2001419c086a200536020020014198086a20053602002001200836029408200141013a00900820014190086a108e010b2004a7450d010b2003101d0b200141a0056a41086a22024200370300200142003703a00541cebac1004118200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b80342002104024002400240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0120012903900821040b20024200370300200142003703a0054195a8c1004115200141a0056a100120062002290300370300200120012903a0053703b80302400240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0320012903900822074200520d0141ecd8c300102c000b42e80721070b200141a0056a41086a22024200370300200142003703a00541e9a4c1004119200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b803200020047d200782210a0240200141b8036a411041f8b3c200410041001002417f460d00200141003a009008200141b8036a411020014190086a41014100100241016a41014d0d0720012d0090082102200141b8036a41101009200241004721050c090b200a4200520d09410121050c080b41df88c0004133103a000b41df88c0004133103a000b41bcacc300102c000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200241011020000b4200210b200141a0056a41086a22024200370300200142003703a005418390c100410d200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b803420021040240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0a20012903900821040b20024200370300200142003703a00541e6bac1004114200141a0056a100120062002290300370300200120012903a0053703b8030240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0b200129039008210b0b200141a0056a41086a22024200370300200142003703a0054181a8c1004114200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b80302400240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0d20012903900842017c21070c010b420121070b20014190086a41086a2007370300200141033a00900820014190086a108b0120024200370300200142003703a0054181a8c1004114200141a0056a100120062002290300370300200120012903a0053703b8032001200737039008200141b8036a411020014190086a4108100320024200370300200142003703a00541e6bac1004114200141a0056a100120062002290300370300200120012903a0053703b8032001200437039008200141b8036a411020014190086a41081003200141a8036a41fabac1004119108f0102400240024020012903a803a74101470d0020012903b0032107200141a0056a41086a22024200370300200142003703a0054195a8c1004115200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b8032001200737039008200141b8036a411020014190086a410810030c010b200a500d010b200141a0056a41086a22024200370300200142003703a005418cb9c000410d200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b803420021070240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0e20012903900821070b20024200370300200142003703a00541cebac1004118200141a0056a100120062002290300370300200120012903a0053703b8032001200737039008200141b8036a411020014190086a410810030b2004200b7d2005109001200141a0056a41086a22024200370300200142003703a00541aaa8c1004112200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b8034100210c02400240200141b8036a411041f8b3c200410041001002417f460d00200142103702c4052001200141b8036a3602c00520014190086a200141c0056a105e200128029008220d450d1120014198086a280200210c200128029408210e0c010b4101210d4100210e0b41002103200141003602900820014190086a108201200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a10810102402001280290082202200128029808220641f8b3c200410041001002417f460d00200141003602c00520022006200141c0056a41044100100241016a41044d0d0e20012802c00521030b0240200128029408450d002002101d0b02402003200c4d0d0020014198086a2108200c21020340200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a10810141002105024020012802900822062008280200220941f8b3c200410041001002417f460d00200141003602c00520062009200141c0056a41044100100241016a41044d0d0420012802c00521050b0240200128029408450d002006101d0b200241016a21060240200520024d0d00200141063602c405200141df8ac0003602c00520014190086a2002200141c0056a107e200128029008220220082802001009200128029408450d002002101d0b2006210220032006470d000b0b200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a108101200128029808210620012802900821022001200c3602c00520022006200141c0056a410410030240200128029408450d002002101d0b0240200c4105742209450d0041002105200d21060340200141a8046a41186a2208200641186a290000370300200141a8046a41106a2203200641106a290000370300200141a8046a41086a220c200641086a290000370300200120062900003703a8044112101f2202450d07200241106a41002f00cca8413b0000200241086a41002900c4a841370000200241002900bca841370000200241124132101e2202450d08200220012903a8043700122002412a6a2008290300370000200241226a20032903003700002002411a6a200c290300370000200141a0056a41086a22084200370300200142003703a00520024132200141a0056a1001200141b8036a41086a2008290300370300200120012903a0053703b80302400240200141b8036a411041f8b3c200410041001002417f460d00200141e8036a41186a22084200370300200141e8036a41106a22034200370300200141e8036a41086a220c4200370300200142003703e803200141b8036a4110200141e8036a412041001002220f417f460d07200f411f4d0d07200141c8036a41186a220f2008290300370300200141c8036a41106a22082003290300370300200141c8036a41086a2203200c290300370300200120012903e8033703c8032002101d200141c0056a41186a200f290300370300200141c0056a41106a2008290300370300200141c0056a41086a2003290300370300200120012903c8033703c0050c010b2002101d200141c0056a41186a4200370300200141c0056a41106a4200370300200141c0056a41086a4200370300200142003703c0050b2001410636029408200141df8ac00036029008200141a0076a200520014190086a107e02400240024020012802a0072202200141a0076a41086a2208280200220341f8b3c200410041001002417f470d0020014190086a41186a420037030020014190086a41106a420037030020014190086a41086a4200370300200142003703900820012802a4070d010c020b20014188046a41186a220c420037030020014188046a41106a220f420037030020014188046a41086a2210420037030020014200370388042002200320014188046a4120410010022203417f460d082003411f4d0d0820014190086a41186a200c29030037030020014190086a41106a200f29030037030020014190086a41086a201029030037030020012001290388043703900820012802a407450d010b2002101d0b024020014190086a200141c0056a412010d003450d0041002102200141003602a007200141a0076a108201200141063602c406200141df8ac0003602c006200141a0076a41a68ec100200141c0066a108101024020012802a00722032008280200220c41f8b3c200410041001002417f460d00200141003602c0062003200c200141c0066a41044100100241016a41044d0d0620012802c00621020b024020012802a407450d002003101d0b200220054d0d00200141063602c406200141df8ac0003602c006200141a0076a2005200141c0066a107e2008280200210320012802a00721084120101f2202450d0b200220012903c005370000200241186a200141c0056a41186a290300370000200241106a200141c0056a41106a290300370000200241086a200141c0056a41086a290300370000200820032002412010032002101d20012802a407450d002008101d0b200541016a2105200641206a2106200941606a22090d000b0b200e450d00200d101d0b200141b8036a41086a22024200370300200142003703b80341fd9bc0004116200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c00602400240200141c0066a411041f8b3c200410041001002417f460d002001420037039008200141c0066a411020014190086a41084100100241016a41084d0d0820012903900822044200510d0f4200211120002004824200520d160c010b42002111200042e807824200520d150b41082108200141b8036a41086a22022011370300200120113703b80341939cc0004115200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c0064100210f02400240200141c0066a411041f8b3c200410041001002417f460d00200142103702c4052001200141c0066a3602c00520014190086a200141c0056a1091012001280290082208450d112001280294082110418801210220014198086a280200220f4188016c2206450d010c120b41002110418801210241004188016c22060d110b200141003602c805200120083602c405200120083602c0052001200141a8046a3602cc05200f0d110c120b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b413241011020000b41df88c0004133103a000b412041011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41f0dcc200102c000b41df88c0004133103a000b41df88c0004133103a000b200820066a210620014190086a2008280260109201200820026a21020240024020012802a0082205450d0020014198036a20012903900820014190086a41086a290300200141a8086a350200420010d20320014198036a41086a2903002107200129039803211220012802a408450d012005101d0c010b42002112420021070b200141013602c805200120063602c405200120023602c0052001200141a8046a3602cc0502402008450d002008ad4220862113024020022006460d00200f4188016c41f87e6a2106200141a0086a2109200141a8086a2103200141a4086a210c4201210b034020014190086a200241e0006a2802001092010240024020092802002205450d0020014188036a20012903900820014190086a41086a2903002003350200420010d20320014188036a41086a2903002104200129038803210a200c280200450d012005101d0c010b4200210a420021040b02402012200a56200720045620072004511b0d002002ad422086200b842113200a2112200421070b20024188016a2102200b42017c210b200641f87e6a22060d000b0b20134280808080105a0d030b200f450d010b200f4188016c21022008211403402014103c20144188016a2114200241f87e6a22020d000b0b2010450d012008101d0c010b0240024002400240200f2013a722024d0d00200820024188016c6a220229031021042008200f417f6a22054188016c6a22064180016a29030021072006290360210b200641e8006a290300210a200641f0006a2903002112200641f8006a2903002113200641c8006a2903002153200641d0006a2903002154200641d8006a2903002155200641286a2903002156200641306a2903002157200641386a2903002158200641186a2903002159200641c0006a290300215d200641206a290300215c2006290300215e20062903082171200220062903103703102002290308217220022071370308200229030021712002205e370300200241206a2206290200215e2006205c370200200241c0006a2206290200215c2006205d370200200241186a2206290300215d20062059370300200241386a2206290200215920062058370200200241306a2206290200215820062057370200200241286a2206290200215720062056370200200241d8006a2206290200215620062055370200200241d0006a2206290200215520062054370200200241c8006a2206290200215420062053370200200241f8006a2013370300200241f0006a2012370300200241e8006a200a370300200228026021092002200b37036020024180016a2007370200200141c0056a41d8006a2056370300200141c0056a41d0006a2055370300200141c0056a41c8006a2054370300200141c0056a41c0006a205c370300200141c0056a41386a2059370300200141c0056a41306a2058370300200141c0056a41286a2057370300200141c0056a41206a205e370300200141c0056a41186a205d370300200120043703d005200120723703c805200120713703c005200120053602980820012010360294082001200836029008200141b8036a41086a22024200370300200142003703b80341939cc0004115200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c006200141103602ac042001200141c0066a3602a80420014190086a200141a8046a10930102402005450d00200f4188016c41f87e6a21062008210203402002103c20024188016a2102200641f87e6a22060d000b0b02402010450d002008101d0b4113101f2202450d01410021052002410f6a41002800f99b40360000200241086a41002900f29b40370000200241002900ea9b40370000200241134126101e2202450d0220022009360013200141b8036a41086a22064200370300200142003703b80320024117200141b8036a1001200141c0066a41086a2006290300370300200120012903b8033703c006024002400240200141c0066a411041f8b3c200410041001002417f460d002001200141c0066a3602a804200141103602ac042001420037039808200142003703900820014100200141c0066a411020014190086a41104100100222062006417f461b2206411020064110491b3602b0042006410f4d0d0220014198086a22062903002104200129039008210720014190086a200141a8046a105e2001280290082205450d02200628020021082001280294082103200141c0066a411010092002101d2005450d010c060b2002101d41000d050b200141c0056a103c0c050b41df88c0004133103a000b4188ddc2002002200f104b000b411341011020000b412641011020000b024020084105742206450d00200521020340200220072004109401200241206a2102200641606a22060d000b0b200141b8086a2004370300200141b0086a2007370300200141a8086a2008360200200141a4086a200336020020014190086a41106a20053602002001419c086a200936020020014190086a41086a41013a0000200141053a00900820014190086a108b01200141b8036a41086a22024200370300200142003703b80341869bc0004116200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c00602400240024002400240200141c0066a411041f8b3c200410041001002417f460d002001420037039008200141c0066a411020014190086a41084100100241016a41084d0d0220012903900821070c010b42e80721070b20014190086a200141c0056a41e00010ce031a42002104200141b8036a41086a22024200370300200142003703b80341a89cc0004115200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c0060240200141c0066a411041f8b3c200410041001002417f460d00200142003703a804200141c0066a4110200141a8046a41084100100241016a41084d0d0220012903a80421040b200141a8046a200720007c20014190086a4100200410950120012802a8044101470d0320012802ac04200141a8046a41086a280200100a0c020b41df88c0004133103a000b41df88c0004133103a000b410221020c010b200141b8036a41086a22142011370300200120113703b80341bd9cc0004113200141b8036a1001200141c0066a41086a2014290300370300200120012903b8033703c006410021140240024002400240024002400240200141c0066a411041f8b3c200410041001002417f460d002001410036029008200141c0066a411020014190086a41044100100241016a41044d0d0120012802900821140b200141b8036a41086a22024200370300200142003703b80341d09cc0004119200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c006410021020240200141c0066a411041f8b3c200410041001002417f460d002001410036029008200141c0066a411020014190086a41044100100241016a41044d0d0220012802900821020b0240024002400240201420024f0d002001419c086a210920014198086a21060240034020014190086a201410960120062802002205410f470d01201441016a22142002490d000c020b0b2001290390082104200141a8046a200941ec0010ce031a200141a0076a200141a8046a41ec0010ce031a200141a0086a2206200536020020012004370398082001201436029008200141a4086a200141a0076a41ec0010ce032109024020042000520d00200141c0066a41086a220620014190086a41086a29030037030020012001290390083703c006200141c0056a200941ec0010ce031a200141a8046a41086a22092006290300370300200120012903c0063703a80420014190086a200141c0056a41ec0010ce031a418001101f2215450d07201520012903a80437030020152005360210201541086a2009290300370300201541146a20014190086a41ec0010ce031a201441016a221420024f0d0320014190086a41106a211620014190086a41146a21032001419c086a210c20014190086a41086a21054101211741012106034020014190086a2014109601024020052802002209410f470d00201441016a22142002490d010c040b2001290390082104200141a8046a200c41ec0010ce031a200141a0076a200141a8046a41ec0010ce031a201620093602002005200437030020012014360290082003200141a0076a41ec0010ce03210820042000520d05200141a0056a41086a220f200529030037030020012001290390083703a005200141c0056a200841ec0010ce031a200141b8036a41086a2210200f290300370300200120012903a0053703b80320014190086a200141c0056a41ec0010ce031a024020172006470d00201741016a22082017490d0e2017410174220f20082008200f491b2208ad4207862204422088a70d0e2004a7220f4100480d0e024002402017450d0020152017410774200f101e22150d010c0c0b200f101f2215450d0b0b200821170b201520064107746a220820012903b803370300200841086a2010290300370300200841106a2009360200200841146a20014190086a41ec0010ce031a200641016a2106201441016a22142002490d000c030b0b2006103c0b4100211741082115410021060b41072118201520064107746a21162006450d060c070b4101211741072118201541014107746a211641010d060c050b2016103c41072118201520064107746a211620060d050c040b41df88c0004133103a000b41df88c0004133103a000b41800141081020000b200f41081020000b0240201522142016460d00410021020c020b410121020c010b41082119200141a8046a41086a211a20014190086a41086a211b4104211c20014190086a410472211d410c211e200141a8046a410c6a211f411021204114212141ec0021224180012123410f21244116212541aeb9c00021264100212741f8b3c2002128417f21294202212a423e212b41fe00212c4102212d4200212e417e212f41ff002130423f2131420121324115213341a89cc0002134410521354103213641e8002137200141a8046a41e8006a213841e000213920014199086a213a4106213b4113213c41bd9cc000213d4101213e41f800213f42e80021404220214141172142412e2143411f214441987f2145411821464120214742e4cab5fbb6ccdcb0e3002148423821494160214a20014198056a214b41c000214c412c214d4124214e411c214f413421502015211441002151410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010206060b20014190086a41106a210620014190086a41146a21080340200141c0066a41086a2205201441086a290300370300200120142903003703c006201441106a280200210220014190086a201441146a41ec0010ce031a2002410f460d09200141a0056a41086a22092005290300370300200120012903c0063703a005200141c0056a20014190086a41ec0010ce031a2006200236020020014190086a41086a2009290300370300200120012903a005370390082008200141c0056a41ec0010ce031a2006103c20144180016a22142016470d000b410121020c560b02402017450d002015101d0b4117101f2202450d012002410f6a41002900f89c40370000200241086a41002900f19c40370000200241002900e99c4037000020024117412e101e2202450d0220022000370017200141b8036a41086a22064200370300200142003703b8032002411f200141b8036a1001200141c0066a41086a2006290300370300200120012903b8033703c00602400240200141c0066a411041f8b3c200410041001002417f460d00200142103702c4052001200141c0066a3602c00520014190086a200141c0056a109701200128029008220d450d052001290294082104200141c0066a411010092004422088a721062004a7210e0c010b4108210d410021064100210e0b2002101d200d200641e8006c22026a210902400240024002402002450d00200241987f6a210520014190086a41047221032001419c086a210c20014199086a210f20014198086a2110200d2102034020022802002106200141c0056a200241046a41dc0010ce031a20064110460d0220014190086a200141c0056a41dc0010ce031a0240024002402006410f470d0020050d010c020b200241e0006a2802002108200141a8046a20014190086a41dc0010ce031a20012006360290082003200141a8046a41dc0010ce031a200141003b01c005200141386a20014190086a200141c0056a108a0120012802382106200c2008360200200f2006453a0000201041063a0000200141053a00900820014190086a108b012005450d010b200241e8006a2102200541987f6a21050c010b0b200922022009470d020c030b200d22022009470d010c020b200241e8006a22022009460d010b20014190086a410472210503402002280200210620014190086a200241046a41e40010ce031a20064110460d01200141c0056a20014190086a41e40010ce031a20012006360290082005200141c0056a41e40010ce031a02402006410f460d0020014190086a103c0b200241e8006a22022009470d000b0b200e450d06200d101d410221020c550b20001098014108217342002174200141b8036a41086a22754200370300200142003703b8034117217641c59ec100217741c59ec1004117200141b8036a1001200141a0056a41086a22782075290300370300200120012903b8033703a0054100217941f8b3c200217a4110217b417f217c200141a0056a411041f8b3c200410041001002417f460d12200141a8046a410472217d4105217e20014190086a410572217f412021800120014190086a41206a21810120014190086a410472218201421021830120014190086a41086a218401410f21850141dc002186014118218701411521880141dfd9c0002189014220218a014128218b014106218c0141ff01218d01410c218e01200141a8046a410c6a218f01413021900120014190086a41306a219101412c21920120014190086a412c6a21930141072194014101219501411c219601413c2197014134219801412421990141e000219a01410d219b01418cb9c000219c014102219d014116219e0141869bc000219f01411e21a00141909fc10021a101411b21a201413b21a301413321a401412b21a501412321a60141f60021a70141d30021a80141cb0021a90141c30021aa0141db0021ab01415821ac01422821ad01413821ae01410121510c040b411741011020000b412e41011020000b41df88c0004133103a000b024020510e04000e0d0c0c0b201420206a2802002102201429020821042014280200210520014190086a201420216a202210ce031a201420236a211420022024460d44200141a0076a20014190086a202210ce031a201a2002360200200120043703a804201f200141a0076a202210ce031a200141c0056a200510990120012802c0052103024002400240200141c0056a20196a22522802002202450d00200220357421094200210b2003210242002153420021544200215542002156420021570340200141f8026a2002109a01200141f8026a20196a290300210720012903f8022104201d2002290000370000201d20196a200220196a290000370000201d20206a200220206a290000370000201d20466a200220466a2900003700002001200536029008200141e8026a2004200720014190086a109b0122062046742046752208201876200673203e6aad204986204987202e10d203200720537c2004200b7c220b200454ad7c2153202e200141e8026a20196a2903002204200820274822061b20557c202e20012903e802220720061b220a20547c2254200a54ad7c21552004202e20061b20577c2007202e20061b220420567c2256200454ad7c2157200220476a21022009204a6a22090d000b20012802c405450d020c010b420021564200215742002154420021554200210b4200215320012802c405450d010b2003101d0b200141c0056a200510990120012802c005210e02400240024020522802002202450d002002203574210c4200210a200e21024200211242002111420021584200211342002159034020014190086a20466a2208200220466a220f29000037030020014190086a20206a2203200220206a2210290000370300201b200220196a220d29000037030020012002290000370390082020101f2206450d0e200620196a20272900a49b403700002006202729009c9b40370000200620202047101e2206450d0d2006200536001020062047204c101e2206450d0c20062001290390083700142006204d6a20082903003700002006204e6a20032903003700002006204f6a201b290300370000200141b8036a20196a2209202e3703002001202e3703b80320062050200141b8036a1001200141c0066a20196a2009290300370300200120012903b8033703c006410021090240200141c0066a202020284100410010022029460d00200120273a00a005200141c0066a2020200141a0056a203e20271002203e6a203e4d0d0c20012d00a00521090b2006101d2008200f29000037030020032010290000370300201b200d2900003703002001200229000037039008200141c8026a200520014190086a20092046742206204475200973203e6a2020109c01200141c8026a20466a29030020127c20012903d8022204200a7c220a200454ad7c2112202e200141c8026a20196a2903002204200620467520274822061b20587c202e20012903c802220720061b225820117c2211205854ad7c21582004202e20061b20597c2007202e20061b220420137c2213200454ad7c2159200220476a2102200c204a6a220c0d000b20012802c405450d020c010b420021134200215942002111420021584200210a4200211220012802c405450d010b200e101d0b42002107200141b8036a20196a225a4200370300200142003703b80320262025200141b8036a1001200141c0066a20196a225b205a290300370300200120012903b8033703c00602400240200141c0066a202020282027202710022029460d002001202e370398082001202e37039008200141c0066a202020014190086a20202027100222022029460d05200220244d0d05201b290300210420012903900821070c010b420021040b024002400240200a200b7c220b202a88201220537c200b200a54ad7c220a202b86842212200b85200a202a882253200a8584500d002012205384500d004100210202400340200141b8026a200b200a2002201c6a202c7110d4032002202d6a210220012903b8022212200b85200141b8026a20196a2903002253200a8584500d012012205384202e520d000b0b200141a8026a200b200a2002202c7110d40320012903a802200141a8026a20196a290300842112420021532002450d012012420052ad2112034020014188026a200b200a20272002202f6a2206200620024b1b220220307110d40320014198026a2012203286225c203284225d20532032862012203188842253205d205310d203205c205d2001290398022001290388025620014198026a20196a290300221220014188026a20196a290300225e562012205e511b1b211220020d000c030b0b42002153200b200a84420052ad21120c010b2012420052ad21120b0240024002400240024002402007202a882004202b8684220b2007852004202a88220a20048584500d00200b200a84500d004100210202400340200141f8016a200720042002201c6a202c7110d4032002202d6a210220012903f801220b200785200141f8016a20196a290300220a20048584500d01200b200a84202e520d000b0b200141e8016a200720042002202c7110d40320012903e801200141e8016a20196a29030084210b4200210a2002450d01200b420052ad210b0340200141c8016a2007200420272002202f6a2206200620024b1b220220307110d403200141d8016a200b203286225c203284225d200a203286200b20318884220a205d200a10d203205c205d20012903d80120012903c80156200141d8016a20196a290300220b200141c8016a20196a290300225e56200b205e511b1b210b20020d000b201220538450450d020c030b4200210a2007200484420052ad210b201220538450450d010c020b200b420052ad210b2012205384500d010b205820557c201120547c2207201154ad7c2154205920577c201320567c2204201354ad7c2111204b2d00002202202d460d0102402002203e470d0003402053215320122155200b200a84202e510d0a200141a8016a200420112055205310d103200141b8016a20072054200b200a10d1034101215f20012903b801225620012903a801225754200141b8016a20196a2903002212200141a8016a20196a290300221354201220135122021b0d042057205654201320125420021b0d0220014198016a20562012200b200a10d20320014188016a205720132055205310d203200420012903880122127d2213201120014188016a20196a2903007d2004201254ad7d225684500d02205420014198016a20196a2903007d215720072001290398012204542102200720047d2112200b2104200a21112013210b2056210a2055210720532154201220572002ad7d22538450450d000c040b0b0340200141f8006a200720542012205310d103200b2255200a225684202e510d08200141f8006a20196a290300210b2001290378210a200141e8006a200420112055205610d1034101215f200a2001290368225754200b200141e8006a20196a290300221354200b20135122021b0d032057200a542013200b5420021b0d01200141d8006a200a200b2012205310d203200141c8006a205720132055205610d20320042001290348220b7d220a2011200141c8006a20196a2903007d2004200b54ad7d221384500d012054200141d8006a20196a2903007d2157200720012903582204542102200720047d210b2012210420532111200a2112201321532055210720562154200b20572002ad7d220a8450450d000c030b0b4100215f0c010b2004200756201120545620112054511b215f0b4200210a205a4200370300200142003703b80320342033200141b8036a1001205b205a290300370300200120012903b8033703c0060240200141c0066a202020282027202710022029460d002001202e37039008200141c0066a202020014190086a201920271002203e6a20194d0d07200129039008210a0b20014190086a200510990120012802900821602001280294082161201b2802002262450d432060206220357422636a2164205f203e732165206021020340200141e8036a20466a2266200220466a2206290000370300200141e8036a20206a2267200220206a2209290000370300200141e8036a20196a2268200220196a2208290000370300200120022900003703e80320082900002104200929000021072002290000210b20014188046a20466a2203200629000037030020014188046a20206a220c200737030020014188046a20196a220f20043703002001200b3703880420022900002104201d20466a22692006290000370000201d20206a226a2009290000370000201d20196a226b2008290000370000201d2004370000200120053602900841002106024020014190086a109b012046742046752209410048206573203e470d00200141c8036a20466a2003290300370300200141c8036a20206a200c290300370300200141c8036a20196a200f29030037030020012001290388043703c803410121062009216c0b200141c0056a20466a226d200141c8036a20466a2210290300370300200141c0056a20206a226e200141c8036a20206a220d2903003703002052200141c8036a20196a220e290300370300200120012903c8033703c005024020060d00200220476a21022063204a6a22630d010c450b0b200141c0066a20466a226f206d290300370300200141c0066a20206a2270206e290300370300205b2052290300370300200120012903c0053703c006200220476a2102206020622035746a21630340200141a0056a20466a2206206f290300370300200141a0056a20206a22092070290300370300200141a0056a20196a2208205b290300370300200120012903c0063703a00520014190086a20466a200629030037030020014190086a20206a2009290300370300201b2008290300370300200120483703b806200120012903a00537039008200141b8066a20014190086a200a206c204674204675201876206c73203e6aad2049862049877e20007c109d0120022064460d4403402066200220466a22062900003703002067200220206a22092900003703002068200220196a2208290000370300200120022900003703e80320032006290000370300200c2009290000370300200f20082900003703002001200229000037038804200120053602900820082900002104200929000021072002290000210b20692006290000370000206a2007370000206b2004370000201d200b37000041002106024020014190086a109b012046742046752209410048206573203e470d0020102003290300370300200d200c290300370300200e200f29030037030020012001290388043703c803410121062009216c0b206d2010290300370300206e200d2903003703002052200e290300370300200120012903c8033703c005024020060d002063200220476a2202470d010c460b0b206f206d2903003703002070206e290300370300205b2052290300370300200120012903c0053703c006200220476a21020c000b0b410321020c4f0b410221020c4e0b410121020c4d0b41df88c0004133103a000b41b8a7c400102c000b41b8a7c400102c000b41df88c0004133103a000b41df88c0004133103a000b41c00041011020000b412041011020000b411041011020000b0240024002400240024002400240024002400240024020c501450d0020c40120c20120ce01746a210220c40120c20120df016a20ce01746a2106034020c20120c7014f0d04200141c0056a20022802002205109e0120012903c00520d001520d02200141a8046a20cc0120d10110ce031a20012903c006220a20012903a804220b54200141c0066a20cb016a2903002207200141a8046a20cb016a29030022045420072004511b450d03200120cf013a00e80320df0120c2016a220520c7014f0d0520062002280200360200200220d2016a2102200620d2016a210620c70120c20120cf016a22c201470d000c110b0b20c40120c20120ce01746a2102034020c20120c7014f0d03200141c0056a20022802002205109e0120012903c00520d001520d01200141a8046a20cc0120d10110ce031a20012903c006220a20012903a804220b5a200141c0066a20cb016a2903002207200141a8046a20cb016a29030022045a20072004511b0d02200120cf013a00e803200220d2016a210220c70120c20120cf016a22c201470d000c0f0b0b20df0120de016a21df0120c50120cf016a21c50120c20120cf016a22c20120c701470d060c0e0b20c20120cf016a21c2012001200a200b7d3703c0062001200720047d200a200b54ad7d3703c80620d301101f2202450d02200220d4016a20cd012f00eaa8413b0000200220cb016a20cd012900e2a841370000200220cd012900daa841370000200220d30120d501101e2202450d0320022005360012200141b8036a20cb016a220620d601370300200120d6013703b803200220d701200141b8036a1001200141a0056a20cb016a2006290300370300200120012903b8033703a005200141a0056a20d40110092002101d20ca01200141a8046a20d4016a290300200141a8046a20d8016a290300109401200141186a20c901200b2004109f01200141a0076a20cb016a220220d90120022903002207200141186a20cb016a2903007c20012903a007220a20012903187c2212200a542202ad7c220a2002200a200754200a2007511b22021b370300200120d901201220021b3703a00720da01200437030020db01200b37030020014190086a20cb016a20ce013a000020dc01200536020020c80120c90129000037000020c80120cb016a20c90120cb016a29000037000020c80120d4016a20c90120d4016a29000037000020c80120d8016a20c90120d8016a290000370000200120dd013a00900820014190086a108b0120df0120de016a21df0120c50120cf016a21c50120c20120c701470d040c0d0b41c8aac30020c20120c701104b000b41d8aac300200520c701104b000b411241011020000b412441011020000b410321510c010b410321510c010b410321020c450b410321020c440b20c1012903002104410021020240024002400240024020bb01a7220620bd01460d002006450d014100210203402002200620bd0176220520026a2209200420b201200920b801746a290300541b2102200620056b220620bd014b0d000b0b200420b201200220b801746a22062903002207520d0120bb012002ad580d022006200620bc016a200220be017320bb01a76a20b8017410cf031a20b30120b7018320bb0120ba018620bf017c8421b30120bb0120c0017c21bb0120c10120bc016a22c10120b901470d030c060b410010a001000b200220042007566a10a001000b41b0aac300102c000b41022151410321020c430b20012083013702c4052001200141a0056a3602c00520014190086a200141c0056a10a1012001280290082202450d0c2001280294082109410f210602400240024002402084012802002205450d0020022903002000520d0020014188046a2087016a220820022080016a29000037030020014188046a207b6a220320022087016a29000037030020014188046a20736a220c2002207b6a29000037030020012002290008370388042005207c6a2206ad20ad017e2204208a0188a70d122004a72205207c4c0d12024002402005450d002005101f220f0d010c1c0b4108210f0b200f2002208b016a200510ce03210520840120063602002001200636029408200120053602900820752074370300200120743703b80320772076200141b8036a100120782075290300370300200120012903b8033703a0052001207b3602c4052001200141a0056a3602c00520014190086a200141c0056a10a20102402006450d002005101d0b200141c0066a2087016a220f2008290300370300200141c0066a207b6a22102003290300370300200141c0066a20736a220d200c29030037030020012001290388043703c006208701101f2206450d1b2006207b6a20792900ec9e41370000200620736a20792900e49e41370000200620792900dc9e41370000200620870120ae01101e2205450d1c200520012903c00637001820052090016a200f2903003700002005208b016a201029030037000020052080016a200d29030037000020752074370300200120743703b803200520ae01200141b8036a100120782075290300370300200120012903b8033703a00502400240200141a0056a207b207a207920791002207c460d0020012083013702ec032001200141a0056a3602e80320014190086a200141e8036a10a3012001280290082206208501460d1f200141c0056a20820120860110ce031a200141a0056a207b10090c010b410f21060b200141a8046a200141c0056a20860110ce031a2006208501470d012005101d410f21060b2009450d020c010b200141a0076a200141a8046a20860110ce031a2005101d200141c8036a2087016a2008290300370300200141c8036a207b6a2003290300370300200141c8036a20736a200c29030037030020012001290388043703c8032009450d010b2002101d0b2006208501460d00200120063602a804207d200141a0076a20860110ce031a200141c0066a2087016a220e200141c8036a2087016a290300370300200141c0066a207b6a2252200141c8036a207b6a290300370300200141c0066a20736a2265200141c8036a20736a290300370300200120012903c8033703c00620752074370300200120743703b803208901208801200141b8036a100120782075290300370300200120012903b8033703a00502400240024002400240200141a0056a207b207a207920791002207c460d0020012083013702c4052001200141a0056a3602c00520014190086a200141c0056a10a401200128029008226d450d162001290294082204208a0188a7226e208b016c2209450d020c010b420021044108216d4200208a0188a7226e208b016c2209450d010b4100210d41002110206d2106034020014190086a2087016a2205200e29030037030020014190086a207b6a220820522903003703002084012065290300370300200120012903c00637039008208101200629000037000020810120736a2203200620736a290000370000208101207b6a220c2006207b6a2900003700002081012087016a220f20062087016a29000037000020a201101f2202450d09200220766a20792800d390413600002002207b6a20792900cc9041370000200220736a20792900c49041370000200220792900bc9041370000200220a20120a301101e2202450d0a200220012903900837001b200220a4016a2005290300370000200220a5016a2008290300370000200220a6016a208401290300370000200220a30120a701101e2202450d0b200220810129000037003b200220a8016a200f290000370000200220a9016a200c290000370000200220aa016a200329000037000020752074370300200120743703b803200220ab01200141b8036a100120782075290300370300200120012903b8033703a005024002400240200141a0056a207b207a207920791002207c470d00410221052002101d4102208d0171209d01470d010c020b200120793a00c005200141a0056a207b200141c0056a209501207910022095016a2095014d0d0e20012d00c0052105200141a0056a207b10092002101d2005208d0171209d01460d010b200d2005209501716a210d20102005207c73209501716a21100b2006208b016a2106200920ac016a22090d000b206e20106b21022004a7450d020c010b410021104100210d206e41006b21022004a7450d010b206d101d0b2002200d6b210202400240024002400240024020012802a804208c01470d00200141a8046a20736a2d0000208d0171208c01470d00208f0128020021062091012002360200209301201036020020014190086a208b016a200d360200207f20012903c006370000207f20736a2065290300370000207f207b6a2052290300370000207f2087016a200e290300370000200120793a00940820012094013a00900820014190086a108b0120022010720d0120014190086a208e016a2006360200208401207e3a00002001207e3a00900820014190086a108b01200610a5010c010b200141e8036a2087016a200e290300370300200141e8036a207b6a2052290300370300200141e8036a20736a2065290300370300200120012903c0063703e8032091012002360200209301201036020020014190086a208b016a200d360200207f20012903c006370000207f20736a2065290300370000207f207b6a2052290300370000207f2087016a200e29030037000020012095013a00940820012094013a00900820014190086a108b01200d200220106a4d0d00209601101f2206450d1f20062087016a207928008c9f413600002006207b6a20792900849f41370000200620736a20792900fc9e41370000200620792900f49e413700002006209601209701101e2206450d20200620012903c00637001c20062098016a200e29030037000020062092016a205229030037000020062099016a20652903003700004200210420754200370300200142003703b8032006209701200141b8036a100120782075290300370300200120012903b8033703a005200141a0056a207b10092006101d420021072010450d0220752074370300200120743703b80320a10120a001200141b8036a100120782075290300370300200120012903b8033703a005200141a0056a207b207a207920791002207c460d012001207437039008200141a0056a207b20014190086a2073207910022095016a20734d0d1220012903900821070c020b200141a8046a103c0c020b420021070b200141c0056a200141a8046a209a0110ce031a20754200370300200142003703b803209c01209b01200141b8036a100120782075290300370300200120012903b8033703a0050240200141a0056a207b207a207920791002207c460d002001207437039008200141a0056a207b20014190086a2073207910022095016a20734d0d0d20012903900821040b20752074370300200120743703b803209f01209e01200141b8036a100120782075290300370300200120012903b8033703a00502400240200141a0056a207b207a207920791002207c460d002001207437039008200141a0056a207b20014190086a2073207910022095016a20734d0d0f200129039008210b0c010b42e807210b0b20014190086a200141c0056a209a0110ce031a200141a0056a200b20047c20014190086a209d0120950120022010721b200710950120012802a005209501470d0020012802a40522020d010b20752074370300200120743703b80320772076200141b8036a100120782075290300370300200120012903b8033703a005200141a0056a207b207a207920791002207c470d330c010b2078280200210641ae9fc100410f100a20022006100a0b200141286a41878bc0004110108f01200129033021af0120012802282106200141a0056a41086a22024200370300200142003703a00541b895c0004115200141a0056a100120014190086a41086a2002290300370300200120012903a005370390080240024020014190086a411041f8b3c200410041001002417f460d00200141003a00c00520014190086a4110200141c0056a41014100100241016a41014d0d2420012d00c0050d010b4108101f2202450d2820024200370300200142818080801037029408200120023602900841978bc000411520014190086a10a6012002101d4108101f2202450d2920024200370300200142818080801037029408200120023602900841cd95c000411620014190086a10a6012002101d200141a0056a41086a22024200370300200142003703a00541f78ac0004110200141a0056a100120014190086a41086a22052002290300370300200120012903a00537039008200142003703c00520014190086a4110200141c0056a41081003200141013a00c00520024200370300200142003703a00541b895c0004115200141a0056a100120052002290300370300200120012903a0053703900820014190086a4110200141c0056a410110030b410821b001420021b101200141a0056a41086a22024200370300200142003703a00541978bc0004115200141a0056a100120014190086a41086a2002290300370300200120012903a00537039008024020014190086a411041f8b3c200410041001002417f460d00200142103702ac04200120014190086a3602a804200141c0056a200141a8046a10a70120012802c00522b001450d2420012902c40521b1010b410821b201420021b301200141a0056a41086a22024200370300200142003703a00541cd95c0004116200141a0056a100120014190086a41086a2002290300370300200120012903a00537039008024020014190086a411041f8b3c200410041001002417f460d00200142103702ac04200120014190086a3602a804200141c0056a200141a8046a10a70120012802c00522b201450d2520012902c40521b3010b200141a0056a41086a22024200370300200142003703a00541e395c0004114200141a0056a100120014190086a41086a2002290300370300200120012903a0053703900802400240024020014190086a411041f8b3c200410041001002417f460d00200142003703c00520014190086a4110200141c0056a41084100100241016a41084d0d14420120012903c00522042004501b21b40120b101422088a721b50120060d020c010b42e50021b40120b101422088a721b50120060d010b20b501417f6a220220b5014b0d1d200220b5014f0d1d20b00120024103746a2202450d1d200229030021af010b410020b50141016a220220b401a76b2206200620024b1b22b60120b5014b0d1d42ffffffff0f21b701410321b80120b00120b6014103746a21b90120b601450d00422021ba0120b30142208821bb01410821bc01410121bd01417f21be0142808080807021bf01427f21c00120b00121c101410221510c320b20b10120b701832104024020b50120b6016b2202450d00024020b601450d0020b00120b901200241037410cf031a0b2002ad42208620048421040b41002102024020b3014220882207a72208450d00024020084101460d004100210220082106034020022006410176220520026a220920af0120b20120094103746a290300541b2102200620056b220641014b0d000b0b2002200220af0120b20120024103746a290300220b566a20af01200b511b220220084b0d210b02400240024002400240024002400240200820b301a7470d00200841016a22062008490d492007a722094101742205200620062005491bad22b301420386220b422088a70d49200ba722064100480d4902402008450d0020b20120094103742006101e22b201450d020c010b2006101f22b201450d010b20b20120024103746a220641086a2006200820026b41037410cf031a200620af013703002004a72004422088220ba72202470d02200241016a22062002490d4820024101742205200620062005491bad2204420386220a422088a70d48200aa722064100480d482002450d0120b00120024103742006101e22b001450d030c020b200641081020000b2006101f22b001450d010b20b00120024103746a20af01370300200742017c220aa72202450d212002410176220620024f0d2220b20120064103746a2903002107024020024101710d002006417f6a220620024f0d2d20b20120064103746a29030020077c42018821070b20b30142ffffffff0f83200a42208684210a2001200b42017c220b422086200442ffffffff0f838437029408200120b0013602900841978bc000411520014190086a10a60102402004a7450d0020b001101d0b2001200a37029408200120b2013602900841cd95c000411620014190086a10a601024020b301a7450d0020b201101d0b200141a0056a41086a22094200370300200142003703a00541f78ac0004110200141a0056a100120014190086a41086a22022009290300370300200120012903a00537039008200120073703c00520014190086a4110200141c0056a41081003200b42ffffffff0f8320b401520d0320094200370300200142003703a005418cb9c000410d200141a0056a100120022009290300370300200120012903a0053703900842002104024020014190086a411041f8b3c200410041001002417f460d00200142003703c00520014190086a4110200141c0056a41084100100241016a41084d0d1720012903c00521040b200141a0056a41086a22024200370300200142003703a00541cb96c0004117200141a0056a100120014190086a41086a2002290300370300200120012903a0053703900820014190086a411041f8b3c200410041001002417f460d01200142003703c00520014190086a4110200141c0056a41084100100241016a41084d0d1720012903c005210b0c020b200641081020000b42e807210b0b200720b4014201887c200b7c2004560d0020014190086a108001200128029008210820012802940821c2010240024002402001280298082202450d0020024105742206410575220cad42287e2204422088a70d452004a722054100480d452005101f2203450d31200820066a210f2002410574210520032102200821060340200641086a2900002104200641106a29000021072006290000210b200241186a200641186a290000370000200241106a2007370000200241086a20043700002002200b370000200241206a4201370300200241286a2102200641206a2106200541606a22050d000b200f20086b41606a41057641016a210220c201450d020c010b4100210c410821034100210220c201450d010b2008101d0b42002104200141a0056a41086a22064200370300200142003703a00541f78ac0004110200141a0056a1001200141b8036a41086a2006290300370300200120012903a0053703b8030240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d1c20012903900821040b20012002360298082001200c36029408200120033602900820014190086a20b401427f7c4201200410a8010b200141b8036a41086a22024200370300200142003703b80341eb96c100411d200141b8036a100120092002290300370300200120012903b8033703a0050240200141a0056a411041f8b3c200410041001002417f460d00200142103702c4052001200141a0056a3602c00520014190086a200141c0056a10a90120012903a00822044202510d25200141b8086a2802002103200141b4086a280200210d200141b0086a2802002110200129039808211202400240024002400240024020012903900822112000520d002003ad221342287e2207422088a741004721062007a721020240024002400240024020044201520d0020060d182002417f4c0d1820012903a80821132002450d012002101f2208450d3a2003450d030c020b20060d172002417f4c0d172002450d052002101f2208450d3a410021c2014100210520030d060c070b410821082003450d010b200341286c21094100210520082102201021060340200641086a2903002104200641106a2903002107200641186a290300210b2006290300210a200241206a200641206a290300370300200241186a200b370300200241106a2007370300200241086a20043703002002200a370300200241286a2102200541016a2105200641286a2106200941586a22090d000c020b0b410021050b200141b0086a2012370300200141a8086a2013370300200141a4086a2005360200200141a0086a20033602002001419c086a200836020020014198086a4101360200200141023a00900820014190086a108e010b201220117c2000520d040c030b41082108410021c201410021052003450d010b200341286c21094100210520082102201021060340200641086a2903002104200641106a2903002107200641186a290300210b2006290300210a200241206a200641206a290300370300200241186a200b370300200241106a2007370300200241086a20043703002002200a370300200241286a2102200541016a2105200641286a2106200941586a22090d000b0b200141a8086a20123703002001419c086a200836020020014198086a20c201360200200141a0086a2005ad422086201384370300200141023a00900820014190086a108e01201220117c2000520d010b2003ad42287e2204422088a70d0e2004a72202417f4c0d0e0240024002402002450d002002101f22c201450d31410021054100210920030d010c020b410821c20141002105410021092003450d010b200341286c21084100210920c2012102201021060340200641086a2903002104200641106a2903002107200641186a290300210b2006290300210a200241206a200641206a290300370300200241186a200b370300200241106a2007370300200241086a20043703002002200a370300200241286a2102200941016a2109200641286a2106200841586a22080d000b0b2001419c086a200936020020014190086a41086a22082003360200200120c20136029408200141093a00900820014190086a108b0102402003450d002010200341286c6a210f4100210520102102034020014190086a41186a2203200241186a29030037030020014190086a41106a22c201200241106a2903003703002008200241086a2903003703002001200229030037039008200241206a29030021042001410e3602ac04200141988ec1003602a804200141c0056a2005200141a8046a107e200141c0056a41086a280200210c20012802c00521094120101f2206450d112006200129039008370000200641186a2003290300370000200641106a20c201290300370000200641086a20082903003700002006412041c000101e2206450d12200620043700202009200c2006412810032006101d024020012802c405450d002009101d0b200541016a2105200241286a2202200f470d000b0b0240200d450d002010101d0b2001410e3602c405200141988ec1003602c00520014190086a41a68ec100200141c0056a108101410021c20102402001280290082202200128029808220641f8b3c200410041001002417f460d00200141003602c00520022006200141c0056a41044100100241016a41044d0d2220012802c00521c2010b0240200128029408450d002002101d0b024020c20120054d0d0020014198086a21032005210203402001410e3602c405200141988ec1003602c00520014190086a41a68ec100200141c0056a10810141002109024020012802900822062003280200220841f8b3c200410041001002417f460d00200141003602c00520062008200141c0056a41044100100241016a41044d0d0c20012802c00521090b0240200128029408450d002006101d0b200241016a21060240200920024d0d002001410e3602c405200141988ec1003602c00520014190086a2002200141c0056a107e200128029008220220032802001009200128029408450d002002101d0b2006210220c2012006470d000b0b2001410e3602c405200141988ec1003602c00520014190086a41a68ec100200141c0056a10810120012802980821062001280290082102200120053602c00520022006200141c0056a410410030240200128029408450d002002101d0b200141b8036a41086a22024200370300200142003703b80341eb96c100411d200141b8036a1001200141a0056a41086a2002290300370300200120012903b8033703a005200141a0056a411010090c010b200d450d002010101d0b200141b8036a41086a22024200370300200142003703b80341a8bcc1004114200141b8036a1001200141a0056a41086a2002290300370300200120012903b8033703a00502400240200141a0056a411041f8b3c200410041001002417f460d002001420037039008200141a0056a411020014190086a41084100100241016a41084d0d1320012903900822044200510d27420021c30120002004824200520d040c010b420021c30120004201824200520d030b200141b8036a41086a220220c301370300200120c3013703b80341cea8c100410c200141b8036a1001200141a0056a41086a22062002290300370300200120012903b8033703a00502400240200141a0056a411041f8b3c200410041001002417f460d0020014200370398082001420037039008200141a0056a411020014190086a4110410010022205417f460d2b2005410f4d0d2b20014198086a290300210420012903900821070c010b42002107420021040b200120073703c006200120043703c806200141a8086a200437030020014190086a41106a200737030020014190086a41086a41013a00002001410a3a00900820014190086a108b01200141003a00e803200142003703a807200142003703a00720024200370300200142003703b80341bcbcc1004112200141b8036a100120062002290300370300200120012903b8033703a0050240200141a0056a411041f8b3c200410041001002417f460d00200142103702c4052001200141a0056a3602c00520014190086a200141c0056a10aa0120012802900822c401450d2c2001200129029408220437028c04200120c40136028804410021c50120014100360290042004a721c6012004422088a722c701450d0220014199086a21c801200141e8046a21c901200141c8046a21ca01410821cb01200141c0056a41086a21cc01410021cd01410221ce01410121cf01420121d00141e00021d101410421d201411221d301411021d401412421d501420021d601411621d701411821d801427f21d901200141c8086a21da01200141c0086a21db01200141bc086a21dc01410a21dd01417f21de01410021df01410021c501410021c201410321510c330b410021c70120014100360290042001420437038804410421c401410021c6010b410021c5010b20014188046a41086a20c70120c5016b36020020014188046a10ab01024020c601450d0020c401101d0b20012903a007200141a0076a41086a29030010ac01024020012d00e8030d0042002104200141b8036a41086a22144200370300200142003703b80341cebcc100410d200141b8036a1001200141a0056a41086a2014290300370300200120012903b8033703a0050240200141a0056a411041f8b3c200410041001002417f460d002001410036029008200141a0056a411020014190086a41044100100241016a41044d0d2a20013502900821040b200141086a20012903c006222e42002004420010d203200141c0066a41086a2214201429030022042004420042edeb82bdef9804200129030842c0843d8020012903104200521b2232202e5641002004501b22141b22077d202e202e203220141b220454ad7d3703002001202e20047d3703c006200141a8086a2007370300200141a0086a200437030020014190086a41086a41033a00002001410a3a00900820014190086a108b010b20012903c006212e200141a8086a200141c0066a41086a221429030037030020014190086a41106a202e37030020014190086a41086a41043a00002001410a3a00900820014190086a108b012014290300212e20012903c0062104200141b8036a41086a22144200370300200142003703b80341cea8c100410c200141b8036a1001200141a0056a41086a2014290300370300200120012903b8033703a0052001202e370398082001200437039008200141a0056a411020014190086a411010030b200141a0056a41086a221420c301370300200120c3013703a00541e0f2c1004111200141a0056a1001200141b8036a41086a2014290300370300200120012903a0053703b803200141b8036a4110100920014190096a24000f0b411b41011020000b413b41011020000b41f60041011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b102e000b412041011020000b41c00041011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200541081020000b411841011020000b413841011020000b41df88c0004133103a000b411c41011020000b413c41011020000b41df88c0004133103a000b41f795c0004126103a000b41b0aec400102c000b4198d8c200102c000b4180d1c20020062002104b000b41df88c0004133103a000b41c8aec400102c000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41ecd8c300102c000b410841081020000b410841081020000b4180d1c20020062002104b000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200241081020000b200541081020000b200241081020000b200241081020000b41012151410321020c0f0b410321020c0e0b410321020c0d0b02402061450d002060101d0b200510a5010240024002400240024002400240205f450d0020014190086a201e6a22022005360200201b20363a0000200120353a00900820014190086a108b0120382903002204500d01200141c0056a200141a8046a203f10ce031a200141a0056a200420007c220410ad0120014190086a200141c0056a203f10ce031a200141c0066a201b203910ce031a20012802a4052208200141a0056a20196a22062802002202470d022002203e6a22092002490d142002203e742208200920092008491b2208ad20407e2207204188a70d142007a722032027480d142002450d0320012802a005200220376c2003101e22090d040c0a0b20014190086a201e6a2005360200201b201c3a0000200120353a00900820014190086a108b01205a202e3703002001202e3703b803203d203c200141b8036a1001205b205a290300370300200120012903b8033703c00620012005203e6a36029008200141c0066a202020014190086a201c1003201a103c20142016470d0c0c050b20014190086a201a203910ce031a200120273b01c005200141c0006a20014190086a200141c0056a108a012001280240210620022005360200203a2006453a0000201b203b3a0000200120353a00900820014190086a108b01205a202e3703002001202e3703b803203d203c200141b8036a1001205b205a290300370300200120012903b8033703c00620012005203e6a36029008200141c0066a202020014190086a201c100320142016470d0a0c040b20012802a00521090c020b2003101f2209450d060b200120083602a405200120093602a0050b2009200220376c220f6a200141c0066a203910ce03210320062002203e6a220c360200200320396a20053602002042101f2202450d02200220246a20272900f89c40370000200220196a20272900f19c40370000200220272900e99c40370000200220422043101e2202450d0320022004370017205a202e3703002001202e3703b80320022044200141b8036a1001205b205a290300370300200120012903b8033703c00620012020360294082001200141c0066a36029008200141a0056a20014190086a10ae012002101d0240200c450d00200f20376a2106200921020340024020022802002024460d002002103c0b200220376a2102200620456a22060d000b0b02402008450d002009101d0b205a202e3703002001202e3703b803203d203c200141b8036a1001205b205a290300370300200120012903b8033703c00620012005203e6a36029008200141c0066a202020014190086a201c100320142016470d050b201621140b20142016470d070c060b411741011020000b412e41011020000b200341081020000b410021510c040b410021510c040b410021510c040b410121020c040b410021020c030b410321020c020b410321020c010b410321020c000b0b1021000ba00905027f017e037f027e097f230041d0006b220124004108210242002103200141186a41086a220442003703002001420037031841ddb8c000410d200141186a1001200141086a41086a2004290300370300200120012903183703084100210502400240024002400240024002400240024002400240200141086a411041f8b3c200410041001002417f460d00200142103702442001200141086a360240200141186a200141c0006a10d30120012802182202450d05200129021c2103200141186a41206a200041206a290300370300200141186a41186a200041186a290300370300200141186a41106a200041106a290300370300200141186a41086a200041086a290300370300200120002903003703182003422088a722052003a7470d02200141186a210020052003a7460d010c070b200141186a41206a200041206a290300370300200141186a41186a200041186a290300370300200141186a41106a200041106a2903003703002004200041086a29030037030020012000290300370318200141186a210041004200a7470d060b200541016a22042005490d0720054101742206200420042006491bad220742287e2208422088a70d072008a722044100480d072005450d012002200541286c2004101e2202450d020c040b200141186a21000c050b2004101f22020d020b200441081020000b41df88c0004133103a000b20034280808080708320078421030b2003422088a721050b2002200541286c22066a22042000290300370300200441206a200041206a290300370300200441186a200041186a290300370300200441106a200041106a290300370300200441086a200041086a290300370300200141186a41086a220942003703002001420037031841ddb8c000410d200141186a1001200141086a41086a20092903003703002001200129031837030820014100360248200142013703402001200541016a220a360218200141186a200141c0006a106202400240200a450d00200641286a210b200141c0006a41086a220c28020021002001280244210d200221060340200141186a200610d4012001280218210e0240024002400240200d20006b2009280200220f4f0d002000200f6a22042000490d07200d4101742210200420042010491b22114100480d07200d450d012001280240200d2011101e22100d020c080b2000200f6a2104200128024021100c020b2011101f2210450d060b20012011360244200120103602402011210d0b200c2004360200201020006a200e200f10ce031a0240200128021c450d00200e101d0b200641286a210620042100200b41586a220b0d000c020b0b200141c0006a41086a28020021042001280244210d200128024021100b200141086a41102010200410030240200d450d002010101d0b0240200a450d00200541286c41286a2104200221000340024020002d00002206450d00024020064101470d00200041086a280200450d01200041046a280200101d200041286a2100200441586a22040d020c030b200041106a280200450d002000410c6a280200101d0b200041286a2100200441586a22040d000b0b02402003a7450d002002101d0b200141d0006a24000f0b1021000b201141011020000bbd0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1001200341086a2005290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d002003420037031020034110200341106a41084100100241016a41084d0d0220032903102106200341101009420121040c010b0b2000200437030020002006370308200341206a24000f0b41df88c0004133103a000be096012f017f027e027f037e0e7f017e027f017e037f017e027f037e187f027e027f037e167f017e027f037e1d7f027e057f017e087f037e0e7f037e027f017e127f017e027f027e017f027e017f017e097f017e087f017e047f027e0b7f027e027f230041d0086b2202240002400240024002400240024002400240024002402001450d00200241e8036a41086a22014200370300200242003703e80341a590c1004117200241e8036a1001200241f0056a41086a2001290300370300200220022903e8033703f0050240024002400240024002400240200241f0056a411041f8b3c200410041001002417f460d00200242003703f806200241f0056a4110200241f8066a41084100100241016a41084d0d0220022903f80621030c010b420321030b200241e8036a41086a22014200370300200242003703e8034195a8c1004115200241e8036a1001200241f8066a41086a2001290300370300200220022903e8033703f80602400240200241f8066a411041f8b3c200410041001002417f460d00200242003703f005200241f8066a4110200241f0056a41084100100241016a41084d0d034200210420022903f00520037e22034200510d010c050b4200210442e80720037e22034200520d040b200241e8036a41086a22012004370300200220043703e80341c2ecc100411c200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f0040240200241f0046a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022201417f460d032001410f4d0d0320024180076a290300210320022903f80621040c050b420021030c040b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b2000200320032000541b22002004510d0442002104200241e8036a41086a22014200370300200242003703e80341c2ecc100411c200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f0042003421086200080210002400240200241f0046a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022201417f460d052001410f4d0d0520024180076a290300210320022903f80621040c010b420021030b200241a0036a200420032000420010d20320022903a003421088200241a8036a2903002200423086842104200042108821030b200241e8036a41086a22014200370300200242003703e80341deecc1004118200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022206417f460d032006410f4d0d0320024180076a290300210720022903f80621000c010b42002100420021070b20014200370300200242003703e80341deecc1004118200241e8036a100120052001290300370300200220022903e8033703f0042002200020047c22043703f8062002200720037c2004200054ad7c37038007200241f0046a4110200241f8066a411010030b200241e8036a41086a22014200370300200242003703e8034181a8c1004114200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004420021040240024002400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0120022903f80621040b20014200370300200242003703e80341e0d7c1004115200241e8036a100120052001290300370300200220022903e8033703f0040240200241f0046a411041f8b3c200410041001002417f460d00200241f0046a411010090c070b200241e8036a41086a22014200370300200242003703e80341f6ecc100411b200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004420021000240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0220022903f80621000b20014200370300200242003703e8034191edc1004116200241e8036a100120052001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0420022903f80622034200520d0141d880c400102c000b42e80721030b200420007d2003824200520d070c060b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41c080c400102c000b20024188036a41deecc100411810e3010240024002400240200229039003220820024188036a41106a290300220984500d00200228028803450d01200241e8036a41086a22014200370300200242003703e80341a7edc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f0044100210a02400240024002400240200241f0046a411041f8b3c200410041001002417f460d00200242103702f4052002200241f0046a3602f005200241f8066a200241f0056a105e20022802f806220b450d0220022802fc06210c20024180076a280200220a41057422010d010c040b4101210b4100210c41004105742201450d020b200b20016a210d4120210e4112210f41102110410021114108211241322113412a21144118211541222116411a21174200211841f8b3c2002119417f211a4201211b200241a0076a211c4130211d2002419c076a211e4210211f200b2120410021210c050b41df88c0004133103a000b410021010c040b410021010c030b410121010c020b410121010c010b410321010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010212120b200241e8016a20082009200aad2203420010d20320024190076a2009370300200241f8066a41106a2008370300200241f8066a41086a41003a0000200241043a00f806200241f8066a108b01200241e8036a41086a22014200370300200242003703e80341bdedc1004111200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004200241f0046a411041f8b3c2004100410010022101200241e8016a41086a290300210420022903e8012100024002402001417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022201417f460d0f2001410f4d0d0f20024180076a290300210720022903f80621220c010b42002122420021070b200241d8016a202220072003420010d20302402000200484500d0020022903d8012203200241d8016a41086a290300222284500d0042002107200241e8036a41086a22014200370300200242003703e80341aeb9c0004116200241e8036a1001200241f0056a41086a22052001290300370300200220022903e8033703f00502400240200241f0056a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0056a4110200241f8066a4110410010022206417f460d112006410f4d0d1120024180076a290300212420022903f80621230c010b42002123420021240b200241c8016a202320037d202420227d2023200354ad7d2003202210d103200241b8016a20022903c801200241c8016a41086a2903002000200410d20320014200370300200242003703e80341cea8c100410c200241e8036a100120052001290300370300200220022903e8033703f005200241f0056a411041f8b3c2004100410010022101200241b8016a41086a290300210420022903b8012100024002402001417f460d002002420037038007200242003703f806200241f0056a4110200241f8066a4110410010022201417f460d122001410f4d0d1220024180076a290300210320022903f80621070c010b420021030b200241e8036a41086a22014200370300200242003703e80341cea8c100410c200241e8036a1001200241f0056a41086a2001290300370300200220022903e8033703f0052002200720007c22003703f8062002200320047c2000200754ad7c37038007200241f0056a4110200241f8066a411010030b200c450d12200b101d410121010c3c0b200241e8036a41086a22014200370300200242003703e80341ceedc1004112200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0320022903f80642017c21040c010b420121040b200241e8036a41086a22014200370300200242003703e80341ceedc1004112200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004200220043703f806200241f0046a4110200241f8066a4108100320014200370300200242003703e80341e0edc100411a200241e8036a100120052001290300370300200220022903e8033703f0040240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d03200220022903f80622043703f005200241e8036a41086a22014200370300200242003703e8034191edc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d06200420022903f806520d010c020b200442e807510d010b200241e8036a41086a22014200370300200242003703e8034191edc1004116200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004200220043703f806200241f0046a4110200241f8066a4108100320014200370300200242003703e8034181a8c1004114200241e8036a100120052001290300370300200220022903e8033703f004420021040240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0820022903f80621040b20014200370300200242003703e80341f6ecc100411b200241e8036a100120052001290300370300200220022903e8033703f004200220043703f806200241f0046a4110200241f8066a410810030b200241e8036a41086a22014200370300200242003703e80341faedc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004410021250240200241f0046a411041f8b3c200410041001002417f460d00200241003602f806200241f0046a4110200241f8066a41044100100241016a41044d0d0520022802f80621250b200241e8036a41086a22014200370300200242003703e8034190eec100411d200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004024002400240200241f0046a411041f8b3c200410041001002417f460d00200241003602f80641012126200241f0046a4110200241f8066a41044100100241016a41044d0d0820022802f806220141024f0d010c020b410421010b200121260b200241e8036a41086a22014200370300200242003703e80341c8d8c100411a200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004410021050240200241f0046a411041f8b3c200410041001002417f460d0020024190076a4200370300200241f8066a41106a4200370300200241f8066a41086a4200370300200242003703f806200241f0046a4110200241f8066a4120410010022201417f460d082001411f4d0d08200241f0056a41186a2201200241f8066a41186a2205290300370300200241f0056a41106a2206200241f8066a41106a2227290300370300200241f0056a41086a2228200241f8066a41086a2229290300370300200220022903f8063703f005200520012903003703002027200629030037030020292028290300370300200220022903f0053703f806410121050b4128101f2201450d0a200120053a0004200141f8b3c200360200200120022903f806370005200120022f00a8083b00252001410d6a200241f8066a41086a2206290300370000200141156a200241f8066a41106a22272903003700002001411d6a20024190076a2228290300370000200141276a200241aa086a2d00003a0000200241e8036a41086a22054200370300200242003703e80341adeec100411a200241e8036a1001200241f0046a41086a2005290300370300200220022903e8033703f004410021050240200241f0046a411041f8b3c200410041001002417f460d00202842003703002027420037030020064200370300200242003703f806200241f0046a4110200241f8066a4120410010022205417f460d092005411f4d0d09200241f0056a41186a2205200241f8066a41186a2206290300370300200241f0056a41106a2227200241f8066a41106a2228290300370300200241f0056a41086a2229200241f8066a41086a222a290300370300200220022903f8063703f0052006200529030037030020282027290300370300202a2029290300370300200220022903f0053703f806410121050b4128101f2227450d0b202720053a0004202741f8b3c200360200202720022903f806370005202720022f00a8083b00252027410d6a20024180076a290300370000202741156a200241f8066a41106a2903003700002027411d6a200241f8066a41186a290300370000202741276a200241a8086a41026a2d00003a0000200241003602c803200242083703c00320024188086a41186a200241c8086a3602002002410036029808200241f080c40036028c0820022001360288082002200241c0036a36029c082002200241c8086a360294082002200241c8086a36029008200241f8066a20024188086a10f502024002400240024020022d00f80722054102470d00200241023a00f0060c010b200241f0046a200241f8066a41800110ce031a2002200241f8066a4184016a2800003600e303200220022800f9073602e003200241f8066a41046a200241f0046a41800110ce03212120024188086a41106a4101360200200241e8036a200241f8066a41840110ce031a200241003602f806200241f8066a410472200241e8036a41840110ce031a200241f8066a4188016a20053a000020024181086a20022802e00336000020024184086a20022800e303360000200241f0056a2002419c086a200241f8066a10840320022d00f0064102470d010b4100212b200241003602d803200242083703d0032001101d4108212c4108212d4108212e4100212a0c010b200241f8066a200241f0056a41880110ce031a200241e8036a2001108503418801101f222c450d10202c200241f8066a41880110ce031a200241a8086a41186a20024188086a41186a280200360200200241a8086a41106a222f20024188086a41106a290300370300200241a8086a41086a20024188086a41086a29030037030020022002290388083703a808200241f8066a200241a8086a10f502024002400240024020022d00f80722294102470d004101212a4101212b0c010b20024181086a212a200241f8066a410472212d200241bc086a2130200241f9076a212e202f2802002131410221064188012105410021014101212b0340200241f0046a200241f8066a41800110ce031a2002202e41036a2800003600e3032002202e2800003602e0032021200241f0046a41800110ce031a202f203120016a222841016a360200200241e8036a200241f8066a41840110ce031a200220283602f806202d200241e8036a41840110ce031a200241f8066a4188016a20293a0000202a20022802e003360000202a41036a20022800e303360000200241f0056a2030200241f8066a108403200241f0056a4180016a2d00004102460d02200241f8066a200241f0056a41880110ce031a0240200141016a2228202b470d00200241e8036a20022802a80820022802ac08280210110300202841016a22292028490d432006202920292006491b222bad4288017e2204422088a70d432004a722294100480d4302402001417f460d00202c20052029101e222c0d010c100b2029101f222c450d0f0b202c20056a200241f8066a41880110ce031a200641026a210620054188016a2105200241f8066a200241a8086a10f50220282101200241f8066a4180016a2d000022294102470d000b202841016a212a0b202c212d200241f0066a41023a00000c010b200141016a212a202c212d0b20022802a808220520022802ac08220128020011040002402001280204450d002005101d0b2002202a3602d8032002202b3602d4032002202c3602d003202d212e0b200241f0056a20271086032002280290062230450d2241012132200241e8036a410172213341282134200241f0056a41286a213541242136200241f0056a41246a213741182138411021394108213a4120213b200241f8066a41206a213c42d000213d4220213e417f213f41052140428080808010214142002142427f21434100214441d000214541342146413c214741c40021484188012149419f04214a41e000214b41e801214c41f002214d41f803214e41a004214f41c800215041c0002151413821524130215341cc002154410121210c140b209901450d22209901208c016a219901209a01206e6a2101209a0120666a2263219a0120012d00000d112063208c016a229a0120716a219b012063209801470d170c160b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b202941081020000b412841041020000b412841041020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41880141081020000b024002400240024002400240024002400240024002400240024002400240024002400240024020210e050001020304040b2020450d11200f101f2201450d0a200120106a20112f00ddc5413b0000200120126a20112900d5c541370000200120112900cdc5413700002001200f2013101e2201450d0b20012020290000370012200120146a202020156a290000370000200120166a202020106a290000370000200120176a202020126a290000370000200241e8036a20126a22052018370300200220183703e80320012013200241e8036a1001200241f0046a20126a2005290300370300200220022903e8033703f00402400240200241f0046a20102019201120111002201a460d002002201f3702fc062002200241f0046a3602f80620024180036a200241f8066a10d501200228028003450d0b200241e8026a200241f8066a10ca0220022903e802a7450d0b200241e8026a20106a290300210420022903f00221030c010b42002103420021040b2001101d42002100200242003703f805200242003703f005024002402008200320082003200854200420095420042009511b22011b22227d220320092004200920011b22237d2008202254ad7d220784500d00200241f8066a202010cb02200241f8066a20126a2903002204201820022903f8062200201b5620042018522004501b22011b21042000201b20011b2100200241f8066a200e6a28020021060240201c2802002201450d002000200484500d1020062001201d6c6a2105200621010340200241c0026a2001290300200120126a2903002003200710d203200241b0026a20022903c002200241c0026a20126a2903002000200410d103200241d0026a200120106a20022903b002200241b0026a20126a290300108703200241f0056a20022903d00220022903d802200241d0026a20106a29030010df012001201d6a22012005470d000b0b20002004842018510d0e200241a0026a200241f8066a20106a290300200241f8066a20156a2903002003200710d20320024190026a20022903a002200241a0026a20126a2903002000200410d10320024190026a20126a29030021042002290390022100201e280200450d012006101d0c010b420021040b200241f8016a2020200020227c2203200420237c2003200054ad7c108703200241f0056a20022903f801200229038002200241f8016a20106a29030010df0120022903f005200241f0056a20126a29030010ac012020200e6a220121202001200d470d0f410021010c3c0b2035280200215520372802002156200241a8086a20386a2257200241f0056a20386a290300370300200241a8086a20396a2258200241f0056a20396a290300370300200241a8086a203a6a2259200241f0056a203a6a290300370300200220022903f0053703a808200241e8036a200241a8086a10f60202400240024020022d00e8032032470d00200241f0046a20386a203320386a290000370300200241f0046a20396a203320396a290000370300200241f0046a203a6a2033203a6a290000370300200220332900003703f004200241f8066a200241f0046a10c902203c2802002201450d01200241f8066a203a6a290300215a20022903f8062104200241f8066a20366a280200450d022001101d0c020b203c20443602000b420021044200215a0b2055ad203d7e2200203e88a70d2a2000a72201203f4c0d2a0240024002402001450d002001101f225b450d0920552040742201450d020c010b4108215b20552040742201450d010b203020016a215c2004203e88205a203e8684225d2043205a2041541b215e4200215f4100216020302161410021620c1a0b2004203e88205a203e8684215d4200215f410021600c210b0240202a450d00202d206e6a2101206721050340024020012d0000450d00200120666a21012005208c016a22050d010c020b20012091016a2903002204208e012004208e015620012090016a2903002204208d01522004501b22061b22002004208d0120061b220484208d01510d04200241a8016a208f01208f012000200410d10320012092016a200241a8016a206a6a2903003703002001208b016a20022903a801370300200120666a21012005208c016a22050d000b0b20022802c003229401206b280200229501206c6c6a219601209501450d15209401219701410121620c190b20a6012802282201450d1e20a60128022022c201200120a5016c6a21c30120a60120a8016a21c401410321620c190b20e70120c8016a290300210420e7012903002100200241f0056a20cc016a222f20e70120d4016a290000370300200241f0056a20cd016a22a10120e70120d5016a290000370300200241f0056a20c8016a22a20120e70120d6016a290000370300200220e7012900603703f00520e7012802282229ad20d7017e220320d80188a70d272003a7220520d9014c0d2720e70120cc016a290300210320e701290310210720e701280220210102400240024002402005450d002005101f2221450d082029450d020c010b410821212029450d010b2001202920ca016c6a212841002106202121050340200520012903003703002005200120c8016a290300370308200520cb016a200120cb016a290300370300200520c5016a200120c5016a290300370300200520cc016a200120cc016a290300370300200520cd016a200120cd016a290300370300200520ca016a2105200620c7016a2106200120ca016a22012028470d000c020b0b410021060b200241f8066a20cc016a200337030020d301200737030020da01200636020020db01202936020020dc012021360200200220003703f806200220043703800720dd01101f2201450d01200120de016a20df012900e9d841370000200120df012900e2d841370000200120dd0120e001101e2231450d02203120022903f00537000f203120e1016a202f290300370000203120e2016a20a101290300370000203120e3016a20a201290300370000200241e8036a20c8016a222820e401370300200220e4013703e803203120e001200241e8036a1001200241f0046a20c8016a2028290300370300200220022903e8033703f004202820df01360200200220e5013703e8032002200241f8066a3602880820024188086a200241e8036a10f302200220d3013602880820024188086a200241e8036a10f30220dc012802002101200220da0128020022053602880820024188086a200241e8036a1062024002402005450d00200520ca016c21290340024002400240024020022802ec032206202828020022056b20c5014f0d00200520c5016a22212005490d41200620c70174222f20212021202f491b222120df01480d412006450d0120022802e80320062021101e22060d020c060b20022802e80321060c020b2021101f2206450d040b200220213602ec03200220063602e8030b2028200520c5016a360200200620056a220520c8016a200120cc016a290000370000200520cd016a200120c5016a290000370000200520cc016a200120cb016a2900003700002005200120cd016a290000370000200220013602880820024188086a200241e8036a10f302200120ca016a2101202920e6016a22290d000b0b200020c901542101200420d201512105200420d20154210620022802ec032129200241f0046a20cd0120022802e80322212028280200100302402029450d002021101d0b2001200620051b210120e70120d0016a21e7012031101d024020db01280200450d0020dc01280200101d0b200420d20120011b21d201200020c90120011b21c90120e70120d101470d0d200241e8036a41086a22634200370300200242003703e80341bdedc1004111200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f004200220d20137038007200220c9013703f806200241f0046a4110200241f8066a4110100320ce014188016c22634188016d2178024002402063450d002078ad4205862204422088a70d3d2004a722014100480d3d2001101f22cd01450d0d20ce01450d010c1d0b410121cd014100217820ce010d1c0b4100210520cf010d1c0c1d0b202141011020000b41b0b0c400102c000b410f41011020000b412f41011020000b200141081020000b200541081020000b41df88c0004133103a000b411241011020000b413241011020000b41c080c400102c000b41c080c400102c000b200141011020000b410021210c040b410421210c050b410021010c2a0b410121010c290b410221010c280b410321010c270b410321010c260b410321010c250b410021010c050b410221010c040b410121010c030b410321010c020b410321010c010b410321010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010204040b20930120696a219301202e202a20666c6a2198012067219901202e2163024002400240024003402063219a0120980120636b206d4d0d07209a01206e6a2d0000450d01209a01206f6a2d0000450d02209a0120726a2d0000450d0320990120746a219901209a0120756a2163209a0120766a2d00000d000b410321010c030b209a0120716a219b01209a0120666a2263209801470d150c140b209a0120706a2163410121010c010b209a0120736a2163410221010b209a01200120666c6a229a0120716a219b012063209801460d10410121010c240b209b01206a6a2903002104209b0129030021000340206320666a210102402063206e6a2d0000450d002001216320682001470d010c140b20632083016a29030022032004206320716a2903002207200054200320045420032004511b22051b21042007200020051b21002063209a0120051b219a012001216320682001470d000b410221010c230b209a0120693a008001209501450d02209a012083016a219c01209a01208a016a219d01410221620c150b410221010c400b02400240024020620e0400010204040b20612201450d272001203b6a2161202e202a20496c6a212941002105202e2106024002400340202920066b204a4d0d012006204b6a22282001460d02200520282001203b10d00322282044476a21052028450d022006204c6a22282001460d02200520282001203b10d00322282044476a21052028450d022006204d6a22282001460d02200520282001203b10d00322282044476a21052028450d022006204e6a22282001460d02200520282001203b10d00322282044476a21052006204f6a210620280d000c020b0b024020062029460d0003402006204b6a22062001460d02200520062001203b10d00322282044476a21052028450d02200620346a22062029470d000b0b2061205c470d0b0c280b202a20054d0d05202e200520496c22066a222820506a2043202e20066a220620506a290300220320062903402204205e7c22002004542206ad7c220720062007200354200020045a1b22061b37030020282043200020061b370340200241f8066a20386a2206200120386a290000370300200241f8066a20396a2228200120396a290000370300200241f8066a203a6a22292001203a6a290000370300200220012900003703f806024020552060470d00205520326a22012055490d442055203274222f20012001202f491b2201ad203d7e2204203e88a70d442004a7222f2044480d44024002402055450d00205b205520456c202f101e225b0d010c090b202f101f225b450d080b200121550b205b206020456c6a220120443602242001200536022020012042370300200120386a2042370300200120396a20423703002001203a6a204237030020292903002104202829030021002006290300210320022903f8062107200120443a0048200120516a2003370300200120526a2000370300200120536a200437030020012007370328200120546a20022800e303360000200120022802e003360049206020326a21602061205c470d0b0c270b02402097012802282201450d002001206c6c21062097012802202089016a21010340202a200128020022054d0d050240202e200520666c6a22052d0080010d002005290340220420052081016a290300220084500d00200241d8006a208e01208d012097012903002203208d0110d203200241e8006a209701206a6a2903002207208d01208d01208d0110d20320024198016a2003208d01208d01208d0110d20320024188016a208f012002290398012007200229037084200229036084208d015220024198016a206a6a2903002203200229036820022903587c7c22072003547222281b208f01200720281b2004200010d103200241f8006a20970120786a290300208d0120022903880120024188016a206a6a29030010d20320052083016a2228208f0120282903002204200241f8006a206a6a2903007c2005290330220020022903787c22032000542228ad7c22002028200020045420002004511b22281b3703002005208f01200320281b3703300b2001206c6a21012006208b016a22060d000b0b209701206c6a229701209601470d0b410021010c210b209401206c6a212f02402094012802282205450d0020940128022021012005206c6c210503400240209c012001460d0020012085016a209d0120890110d003450d002001206c6a21012005208b016a22050d010c020b20940120786a22062903002104209c0129030021002001209a0120716a22282903002203209401207a6a222929030022077d3703002001200020047d2003200754ad7d370308202829030021042006209c01290300370300202920043703002001206c6a21012005208b016a22050d000b0b202f219401202f209601470d0b0b200241f8066a20786a222f209a0120776a290300370300207b209a0120796a290300370300200241f8066a206a6a222d209a01207c6a2903003703002002209a012903603703f806209a012802282229ad207d7e2204207e88a70d2d2004a72205207f4c0d2d209a0120786a2903002104209a01206a6a2903002100209a012802202101209a012903102103209a01290300210702400240024002402005450d002005101f2221450d082029450d020c010b410821212029450d010b2001202920716c6a2128410021062021210503402005200129030037030020052001206a6a29030037030820052085016a20012085016a29030037030020052089016a20012089016a290300370300200520786a200120786a2903003703002005207a6a2001207a6a290300370300200520716a2105200620696a2106200120716a22012028470d000c020b0b410021060b209a01206e6a2d00002131209a012080016a2903002122209a01206c6a2903002123209a012081016a2903002124209a012082016a290300219e01209a012083016a290300219f01209a0120716a29030021a001024002400240024020022802b403200241b0036a206a6a22052802002201470d00200120696a22282001490d44200120697422a1012028202820a101491b22a201ad2084017e22a301207e88a70d4420a301a722a1012065480d442001450d0120022802b003200120666c20a101101e22280d020c090b20022802b00321280c020b20a101101f2228450d070b200220a2013602b403200220283602b003200528020021010b2028200120666c6a220120233703502001209e01370340200120a00137033020012003370310200120003703082001200737030020012021360220200120022903f806370360200120312065473a008001200120022800f0053600810120012080016a202237030020012081016a202437030020012083016a209f01370300200120786a200437030020012085016a200636020020012086016a20293602002001207c6a202d290300370300200120796a207b290300370300200120776a202f29030037030020012087016a2088012800003600002005200528020020696a360200202e212d2093012064490d060c260b20c201222820a9016a2105202820a5016a21c20120022802b003220620aa0128020020ab016c6a212f0240024002400340202f200622016b20ac014d0d03200120ad016a22062005460d172006200520ae0110d003450d17200120af016a22062005460d012006200520ae0110d003450d01200120b0016a22062005460d022006200520ae0110d003450d020240200120b2016a22292005460d00200120b4016a21062029200520ae0110d0030d010b0b200120b3016a21010c160b200120ab016a21010c150b200120b1016a21010c140b2001202f460d140340200120ad016a22062005460d142006200520ae0110d003450d14200620a9016a2201202f470d000c150b0b4198adc4002005202a104b000b4198adc4002005202a104b000b202f41081020000b200541081020000b20a10141081020000b41022121410321010c370b410021620c070b410021620c070b410121620c070b410221620c080b410221010c130b410221010c120b410121010c110b410221010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b202820b5013a0048200241286a20a60120a4016a290300220020b6012028290300220420b60110d203200241386a202820a4016a290300220320b60120a601290300220720b60110d203200241c8006a200720b601200420b60110d20320a60120b8016a290300220420b901200420b9015620a60120b7016a290300220420b601522004501b22051b2207200420b60120051b220484500d04200241186a20ba012002290348200020b60152200320b6015271200229033020b6015272200229034020b6015272200241c8006a20a4016a2903002200200229032820022903387c7c22032000547222051b20ba01200320051b2007200410d103202820b7016a2206200241186a20a4016a2903002200370300202820022903182203370310200120bb016a220520ba012000200529030022047c2003200129035022007c22032000542205ad7c22002005200020045420002004511b22051b370300200120ba01200320051b37035020c401200120ad016a2205460d00200520c40120ae0110d003450d00200120a4016a220520ba01200529030022042006290300220020bc0186202820b8016a2205290300220320bc01888420b60120005022281b7c20012903002200200320bc018620bd0120281b7c22032000542228ad7c22002028200020045420002004511b22281b370300200120ba01200320281b370300200241f8066a20b7016a20c40120b7016a2900002203370300200241f8066a20b8016a20c40120b8016a2900002207370300200241f8066a20a4016a20c40120a4016a2900002222370300200220c40129000022233703f8062006290300210420052903002100200241f0056a20b7016a22282003370300200241f0056a20b8016a22292007370300200241f0056a20a4016a222f2022370300200220233703f005024020012802282205200120be016a2231280200470d00200520b5016a22062005490d2c200520b5017422a1012006200620a101491b22a101ad20bf017e220320bc0188a70d2c2003a722a20120c001480d2c2005450d02200120ae016a280200200520c1016c20a201101e22060d030c060b200120ae016a28020021060c030b20c20120c301470d050c0d0b20a201101f2206450d030b203120a101360200200120ae016a2006360200200120a9016a28020021050b2006200520c1016c6a220520022903f0053703102005200420bc0186200020bc01888420b60120045022061b3703082005200020bc018620bd0120061b370300200520a9016a2028290300370300200520ae016a2029290300370300200520b7016a202f290300370300200120a9016a2201200128020020b5016a36020020c20120c301470d030c0a0b41a8adc400102c000b20a20141081020000b410321620c010b410321620c010b410321010c010b410321010c000b0b20c60120636a21850120ce014188016c216620c6014180016a2163200241b0076a219a014100210520cd012101024002400340206341a47f6a280200216e206341a07f6a28020021cc01200241f0056a206341a87f6a41d80010ce031a20632d00004102460d01200241f8066a200241f0056a41d80010ce031a200241e8036a41186a2268209a0141186a290000370300200241e8036a41106a2271209a0141106a290000370300200241e8036a41086a22c501209a0141086a2900003703002002209a012900003703e8030240206e450d0020cc01101d0b200120022903e803370000200141186a2068290300370000200141106a2071290300370000200141086a20c50129030037000020634188016a2163200541016a2105200141206a2101206641f87e6a22660d000c020b0b206341086a2263208501460d0020c60120ce014188016c6a219a01034020634180016a2d00004102460d0120634188016a21010240206341246a280200450d00206341206a280200101d0b20012163209a012001470d000b0b20cf01450d010b20c601101d0b200220783602f404200220cd013602f004200220053602f80441a7edc1004116200241f0046a10e8024100216602400240024002400240024020054105742263450d0020634105752268ad4205862204422088a70d232004a722014100480d232001101f226e450d0220cd0120636a20cd01470d010c030b4101216e4100216820cd0120636a20cd01460d020b2005410574229a0141606a4105762166200241f8066a4101722105206e216320cd0121010340200241f0056a41186a200141186a290000370300200241f0056a41106a200141106a290000370300200241f0056a41086a200141086a290000370300200220012900003703f005200241f8066a200241f0056a10f6020240024020022d00f8064101470d00200241e8036a41186a200541186a290000370300200241e8036a41106a200541106a290000370300200241e8036a41086a200541086a290000370300200220052900003703e8030c010b200241e8036a41186a4200370300200241e8036a41106a4200370300200241e8036a41086a4200370300200242003703e8030b200141206a2101206320022903e803370000206341186a200241e8036a41186a290300370000206341106a200241e8036a41106a290300370000206341086a200241e8036a41086a290300370000206341206a2163209a0141606a229a010d000b206641016a216620780d020c030b200141011020000b2078450d010b20cd01101d0b2066ad2204421b88a70d0a2004420586a72263417f4c0d0a024002400240024002402063450d002063101f2205450d022066450d010c030b4101210520660d020b41002166410021630c020b206341011020000b2066410574219a014160206e6b217120052163206e2101034020632001290000370000206341186a200141186a290000370000206341106a200141106a290000370000206341086a200141086a290000370000206341206a2163200141206a2101209a0141606a229a010d000b206e20664105746a20716a41057641016a21630b2002206336028007200220663602fc06200220053602f80641aaa8c1004112200241f8066a10e80202402066450d002005101d0b2068450d09206e101d0c090b20a60120a5016a22a60120a701460d0341032121410321010c1a0b20024188086a20386a2201205729030037030020024188086a20396a2205205829030037030020024188086a203a6a22062059290300370300200220022903a8083703880802402056450d002030101d0b205b450d00200241f8066a20386a22282001290300370300200241f8066a20396a22292005290300370300200241f8066a203a6a2221200629030037030020022002290388083703f8060240200241c0036a203a6a2206280200220520022802c403470d00200241f0056a202710850320022802c40322012006280200222f6b203f20022802f005223020326a223120312030491b22304f0d00202f20306a2230202f490d1c2001203274222f20302030202f491b222fad203d7e2204203e88a70d1c2004a722302044480d1c024002402001450d0020022802c003200120456c2030101e22010d010c140b2030101f2201450d130b2002202f3602c403200220013602c0030b20022802c003200520456c6a2201205b360220200120022903f80637022c200120346a2060360200200120366a2055360200200120423703102001205f2042205a204154222f1b3703082001205d2043202f1b370300200120386a2042370300200120466a2021290300370200200120476a2029290300370200200120486a20282903003702002006200520326a360200200241f0056a2027108603200241f0056a203b6a28020022300d150b2027101d0240202a20264f0d000240202a450d00202a4188016c2101202d41206a216303400240206341046a280200450d002063280200101d0b20634188016a2163200141f87e6a22010d000b0b0240202b450d00202c101d0b0240200241c8036a2802002263450d00206341d0006c210120022802c00341206a216303400240206341046a280200450d002063280200101d0b206341d0006a2163200141b07f6a22010d000b0b20022802c403450d0320022802c003101d0c030b202a2025202a2025491b2264ad4288017e2204422088a70d072004a72201417f4c0d07024002402001450d002001101f22050d01200141081020000b410821050b41002165200241003602b803200220643602b403200220053602b0032064450d004188012166202e202a4188016c22676a2168410121694108216a200241c0036a41086a216b41d000216c419f04216d418001216e418802216f4190022170413021714190032172419803217341e07b217441a0042175419804217641f80021774118217841f00021794110217a200241f8066a41106a217b41e800217c4230217d4220217e417f217f41d80021800141c80021810141c000218201413821830142880121840141282185014124218601418401218701200241f3056a218801412021890141e000218a0141b07f218b0141f87e218c014200218d014201218e01427f218f014148219001414021910141b87f2192014100219301410221210c150b410821a401200241c0036a41086a2802002201450d0041d00021a50120022802c00322a601200141d0006c6a21a701412c21a801412821a901200241b0036a41086a21aa0141880121ab01419f0421ac0141e00021ad01412021ae0141e80121af0141f00221b00141900221b10141f80321b20141980321b30141a00421b401410121b501420021b601411821b701411021b801420121b901427f21ba0141d80021bb01422021bc0142808080807021bd01412421be01423021bf01410021c001413021c101410321210c150b20022802d00321c50120022902b403210320022802b00321c6010240200241d0036a20a4016a2802002201450d0020014188016c210520c50141206a210103400240200141046a280200450d002001280200101d0b20014188016a2101200541f87e6a22050d000b0b024020022802d403450d0020c501101d0b0240200241c8036a2802002201450d00200141d0006c210520022802c00341206a210103400240200141046a280200450d002001280200101d0b200141d0006a2101200541b07f6a22050d000b0b024020022802c403450d0020022802c003101d0b20c601450d00200220c6013602a808200220033702ac08200241e8036a41086a22014200370300200242003703e80341a7edc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004200241f0046a411041f8b3c200410041001002417f460d01200242103702f4052002200241f0046a3602f005200241f8066a200241f0056a105e20022802f8062229450d1120022802fc0621c70120024180076a28020041057422c8010d020c030b420021c901200241e8036a41086a22634200370300200242003703e80341bdedc1004111200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f004200241f0046a411041f8b3c200410041001002417f460d032002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022263417f460d0e2063410f4d0d0e20022903f80621c9010c030b41012129410021c701410041057422c801450d010b202921010340410f101f2205450d05200541076a41002900e9d841370000200541002900e2d8413700002005410f412f101e2205450d062005200129000037000f200541276a200141186a22ca012900003700002005411f6a200141106a2206290000370000200541176a200141086a22cb01290000370000200241e8036a41086a22c5014200370300200242003703e8032005412f200241e8036a1001200241f0056a41086a22cc0120c501290300370300200220022903e8033703f005200241f0056a411010092005101d4112101f2205450d07200541106a41002f0087d74122283b0000200541086a41002900ffd6412204370000200541002900f7d6412200370000200541124132101e2205450d08200520012900003700122005412a6a20ca01290000370000200541226a20062900003700002005411a6a20cb0129000037000020c5014200370300200242003703e80320054132200241e8036a100120cc0120c501290300370300200220022903e8033703f005410021cc010240200241f0056a411041f8b3c200410041001002417f460d00200241003602f806200241f0056a4110200241f8066a41044100100241016a41044d0d0520022802f80621cd01200241f0056a41101009410121cc010b2005101d024020cd01410020cc011b22cc0141014d0d004112101f2205450d0a200541106a20283b0000200541086a200437000020052000370000200541124132101e2205450d0b200520012900003700122005412a6a20ca01290000370000200541226a20062900003700002005411a6a20cb0129000037000020c5014200370300200242003703e80320054132200241e8036a1001200241f0046a41086a20c501290300370300200220022903e8033703f004200220cc01417f6a3602f806200241f0046a4110200241f8066a410410032005101d0b200141206a210120c80141606a22c8010d000b0b2003422088a721ce01024020c701450d002029101d0b20ce01450d0c2003a721cf0141880121d00120c60120ce014188016c6a21d101410821c80120c60141086a29030021d20120c60129030021c901411021cd01200241f8066a41106a21d30141f80021d401411821cc0141f00021d50141e80021d601423021d701422021d801417f21d901413021ca01412821cb01200241f8066a41286a21da012002419c076a21db01412021c501200241f8066a41206a21dc01410f21dd01410721de01410021df01412f21e001412721e101411f21e201411721e301420021e401420121e501410121c701415021e60120c60121e701410421210c110b200241e8036a41086a22634200370300200242003703e80341c7eec1004115200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200241003602f806200241f0046a4110200241f8066a41044100100241016a41044d0d0a20023502f80621040c010b423c21040b200241086a20c90142002004420010d203200241e8036a41086a22634200370300200242003703e80341c2ecc100411c200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f004200242003703800720024289f48bdcc4002002290308428094ebdc038020022903104200521b3703f806200241f0046a4110200241f8066a411010030c120b102e000b41df88c0004133103a000b410f41011020000b412f41011020000b411241011020000b413241011020000b411241011020000b413241011020000b41df88c0004133103a000b203041081020000b41df88c0004133103a000b41e882c40041004100104b000b41df88c0004133103a000b41012121410321010c030b410321010c020b410321010c010b410321010c000b0b200241f8066a10800120022802f806210520022802fc06216602402002280280072263450d002063410574220141057522c501ad42287e2204422088a70d012004a7229a014100480d01209a01101f2268450d02200520016a216e2063410574219a0120682163200521010340200141086a2900002104200141106a290000210020012900002103206341186a200141186a290000370000206341106a2000370000206341086a200437000020632003370000206341206a4201370300206341286a2163200141206a2101209a0141606a229a010d000b206e20056b41606a41057641016a216e2066450d040c030b410021c501410821684100216e20660d020c030b1021000b209a0141081020000b2005101d0b2002410e3602ec03200241988ec1003602e803200241f8066a41a68ec100200241e8036a108101410021630240024020022802f8062201200228028007229a0141f8b3c200410041001002417f460d00200241003602e8032001209a01200241e8036a41044100100241016a41044d0d0120022802e80321630b024020022802fc06450d002001101d0b200241f0056a206310b30220022802f0052171024002400240206e20022802f805470d0020712068460d01417f219a0120682163207121010340209a0141016a229a01206e4f0d0220632001412010d0030d01200141206a2105206341206a2166206341286a2163200141286a210120662903002005290300510d000b0b2002206e36028007200220c5013602fc06200220683602f806200241f8066a42004200200410a80120022802f405450d012071101d200241d0086a24000f0b024020022802f405450d002071101d0b20c501450d002068101d0b200241d0086a24000f0b41df88c0004133103a000bb10803027f017e107f230041f0036b22022400200241086a200110d50102400240024002400240024002400240024002402002280208450d00200228020c2203ad4288017e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241f0036a24000f0b4108210620030d030b4100210f4100210d0c030b102e000b200541081020000b200241b0026a4104722107200141086a2108200241306a41186a2109200241306a41106a210a4100210b4100210c410021052003210d0340200141046a220e280200210f200828020021102002410036029003200841002001280200200f20024190036a410420101002220f200f417f461b220f4104200f410449220f1b20082802006a36020002400240200f0d00200228029003211120024190036a200110a301200228029003410f460d00200241b0026a20024190036a41e00010ce031a20094200370300200a4200370300200241306a41086a2210420037030020024200370330200841002001280200200e280200200241306a412020082802001002220f200f417f461b220f4120200f4120491b20082802006a3602000240200f411f4d0d0020024190016a41186a200929030037030020024190016a41106a200a29030037030020024190016a41086a2010290300370300200220022903303703900120022802b0022110200241b4016a200741dc0010ce031a201121120c020b200241b0026a108c010b410f21100b20024190036a200241b4016a41dc0010ce031a20024190026a41186a220e20024190016a41186a29030037030020024190026a41106a221120024190016a41106a29030037030020024190026a41086a221320024190016a41086a2903003703002002200229039001370390022010410f460d02200541016a210f200241306a20024190036a41dc0010ce031a200241106a41186a2214200e290300370300200241106a41106a220e2011290300370300200241106a41086a22112013290300370300200220022903900237031002402005200d470d00200b200f200f200b491b220dad4288017e2204422088a70d042004a722134100480d0402402005450d002006200c2013101e22060d010c060b2013101f2206450d050b2006200c6a22052010360200200541046a200241306a41dc0010ce031a200541e0006a2012360200200541fc006a2014290300370200200541f4006a200e290300370200200541ec006a2011290300370200200541e4006a2002290310370200200b41026a210b200c4188016a210c200f2105200f2003490d000b0b2000200d36020420002006360200200041086a200f360200200241f0036a24000f0b2000410036020002402005450d002006210503402005103c20054188016a2105200c41f87e6a220c0d000b0b0240200d450d002006101d0b200241f0036a24000f0b1021000b201341081020000bf30202027f037e230041306b22022400024002404113101f2203450d002003410f6a41002800f99b40360000200341086a41002900f29b40370000200341002900ea9b40370000200341134126101e2203450d0120032001360013200241206a41086a220142003703002002420037032020034117200241206a1001200241086a2001290300370300200220022903203703000240024002402002411041f8b3c200410041001002417f460d00200220023602102002411036021420024200370328200242003703202002410020024110200241206a41104100100222012001417f461b2201411020014110491b3602182001410f4d0d02200241286a290300210420022903202105200241206a200241106a105e20022802202201450d0220022902242106200020043703082000200537030020002006370214200020013602100c010b200041003602100b2003101d200241306a24000f0b41df88c0004133103a000b411341011020000b412641011020000bc90401077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d0020004188016c2104200241086a22052802002100200228020421060340200341e0006a28020021070240024002400240200620006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000101e22060d020c070b200228020021060c020b2000101f2206450d050b2002200036020420022006360200200528020021000b2005200041046a360200200620006a20073600002003200210b201024002400240024020022802042206200528020022076b41204f0d00200741206a22002007490d0620064101742207200020002007491b22004100480d062006450d01200228020020062000101e22080d020c080b200228020021080c020b2000101f2208450d060b200220003602042002200836020020052802002107200021060b2005200741206a2200360200200820076a220741086a200341ec006a290000370000200741106a200341f4006a290000370000200741186a200341fc006a2900003700002007200341e4006a29000037000020034188016a2103200441f87e6a22040d000b200128020020012802042008200010032006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100320030d030c040b1021000b200041011020000b200041011020000b2008101d0b200241106a24000be90504027f017e017f047e230041206b220324000240024002404118101f2204450d00200441106a41002900e9ba40370000200441086a41002900e1ba40370000200441002900d9ba40370000200441184138101e2204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a29000037000042002105200341106a41086a220642003703002003420037031020044138200341106a1001200341086a2006290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d00200342003703182003420037031020034110200341106a4110410010022206417f460d022006410f4d0d02200341186a2903002107200329031021052004101d411421064114101f2204450d010c050b420021072004101d411421064114101f22040d040b200641011020000b41df88c0004133103a000b411841011020000b413841011020000b200441106a41002800d5ba40360000200441086a41002900cdba40370000200441002900c5ba403700000240200420064134101e2204450d00200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a29000037000042002108200341106a41086a220642003703002003420037031020044134200341106a1001200341086a2006290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d00200342003703182003420037031020034110200341106a4110410010022206417f460d022006410f4d0d02200341186a2903002109200329031021080c010b420021090b2004101d20002008200120052005200156200720025620072002511b22041b22017c220a20092002200720041b22027c200a200854ad7c10e2012000200520017d200720027d2005200154ad7d10e701200341206a24000f0b41df88c0004133103a000b413441011020000bc30b03027f017e047f23004180026b22052400200541086a220642003703002005420037030041d09cc000411920051001200541f0016a41086a2006290300370300200520052903003703f00141002106024002400240024002400240024002400240024002400240024002400240200541f0016a411041f8b3c200410041001002417f460d0020054100360278200541f0016a4110200541f8006a41044100100241016a41044d0d01024020052802782206450d0020052006417f6a1096012005280208410f460d01200541f8006a200541f80010ce031a20052903782107200541f8006a41086a103c20072001580d01200041b09dc00036020420004101360200200041086a41c7003602002002103c20054180026a24000f0b410021060b200541086a220842003703002005420037030041d09cc000411920051001200541f0016a41086a2008290300370300200520052903003703f0012005200641016a360278200541f0016a4110200541f8006a4104100320052001370378200541f8006a41086a200241e00010ce032109200520043703e001200520033a00e801411a101f2202450d01200241186a41002f00e89b403b0000200241106a41002900e09b40370000200241086a41002900d89b40370000200241002900d09b403700002002411a4134101e2208450d022008200636001a200541086a22024200370300200542003703002008411e20051001200541f0016a41086a2002290300370300200520052903003703f0012005410036020820054201370300200529037821014108101f220a450d032005410836020420022002280200220b41086a3602002005200a360200200a200b6a20013700002009200510b20102400240024002400240024002400240024002400240200541e8016a2d000022024101460d0020024102470d012005280204200541086a2802002202470d03200241016a220a2002490d162002410174220b200a200a200b491b220b4100480d162002450d0720052802002002200b101e220a450d080c130b2005280204200541086a2802002202470d01200241016a220a2002490d152002410174220b200a200a200b491b220b4100480d152002450d0420052802002002200b101e220a450d050c100b2005280204200541086a2802002202470d02200241016a220a2002490d142002410174220b200a200a200b491b220b4100480d142002450d0720052802002002200b101e220a450d080c0d0b2005280200210a0c0f0b2005280200210a0c100b2005280200210a0c0b0b200b101f220a0d0b0b200b41011020000b200b101f220a0d0b0b200b41011020000b200b101f220a0d050b200b41011020000b41df88c0004133103a000b411a41011020000b413441011020000b410841011020000b2005200b3602042005200a360200200541086a28020021020b200541086a200241016a360200200a20026a41003a00000c040b2005200b3602042005200a360200200541086a28020021020b200541086a200241016a360200200a20026a41013a00000c020b2005200b3602042005200a360200200541086a28020021020b200541086a200241016a360200200a20026a41023a00000b200541e0016a29030021010240024002402005280204220a200541086a28020022026b41084f0d00200241086a220b2002490d03200a4101742202200b200b2002491b22024100480d03200a450d012005280200200a2002101e220a450d020c040b2005280200210a0c040b2002101f220a0d020b200241011020000b1021000b200520023602042005200a360200200541086a28020021020b200541086a220b200241086a360200200a20026a200137000020052802042102200541f0016a41102005280200220a200b280200100302402002450d00200a101d0b2008101d2009103c20054184016a200636020020054181016a20033a0000200541f8006a41086a41023a0000200541053a0078200541f8006a108b01200041003602002000200636020420054180026a24000b9a0604027f017e047f017e230041a0036b220224000240024002400240411a101f2203450d00200341186a41002f00e89b403b0000200341106a41002900e09b40370000200341086a41002900d89b40370000200341002900d09b403700002003411a4134101e2203450d012003200136001a200241e0016a41086a22014200370300200242003703e0012003411e200241e0016a1001200241086a2001290300370300200220022903e0013703000240024002402002411041f8b3c200410041001002417f460d002002200236021020024110360214200242003703e0012002410020024110200241e0016a41084100100222012001417f461b2201410820014108491b360218200141074d0d0620022903e0012104200241e0016a200241106a10a30120022802e0012101200241c4026a200241e0016a41047241dc0010ce031a2001410f460d0620024184016a200241c4026a41dc0010ce031a20022001360220200241206a41047220024184016a41dc0010ce032105200241003a00e00120022802102002280214200241e0016a4101200241186a22012802001002210620012001280200200641016a41014b22066a22073602002006450d0220022d00e001220641034f0d02200242003703e001200241106a41086a2208410020022802102002280214200241e0016a41082007100222012001417f461b2201410820014108491b20082802006a360200200141074d0d0520022903e001210920022802202101200241e0016a200541dc0010ce031a2002200241236a2800003600c702200220022800203602c4022001410f460d06200241206a200241e0016a41dc0010ce031a200220022800c70236008701200220022802c4023602840120002001360208200020043703002000410c6a200241206a41dc0010ce031a200041f0006a20063a0000200041e8006a20093702002000200228028401360071200041f4006a2002280087013600000c010b2000410f3602080b2003101d200241a0036a24000f0b200241206a103c41df88c0004133103a000b411a41011020000b413441011020000b200241206a103c0b41df88c0004133103a000bec0603027f017e0b7f23004190036b22022400200241086a200110d50102400240024002400240024002400240024002400240024002402002280208450d00200228020c2203ad42e8007e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b2000410036020020024190036a24000f0b4108210620030d030b4100210d4100210b0c030b102e000b200541081020000b200241c8016a4104722107200141086a210541002108410021094100210a2003210b0340200241003a00a8022001280200200141046a220c280200200241a8026a410120052802001002210d20052005280200200d41016a41014b220d6a360200200d450d040240024020022d00a802220d4101460d00200d0d06200241a8026a200241106a41dc0010ce031a410f210c0c010b200241a8026a200110a30120022802a802410f460d04200241c8016a200241a8026a41e00010ce031a200c280200210d2005280200210c2002410036028c03200541002001280200200d2002418c036a4104200c1002220d200d417f461b220d4104200d4104491b20052802006a360200200d41034d0d03200228028c03210e20022802c801210c200241ec006a200741dc0010ce031a200241a8026a200241ec006a41dc0010ce031a200c410f460d05200241106a200241a8026a41dc0010ce031a200241a8026a200241106a41dc0010ce031a200c4110460d060b200a41016a210d200241c8016a200241a8026a41dc0010ce031a0240200a200b470d002008200d200d2008491b220bad42e8007e2204422088a70d072004a7220f4100480d070240200a450d0020062009200f101e22060d010c090b200f101f2206450d080b200620096a220a200c360200200a41046a200241c8016a41dc0010ce031a200a41e0006a200e360200200841026a2108200941e8006a2109200d210a200d2003490d000b0b2000200b36020420002006360200200041086a200d36020020024190036a24000f0b200241c8016a108c010b200241a8026a200241ec006a41dc0010ce031a0b200241a8026a200241106a41dc0010ce031a0b200041003602000240200a450d0020062105034002402005280200410f460d002005103c0b200541e8006a2105200941987f6a22090d000b0b0240200b450d002006101d0b20024190036a24000f0b1021000b200f41081020000bc382010d027f027e067f017e0a7f017e037f017e017f017e297f027e337f230041b0026b2201240020014190026a41086a220242003703002001420037039002419efcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d02200129035022034200510d044200210420002003824200520d120c010b42002104200042e807824200520d110b20014190026a41086a22022004370300200120043703900241b2fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f001200141f0016a411041f8b3c200410041001002417f460d1020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d0120012802502202450d104108210520014190026a41086a22064200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a200629030037030020012001290390023703f0014100210602400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10a40120012802502205450d06200141d8006a2802002106200128025421070c010b410021070b4200210320014190026a41086a22084200370300200142003703900241c6fcc000411420014190026a1001200141f0016a41086a2209200829030037030020012001290390023703f001200141d0006a200141f0016a10600240200128025c220a450d00200128025822082001290360220b422088a76b20066a2109200129035021030240200ba7450d00200a101d0b20092002490d070c060b200842003703002001420037039002418cb9c000410d20014190026a10012009200829030037030020012001290390023703f001410021080240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d04200129035021030b200620024f0d050c060b41df88c0004133103a000b41df88c0004133103a000b41f0a8c300102c000b41df88c0004133103a000b41df88c0004133103a000b0240200820024f0d00200820026b220220066a220820024f0d052005200841286c6a29032021030c010b20014190026a41086a22024200370300200142003703900241dafcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d02200129035020037c21030c010b420520037c21030b20014190026a41086a220242003703002001420037039002419efcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240024002400240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d022001290350220b4200520d0141a88ec300102c000b42e807210b0b2003200b7c427f7c22032003200b827d210302402007450d002005101d0b20032000520d0c4108210c20014190026a41086a22024200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100210d02400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10a4012001280250220c450d07200141d8006a280200210d2001280254210e0c010b4100210e0b20014190026a41086a22024200370300200142003703900241b2fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100210f0240200141f0016a411041f8b3c200410041001002417f460d0020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d032001280250210f0b4200210320014190026a41086a220242003703002001420037039002418cb9c000410d20014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d02200129035021030b0240024002400240200d41286c2202450d00200c41206a2903002003520d00200141f0016a41186a2206200c41186a290300370300200141f0016a41106a2208200c41106a290300370300200141f0016a41086a2205200c41086a2903003703002001200c2903003703f0014120101f2210450d0b201020012903f001370000201041186a2006290300370000201041106a2008290300370000201041086a2005290300370000200c20026a200c41286a2202460d02200d41286c41586a21054120210841012106410121110340200241206a2903002003520d04200141f0016a41186a2207200241186a290300370300200141f0016a41106a220a200241106a290300370300200141f0016a41086a2209200241086a290300370300200120022903003703f00102400240024020112006470d00200641016a22122006490d2a20064101742213201220122013491b2213ad420586220b422088a70d2a200ba722124100480d2a2006450d01201020064105742012101e22100d020c0c0b200621130c010b2012101f2210450d0a0b200241286a2102201020086a220620012903f001370000200641186a2007290300370000200641106a200a290300370000200641086a2009290300370000200841206a2108201141016a211120132106200541586a22050d000c020b0b4101211041002111410021130b200f200d20116b22064d0d0a0c0b0b4101211141012113200f200d41016b22064b0d0a0c090b20062113200f200d20116b22064b0d090c080b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b201241011020000b41df88c0004133103a000b4188a9c30020082006104b000b412041011020000b2013450d012010101d0c010b20014190026a41086a22024200370300200142003703900241eefcc000411c20014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240024002400240024002400240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d022001290350210b0c010b42e807210b0b20014190026a41086a22024200370300200142003703900241c6fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120014100360258200142013703504108101f2202450d01200142888080808001370254200120023602502002200b20037c370000200241084110101e2202450d0220014290808080c0013702542002200f20066b221436000820012002360250200120113602900220014190026a200141d0006a10620240024002402011450d002011410574210a4100200141d0006a41086a28020022066b210520012802502109200128025421072010210203400240200720056a411f4b0d00200641206a22082006490d2320074101742212200820082012491b22084100480d23024002402007450d00200920072008101e22090d010c060b2008101f2209450d050b200821070b200920066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102200a41606a220a0d000b200141d8006a200636020020012007360254200120093602500c010b200141d8006a280200210620012802542107200128025021090b200141f0016a411020092006100302402007450d002009101d0b02402013450d002010101d0b20014190026a41086a220242003703002001420037039002418afdc000410e20014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100210602400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a105e20012802502212450d0620012802542115200141d8006a280200220641ffffff3f712213450d010c070b4101211241002115410041ffffff3f7122130d060b410821100c060b200841011020000b41df88c0004133103a000b410841011020000b411041011020000b41df88c0004133103a000b20134104742202101f22100d00200241081020000b4100210202402012201220064105746a460d002006410574220841606a2107200141086a21052010210220122106034020012006109a01200129030021032002200529030037030820022003370300200241106a2102200641206a2106200841606a22080d000b200741057641016a21020b20014190026a41086a2206420037030020014200370390024198fdc000411820014190026a1001200141d0006a41086a2006290300370300200120012903900237035020014100360298022001420137039002200120023602f001200141f0016a20014190026a10620240024020024104742207450d0020062802002102200128029002210a2001280294022105201021060340200641086a29030021032006290300210b0240024002400240200520026b41104f0d00200241106a22082002490d1f20054101742209200820082009491b22094100480d1f2005450d01200a20052009101e220a0d020c0a0b200241106a21080c020b2009101f220a450d080b200921050b200641106a2106200a20026a220220033700082002200b37000020082102200741706a22070d000b20014198026a200836020020012005360294022001200a360290020c010b200628020021082001280294022105200128029002210a0b200141d0006a4110200a2008100302402005450d00200a101d0b02402013450d002010101d0b20014190026a41086a22024200370300200142003703900241b0fdc000411220014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240200141f0016a411041f8b3c200410041001002417f460d0020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d0a200128025021050c010b410221050b200141a8026a4200370300200141a0026a420037030020014198026a42003703002001420037039002200520146a220aad42307e2203422088a70d172003a72202417f4c0d17024002402002450d002002101f2209450d0d200921020c010b41082109410821020b200141d0006a41186a220620014190026a41186a290300370300200141d0006a41106a220820014190026a41106a290300370300200141d0006a41086a20014190026a41086a2903003703002001200129039002370350024002400240200a4102490d002011200f6a20056a417f6a200d6b21050340200141f0016a41186a2006290300370300200141f0016a41106a2008290300370300200141f0016a41086a200141d0006a41086a2207290300370300200120012903503703f0012002420037030820024200370300200729030021032008290300210b20012903502116200241286a2006290300370300200241206a200b370300200241186a2003370300200241106a2016370300200241306a21022005417f6a22050d000b200a417f6a21060c010b41002106200a450d010b200242003703082002420037030020022001290350370310200241186a200141d8006a290300370300200241206a200141e0006a290300370300200241286a200141d0006a41186a290300370300200641016a21060b200120063602582001200a3602542001200936025020014190026a41086a22024200370300200142003703900241c2fdc000411320014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120014110360294022001200141f0016a36029002200141d0006a20014190026a1085020240200a450d002009101d0b200141d0006a41086a2014360200200141023a0054200141063a0050200141d0006a108b012015450d002012101d200e0d010c020b200e450d010b200c101d0b20014190026a41086a22022004370300200120043703900241c6fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f001200141d0006a200141f0016a1060200128025c2217450d172001280260211820012903502000520d1620014190026a41086a2202420037030020014200370390024198fdc000411820014190026a1001200141d0006a41086a20022903003703002001200129039002370350200141d0006a4110100920024200370300200142003703900241c6fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240024002400240024002400240200141f0016a411041f8b3c200410041001002417f460d002001200141f0016a3602900220014110360294022001420037035020014100200141f0016a4110200141d0006a41084100100222022002417f461b2202410820024108491b220636029802200241074d0d05200129035021042001410036025020014198026a4100200141f0016a4110200141d0006a41042006100222022002417f461b22024104200241044922021b20066a36020020020d0520012802502102200141d0006a20014190026a105e20012802502219450d052001290254211a200141f0016a41101009200120023602c801200120043703c00120012802c801211b410821094200211620014190026a41086a22024200370300200142003703900241c2fdc000411320014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10860220012802502209450d0a20012902542116200141f0016a411010090b20014190026a41086a220242003703002001420037039002418cb9c000410d20014190026a1001200141f0016a41086a2206200229030037030020012001290390023703f0014200210b0240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d042001290350210b0b20024200370300200142003703900241dafcc000411420014190026a10012006200229030037030020012001290390023703f001200141f0016a411041f8b3c200410041001002417f460d0120014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d042001290350211c0c020b02402018450d002017101d0b41ae9fc100410f100a41a3fec0004135100a200141b0026a24000f0b4205211c0b4200210420014190026a41086a220242003703002001420037039002418efec000411520014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240200141f0016a411041f8b3c200410041001002417f460d002001420037035820014200370350200141f0016a4110200141d0006a4110410010022202417f460d072002410f4d0d07200141d8006a2903002104200129035021000c010b420921000b20092016422088a7221d41306c6a2102024002400240201b450d00201b417f6a211041002108024020092002460d002009201d41306c6a220641506a2202290300200641586a29030084500d02200141a8026a200641786a290000370300200141a0026a200641706a29000037030020014198026a200641686a2900003703002001200641606a29000037039002410121080b410021120c020b4100211241002110410021080c010b410121120b200141d9006a20014190026a41086a290300370000200141e1006a20014190026a41106a290300370000200141e9006a20014190026a41186a290300370000200120083a005020012001290390023700514101211e200141d0006a4101722106024002402008450d00200620002004109401200141f0016a41186a200641186a290000370300200141f0016a41106a200641106a290000370300200141f0016a41086a200641086a290000370300200120062900003703f0014120101f221e450d09201e20012903f001370000201e41186a200141f0016a41186a2206290300370000201e41106a200141f0016a41106a2208290300370000201e41086a200141f0016a41086a2205290300370000200141d0006a4101722107410221114120210a4101210d4101211f410020106b220c41016a4101460d010340201241ff01710d0220092002460d02200241506a2210290300200241586a29030084500d022006200241786a2900003703002008200241706a2900003703002005200241686a2900003703002001200241606a2900003703f001200720012903f001370000200741086a2005290300370000200741106a2008290300370000200741186a2006290300370000200141013a005020072000200410940120014190026a41186a2202200629030037030020014190026a41106a2212200829030037030020014190026a41086a22132005290300370300200120012903f0013703900220062002290300370300200820122903003703002005201329030037030020012001290390023703f0010240200d201f470d00200d41016a2202200d490d1d2011200220022011491b221fad4205862203422088a70d1d2003a722024100480d1d0240200d450d00201e200a2002101e221e0d010c080b2002101f221e450d070b201e200a6a220220012903f001370000200241186a2006290300370000200241106a2008290300370000200241086a2005290300370000201141026a2111200a41206a210a4100211220102102200c200d41016a220d6a4101470d000c020b0b200141f0016a41186a200641186a290000370300200141f0016a41106a200641106a290000370300200141f0016a41086a200641086a290000370300200120062900003703f0014100210d4100211f0b4108212020014190026a41086a22024200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100212102400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10a40120012802502220450d0a200141d8006a2802002111200128025421210c010b410021110b200141013602502020201141286c6a210e024002400240024002400240201a422088a72205450d00410021224100212302402005200e20206b41286e2202200220054b1b2202450d00200241057422064100480d202006101f2208450d1220012008360250200221230b20202102200521082001280250222421060340200e20026b419f014d0d0220062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020084101460d0320062002290028370020200641386a200241c0006a290000370000200641306a200241386a290000370000200641286a200241306a29000037000020084102460d0420062002290050370040200641d8006a200241e8006a290000370000200641d0006a200241e0006a290000370000200641c8006a200241d8006a29000037000020084103460d0520062002290078370060200641f8006a20024190016a290000370000200641f0006a20024188016a290000370000200641e8006a20024180016a290000370000202241046a212220064180016a2106200241a0016a21022008417c6a22080d000c060b0b4100212320012802502124410021220c040b200e2002460d032020201141286c6a2112410121070240034020062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020082007220a460d01200a41016a2107200641206a21062012200241286a2202470d000b0b2022200a6a21220c030b202241017221220c020b202241027221220c010b202241037221220b201c200b7c210b201e200d4105746a2125024002400240024002402005450d00200e2020460d012005417f732106201141286c2108202021020340200141f0016a41186a200241186a290300370300200141f0016a41106a200241106a290300370300200141f0016a41086a200241086a290300370300200120022903003703f001200641016a2206450d03200241286a2102200841586a22080d000c020b0b200e2020460d00200141d0006a41186a202041186a290300370300200141d0006a41106a202041106a290300370300200141d0006a41086a202041086a29030037030020012020290300370350202041286a2106202029032021040c020b0240201e2025460d00200141f0016a41186a201e41186a2202290000370300200141f0016a41106a201e41106a2206290000370300200141f0016a41086a201e41086a22082900003703002001201e2900003703f0012008290000210420062900002100201e290000210320014190026a41186a200229000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002201e41206a210841022105200e2106200b21040c030b410021114108210c02402021450d002020101d0b410021070c100b200241206a2903002104200141d0006a41186a200141f0016a41186a290300370300200141d0006a41106a200141f0016a41106a290300370300200141d0006a41086a200141f0016a41086a290300370300200120012903f001370350200241286a21060b20014190026a41186a200141d0006a41186a29030037030020014190026a41106a200141d0006a41106a29030037030020014190026a41086a200141d0006a41086a290300370300200120012903503703900241002105201e21080b417f417f200e20066b41286d2202202520086b4105766a220720072002491b220241016a220720072002491b2211ad42287e2200422088a70d182000a72202417f4c0d18024002402002450d002002101f220c450d0c200c21260c010b4108210c410821260b200c200129039002370300200c41186a20014190026a41186a290300370300200c41106a20014190026a41106a290300370300200c41086a20014190026a41086a29030037030020262004370320024002402005450d0020082025460d01200841086a2900002104200841106a29000021002008290000210320014190026a41186a200841186a29000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002200841206a21080c100b02402006200e460d00200141d0006a41186a200641186a2202290300370300200141d0006a41106a200641106a2205290300370300200141d0006a41086a200641086a22072903003703002001200629030037035020014190026a41086a200729030037030020014190026a41106a200529030037030020014190026a41186a20022903003703002001200629030037039002200641286a2102200629032021044100210f0c110b20082025460d00200141f0016a41186a200841186a2202290000370300200141f0016a41106a200841106a2205290000370300200141f0016a41086a200841086a2207290000370300200120082900003703f00120072900002104200529000021002008290000210320014190026a41186a200229000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002200841206a21080c0f0b4101210720210d100c110b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200241011020000b200941011020000b41df88c0004133103a000b41df88c0004133103a000b412041011020000b41df88c0004133103a000b41df88c0004133103a000b200241081020000b200641011020000b200241081020000b410021020c090b4102210f200b2104200621020b4102210a41022106412821050340200141d0006a41186a221220014190026a41186a2214290300370300200141d0006a41106a221020014190026a41106a2215290300370300200141d0006a41086a221320014190026a41086a22272903003703002001200129039002370350024020062207417f6a22062011470d002006417f417f200e20026b41286d2226202520086b4105766a221120112026491b222641016a221120112026491b6a22262006490d0b200a20262026200a491b2211ad42287e2200422088a70d0b2000a722064100480d0b0240024020074101470d002006101f220c0d010c060b200c20052006101e220c450d050b200c21260b202620056a22062001290350370300200641186a2012290300370300200641106a2010290300370300200641086a2013290300370300200641206a2004370300024002400240024002400240200f41ff017122064101460d0020064102470d0120082025460d05200841086a2900002104200841106a2900002100200829000021032014200841186a29000037030020152000370300202720043703002001200337039002200841206a2108420121004102210f0c020b200e2002460d042014200241186a2903003703002015200241106a2903003703002027200241086a290300370300200120022903003703900220022903202104420121004101210f200241286a21020c030b200e2002470d014102210f024020082025460d00200141f0016a41186a200841186a2206290000370300200141f0016a41106a200841106a2212290000370300200141f0016a41086a200841086a2210290000370300200120082900003703f0012010290000210420122900002100200829000021032014200629000037030020152000370300202720043703002001200337039002200841206a2108420121000c010b420021000c020b200b21040c010b2012200241186a22062903003703002010200241106a22122903003703002013200241086a221029030037030020012002290300370350201029030021042012290300210020022903002103201420062903003703002015200037030020272004370300200120033703900220022903202104420121004100210f200241286a21020b200a41026a210a200741016a2106200541286a210520004200520d010b0b2021450d010b2020101d0b0240200741144b0d0041012128200741014d0d03417f21292007417f6a212a4128212b2026200741286c6a212c4102212d4120212e4118212f41102130410821314103213241f0002133415821344178213541702136416821374160213841c80021394100213a0c040b2007410176223bad42287e2204422088a70d062004a72202417f4c0d064108213c024002402002450d002002101f223d450d03203d213e0c010b4108213d4108213e0b4158213f202641586a2140202641a87f6a21414100214241042143417f21444101214542032146422021474103214841022149417d214a4128214b4178214c4120214d4118214e4110214f417e2150417421514164215241502153410521544109215541f000215641c800215741c0002158413821594130215a410a215b4104215c4100215d4100215e2007215f4101213a0c040b200641081020000b200241081020000b410021020c020b410121020c010b410121020b0240034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e020001010b20012007360258200120113602542001200c36025020014190026a41086a22654200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a2202206529030037030020012001290390023703f00120014110360294022001200141f0016a36029002200141d0006a20014190026a10870202402011450d00200c101d0b20654200370300200142003703900241d5fdc000411220014190026a10012002206529030037030020012001290390023703f00141002166024002400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a105e20012802502267450d02200141d8006a2802002168200128025421660c010b41012167410021680b200141d8016a4200370300200141d0016a4200370300200141c8016a4200370300200142003703c0012068ad2204421b88a70d172004420586a72265417f4c0d17024002402065450d002065101f22690d01206541011020000b410121690b200141d0006a41186a2206200141c0016a41186a290300370300200141d0006a41106a2208200141c0016a41106a290300370300200141d0006a41086a2205200141c0016a41086a290300370300200120012903c00137035002400240024020684102490d002068417f6a210220692165034020652001290350370000206541186a2006290300370000206541106a2008290300370000206541086a2005290300370000206541206a21652002417f6a22020d000b2068417f6a216a0c010b4100216a206921652068450d010b20652001290350370000206541186a200141d0006a41186a290300370000206541106a200141d0006a41106a290300370000206541086a200141d0006a41086a290300370000206a41016a216a0b2009201d41306c6a21652016a7216b4100216c4158216d4150216e4178216f4118217020014190026a41186a2171417021724110217320014190026a41106a2174416821754108217620014190026a41086a217741602178410121794105217a201b450d024102213a0c090b41df88c0004133103a000b02400240024002400240024002400240024002400240203a0e0400010203030b2007202a220220296a222a490d0402402007202a6b2206202d490d0020262002202b6c6a2202202e6a22052903002026202a202b6c6a2208202e6a220a29030022045a0d00200141f0016a202f6a22122008202f6a2210290300370300200141f0016a20306a2213200820306a220f290300370300200141f0016a20316a220e200820316a2214290300370300200120082903003703f001200820022903003703002014200220316a290300370300200f200220306a29030037030020102002202f6a290300370300200a2005290300370300024020062032490d00200820336a29030020045a0d0041022108202c210503402005220220346a2002290300370300200220356a2002202e6a290300370300200220366a2002202f6a290300370300200220376a200220306a290300370300200220386a200220316a290300370300200820286a220820064f0d012002202b6a2105200220396a2903002004540d000b0b200220012903f001370300200220043703202002202f6a2012290300370300200220306a2013290300370300200220316a200e2903003703000b202c20346a212c202a0d090c0e0b205f21604100215f41012161206020446a2210450d1502400240024002400240024020262010204b6c6a204d6a29030020262060204b6c22026a20536a29030022045a0d002041206020546c20487422056a2102034020102045460d02201020446a21102004200229030022005421062002203f6a21022000210420060d000c030b0b206020506a2105204120026a21064100215f41002102034020052002460d05200220456a21022004200629030022005a21082006203f6a21062000210420080d000b200220456a2161206020026b20446a2210450d030c020b410021100b20602010490d08206020074b0d0a0240206020106b22612045762208450d00204020056a210220262010204b6c6a21060340200141d0006a204d6a22052006204d6a220a290300370300200141d0006a204e6a22122006204e6a2213290300370300200141d0006a204f6a220f2006204f6a220e290300370300200141d0006a203c6a22142006203c6a2215290300370300200120062903003703502002203c6a222729030021042002204f6a222529030021002002204e6a222029030021032002290300210b200a2002204d6a222129030037030020132003370300200e2000370300201520043703002006200b37030020212005290300370300202020122903003703002025200f29030037030020272014290300370300200220012903503703002002203f6a21022006204b6a2106200820446a22080d000b0b2010450d010b206120554b0d00206020074b0d0820262010204b6c6a2162410021630c1c0b2010215f205d205e460d190c1a0b20602161205d205e460d160c170b20652009460d012065206d6a21022065206e6a2265290300200229030084500d01201b2079460d0b2079201b6b2102034020092065460d022065206d6a21062065206e6a2265290300200629030084500d02200220796a22020d000c0b0b0b20652009460d00024003402065206d6a29030021042065206e6a2202290300210020712065206f6a2903003703002074206520726a2903003703002077206520756a2903003703002001206520786a290300370390022000200484500d01200141d0006a20706a22062071290300370300200141d0006a20736a22082074290300370300200141d0006a20766a220520772903003703002001200129039002370350200141e0016a200141d0006a10fb01200141c0016a20706a220a2071290300370300200141c0016a20736a22122074290300370300200141c0016a20766a2210207729030037030020012001290390023703c001024020012802e0012079460d002002216520092002470d010c030b0b200141f0016a20766a22132010290300370300200141f0016a20736a22102012290300370300200141f0016a20706a2212200a290300370300200120012903c0013703f001200141e0016a20766a2802002102200141306a20706a220a2012290300370300200141306a20736a22122010290300370300200141306a20766a22102013290300370300200120012903f001370330200141106a20706a2213200a290300370300200141106a20736a220a2012290300370300200141106a20766a2212201029030037030020012001290330370310200620132903003703002008200a29030037030020052012290300370300200120012903103703500240206a20024d0d002065206e6a216520692002207a746a22022001290350370000200220706a2006290300370000200220736a2008290300370000200220766a2005290300370000206c20796a216c4100211b41000d0a4103213a0c110b4198a9c3002002206a104b000b200141306a41186a200141f0016a41186a290300370300200141306a41106a200141f0016a41106a290300370300200141306a41086a200141f0016a41086a290300370300200120012903f0013703300b0240206b450d002009101d0b024002400240206a206841ffffff3f7122652065206a4b1b2208450d0020672165206921024100214d0340024020652002460d0020652002412010d003450d004116101f2206450d032006410e6a41002900d7d940370000200641086a41002900d1d940370000200641002900c9d940370000200641164136101e2206450d04200620652900003700162006412e6a206541186a290000370000200641266a206541106a2900003700002006411e6a206541086a29000037000020014190026a41086a2205420037030020014200370390022006413620014190026a1001200141d0006a41086a20052903003703002001200129039002370350200141d0006a411010092006101d0b206541206a2165200241206a2102204d41016a224d2008490d000b0b2069206a4105746a2165206a21050240024002400240024002400240206a4104490d00200141d0006a41206a213c20014190016a214f200141b0016a214e200141d0016a213f200141e8006a2106200141e0006a214d200141d8006a210820652102206a2105034020064200370300204d420037030020084200370300200142003703500240203c2002460d00200241606a200141d0006a412010d0030d030b20064200370300204d420037030020084200370300200142003703500240204f2002460d00200241406a200141d0006a412010d0030d040b20064200370300204d420037030020084200370300200142003703500240204e2002460d00200241a07f6a200141d0006a412010d0030d050b20064200370300204d42003703002008420037030020014200370350200241807f6a21650240203f2002460d002065200141d0006a412010d0030d060b2005417c6a210520652102206520696b41ff004b0d000b0b20652069460d052005417f6a2102200141d0006a41206a2106200141e8006a214d200141e0006a2108200141d8006a21050340204d4200370300200842003703002005420037030020014200370350024020062065460d00206541606a200141d0006a412010d0030d060b2002417f6a21022069206541606a2265470d000c060b0b2005417f6a21020c030b2005417e6a21020c020b2005417d6a21020c010b2005417c6a21020b200241016a2265206a206a20654b1b216a0b200141ec006a2022360200200141d0006a41186a2023360200200141e4006a2024360200200141d0006a41106a200d360200200141dc006a201f360200200141d0006a41086a2265201e360200200141033a0054200141063a0050200141d0006a108b0120014190026a41086a22024200370300200142003703900241d5fdc000411220014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120014100360258200142013703502001206a3602900220014190026a200141d0006a1062024002400240206a450d00206a41057421054100206528020022026b214d2001280250213c2001280254210820692165034002402008204d6a411f4b0d00200241206a22062002490d232008410174224f20062006204f491b22064100480d23024002402008450d00203c20082006101e223c0d010c060b2006101f223c450d050b200621080b203c20026a22062065290000370000200641186a206541186a290000370000200641106a206541106a290000370000200641086a206541086a290000370000204d41606a214d200241206a2102206541206a2165200541606a22050d000b200141d8006a2002360200200120083602542001203c3602500c010b20652802002102200128025421082001280250213c0b200141f0016a4110203c2002100302402008450d00203c101d0b02402068450d002069101d0b20014190026a41086a22654200370300200142003703900241e7fdc000411620014190026a1001200141f0016a41086a2202206529030037030020012001290390023703f0012001206c360250200141f0016a4110200141d0006a4104100320654200370300200142003703900241fdfdc000411120014190026a10012002206529030037030020012001290390023703f00102400240200141f0016a411041f8b3c200410041001002417f460d0020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d06200128025041016a21650c010b410121650b20014190026a41086a22024200370300200142003703900241fdfdc000411120014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120012065360250200141f0016a4110200141d0006a4104100302402066450d002067101d0b201aa7450d202019101d0c200b200641011020000b411641011020000b413641011020000b202a2007102a000b41df88c0004133103a000b20102060102a000b20602010417f6a225f490d160b20602007102b000b4100213a0c050b4103213a0c050b4102213a0c070b4103213a0c070b4103213a0c070b410021020c0e0b410121020c0d0b410121020c0c0b410121020c0b0b410121020c0a0b410121020c090b410121020c080b410121020c070b410021020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b205d205e470d13410121020c170b205d20456a2202205d490d1a205d2045742206200220022006491b2202ad2046862204204788a70d1a2004a722062042480d1a02400240205d450d00205c205d2048742006101e225c0d010c030b2006101f225c450d020b2002215d410221020c160b205c205e2048746a220220613602042002205f360200205e20456a2264215e20642049490d02410121630c140b200641041020000b0240024020630e020001010b2060201020446a225f490d1602402060205f6b22612049490d0020262010204b6c6a2202204d6a22082903002026205f204b6c6a2206204d6a220529030022045a0d00200141f0016a204e6a220a2006204e6a2212290300370300200141f0016a204f6a22132006204f6a220f290300370300200141f0016a203c6a220e2006203c6a2214290300370300200120062903003703f0012006200229030037030020142002203c6a290300370300200f2002204f6a29030037030020122002204e6a29030037030020052008290300370300024020612048490d00200620566a29030020045a0d0041022106206221080240034020082202204d6a200220576a2903003703002002204e6a200220586a2903003703002002204f6a200220596a2903003703002002203c6a2002205a6a29030037030020022002204b6a2208290300370300200620456a220620614f0d01200220566a2903002004540d000b0b2002204b6a21020b200220012903f001370300200220043703202002204e6a200a2903003703002002204f6a20132903003703002002203c6a200e2903003703000b205f450d0f2062203f6a2162205f21102061205b490d0d410021020c140b0240024002400240205c2064220e20446a22642048746a2202280200450d00205c200e2048746a220a20516a2802002205200228020422064d0d004102215e200e41024d0d04205c200e204a6a22022048746a2802042208200620056a4d0d014103215e200e41034d0d04200a20526a280200200820056a4d0d010c050b200e2048490d0120022802042106205c200e204a6a22022048746a28020421080b20082006490d010b200e20506a21020b200e200220456a22254d0d03200e20024d0d04205c20022048746a2215280204222020152802006a2202205c20252048746a2227280200225e490d05200220074b0d06201520436a21212026205e204b6c6a220f20272802042214204b6c22066a210a2002204b6c2108024002400240024002402002205e6b221220146b220220144f0d00203d200a2002204b6c220610ce031a203e20066a210520142045480d0120022045480d01204020086a2108200a2102034020082002203f6a22122005203f6a22132005204c6a2903002002204c6a29030054220a1b22062903003703002008204d6a2006204d6a2903003703002008204e6a2006204e6a2903003703002008204f6a2006204f6a2903003703002008203c6a2006203c6a29030037030020052013200a1b2105200f20122002200a1b22024f0d042008203f6a2108203e2106203e2005490d000c050b0b203d200f200610ce031a203e20066a210520142045480d01201220144c0d01202620086a2113203e2106200f210203402002200a2006200a204d6a2903002006204d6a2903005422121b22082903003703002002204d6a2008204d6a2903003703002002204e6a2008204e6a2903003703002002204f6a2008204f6a2903003703002002203c6a2008203c6a29030037030020062006204b6a20121b21062002204b6a2102200a204b6a200a20121b220a20134f0d04200520064b0d000c040b0b200a21020c010b200f21020b203e21060b20022006200520066b22082008204b706b10ce031a2021202020146a3602002015205e36020020272027203c6a2025204473200e6a20487410cf031a2064215e206420454b0d0d0b205f0d060c010b200e215e205f0d060b0240205d450d00205c101d0b203b450d06203d101d410021020c110b4188bfc3002025200e104b000b4188bfc3002002200e104b000b205e2002102a000b20022007102b000b4101213a0c020b4101213a0c020b410021020c0a0b410121020c090b410121020c080b410021630c030b410121630c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b205f2060102a000b102e000b1021000b2018450d002017101d0b200141b0026a24000b980201027f230041306b220224000240024002404113101f2203450d002003410f6a410028008f9d40360000200341086a41002900889d40370000200341002900809d40370000200341134126101e2203450d0120032001360013200241206a41086a220142003703002002420037032020034117200241206a1001200241086a200129030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a105e20022802202201450d0420002002290224370204200020013602000c010b20004100360208200042013702000b2003101d200241306a24000f0b411341011020000b412641011020000b41df88c0004133103a000bb20504027f017e017f037e230041206b220224000240024002404114101f2203450d00200341106a41002800d5ba40360000200341086a41002900cdba40370000200341002900c5ba40370000200341144134101e2203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241106a41086a220542003703002002420037031020034134200241106a1001200241086a2005290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022205417f460d022005410f4d0d02200241186a2903002106200229031021042003101d4118101f2203450d010c050b420021062003101d4118101f22030d040b411841011020000b41df88c0004133103a000b411441011020000b413441011020000b200341106a41002900e9ba40370000200341086a41002900e1ba40370000200341002900d9ba403700000240200341184138101e2203450d0020032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a29000037000042002107200241106a41086a220142003703002002420037031020034138200241106a1001200241086a2001290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022201417f460d022001410f4d0d02200241186a2903002108200229031021070c010b420021080b2003101d2000200720047c22043703002000200820067c2004200754ad7c370308200241206a24000f0b41df88c0004133103a000b413841011020000bc60201037f230041206b2201240002400240024002404110101f2202450d00200241086a41002900a49b403700002002410029009c9b4037000020002802002103200241104120101e2202450d01200220033600102002412041c000101e2202450d02200220002900043700142002412c6a2000411c6a290000370000200241246a200041146a2900003700002002411c6a2000410c6a290000370000200141106a41086a220042003703002001420037031020024134200141106a1001200141086a2000290300370300200120012903103703004100210002402001411041f8b3c200410041001002417f460d00200141003a001020014110200141106a41014100100241016a41014d0d0420012d001021000b2002101d200141206a240020000f0b411041011020000b412041011020000b41c00041011020000b41df88c0004133103a000bec1004097f047e097f027e230041a0036b220524000240024002400240024002400240024002400240024002402004450d0020054190036a41086a22064200370300200542003703900341939dc000411d20054190036a1001200541f0026a41086a200629030037030020052005290390033703f002410021060240200541f0026a411041f8b3c200410041001002417f460d0020054180026a4200370300200541e8016a41106a4200370300200541e8016a41086a4200370300200542003703e801200541f0026a4110200541e8016a4120410010022206417f460d0b2006411f4d0d0b200541a0016a41186a200541e8016a41186a290300370300200541a0016a41106a200541e8016a41106a290300370300200541a0016a41086a200541e8016a41086a290300370300200520052903e8013703a001410121060b4128101f2207450d0b200720063a0004200741f8b3c200360200200720052903a001370005200720052f00e8013b00252007410d6a200541a8016a290300370000200741156a200541b0016a2903003700002007411d6a200541b8016a290300370000200741276a200541ea016a2d00003a0000200541a0016a200710ba0120052d00a001450d012004417f6a2108200541e8016a41206a2109200541a0016a4101722106200541e8016a41c0006a220a2002460d02200541e8016a41186a210b200541e8016a41106a210c200541c8026a210d4200210e4200210f42002110420021110340200b200f370300200c200e370300200520103703e801200520113703f0012009200641c10010ce0321040240200a2002412010d0030d00200541f0026a41186a2212200441186a2213290200370300200541f0026a41106a2214200441106a2215290200370300200541f0026a41086a2216200441086a2217290200370300200520042902003703f0024110101f2218450d07201841086a41002900a49b403700002018410029009c9b40370000201841104120101e2218450d0a201820013600102018412041c000101e2218450d0b201820052903f0023700142018412c6a2012290300370000201841246a20142903003700002018411c6a201629030037000020054190036a41086a2219420037030020054200370390032018413420054190036a1001200541d0026a41086a221a201929030037030020052005290390033703d002200541d0026a411041f8b3c20041004100100221192018101d2019417f470d00200d2c00002118200541d0026a41186a22192013290000370300200541d0026a41106a22132015290000370300201a2017290000370300200520042900003703d00220054190016a200541d0026a109a0120054190016a41086a290300211b200529039001211c20054180016a200541d0026a109a01200541d0006a20052903800120054180016a41086a2903002018200320182003411874411875481b2204ad423886423887420010d20320122019290300370300201420132903003703002016201a290300370300200520052903d0023703f002200541e0006a2001200541f0026a20042008109c01201b200f7c201c200e7c220f201c54ad7c200541e0006a41186a2903007c200f20052903707c220e200f54ad7c210f200541d0006a41086a29030020117c2005290350221c20107c2211201c54ad7c200541e0006a41086a2903007c201120052903607c2210201154ad7c21110b200541a0016a200710ba0120052d00a0010d000c040b0b4200210e4200210f42002110420021110c030b42002110420021114200210e4200210f0c010b200541c8026a21164200210e4200210f42002110420021110340200541e8016a41186a200f370300200541e8016a41106a200e370300200520103703e801200520113703f0012009200641c10010ce032118200541f0026a41186a2202200641186a290000370300200541f0026a41106a220a200641106a290000370300200541f0026a41086a220b200641086a290000370300200520062900003703f0024110101f2204450d03200441086a41002900a49b403700002004410029009c9b40370000200441104120101e2204450d04200420013600102004412041c000101e2204450d05200420052903f0023700142004412c6a2002290300370000200441246a200a2903003700002004411c6a200b29030037000020054190036a41086a220c420037030020054200370390032004413420054190036a1001200541d0026a41086a2212200c29030037030020052005290390033703d002200541d0026a411041f8b3c200410041001002210c2004101d0240200c417f470d0020162c00002104200541d0026a41186a220c201841186a290000370300200541d0026a41106a2214201841106a2900003703002012201841086a290000370300200520182900003703d002200541c0006a200541d0026a109a01200541c0006a41086a290300211b2005290340211c200541306a200541d0026a109a0120052005290330200541306a41086a2903002004200320042003411874411875481b2204ad423886423887420010d2032002200c290300370300200a2014290300370300200b2012290300370300200520052903d0023703f002200541106a2001200541f0026a20042008109c01201b200f7c201c200e7c220f201c54ad7c200541106a41186a2903007c200f20052903207c220e200f54ad7c210f200541086a29030020117c2005290300221c20107c2211201c54ad7c200541106a41086a2903007c201120052903107c2210201154ad7c21110b200541a0016a200710ba0120052d00a0010d000b0b2007101d0b2000200e37031020002010370300200041186a200f37030020002011370308200541a0036a24000f0b411041011020000b412041011020000b41c00041011020000b412041011020000b41c00041011020000b41df88c0004133103a000b412841041020000bbd1207017f017e087f047e017f037e067f23004180016b2203240042002104200341086a41086a2205420037030020034200370308418cb9c000410d200341086a1001200341d8006a41086a2005290300370300200320032903083703580240024002400240024002400240200341d8006a411041f8b3c200410041001002417f460d0020034200370308200341d8006a4110200341086a41084100100241016a41084d0d01200329030821040b200341086a41106a427f370300200341086a41286a41023a0000200341086a41186a2002370300200341286a20002900003703002003427f3703104201210220034201370308200341d8006a200110ea0120032802582106200328025c2107024002400240024002400240024020032802602208450d000240200341d8006a41186a22092000460d00200341f9006a210a200841286c210b420121022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a2211200e370300200341d8006a41086a200d370300200320103703580240024020092900002000290000510d002011290300220d2004580d010c050b2003290308210d4200210220034200370308200d4201510d060b200c41286a210c200b41586a220b0d000c020b0b200841286c210b200341086a41186a29030021122003290318211320032903102114200329030821022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a200e370300200341d8006a41086a200d370300200342003703082003201037035820024201510d03200c41286a210c42002102200b41586a220b0d000b0b4100210902402007450d002006101d0b4108210a4100211520024201510d050c0b0b2003200a2800003602502003200a41036a280000360053200c41286a210c200341e0006a290300210e200341f8006a2d0000210b200341f0006a290300210f200329035821100c030b200c41286a210c0c010b200341086a41186a29030021122003290318211320032903102114200c41286a210c0b200341e0006a2903002202201320142003290358220d54201320025420132002511b220b1b210e200d2014200b1b2110200341e8006a2903002202201220122002541b210d200341f8006a2d0000410272210b200341f0006a290300210f420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336003b200320032802403602384128101f220a450d04200a2010370300200a200b3a0020200a200f370318200a200d370310200a2003280238360021200a200e370308200a41246a200328003b36000002400240200c2006200841286c6a2216460d002006200841286c6a2108200341d8006a41186a210b200341f9006a221741036a21184101210941012115034002400240024002400240200b2000460d000340200341d8006a41206a2219200c41206a290300370300200b200c41186a290300370300200341d8006a41106a2211200c41106a290300370300200341d8006a41086a221a200c41086a2903003703002003200c29030037035802400240200b2900002000290000510d002011290300220d2004580d010c040b2003290308210d4200210220034200370308200d4201510d040b2008200c41286a220c470d000c080b0b200341086a41186a290300210e2003290318210d2003290310210f200329030821020340200341d8006a41206a200c41206a290300370300200b200c41186a290300370300200341d8006a41106a200c41106a290300370300200341d8006a41086a200c41086a2903003703002003200c2903003703582003420037030820024201510d03420021022008200c41286a220c470d000c070b0b2003201728000036025020032018280000360053200c41286a210c201a290300211020192d00002111200b290300210e2003290358210f0c020b200341086a41186a290300210e2003290318210d2003290310210f0b200c41286a210c200341d8006a41086a2903002202200d200f2003290358221354200d200254200d2002511b22111b21102013200f20111b210f200341d8006a41106a2903002202200e200e2002541b210d200341d8006a41206a2d00004102722111200b290300210e420021020b2003200328005336004b200320032802503602482003200328004b36004320032003280248360240200341d8006a41206a221920113a0000200b200e370300200341d8006a41106a221a200d3703002017200328024036000020182003280043360000200320103703602003200f370358024020152009470d00200941016a22112009490d0620094101742215201120112015491b2215ad42287e220d422088a70d06200da722114100480d0602402009450d00200a200941286c2011101e220a0d010c080b2011101f220a450d070b200a200941286c6a22112003290358370300201141206a2019290300370300201141186a200b290300370300201141106a201a290300370300201141086a200341d8006a41086a290300370300200941016a2109200c2016470d000c020b0b41012109410121150b02402007450d002006101d0b20024201520d060b200341d8006a41206a2200200541206a290300370300200341d8006a41186a220b200541186a290300370300200341d8006a41106a2211200541106a290300370300200341d8006a41086a2208200541086a2903003703002003200529030037035820092015470d04200941016a220c2009490d0120094101742205200c200c2005491b2215ad42287e2202422088a70d012002a7220c4100480d01024002402009450d00200a200941286c200c101e220a450d010c060b200c101f220a0d050b200c41081020000b41df88c0004133103a000b1021000b201141081020000b412841081020000b200a200941286c6a220c2003290358370300200c41206a2000290300370300200c41186a200b290300370300200c41106a2011290300370300200c41086a2008290300370300200941016a21090b200320093602602003201536025c2003200a3602582001200341d8006a10f10120034180016a24000bc30201027f230041f0016b220224000240024002404112101f2203450d00200341106a41002f00eaa8413b0000200341086a41002900e2a841370000200341002900daa841370000200341124124101e2203450d012003200136001220024188016a41086a2201420037030020024200370388012003411620024188016a1001200241e8006a41086a2001290300370300200220022903880137036802400240200241e8006a411041f8b3c200410041001002417f460d002002421037027c2002200241e8006a36027820024188016a200241f8006a10e1022002290388014201520d04200241086a20024188016a41086a41e00010ce031a20004201370300200041086a200241086a41e00010ce031a0c010b200042003703000b2003101d200241f0016a24000f0b411241011020000b412441011020000b41df88c0004133103a000bc20502037f037e230041306b220424000240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441086a22064200370300200442003703002005413420041001200441206a41086a200629030037030020042004290300370320024002400240200441206a411041f8b3c200410041001002417f460d002004420037030820044200370300200441206a411020044110410010022206417f460d022006410f4d0d02200441086a2903002107200429030021080c010b42002108420021070b2005101d20042001200820027c2202200720037c2002200854ad7c10ec01200441106a290300210820042903082102024002400240024020042903004200510d0042002109200441086a220542003703002004420037030041aeb9c000411620041001200441206a41086a2201200529030037030020042004290300370320200441206a411041f8b3c200410041001002417f460d012004420037030820044200370300200441206a411020044110410010022206417f460d072006410f4d0d07200441086a2903002103200429030021070c020b200221090c020b42002107420021030b200542003703002004420037030041aeb9c000411620041001200120052903003703002004200429030037032020044200200320087d2007200254ad7d2208200720027d2202200756200820035620082003511b22051b37030820044200200220051b370300200441206a4110200441101003420021080b2000200937030020002008370308200441306a24000f0b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b7e01017f230041c0006b220124002001412e36020c2001419d96c000360208200120003602142001413c6a411b3602002001412c6a4102360200200141183602342001420237021c200141b8b1c4003602182001200141146a3602382001200141086a3602302001200141306a360228200141186a41c8b1c40010cf01000bb60504027f017e0e7f017e230041d0006b22022400200241086a200110d5010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210e4100210d0c030b102e000b200541081020000b200141046a2107200241306a41186a2108200241306a41106a21094100210a4100210b4100210c2003210d0240034020024200370330200141086a2205410020012802002007280200200241306a410820052802001002220e200e417f461b220e4108200e4108491b20052802006a220f360200200e41074d0d01200229033021042008420037030020094200370300200241306a41086a22104200370300200242003703302005410020012802002007280200200241306a4120200f1002220e200e417f461b220e4120200e4120491b20052802006a360200200e411f4d0d01200c41016a210e200241106a41186a220f2008290300370300200241106a41106a22112009290300370300200241106a41086a22122010290300370300200220022903303703100240200c200d470d00200a200e200e200a491b220dad42287e2213422088a70d042013a722054100480d040240200c450d002006200b2005101e22060d010c060b2005101f2206450d050b2006200b6a22052004370300200541206a200f290300370300200541186a2011290300370300200541106a2012290300370300200541086a2002290310370300200a41026a210a200b41286a210b200e210c200e2003490d000c020b0b200041003602000240200d450d002006101d0b200241d0006a24000f0b2000200d36020420002006360200200041086a200e360200200241d0006a24000f0b1021000b200541081020000ba20403057f017e037f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d002003200041286c6a2104200241086a22052802002100200228020421060340200329030021070240024002400240200620006b41084f0d00200041086a22082000490d0620064101742209200820082009491b220a4100480d062006450d0120022802002006200a101e22090d020c070b200041086a2108200228020021090c020b200a101f2209450d050b2002200a36020420022009360200200a21060b20052008360200200920006a20073700000240024002400240200620086b41204f0d00200841206a22002008490d062006410174220a20002000200a491b220a4100480d062006450d0120092006200a101e22090d020c080b200841206a21000c020b200a101f2209450d060b2002200a36020420022009360200200a21060b20052000360200200920086a220841086a200341106a290000370000200841106a200341186a290000370000200841186a200341206a2900003700002008200341086a290000370000200341286a22032004470d000b200128020020012802042009200010032006450d050c040b200228020421032001280200200128020420022802002209200241086a280200100320030d030c040b1021000b200a41011020000b200a41011020000b2009101d0b200241106a24000ba77f05057f057e057f017e097f230041d0096b22022400200241003a00f00820012802002001280204200241f0086a410120012802081002210320012001280208200341016a41014b22036a2204360208024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00f0082203410e4b0d07024020030e0f000b0709040c0e0a10060f03050d02000b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450dc10120022d00f008450d130cc1010b2000410f360200200241d0096a24000f0b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d1420022d00f00822034101460d1320030d14200241f0086a200110a30120022802f008210320024190086a200241f0086a41047241dc0010ce031a2003410f460d14200241b0076a20024190086a41dc0010ce031a41e000101f2201450d9d0120012003360200200141046a200241b0076a41dc0010ce031a20014108762104410121030c250b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450dbd0120022d00f008450d0f0cbd010b200241003a00f008410421032001280200200141046a280200200241f0086a4101200410022104200141086a22052005280200200441016a41014b22046a22053602002004450d1c20022d00f00822044102460d1b20044101460d1a20040d1c20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f00841042103200141086a220441002001280200200141046a280200200241f0086a41202005100222012001417f461b2201412020014120491b20042802006a3602002001411f4d0d1c200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210620022900ff08210720022900f7082108200241a0076a41086a220320012d00003a0000200220022f01980722013b019407200220022903e0063703a00720024190086a41086a20032d00003a0000200220013b018807200220022903a007370390082008422088a721012008a72104410121030c1e0b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d2920022d00f008220341044b0d29024020030e050027252624000b200241e8046a200110ca0220022903e804a7450d29200241f8046a290300210720022903f0042108200241f0086a200110bb0220022d00f00822034102460d292002418c096a2902002109200241fc086a290200210a20022f00f108210120022d00f308210420022902f408210b200220024184096a2902003703a0082002200a370398082002200b3703900820012004411074722101410121040c280b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1220022d00f00822054101460d114103210320050d13200241c0046a200110d50120022802c004450d1320022802c4042104200241f0086a200110a30120022802f008210520024190086a200241f0086a41047241dc0010ce031a2005410f460d13200241b0076a20024190086a41dc0010ce031a41e000101f2201450d9d0120012005360200200141046a200241b0076a41dc0010ce031a410121030c140b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22012001280200200341016a41014b6a3602002000410f360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d1420022d00f00822034101460d1220030d14200241f0086a200110bb0220022d00f00822034102460d1420022d00f308210c20022f00f108210d2002418c096a290200210720024188096a280200210420024184096a2802002105200241f0086a41106a2802002106200241fc086a280200210e20022902f4082108200241d8006a200110ca022002280258450d14200d200c411074722101200241d8006a41106a29030021094101210c2002290360210a0c130b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d6620022d00f008220341094b0d66024020030e0a00363334313839353b32000b200241f0086a200110920220022802f0082203450d6620022902f4082107200241a0036a200110d5012007a7210420022802a003450d6520022802a403210c200441087621012003410876210f20074220882107410121100c360b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d880120022d00f008220541064b0d880141022106024020050e0700b5012b2c2a2d2e000b200241186a200110d5012002280218450d8801200228021c2204417f4c0d8e012004450d6e200410792203450d9a01200141086a2205200441002001280200200141046a280200200320042005280200100222012001417f461b2201200120044b1b220120052802006a36020020012004470d6f0cb3010b200241003a00f008410421052001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22063602002003450d820120022d00f008220d410e4b0d82010240200d0e0f005354810150585b565d525e4f51594e000b200241f0086a200110bb0220022d00f00822044102460d820120022d00f308210620022f00f108210d2002418c096a290200210720024188096a280200210e20024184096a2802002103200241f0086a41106a350200210b200241fc086a350200211120022902f4082108200241b0016a200110ca0220022903b001a7450d8201200241b0016a41106a290300210a20022903b8012109200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210520012001280200200541016a41014b22056a3602002005450d820120022d00f008220c41024b0d8201200d200641107472210f200b422086201184210b410121050c80010b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d034105210320022d00f008220441034b0dae01024020040e0400191718000b200241f0086a200110a403200241a0076a41086a220120024190096a28020036020020024190086a41086a2204200241a8096a29030037030020024190086a41106a2205200241b0096a290300370300200220024188096a2903003703a0072002200241a0096a29030037039008200241c0096a290300210a200241b8096a29030021082002419c096a280200210e20024198096a280200210620024194096a280200210c200241f0086a41106a290300210720022903f808210920022903f0084201520d2c20024188076a41086a2001280200360200200241b0076a41086a2004290300370300200241b0076a41106a2005290300370300200220022903a0073703880720022002290390083703b007410121030caf010b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a220d3602002003450d5e20022d00f008220f410b4b0d5e410921030240200f0e0c004445424748464ba301434a41000b200241f0086a200110a30120022802f008210320024190086a200241f0086a41047241dc0010ce031a2003410f460d5e200241b0076a20024190086a41dc0010ce031a41e000101f2204450d9b0120042003360200200441046a200241b0076a41dc0010ce031a200241d0026a200110ca0220022903d002a7450d5d200241e0026a290300210720022903d8022208422088a7210e2008a7210c410121030c600b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450dae0120022d00f008450d050cae010b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d014106210320022d00f008220541044b0da801024020050e050024212220000b200241f0086a200110a30120022802f008210120024190086a200241f0086a41047241dc0010ce031a2001410f460da801200241b0076a20024190086a41dc0010ce031a41e000101f2204450d940120042001360200200441046a200241b0076a41dc0010ce031a410121030caa010b410521030caa010b410621030ca6010b200241e0046a200110d50120022802e004450dad0120022802e4042203417f4c0d86012003450d35200310792204450d8e01200141086a2205200341002001280200200141046a280200200420032005280200100222012001417f461b2201200120034b1b220120052802006a36020020012003470d360ca4010b200241086a200110f1022002290308a7450dad012002290310210720004100360200200041086a2007370300200241d0096a24000f0b200241d0046a200110f10220022903d004a7450da80120022903d80421072000410a360200200041086a2007370300200241d0096a24000f0b200241f0086a200110bb024102210320022d00f00822014102470d100b2000410f360200200241d0096a24000f0b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f008200141086a220541002001280200200141046a280200200241f0086a41202004100222032003417f461b2203412020034120491b20052802006a3602002003411f4d0d00200241a0076a41086a2203200241f0086a411f6a2d00003a0000200220022f00f1083b01940720022002290087093703a00720022d00f008210520022800f308210420022900ff08210720022900f7082108200241b0076a41086a20032d00003a0000200220022f0194073b019c07200220022903a0073703b007200241c8046a200110d5014103210320022802c804450d0120022802cc042106200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210e20012001280200200e41016a41014b220e6a360200200e450d012008422088a7210e2008a7210120022d00f008210c20024188076a41086a200241b0076a41086a2d00003a0000200220022f019c073b018407200220022903b00737038807410221030c020b410321030b0b200241f0086a41086a220d20024188076a41086a2d00003a0000200220022f0184073b01e00620022002290388073703f008200220022f01de063b01ac07024020034103470d002000410f360200200241d0096a24000f0b200241f8066a41086a220f200d2d00003a0000200220022f01e0063b01dc06200220022903f0083703f806200220022f01ac073b01da06200020053a0005200020033a000420004109360200200041146a2007370200200041106a200e3602002000410c6a2001360200200041086a20043602002000200c3a0025200041286a2006360200200020022f01dc063b00062000411c6a20022903f806370200200041246a200f2d00003a0000200020022f01da063b0126200241d0096a24000f0b200241f0086a200110bb0220022d00f00822034102460d0120022d00f308210c20022f00f108210d2002418c096a290200210720024188096a280200210420024184096a2802002105200241f0086a41106a2802002106200241fc086a280200210e20022902f408210820024188016a200110ca02200229038801a7450d0120024188016a41106a2903002109200229039001210a200241f0006a200110ca022002290370a7450d01200d200c41107472210120024180016a29030021112002290378210b4102210c0b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2011370200200041c0006a200b370200200041386a2009370200200041306a200a370200200041286a2007370000200041246a2004360000200041206a20053600002000411c6a2006360000200041186a200e360000200041106a20083700002000410c6a20033a0000200041086a200c360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b200241a0016a200110f10220022903a001a7450d0120022903a8012207422088a721012007a72104410221030c020b200241003a00f008410421032001280200200141046a280200200241f0086a4101200510022104200141086a22012001280200200441016a41014b22016a3602002001450d0020022d00f0082105410321030c020b0b0b200241f0086a41086a220e20024190086a41086a2d00003a0000200220022f0188073b01e00620022002290390083703f008200220022f01f8063b01ac07024020034104470d002000410f360200200241d0096a24000f0b200241b0076a41086a220c200e2d00003a0000200220022f01e0063b019c07200220022903f0083703b007200220022f01ac073b018407200020053a0009200041086a20033a000020004104360200200041186a2007370200200041146a2001360200200041106a20043602002000410c6a2006360200200020022f019c073b000a200041206a20022903b007370000200041286a200c2d00003a0000200020022f0184073b012a200241d0096a24000f0b200241f0086a200110bb0220024190086a41086a22042002418c096a280200360200200220024184096a2902003703900820022d00f00822054102460d970120022d00f308210d20022f00f108210f20024190096a280200210c200241fc086a290200210720022902f4082109200241a0076a41086a200428020036020020022002290390083703a00720024190066a200110ca0241052103200229039006a7450d7220024190066a41106a290300210a200229039806210b20024180066a200110f102200229038006a7450d722002290388062108200241f8056a200110d50120022802f805450d7220022802fc05220e417f4c0d75200e450d70200e10792206450d8701200141086a2204200e41002001280200200141046a2802002006200e2004280200100222012001417f461b22012001200e4b1b220120042802006a3602002001200e470d710c90010b200241c0066a200110ca0220022903c006a7450d9601200241d0066a290300210820022903c806210a200241b0066a200110f10220022903b006a7450d960120022903b806210b20024188096a4200370300200241f0086a41106a4200370300200241f0086a41086a4200370300200242003703f00841002106200141086a220341002001280200200141046a280200200241f0086a41202003280200100222042004417f461b2204412020044120491b20032802006a3602002004411f4d0d4c2002419e076a20022d00f2083a000020024190086a41086a200241f0086a411f6a2d00003a0000200220022f01f0083b019c0720022002290087093703900820022f01f40820022d00f60841107472210420022d00f308210520022900f708210920022900ff082107410121060c4d0b200241e8056a200110f10220022903e805a7450d950120022903f0052107200241e0056a200110d50120022802e005450d950120022802e4052206417f4c0d732006450d51200610792205450d8001200141086a2204200641002001280200200141046a280200200520062004280200100222012001417f461b2201200120064b1b220120042802006a36020020012006470d520c8d010b20022f00f10820022d00f308411074722104200241fc086a2802002105200241f0086a41106a280200210620024184096a280200210e20024188096a280200210c2002418c096a290200210820022902f40821070b200020033602042000410e360200200041246a2008370200200041206a200c3602002000411c6a200e360200200041186a2006360200200041146a20053602002000410c6a2007370200200041086a2004410874200141ff017172360200200241d0096a24000f0b200241d8056a200110d50120022802d805450d0520022802dc0522034108762101410521040c030b200241c8056a200110d50120022802c805450d0420022802cc052103200241b0056a200110ca0220022903b005a7450d04200241c0056a290300210720022903b8052108200241a0056a200110f10220022903a005a7450d0420022903a805210920024198056a200110d501200228029805450d04200228029c052101200241a0086a20073703002002200837039808200220013602900820034108762101410321040c030b200241d0056a200110d50120022802d005450d0320022802d40522034108762101410421040c010b20024180056a200110ca02200229038005a7450d0220024190056a29030021072002200229038805370390082002200737039808410221040b0b200241f0086a41106a20024190086a41106a290300220a370300200241f0086a41086a20024190086a41086a290300220b370300200241b0076a41086a2205200b370300200241b0076a41106a2206200a3703002002200229039008220a3703b0072002200a3703f008200041386a2007370200200041306a20083702002000410c6a2001410874200341ff017172360200200041086a20043602002000410c360200200041286a2009370200200041106a20022903b007370200200041186a2005290300370200200041206a2006290300370200200241d0096a24000f0b200241f0086a41106a20024190086a41106a290300370300200241f0086a41086a20024190086a41086a29030037030020022002290390083703f0082000410f360200200241d0096a24000f0b200241b0046a200110f10220022903b004a7450d880120022903b8042207422088a721012007a72105410521030c020b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f00841002105200141086a220641002001280200200141046a280200200241f0086a41202004100222012001417f461b2201412020014120491b20062802006a3602002001411f4d0d19200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210620022800f308210420022900ff08210720022900f7082108200241b0076a41086a20012d00003a0000200220022f0198073b019c07200220022903e0063703b0072008422088a721012008a721054101210e0c1a0b200241a0046a200110f10220022903a004a7450d860120022903a8042207422088a721012007a72105410421030b0c86010b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f00841002105200141086a220641002001280200200141046a280200200241f0086a41202004100222042004417f461b2204412020044120491b20062802006a220e3602002004411f4d0d18200241e0066a41086a2205200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210620022800f308210420022900f708210820022900ff08210720024190086a41086a20052d00003a0000200220022f0198073b01ac07200220022903e00637039008410121050c190b200241286a200110d5012002280228450d5e200228022c2204417f4c0d642004450d3e200410792203450d72200141086a2205200441002001280200200141046a280200200320042005280200100222012001417f461b2201200120044b1b220120052802006a36020020012004470d3f0c7d0b200241206a200110d5012002280220450d5d20022802242204417f4c0d632004450d3f200410792203450d72200141086a2205200441002001280200200141046a280200200320042005280200100222012001417f461b2201200120044b1b220120052802006a36020020012004470d400c7b0b200242003703f00841042106200141086a220341002001280200200141046a280200200241f0086a41082004100222012001417f461b2201410820014108491b20032802006a360200200141074d0d5c20022903f00821070c88010b200241c0006a200110d5012002280240450d5b20022802442213ad42187e2207422088a70d612007a72204417f4c0d612004450d432004101f22030d44200441041020000b200241d0006a200110d5012002280250450d5a20022802542212ad420c7e2207422088a70d602007a72204417f4c0d602004450d442004101f22030d45200441041020000b0c82010b200241d0036a200110d50120022802d003450d3520022802d4032203410876210f42002107410521100c080b20024190046a200110f102200229039004a7450d34200229039804220842208821072008a722044108762101410a21100c090b200241c0036a200110d50120022802c003450d3320022802c4032103200241f0086a200110bb0220022d00f00822044102460d3320022d00f308210c20022f00f108210f2002418c096a290200210820024184096a2802002105200241f0086a41106a2802002106200241fc086a280200210e20022902f4082107200220024188096a280200360290082002200837029408200241b8036a200110d50120022802b803450d3320022802bc03210d200241b0036a200110d50120022802b003450d33200f200c4110747221012007422088a7210c2008422088a721122003410876210f200229039008210820022802b403ad21094200210a410321100c0a0b200241c8036a200110d50120022802c803450d3220022802cc032203410876210f42002107410421100c050b200241f0086a200110bb0220022d00f00822034102460d3120022902f40822084220882107410821102008a72204410876210120022f00f10820022d00f30841107472210f200241fc086a280200210c200241f0086a41106a280200210e20024184096a280200210620024188096a28020021052002418c096a29020021080c080b200241f0086a200110920220022802f0082203450d3020022902f4082107200241a8036a200110d5012007a7210420022802a803450d2f20022802ac03210c200441087621012003410876210f20074220882107410221100b0c050b200241f0086a200110bb0220022d00f00822034102460d2e20022d00f308210420022f00f108210d2002418c096a290200210820024188096a280200210520024184096a2802002106200241f0086a41106a280200210e200241fc086a280200210c20022902f408210b200241e0036a200110ca0220022903e003a7450d2e200241e0036a41106a290300210a20022903e8032109200241d8036a200110d50120022802d803450d2e200d200441107472210f20022802dc032112200b4220882107200ba722044108762101410621100c050b200241f8036a200110d50120022802f803450d2d20022802fc032203410876210f42002107410721100b0c020b20024180046a200110f102200229038004a7450d2b200229038804220842208821072008a722044108762101410921100b0b0b20004107360200200041c0006a200a370200200041386a2009370200200041346a200d360200200041306a2012360200200041286a2008370200200041246a2005360200200041206a20063602002000411c6a200e360200200041186a200c360200200041086a20103602002000410c6a200f410874200341ff017172360200200041106a20074220862001ad42ffffff07834208862004ad42ff01838484370200200241d0096a24000f0b410121042001280200200141046a28020041014100200141086a28020010021a41002003460d6e0b2003450d762004101d0c760b410021014100210e0b200241a0076a41086a220c200241b0076a41086a2d00003a0000200220022f019c073b019407200220022903b0073703a0070240200e450d0020024190086a41086a2203200c2d00003a0000200220022f019407220e3b01ac07200220022903a0073703900820024188076a41086a20032d00003a00002002200e3b018407200220022903900837038807410321030b0c6e0b0b200241a0076a41086a220c20024190086a41086a2d00003a0000200220022f01ac073b01940720022002290390083703a00702402005450d00200241b0076a41086a200c2d00003a0000200220022f0194073b019c07200220022903a0073703b007200241003a00f0082001280200200141046a280200200241f0086a4101200e10022105200141086a22012001280200200541016a41014b22016a3602002001450d0020022d00f008210e20024188076a41086a200241b0076a41086a2d00003a0000200220022f019c073b018407200220022903b007370388072008422088a721012008a72105410221030c6d0b0c6c0b410c21030c1e0b200241f8026a200110d501410d210320022802f802450d1d20022802fc022104200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210520012001280200200541016a41014b22056a3602002005450d1d20022d00f0082105410421030c600b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f008200141086a220341002001280200200141046a280200200241f0086a4120200d100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d1b200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210420022900ff08210720022900f7082108200241a0076a41086a220320012d00003a0000200220022f01980722013b019407200220022903e0063703a00720024190086a41086a220620032d00003a0000200220013b01ac07200220022903a00737039008200241b0076a41086a220320062d00003a0000200220013b019c0720022002290390083703b00720024188076a41086a20032d00003a0000200220013b018407200220022903b007370388072008422088a7210e2008a7210c410a21030c5f0b200241e8026a200110d5014102410d20022802e8021b210320022802ec0221040c040b200241f0026a200110d501410d210320022802f002450d1a20022802f4022104200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210520012001280200200541016a41014b22056a3602002005450d1a20022d00f0082105410321030c5d0b20024190036a200110f102410d2103200229039003a7450d19200229039803210720024188036a200110d501200228028803450d19200228028c0321042007422088a7210e2007a7210c410721030c1a0b200241f0086a200110a30120022802f008210320024190086a200241f0086a41047241dc0010ce031a2003410f460d17200241b0076a20024190086a41dc0010ce031a41e000101f2204450d5520042003360200200441046a200241b0076a41dc0010ce031a200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22032802001002210520032003280200200541016a41014b22056a22063602002005450d1620022d00f008220541024b0d16200242003703f008200141086a220341002001280200200141046a280200200241f0086a41082006100222012001417f461b2201410820014108491b20032802006a360200200141074d0d1620022903f0082207422088a7210e2007a7210c410521030c5b0b20024180036a200110d5014106410d2002280280031b210320022802840321040b0c170b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f008200141086a220641002001280200200141046a220e280200200241f0086a4120200d100222032003417f461b2203412020034120491b20062802006a220c3602002003411f4d0d14200241e0066a41086a2203200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210420022900f708210820022900ff082107200241a0076a41086a220d20032d00003a0000200220022f01980722033b019407200220022903e0063703a007200241b0076a41086a220f200d2d00003a0000200220033b019c07200220022903a0073703b00720024190086a41086a200f2d00003a0000200220033b01ac07200220022903b00737039008200241003a00f0082001280200200e280200200241f0086a4101200c1002210120062006280200200141016a41014b22016a3602002001450d2b20022d00f008210620024188076a41086a20024190086a41086a2d00003a0000200220022f01ac073b0184072002200229039008370388072008422088a7210e2008a7210c410b21030c580b20024188096a420037030020024180096a420037030041082103200241f0086a41086a4200370300200242003703f008200141086a220441002001280200200141046a280200200241f0086a4120200d100222012001417f461b2201412020014120491b20042802006a3602002001411f4d0d13200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210420022900ff08210720022900f7082108200241a0076a41086a220620012d00003a0000200220022f01980722013b019407200220022903e0063703a00720024188076a41086a20062d00003a0000200220013b018407200220022903a007370388072008422088a7210e2008a7210c0c570b200241f0086a2001105e20022802f0082204450d342004410876210f20022902f4082108410f21050c2e0b200241c0026a200110d50120022802c002450d3320022802c4022204410876210f410c21050c0a0b20024190026a200110d501200228029002450d322002280294022103200241f8016a200110ca0220022903f801a7450d3220024188026a290300210b2002290380022108410521050c2f0b200241003a00f0082001280200200141046a280200200241f0086a4101200610022103200141086a22012001280200200341016a41014b22016a3602002001450d3120022d00f008210c410d21050c050b200241a0026a200110f10220022802a002450d30410a210520022903a80221080c0c0b200241c8016a200110ca0220022903c801a7450d2f200241d8016a290300210b20022903d0012108410221050c010b200241e0016a200110ca0220022903e001a7450d2e200241f0016a290300210b20022903e8012108410321050b0c290b200241003a00f0082001280200200141046a280200200241f0086a410120061002210341082105200141086a22012001280200200341016a41014b22016a3602002001450d2c20022d00f008220c41034f0d2c0b0c290b20024198026a200110d501200228029802450d2a200228029c022214ad42247e2207422088a70d352007a72203417f4c0d352003450d222003101f22040d23200341041020000b200241c8026a200110d50120022802c802450d2920022802cc022204410876210f410e21050b0c010b410721050b0c220b200241f0086a200110bb0220022d00f00822044102460d2520022f00f10820022d00f30841107472210f200241fc086a290200210b20024184096a280200210320024188096a280200210e2002418c096a290200210720022902f4082108410921050c220b200241b0026a200110f10220022802b002450d24410b210520022903b80221080b0c1e0b2004103c2004101d0b410d21030b0b0c410b2004450d002003101d0b2000410f360200200241d0096a24000f0b0b200241ac076a41026a22032002419c076a41026a2d00003a0000200241f0086a41086a220e20024190086a41086a2d00003a0000200220022f019c073b01ac0720022002290390083703f00802402006450d0020024198076a41026a20032d00003a0000200241a0076a41086a200e2d00003a0000200220022f01ac073b019807200220022903f0083703a007200241a8066a200110d5014105210320022802a806450d3b20022802ac062206417f4c0d272006450d2520061079220c450d3a200141086a220e200641002001280200200141046a280200200c2006200e280200100222012001417f461b2201200120064b1b2201200e2802006a36020020012006470d260c3c0b410521030c3a0b410121032001280200200141046a28020041014100200141086a28020010021a41002004460d3e0b20040d1d0c1e0b410121032001280200200141046a28020041014100200141086a28020010021a41002004460d3b0b20040d1b0c1c0b410121052001280200200141046a28020041014100200141086a28020010021a41002006460d3b0b2006450d422005101d0c420b410121032001280200200141046a28020041014100200141086a28020010021a41002004460d440b20040d170c180b410421030b2013450d0242002107200141086a210c200141046a21154100210f410021044100210e201321160340200241386a200110d5012002280238450d15200228023c2206417f4c0d1d024002402006450d00200610792210450d28200c200641002001280200201528020020102006200c280200100222052005417f461b2205200520064b1b2205200c2802006a36020020052006460d010c160b410121102001280200201528020041014100200c28020010021a41002006470d150b200241306a200110d5012002280230450d1420022802342205417f4c0d1d024002402005450d00200510792212450d26200c200541002001280200201528020020122005200c2802001002220d200d417f461b220d200d20054b1b220d200c2802006a360200200d2005460d010c150b410121122001280200201528020041014100200c28020010021a41002005470d140b200e41016a210d0240200e2016470d00200f200d200d200f491b2216ad42187e2208422088a70d1f2008a722144100480d1f0240200e450d00200320042014101e22030d010c240b2014101f2203450d230b200320046a220e2010360200200e41146a2005360200200e41106a2005360200200e410c6a2012360200200e41046a2006ad220842208620088437020020074280808080107c2107200f41026a210f200441186a2104200d210e200d2013490d000c040b0b410421030b2012450d0242002107200141086a210f200141046a21154100210c410021054100210e201221100340200241c8006a200110d5012002280248450d07200228024c2204417f4c0d1b024002402004450d0020041079220d450d1f200f2004410020012802002015280200200d2004200f280200100222062006417f461b2206200620044b1b2206200f2802006a36020020062004460d010c080b4101210d2001280200201528020041014100200f28020010021a41002004470d070b200e41016a21060240200e2010470d00200c20062006200c491b2210ad420c7e2208422088a70d1d2008a722164100480d1d0240200e450d00200320052016101e22030d010c200b2016101f2203450d1f0b200320056a220e200d360200200e41046a2004ad220842208620088437020020074280808080107c2107200c41026a210c2005410c6a21052006210e20062012490d000c040b0b41002116420021070b2003450d1220072016ad842107410621060c3e0b41002110420021070b2003450d1020072010ad842107410721060c3c0b410d21030c2c0b2004450d00200d101d0b0240200e450d002003210103400240200141046a280200450d002001280200101d0b2001410c6a2101200541746a22050d000b0b20100d0c0c0d0b410421040b024002402014450d004200210720024188096a211720024184096a2118200241fc086a21194100210e411c210641002103201421130340200241f0086a200110bb0220022d00f008220c4102460d08200341016a210520022d00f308210d20022f00f108210f2002418c096a29020021082017280200211020182802002112200241f0086a41106a28020021152019280200211620022902f4082109024020032013470d00200e20052005200e491b2213ad42247e220a422088a70d16200aa7221a4100480d1602402003450d002004200641646a201a101e22040d010c1a0b201a101f2204450d190b200420066a22032008370000200341676a200f200d41107472220d4110763a0000200341656a200d3b00002003417c6a2010360000200341786a2012360000200341746a2015360000200341706a2016360000200341686a2009370000200341646a200c3a000020074280808080107c2107200e41026a210e200641246a21062005210320052014490d000c020b0b41002113420021070b2004450d0620072013ad8421082004410876210f410621050b0b0b0b0b200220022f01b00722013b01f008200220013b01e006200041386a200a370000200041306a2009370000200041186a200b370000200041106a20083700002000200c3a0009200041086a20053a000020004105360200200041286a2007370000200041246a200e360000200041206a20033600002000410c6a200f410874200441ff017172360000200020022f01e0063b000a200241d0096a24000f0b2013450d002004101d0b200220022f01b0073b01f0082000410f360200200241d0096a24000f0b2005450d002012101d0b2006450d002010101d0b0240200e450d002003210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200441686a22040d000b0b2016450d010b2003101d0b2000410f360200200241d0096a24000f0b410121062001280200200141046a28020041014100200141086a28020010021a4100200e460d1f0b200e450d002006101d0b0c1e0b4101210c2001280200200141046a28020041014100200141086a28020010021a41002006460d160b2006450d14200c101d0c140b102e000b1021000b200441011020000b201641041020000b201a41041020000b201441041020000b41e00041081020000b200541011020000b200341011020000b200641011020000b41e00041081020000b41e00041081020000b200441011020000b200641011020000b200441011020000b200441011020000b41e00041081020000b41e00041081020000b200e41011020000b200641011020000b0c010b20024194076a41026a20024198076a41026a2d00003a000020024188076a41086a200241a0076a41086a2d00003a00002002200a3703b007200220022f0198073b019407200220022903a007370388072002200b3703c007200220083703b807410421032006210e0b0c060b200241f0086a41086a220120024188076a41086a2d00003a0000200220022f0184073b01e00620022002290388073703f008200220022f01de063b01ac0702402003410d470d002000410f360200200241d0096a24000f0b200241f8066a41086a220d20012d00003a0000200220022f01e0063b01dc06200220022903f0083703f806200220022f01ac073b01da06200020053a0009200041086a20033a000020004106360200200041186a2007370200200041146a200e360200200041106a200c3602002000410c6a2004360200200020063a0029200020022f01dc063b000a200041206a20022903f806370200200041286a200d2d00003a0000200020022f01da063b012a200241d0096a24000f0b2004ad22074220862007842107410321060c0d0b2004ad22074220862007842107410521060c0c0b200541087621042006ad22084220862008842109410221030c080b200241c0076a200a37030020024188076a41086a200241a0076a41086a2802003602002002200b3703b807200220022903a007370388072002200e3602b007410321030b200f200d4110747221040b0c050b2004450d08200020043602042000410b360200200041086a2003ad2207422086200784370200200241d0096a24000f0b0b0b200241f0086a41086a220c20024188076a41086a2d00003a0000200220022f0184073b01e00620022002290388073703f008200220022f01de063b01ac07024020034106470d002000410f360200200241d0096a24000f0b200241f8066a41086a220d200c2d00003a0000200220022f01e0063b01dc06200220022903f0083703f806200220022f01ac073b01da06200020063a0009200041086a20033a000020004108360200200041186a2007370200200041146a2001360200200041106a20053602002000410c6a20043602002000200e3a0029200020022f01dc063b000a200041206a20022903f806370200200041286a200d2d00003a0000200020022f01da063b012a200241d0096a24000f0b0b200241a0076a41026a220120024194076a41026a2d00003a000020024190086a41086a220d20024188076a41086a280200360200200241f0086a41086a220f200241b0076a41086a290300370300200241f0086a41106a2210200241b0076a41106a290300370300200220022f0194073b01a007200220022903880737039008200220022903b0073703f008024020034105470d002000410f360200200241d0096a24000f0b20024184076a41026a221220012d00003a0000200241f8066a41086a2201200d280200360200200241e0066a41086a220d200f290300370300200241e0066a41106a220f2010290300370300200220022f01a0073b01840720022002290390083703f806200220022903f0083703e0062000410f6a20044110763a00002000410d6a20043b0000200041086a20033a00002000410d360200200041186a2007370200200041106a20093702002000410c6a20053a0000200041346a200e360200200041306a20063602002000412c6a200c360200200020022f0184073b00092000410b6a20122d00003a0000200041206a20022903f806370200200041286a2001280200360200200041386a20022903e006370200200041c0006a200d290300370200200041c8006a200f290300370200200041d8006a200a370200200041d0006a2008370200200241d0096a24000f0b2000410f360200200241d0096a24000f0b2004ad22074220862007842107410121060b20004101360200200041106a20073702002000410c6a2003360200200041086a2006360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b2000410f360200200241d0096a24000bdd0504027f017e0f7f017e230041d0006b22022400200241086a200110d5010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210f4100210d0c030b102e000b200541081020000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d024003402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001002220f200f417f461b220f4120200f412049220f1b20052802006a2210360200200f0d01200241106a41186a22112007290300370300200241106a41106a22122008290300370300200241106a41086a2213200e29030037030020022002290330370310200242003703302005410020012802002009280200200241306a410820101002220f200f417f461b220f4108200f4108491b20052802006a360200200f41074d0d01200c41016a210f200229033021042007201129030037030020082012290300370300200e2013290300370300200220022903103703300240200c200d470d00200a200f200f200a491b220dad42287e2214422088a70d042014a722054100480d040240200c450d002006200b2005101e22060d010c060b2005101f2206450d050b2006200b6a22052002290330370300200541186a2007290300370300200541106a2008290300370300200541086a200e290300370300200541206a2004370300200a41026a210a200b41286a210b200f210c200f2003490d000c020b0b200041003602000240200d450d002006101d0b200241d0006a24000f0b2000200d36020420002006360200200041086a200f360200200241d0006a24000f0b1021000b200541081020000bd60501097f230041c0006b220124000240024002400240411a101f2202450d00200241186a41002f00e89b403b0000200241106a41002900e09b40370000200241086a41002900d89b40370000200241002900d09b403700002002411a4134101e2202450d012002200036001a200141306a41086a22034200370300200142003703302002411e200141306a1001200141206a41086a200329030037030020012001290330370320200141206a411010092002101d4113101f2202450d022002410f6a410028008f9d40360000200241086a41002900889d40370000200241002900809d40370000200241134126101e2202450d0320022000360013200141306a41086a220342003703002001420037033020024117200141306a1001200141206a41086a200329030037030020012001290330370320200141206a411010092002101d200120001099012001280204210420012802002105024002400240024020012802082202450d0020024105742106200521030340200141186a2207200341186a290000370300200141106a2208200341106a290000370300200141086a2209200341086a290000370300200120032900003703004110101f2202450d02200241086a41002900a49b403700002002410029009c9b40370000200241104120101e2202450d03200220003600102002412041c000101e2202450d04200341206a2103200220012903003700142002412c6a2007290300370000200241246a20082903003700002002411c6a2009290300370000200141306a41086a220742003703002001420037033020024134200141306a1001200141206a41086a200729030037030020012001290330370320200141206a411010092002101d200641606a22060d000b0b02402004450d002005101d0b200141c0006a24000f0b411041011020000b412041011020000b41c00041011020000b411a41011020000b413441011020000b411341011020000b412641011020000b890303047f017e027f230041306b22032400200341206a41086a220442003703002003420037032020002001200341206a1001200341086a41086a20042903003703002003200329032037030820034100360228200342013703202002280200210120032002280208220236021c2003411c6a200341206a106202400240024002402002450d002002410374210520042802002102200328022421060340200129030021070240024002400240200620026b41084f0d00200241086a22002002490d0720064101742208200020002008491b22094100480d072006450d01200328022020062009101e22080d020c080b200241086a2100200328022021080c020b2009101f2208450d060b2003200936022420032008360220200921060b200141086a210120042000360200200820026a200737000020002102200541786a22050d000c020b0b2004280200210020032802242106200328022021080b200341086a411020082000100302402006450d002008101d0b200341306a24000f0b1021000b200941011020000bc20304027f017e087f017e230041106b220224002002200110d50102400240024002400240024002400240024002402002280200450d0020022802042203ad2204421d88a70d032004420386a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241106a24000f0b4108210620030d030b410021054100210b0c030b102e000b200541081020000b200141046a210741002108410021094100210a2003210b034020024200370308200141086a2205410020012802002007280200200241086a410820052802001002220c200c417f461b220c4108200c4108491b20052802006a360200200c41074d0d02200a41016a2105200229030821040240200a200b470d002008200520052008491b220bad420386220d422088a70d04200da7220c4100480d040240200a450d0020062009200c101e22060d010c060b200c101f2206450d050b200620096a2004370300200841026a2108200941086a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d002006101d0b200241106a24000f0b1021000b200c41081020000bb50d03017f017e097f230041d0006b2204240042002105200441206a41086a220642003703002004420037032041eb96c100411d200441206a1001200441086a220720062903003703002004200429032037030002400240024002400240024002400240024002402004411041f8b3c200410041001002417f460d002004421037021420042004360210200441206a200441106a10a90120042903304202510d0102402004280244450d00200441c0006a280200101d0b200041046a280200450d092000280200101d200441d0006a24000f0b2006420037030020044200370320418cb9c000410d200441206a100120072006290300370300200420042903203703000240024002402004411041f8b3c200410041001002417f460d002004420037032020044110200441206a41084100100241016a41084d0d01200429032021050b02402002a74101470d00200441206a41086a2206420037030020044200370320418897c100411a200441206a1001200441086a20062903003703002004200429032037030002402004411041f8b3c200410041001002417f460d002004420037032020044110200441206a41084100100241016a41084d0d0320042903202005580d00200041046a280200450d0c2000280200101d200441d0006a24000f0b200441206a41086a2206420037030020044200370320418897c100411a200441206a1001200441086a2006290300370300200420042903203703002004200142018620057c37032020044110200441206a410810030b200028020821062000280204210820002802002109200441206a41086a220042003703002004420037032041eb96c100411d200441206a1001200441086a20002903003703002004200429032037030020044100360228200442013703204108101f2200450d032004428880808080013702242004200036022020002005370000200041084110101e2200450d04200442908080808002370224200020013700082004200036022020042006360210200441106a200441206a106202400240024002402006450d002009200641286c6a210a200441206a41086a220b280200210c2004280224210720092100034002400240024002402007200c6b41204f0d00200c41206a2206200c490d062007410174220d20062006200d491b220e4100480d062007450d0120042802202007200e101e220d0d020c070b200c41206a21062004280220210d0c020b200e101f220d450d050b2004200e3602242004200d360220200e21070b200b2006360200200d200c6a220c41186a200041186a290000370000200c41106a200041106a290000370000200c41086a200041086a290000370000200c2000290000370000200041206a29030021050240200720066b41074b0d00200641086a220c2006490d032007410174220e200c200c200e491b220c4100480d03024002402007450d00200d2007200c101e220d0d010c070b200c101f220d450d060b2004200c3602242004200d360220200c21070b200b200641086a220c360200200d20066a2005370000200a200041286a2200470d000b0b200441286a28020021002004280224210702400240024002400240024002400240024002400240024020024201520d0020072000470d01200041016a22062000490d0c20004101742207200620062007491b22074100480d0c2000450d03200428022020002007101e22060d040c140b20072000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d05200428022020002007101e22060d060c140b200428022021060c030b20042802202106200721070c050b2007101f2206450d100b20042007360224200420063602200b200441206a41086a220b200041016a220d360200200620006a41013a000002402007200d6b41074b0d00200d41086a220c200d490d072007410174220e200c200c200e491b220c4100480d072007450d0420062007200c101e22060d050c110b2007210c0c050b2007101f2206450d0e0b20042007360224200420063602200b200441286a200041016a220d360200200620006a41003a0000200441102006200d10032007450d0f0c0e0b200c101f2206450d0c0b2004200c360224200420063602200b200b200041096a22003602002006200d6a200337000020044110200620001003200c0d0b0c0c0b1021000b200e41011020000b200c41011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b410841011020000b411041011020000b200741011020000b200741011020000b200c41011020000b2006101d0b2008450d002009101d0b200441d0006a24000bc20306037f017e017f027e017f027e230041106b22022400200242003703002001410020012802002001280204200241082001280208100222032003417f461b2203410820034108491b20012802086a22043602080240024002400240200341074d0d002002290300210520024200370300200141086a220641002001280200200141046a280200200241082004100222032003417f461b2203410820034108491b20062802006a360200200341074d0d00200229030021072002200110a40120022802002204450d0020022902042108200241003a00002001280200200141046a28020020024101200141086a22032802001002210620032003280200200641016a41014b22066a22093602002006450d0120022d00004101470d014200210a20024200370300200141086a220341002001280200200141046a280200200241082009100222012001417f461b2201410820014108491b20032802006a360200200141074d0d022002290300210b4201210a0c030b20004202370310200241106a24000f0b4200210a0b0b2000200b3703182000200a3703102000200737030820002005370300200041246a2008370200200041206a2004360200200241106a24000bc60303027f017e097f230041106b220224002002200110d50102400240024002400240024002400240024002402002280200450d0020022802042203ad2204421e88a70d032004420286a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241106a24000f0b4104210620030d030b410021054100210b0c030b102e000b200541041020000b200141086a210741002108410021094100210a2003210b0340200141046a28020021052007280200210c2002410036020c20074100200128020020052002410c6a4104200c100222052005417f461b2205410420054104491b20072802006a360200200541034d0d02200a41016a2105200228020c210c0240200a200b470d002008200520052008491b220bad4202862204422088a70d042004a7220d4100480d040240200a450d0020062009200d101e22060d010c060b200d101f2206450d050b200620096a200c360200200841026a2108200941046a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d002006101d0b200241106a24000f0b1021000b200d41041020000b880301097f230041306b22012400200141206a41086a220242003703002001420037032041bcbcc1004112200141206a1001200141086a41086a20022903003703002001200129032037030820014100360228200142013703202000280200210320012000280208220036021c2001411c6a200141206a106202400240024002402000450d002000410274210420022802002100200128022421050340200328020021060240024002400240200520006b41044f0d00200041046a22072000490d0720054101742208200720072008491b22094100480d072005450d01200128022020052009101e22080d020c080b200041046a2107200128022021080c020b2009101f2208450d060b2001200936022420012008360220200921050b200341046a210320022007360200200820006a2006360000200721002004417c6a22040d000c020b0b2002280200210720012802242105200128022021080b200141086a411020082007100302402005450d002008101d0b200141306a24000f0b1021000b200941011020000bb60202047f027e230041206b22022400200241106a41086a220342003703002002420037031041aeb9c0004116200241106a1001200241086a22042003290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022205417f460d022005410f4d0d02200241186a2903002106200229031021070c010b42002107420021060b200342003703002002420037031041aeb9c0004116200241106a100120042003290300370300200220022903103703002002427f200620017c200720007c22002007542203ad7c22072003200720065420072006511b22031b3703182002427f200020031b37031020024110200241106a41101003200241206a24000f0b41df88c0004133103a000b990201037f230041306b220224000240024002404117101f2203450d002003410f6a41002900f89c40370000200341086a41002900f19c40370000200341002900e99c4037000020034117412e101e2203450d0120032001370017200241206a41086a22044200370300200242003703202003411f200241206a1001200241086a200429030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a10970120022802202204450d0420002002290224370204200020043602000c010b20004100360208200042083702000b2003101d200241306a24000f0b411741011020000b412e41011020000b41df88c0004133103a000b9d0501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a20021062024002400240024002402000450d00200041e8006c2104200241086a2105034020052802002100200228020421060240024002400240024002400240024002402003280200410f470d0020062000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d03200228020020002007101e22060d040c0c0b20062000470d01200041016a22062000490d0a20004101742207200620062007491b22074100480d0a2000450d05200228020020002007101e22060d060c0c0b200228020021060c030b200228020021060c050b2007101f2206450d080b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41003a0000200341e8006a2103200441987f6a22040d030c040b2007101f2206450d060b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41013a00002003200210b201200341e0006a2802002107024002400240024020022802042206200528020022006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000101e22060d020c090b200228020021060c020b2000101f2206450d070b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200341e8006a2103200441987f6a22040d000b0b200228020421002001280200200128020420022802002203200241086a280200100302402000450d002003101d0b200241106a24000f0b1021000b200741011020000b200741011020000b200041011020000bf60201037f230041306b22022400024002404110101f2203450d00200341086a410029009dba4037000020034100290095ba40370000200341104120101e2203450d0120032001370010200241106a41086a220442003703002002420037031020034118200241106a1001200241086a2004290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200241106a41186a4200370300200241106a41106a4200370300200241186a42003703002002420037031020024110200241106a4120410010022204417f460d022004411f4d0d0220002002290310370000200041186a200241106a41186a290300370000200041106a200241106a41106a290300370000200041086a200241106a41086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b2003101d200241306a24000f0b41df88c0004133103a000b411041011020000b412041011020000b890201027f230041306b22022400024002400240410f101f2203450d00200341076a41002900b4bf41370000200341002900adbf413700002003410f411e101e2203450d012003200136000f200241206a41086a220142003703002002420037032020034113200241206a1001200241086a200129030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a105e20022802202201450d0420002002290224370204200020013602000c010b20004100360208200042013702000b2003101d200241306a24000f0b410f41011020000b411e41011020000b41df88c0004133103a000bc10903017f017e057f230041e0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002903002203423f560d00200141046a280200200141086a2802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d05200128020020002005101e2204450d060c190b2003428080015a0d01200141046a2802002204200141086a28020022006b41024f0d02200041026a22052000490d1020044101742200200520052000491b22004100480d102004450d08200128020020042000101e2204450d090c160b200128020021040c180b20034280808080045a0d01200141046a2802002204200141086a28020022006b41044f0d04200041046a22052000490d0e20044101742200200520052000491b22004100480d0e2004450d08200128020020042000101e22040d090c120b200128020021040c140b4108200379a74103766b22064104490d0e200141046a280200200141086a2802002205470d03200541016a22042005490d0c20054101742207200420042007491b22044100480d0c2005450d09200128020020052004101e22070d0a0c110b2005101f22040d130b200541011020000b200128020021040c050b200128020021070c070b2000101f22040d0d0b200041011020000b2000101f2204450d090b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a7410274410272360000200241e0006a24000f0b2004101f2207450d070b20012007360200200141046a2004360200200141086a28020021050b200141086a2204200541016a360200200720056a200641027441736a3a0000200220002903002203370308200141046a210703400240024002400240200728020020042802002200470d00200041016a22052000490d0520004101742208200520052008491b22084100480d052000450d01200128020020002008101e22050d020c060b200128020021050c020b2008101f2205450d040b2001200536020020072008360200200428020021000b2004200041016a360200200520006a2003a73a0000200342088821032006417f6a22060d000b20022003370308200350450d03200241e0006a24000f0b1021000b200841011020000b41c0dac300102c000b2002200241086a360240200241f0c0c100360244200241c8006a41146a4100360200200241286a41146a411c360200200241346a411d360200200241106a41146a4103360200200241f8b3c2003602582002420137024c200241d8dac3003602482002411d36022c20024203370214200241e0b0c4003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a41e0dac30010cf01000b200041011020000b200441011020000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b0000200241e0006a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a0000200241e0006a24000ba1ce0103067f017e047f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002203450d0020034101460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110b101200028020022034101470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00000240200041086a28020022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a00002000410c6a28020021072002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d1220054101742204200620062004491b22044100480d122005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a200041086a28020021030b024020034102470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a28020021030b024020034103470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41023a00002000410c6a28020021072002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d1220054101742204200620062004491b22044100480d122005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a200041086a28020021030b024020034104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041106a290300210802400240024002400240200141046a2802002204200528020022036b41084f0d00200341086a22052003490d1220044101742203200520052003491b22034100480d122004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341086a360200200420036a2008370000200041086a28020021030b024020034105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41043a00002000410c6a28020021072002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d1220054101742204200620062004491b22044100480d122005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a200041086a28020021030b024002400240024002400240024020034106470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1820034101742205200420042005491b22044100480d182003450d01200128020020032004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41053a00002000410c6a28020021032002200041146a280200220536020c2002410c6a2001106202402005450d002003200541186c6a2109200141046a210703402003280200210a2002200341086a280200220536020c2002410c6a2001106202400240024002402007280200220b200428020022066b20054f0d00200620056a220c2006490d19200b4101742206200c200c2006491b22064100480d19200b450d012001280200200b2006101e220b0d020c070b2001280200210b0c020b2006101f220b450d050b2001200b36020020072006360200200428020021060b2004200620056a360200200b20066a200a200510ce031a2003410c6a280200210a2002200341146a280200220536020c2002410c6a2001106202400240024002402007280200220b200428020022066b20054f0d00200620056a220c2006490d19200b4101742206200c200c2006491b22064100480d19200b450d012001280200200b2006101e220b0d020c080b2001280200210b0c020b2006101f220b450d060b2001200b36020020072006360200200428020021060b2004200620056a360200200b20066a200a200510ce031a200341186a22032009470d000b0b200041086a28020021030b20034107470d04024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1520034101742205200420042005491b22054100480d152003450d01200128020020032005101e2204450d020c050b200128020021040c050b2005101f22040d030b200541011020000b200641011020000b200641011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41063a00002000410c6a28020021052002200041146a280200220336020c2002410c6a200110622003450d0020052003410c6c6a2109200141046a210a03402005280200210b2002200541086a280200220336020c2002410c6a200110620240024002400240200a2802002207200628020022046b20034f0d00200420036a220c2004490d1320074101742204200c200c2004491b22044100480d132007450d01200128020020072004101e22070d020c060b200128020021070c020b2004101f2207450d040b20012007360200200a2004360200200628020021040b2006200420036a360200200720046a200b200310ce031a2005410c6a22052009470d000b0b200028020022034102470d020c030b200441011020000b20034102460d010b20034103460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0e20034101742205200420042005491b22054100480d0e2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200028020022034103470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0d20034101742205200420042005491b22054100480d0d2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240200041086a2802004101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0f20034101742206200420042006491b22064100480d0f2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110bc022002200041306a36020c2002410c6a200110f302200041086a2802004102470d010b02400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0e20034101742205200420042005491b22054100480d0e2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110bc022002200041306a36020c2002410c6a200110f3022002200041c0006a36020c2002410c6a200110f3020b41042104200028020022034104470d010c020b4104210420034104460d010b20034105460d010c020b02400240024002400240200120046a280200200141086a2802002203470d00200341016a22042003490d0a20034101742205200420042005491b22054100480d0a2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00000240200041086a22032d000022044101470d0002400240024002400240200141046a28020020052802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41003a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0b20054101742204200620062004491b22044100480d0b2005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000020032d000021040b0240200441ff01714102470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a41013a0000200041106a200110b10120032d000021040b0240200441ff01714103470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41023a000002400240024002400240200141046a28020020062802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a200341016a2d00003a00000b200028020022034105470d010b02400240024002400240200141046a220b280200200141086a22052802002203470d00200341016a22042003490d0920034101742206200420042006491b22064100480d092003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41053a00000240024002400240024002400240200041086a2d000022034101470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d1020034101742206200420042006491b22064100480d102003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110bc022002200041306a36020c2002410c6a200110f302024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200b28020020052802002203470d03200341016a22042003490d1a20034101742206200420042006491b22064100480d1a2003450d08200128020020032006101e22040d090c110b200b28020020052802002203470d01200341016a22042003490d1920034101742206200420042006491b22064100480d192003450d04200128020020032006101e22040d050c0f0b200b28020020052802002203470d02200341016a22042003490d1820034101742206200420042006491b22064100480d182003450d09200128020020032006101e22040d0a0c100b200128020021040c040b200128020021040c060b200128020021040c080b2006101f2204450d0a0b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41013a00000c060b2006101f2204450d080b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41023a00000c030b2006101f2204450d060b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41003a00000b200041086a2d000021030b200341ff01714102470d05024002400240200b28020020052802002203470d00200341016a22042003490d0d20034101742206200420042006491b22064100480d0d2003450d01200128020020032006101e2204450d020c060b200128020021040c060b2006101f22040d040b200641011020000b200641011020000b200641011020000b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a200110f302200041086a2d000021030b0240200341ff01714103470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a36020c2002410c6a200110f302200041086a2d000021030b0240200341ff01714104470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41033a0000200041086a2d000021030b0240200341ff01714105470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a200110622002200041106a36020c2002410c6a200110f302200041086a2d000021030b0240200341ff01714106470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a28020021032002200041146a280200220436020c2002410c6a2001106202402004450d00200441246c210403402003200110bc02200341246a21032004415c6a22040d000b0b200041086a2d000021030b0240200341ff01714107470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41063a0000200041086a2d000021030b0240024002400240024002400240200341ff01714108470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d1020034101742206200420042006491b22064100480d102003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41073a000002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200b28020020052802002203470d03200341016a22042003490d1920034101742206200420042006491b22064100480d192003450d08200128020020032006101e22040d090c100b200b28020020052802002203470d01200341016a22042003490d1820034101742206200420042006491b22064100480d182003450d04200128020020032006101e22040d050c0e0b200b28020020052802002203470d02200341016a22042003490d1720034101742206200420042006491b22064100480d172003450d09200128020020032006101e22040d0a0c0f0b200128020021040c040b200128020021040c060b200128020021040c080b2006101f2204450d090b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41013a00000c060b2006101f2204450d070b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41023a00000c030b2006101f2204450d050b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41003a00000b200041086a2d000022034109470d05024002400240200b28020020052802002203470d00200341016a22042003490d0d20034101742206200420042006491b22064100480d0d2003450d01200128020020032006101e2204450d020c060b200128020021040c060b2006101f22040d040b200641011020000b200641011020000b200641011020000b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110bc02200041086a2d000021030b0240200341ff0171410a470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a200110b101200041086a2d000021030b0240200341ff0171410b470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041106a200110b101200041086a2d000021030b0240200341ff0171410c470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a20011062200041086a2d000021030b0240200341ff0171410d470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a410c3a000002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a200041096a2d00003a0000200041086a2d000021030b0240200341ff0171410e470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a410d3a00002000410c6a20011062200041086a2d000021030b02400240200341ff0171410f470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0b20034101742206200420042006491b22064100480d0b2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a220c200341016a360200200420036a410e3a00002000410c6a28020021032002200041146a280200220436020c2002410c6a200110622004450d0020044105742107200141046a210903400240024002400240200b2802002206200528020022046b41204f0d00200441206a220a2004490d0b20064101742204200a200a2004491b22044100480d0b2006450d01200128020020062004101e22060d020c060b200128020021060c020b2004101f2206450d040b2001200636020020092004360200200c28020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200028020022034106470d020c030b200441011020000b20034106460d010b20034107460d010c050b02400240024002400240200141046a2206280200200141086a22032802002204470d00200441016a22052004490d0620044101742207200520052007491b22074100480d062004450d01200128020020042007101e2205450d020c030b200128020021050c030b2007101f22050d010b200741011020000b20012005360200200141046a2007360200200141086a28020021040b2003200441016a360200200520046a41063a00000240200041086a22052d000022044101470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41003a00002000410c6a280200200110b2012002200041106a36020c2002410c6a200110f302200041086a2d000021040b0240200441ff01714102470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41013a00002000410c6a2001106220052d000021040b0240200441ff01714103470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a220b200441016a360200200720046a41023a00002000410c6a2001106202400240024002400240200141046a280200200b2802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a200541016a2d00003a000020052d000021040b0240200441ff01714104470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a220b200441016a360200200720046a41033a00002000410c6a2001106202400240024002400240200141046a280200200b2802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a200541016a2d00003a000020052d000021040b0240200441ff01714105470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41043a00002000410c6a280200200110b20102400240024002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022044101460d0020044102470d01200628020020032802002204470d03200441016a22072004490d162004410174220b20072007200b491b220b4100480d162004450d0820012802002004200b101e22070d090c100b200628020020032802002204470d01200441016a22072004490d152004410174220b20072007200b491b220b4100480d152004450d0420012802002004200b101e22070d050c0e0b200628020020032802002204470d02200441016a22072004490d142004410174220b20072007200b491b220b4100480d142004450d0920012802002004200b101e22070d0a0c0f0b200128020021070c040b200128020021070c060b200128020021070c080b200b101f2207450d090b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41013a00000c060b200b101f2207450d070b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41023a00000c030b200b101f2207450d050b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41003a00000b200041106a290300210802400240024020062802002207200328020022046b41084f0d00200441086a220b2004490d0a20074101742204200b200b2004491b22044100480d0a2007450d01200128020020072004101e2207450d020c060b200128020021070c060b2004101f22070d040b200441011020000b200b41011020000b200b41011020000b200b41011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441086a360200200720046a200837000020052d000021040b0240200441ff01714106470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41053a00002000410c6a2001106220052d000021040b0240200441ff01714107470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41063a0000200041106a200110b1012000410c6a2001106220052d000021040b0240200441ff01714108470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41073a00000240024002400240024020062802002207200328020022046b41204f0d00200441206a220b2004490d0720074101742204200b200b2004491b22044100480d072007450d01200128020020072004101e2207450d020c030b200128020021070c030b2004101f22070d010b200441011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441206a360200200720046a220441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002004200529000137000020052d000021040b0240200441ff01714109470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41083a000020052d000021040b0240200441ff0171410a470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41093a00000240024002400240024020062802002207200328020022046b41204f0d00200441206a220b2004490d0720074101742204200b200b2004491b22044100480d072007450d01200128020020072004101e2207450d020c030b200128020021070c030b2004101f22070d010b200441011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441206a360200200720046a220441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002004200529000137000020052d000021040b0240200441ff0171410b470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a410a3a00000240024002400240024020062802002207200328020022046b41204f0d00200441206a220b2004490d0720074101742204200b200b2004491b22044100480d072007450d01200128020020072004101e2207450d020c030b200128020021070c030b2004101f22070d010b200441011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441206a360200200720046a220441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002004200529000137000002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a200541216a2d00003a000020052d000021040b0240200441ff0171410c470d0002400240024002400240200628020020032802002204470d00200441016a22052004490d0720044101742206200520052006491b22064100480d072004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a410b3a00000b200028020022034107470d040b024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0320034101742205200420042005491b22054100480d032003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b1021000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a0000024002400240024002400240024002400240200041086a28020022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1b20034101742205200420042005491b22054100480d1b2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001106202402007450d00200141046a210b03400240024002400240200b28020020052802002203470d00200341016a22062003490d1c2003410174220a20062006200a491b220a4100480d1c2003450d0120012802002003200a101e22060d020c070b200128020021060c020b200a101f2206450d050b20012006360200200b200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a20011062200041086a28020021030b20034102470d03024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1820034101742205200420042005491b22054100480d182003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b200a41011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001106202402007450d00200141046a210b03400240024002400240200b28020020052802002203470d00200341016a22062003490d182003410174220a20062006200a491b220a4100480d182003450d0120012802002003200a101e22060d020c070b200128020021060c020b200a101f2206450d050b20012006360200200b200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a20011062200041086a28020021030b20034103470d03024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b200a41011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011062200041106a200110bc02200041346a20011062200041386a20011062200041086a28020021030b024020034104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011062200041086a28020021030b024020034105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011062200041086a28020021030b024020034106470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a200110bc022002200041386a36020c2002410c6a200110f302200041306a20011062200041086a28020021030b024020034107470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a20011062200041086a28020021030b024020034108470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a200110bc02200041086a28020021030b024020034109470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a200110b101200041086a28020021030b02402003410a470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a200110b1010b41082104200028020022034108470d010c020b4108210420034108460d010b20034109460d010c020b02400240024002400240200141046a280200200120046a2802002203470d00200341016a22052003490d0f20034101742206200520052006491b22064100480d0f2003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41083a00000240200020046a22032d000022044101470d0002400240024002400240200141046a28020020062802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a41003a00002000410c6a280200200110b201200041086a2d000021040b0240200441ff01714102470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41013a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d1020054101742204200620062004491b22044100480d102005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000002400240024002400240200141046a28020020062802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a200341216a2d00003a000020032d000021040b0240200441ff01714103470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41023a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d1020054101742204200620062004491b22044100480d102005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000020032d000021040b0240200441ff01714104470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a41033a0000200041106a200110b10120032d000021040b0240200441ff01714105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1020034101742205200420042005491b22054100480d102003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041106a200110b1010b200028020022034109470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0e20034101742205200420042005491b22054100480d0e2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240200041046a22032d00004101470d0002400240024002400240200141046a28020020052802002204470d00200441016a22062004490d1020044101742207200620062007491b22074100480d102004450d01200128020020042007101e2206450d020c030b200128020021060c030b2007101f22060d010b200741011020000b20012006360200200141046a2007360200200141086a28020021040b200141086a200441016a360200200620046a41003a0000200041086a200110622000410c6a280200200110b201200041046a2d00004102470d010b02400240024002400240200141046a28020020052802002204470d00200441016a22052004490d0f20044101742206200520052006491b22064100480d0f2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41013a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a29000037000020042003290001370000200041286a2001106202400240024002400240200141046a28020020062802002204470d00200441016a22052004490d0f20044101742206200520052006491b22064100480d0f2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a200341216a2d00003a00000b20002802002203410a470d010c020b2003410a460d010b2003410b460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110b10120002802002203410b470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0a20034101742205200420042005491b22054100480d0a2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0a20034101742205200420042005491b22054100480d0a2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a0000200041046a280200210720022000410c6a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d0a20054101742204200620062004491b22044100480d0a2005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a20002802002203410c470d010c020b2003410c460d010b2003410d460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0720034101742205200420042005491b22054100480d072003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a00000240200041086a28020022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a36020c2002410c6a200110f3022000410c6a200110bc02200041086a28020021030b024020034102470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a200110f302200041086a28020021030b024020034103470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110622002200041186a36020c2002410c6a200110f302200041286a200110b101200041106a20011062200041086a28020021030b024020034104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011062200041086a28020021030b024020034105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a200110620b2000280200410d470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0620034101742205200420042005491b22054100480d062003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a00000240200041086a22042d000022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22052003490d0720034101742206200520052006491b22064100480d072003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41003a0000200041d0006a280200210702400240024002400240200141046a2802002205200628020022036b41044f0d00200341046a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200520036a2007360000200041106a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041186a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041206a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041286a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041306a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041386a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041c0006a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041c8006a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041d4006a280200210702400240024002400240200141046a2802002205200628020022036b41044f0d00200341046a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200520036a2007360000200041d8006a280200210702400240024002400240200141046a2802002205200628020022036b41044f0d00200341046a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200520036a200736000020042d000021030b0240200341ff01714102470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22052003490d0720034101742206200520052006491b22064100480d072003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2207200341016a360200200520036a41013a0000200041186a200110b1012000410c6a280200210b2002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002206200728020022056b20034f0d00200520036a22072005490d0720064101742205200720072005491b22054100480d072006450d01200128020020062005101e2206450d020c030b200128020021060c030b2005101f22060d010b200541011020000b20012006360200200141046a2005360200200141086a28020021050b200141086a200520036a360200200620056a200b200310ce031a20042d000021030b0240200341ff01714103470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22052003490d0720034101742206200520052006491b22064100480d072003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2207200341016a360200200520036a41023a00002000410c6a200110bc022002200041c0006a36020c2002410c6a200110f302200041d0006a200110b101200041306a280200210b2002200041386a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002206200728020022056b20034f0d00200520036a22072005490d0720064101742205200720072005491b22054100480d072006450d01200128020020062005101e2206450d020c030b200128020021060c030b2005101f22060d010b200541011020000b20012006360200200141046a2005360200200141086a28020021050b200141086a200520036a360200200620056a200b200310ce031a20042d000021030b200341ff01714104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22052003490d0620034101742206200520052006491b22064100480d062003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41033a00002002200041386a36020c2002410c6a200110f302200041c8006a200110b10102400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d0620054101742203200620062003491b22034100480d062005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a290000370000200320042900013700002000412c6a28020021072002200041346a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d0620054101742204200620062004491b22044100480d062005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a0b2000280200410e470d0302400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410e3a0000024020002802044101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0620034101742206200420042006491b22064100480d062003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a280200200110b201200041046a2802004102470d040b024002400240200141046a28020020052802002203470d00200341016a22042003490d0320034101742205200420042005491b22054100480d032003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b1021000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110bc020b200241106a24000bb70201027f0240024002400240024002402000280200220141064b0d0020010e0705010502050304050b02402000410c6a2802002202450d00200028020421012002410c6c210203400240200141046a280200450d002001280200101d0b2001410c6a2101200241746a22020d000b0b200041086a280200450d04200041046a280200101d0f0b200041086a280200450d032000280204101d0f0b200041086a280200450d022000280204101d0f0b200041086a280200450d012000280204101d0f0b02402000410c6a2802002202450d0020002802042101200241186c210203400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200241686a22020d000b0b200041086a280200450d00200041046a280200101d0f0b0bef1004047f017e087f037e230041b0046b22022400200241106a200110b5010240024002400240024002400240024002402002280210450d00200241003a00880220024188026a2001280200220320012802042204410047220510ce031a20042005490d04200141046a200420056b3602002001200320056a3602002004450d0120022d008802220441ff00714101470d022004411874411875417f4c0d03420221060c080b20004203370370200241b0046a24000f0b20004203370370200241b0046a24000f0b20004203370370200241b0046a24000f0b200241a8016a200110b60102400240024020022d00a8014102460d00200241c8036a41206a200241a8016a41206a280200360200200241c8036a41186a200241a8016a41186a290300370300200241c8036a41106a200241a8016a41106a290300370300200241c8036a41086a200241a8016a41086a290300370300200220022903a8013703c80320024188026a41386a2207420037030020024188026a41306a2208420037030020024188026a41286a2209420037030020024188026a41206a220a420037030020024188026a41186a220b420037030020024188026a41106a220c420037030020024188026a41086a220d4200370300200242003703880220024188026a20012802002203200141046a220e280200220441c000200441c000491b220510ce031a200e200420056b3602002001200320056a3602002004413f4d0d00200241f0036a41386a2007290300370300200241f0036a41306a2008290300370300200241f0036a41286a2009290300370300200241f0036a41206a200a290300370300200241f0036a41186a200b290300370300200241f0036a41106a200c290300370300200241f0036a41086a200d29030037030020022002290388023703f00320022001105a2002280200450d002002290308210f200141046a220e2802002104200241003a00880220024188026a200128020022072004410047220510ce031a20042005490d04200e200420056b22033602002001200720056a22053602002004450d002002310088022210500d01200241003a00880220024188026a20052003410047220410ce031a20032004490d05200141046a200320046b3602002001200520046a3602002003450d0042022010420f838622114204540d00420121062002310088024208862010844204882011420c882210420120104201561b7e22102011540d020b420221060c050b420021060b20024180016a41206a200241c8036a41206a28020036020020024180016a41186a200241c8036a41186a29030037030020024180016a41106a200241c8036a41106a29030037030020024180016a41086a200241c8036a41086a290300370300200241e8026a41086a200241f0036a41086a290300370300200241e8026a41106a200241f0036a41106a290300370300200241e8026a41186a200241f0036a41186a290300370300200241e8026a41206a200241f0036a41206a290300370300200241e8026a41286a200241f0036a41286a290300370300200241e8026a41306a200241f0036a41306a290300370300200241e8026a41386a200241f0036a41386a290300370300200220022903c80337038001200220022903f0033703e8020c030b20052004102a000b20052004102a000b20042003102a000b200241a8016a41206a220420024180016a41206a280200360200200241a8016a41186a220520024180016a41186a290300370300200241a8016a41106a220320024180016a41106a290300370300200241a8016a41086a220e20024180016a41086a29030037030020024188026a41086a2207200241e8026a41086a29030037030020024188026a41106a2208200241e8026a41106a29030037030020024188026a41186a2209200241e8026a41186a29030037030020024188026a41206a220a200241e8026a41206a29030037030020024188026a41286a220b200241e8026a41286a29030037030020024188026a41306a220c200241e8026a41306a29030037030020024188026a41386a220d200241e8026a41386a29030037030020022002290380013703a801200220022903e80237038802024020064202520d0020004203370370200241b0046a24000f0b200241d8006a41206a2004280200360200200241d8006a41186a2005290300370300200241d8006a41106a2003290300370300200241d8006a41086a200e290300370300200241186a41086a2007290300370300200241186a41106a2008290300370300200241186a41186a2009290300370300200241186a41206a200a290300370300200241186a41286a200b290300370300200241186a41306a200c290300370300200241186a41386a200d290300370300200220022903a80137035820022002290388023703180b20024188026a200110b7012002280288022101200241e8026a20024188026a41047241dc0010ce031a02402001410f470d0020004203370370200241b0046a24000f0b200241a8016a200241e8026a41dc0010ce031a2000200f37030020002002290358370308200041106a200241d8006a41086a290300370300200041186a200241d8006a41106a290300370300200041206a200241d8006a41186a290300370300200041286a200241d8006a41206a2802003602002000200229031837022c200041346a200241186a41086a2903003702002000413c6a200241186a41106a290300370200200041c4006a200241186a41186a290300370200200041cc006a200241186a41206a290300370200200041d4006a200241186a41286a290300370200200041dc006a200241c8006a290300370200200041e4006a200241d0006a29030037020020004188016a200136020020004180016a201037030020002011370378200020063703702000418c016a200241a8016a41dc0010ce031a200241b0046a24000bca0301077f230041106b22022400200241003a0003200241036a2001280200220320012802042204410047220510ce031a0240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d000240024020022d0003220341037122044102460d00024020044101460d0020040d0220034102762101410121040c050b200241003a000b2002410b6a20052006410047220410ce031a20062004490d06200141046a200620046b3602002001200520046a3602002006450d0220022d000b4108742003724102762101410121040c040b41002104200241003a000e200241003b010c2002410c6a200520064103200641034922071b220810ce031a200141046a200620086b3602002001200520086a36020020070d0320022f010c20022d000e411074724108742003724102762101410121040c030b200341034b0d004100210420024100360204200241046a200520064104200641044922081b220310ce031a200141046a200620036b3602002001200520036a36020020080d0120022802042101410121040c020b410021040b0b2000200136020420002004360200200241106a24000f0b20052004102a000b20042006102a000b870801067f230041f0006b22022400200241003a0050200241d0006a2001280200220320012802042204410047220510ce031a02400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d0020022d0050220441ef014b0d010c030b200041023a0000200241f0006a24000f0b02400240024002400240200441847e6a220441034b0d00024002400240024020040e0400010203000b200241003b0150200241d0006a20052006410220064102491b220410ce031a200141046a200620046b3602002001200520046a360200200641014d0d0420022f0150220441ef014b0d09200041023a0000200241f0006a24000f0b20024100360250200241d0006a20052006410420064104491b220410ce031a200141046a200620046b3602002001200520046a360200200641034d0d04410121012002280250220441ffff034b0d09200041023a0000200241f0006a24000f0b200041023a0000200141046a20062006410420064104491b22006b3602002001200520006a360200200241f0006a24000f0b41002103200241d0006a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd031a200241d0006a2005200410ce031a200141046a200620046b3602002001200520046a3602002006411f4d0d032002412c6a41026a200241d0006a41026a2d00003a0000200241186a200241df006a290000370300200241206a200241e7006a290000370300200241286a200241d0006a411f6a2d00003a0000200220022f00503b012c2002200229005737031020022800532104410121030c040b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b0b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2205200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c2002200229031037033002402003450d002002410c6a41026a20012d00003a0000200241d0006a41086a2005290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010c030b200041023a0000200241f0006a24000f0b20052004102a000b410121010b200020022f010c3b0001200020013a0000200041046a2004360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a280200360200200241f0006a24000bb4820105067f057e047f037e097f230041e0096b22022400200241003a00800920024180096a2001280200220320012802042204410047220510ce031a02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d0080092204410e4b0d07024020040e0f000b0709040c0e0a10060f03050d02000b200241003a00800920024180096a20052006410047220410ce031a20062004490d9301200141046a200620046b3602002001200520046a3602002006450ddc0120022d008009450d130cdc010b2000410f360200200241e0096a24000f0b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002006450d1420022d00800922044101460d1320040d1420024180096a200110b7012002280280092104200241a0086a20024180096a41047241dc0010ce031a2004410f460d14200241c0076a200241a0086a41dc0010ce031a41e000101f2201450da60120012004360200200141046a200241c0076a41dc0010ce031a20014108762105410121040c250b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002006450dd80120022d008009450d0f0cd8010b200241003a00800920024180096a20052006410047220410ce031a20062004490d920141042103200141046a200620046b22073602002001200520046a22043602002006450d1c20022d00800922054102460d1b20054101460d1a20050d1c20024180096a2007412020074120491b22056a41004100412020056b2005411f4b1b10cd031a20024180096a2004200510ce031a41042103200141046a200720056b3602002001200420056a3602002007411f4d0d1c20024198076a41086a220520024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d00800921012002280083092104200229008f0921082002290087092109200241f8066a41086a220620052d00003a0000200220022f01be0722053b01bc0720022002290398073703f806200241a0086a41086a20062d00003a0000200220053b01e806200220022903f8063703a0082009422088a721052009a72106410121030c1e0b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002006450d2920022d008009220441044b0d29024020040e050027252624000b200241e0046a200110f20220022903e004a7450d29200241f0046a290300210820022903e804210920024180096a200110b60120022d00800922044102460d292002419c096a290200210a2002418c096a290200210b20022f008109210120022d0083092105200229028409210c200220024194096a2902003703b0082002200b3703a8082002200c3703a00820012005411074722101410121050c280b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b22033602002001200520046a22043602002006450d1220022d00800922054101460d114103210420050d13200241b8046a200110b50120022802b804450d1320022802bc04210520024180096a200110b7012002280280092106200241a0086a20024180096a41047241dc0010ce031a2006410f460d13200241c0076a200241a0086a41dc0010ce031a41e000101f2201450da90120012006360200200141046a200241c0076a41dc0010ce031a410121040c140b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002000410f360200200241e0096a24000f0b2000410f360200200241e0096a24000f0b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b3602002001200520046a3602002006450d1420022d00800922044101460d1220040d1420024180096a200110b60120022d00800922044102460d1420022d008309210d20022f008109210e2002419c096a290200210820024198096a280200210520024194096a280200210620024180096a41106a28020021032002418c096a28020021072002290284092109200241c8006a200110f2022002280248450d14200e200d411074722101200241c8006a41106a290300210a4101210d2002290350210b0c130b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b3602002001200520046a3602002006450d6620022d008009220441094b0d66024020040e0a00353233303738343a31000b20024180096a200110ba022002280280092204450d66200229028409210820024198036a200110b5012008a72105200228029803450d65200228029c03210d200541087621012004410876210f20084220882108410121100c350b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b22033602002001200520046a22073602002006450d810120022d008009220541064b0d810141022106024020050e0700d0012b2c2a2d2e000b200241186a200110b5012002280218450d8101200228021c2205417f4c0d97012005450d6d200510792204450daa0120042001280200200141046a22032802002206200520062005491b220610ce031a200328020022072006490dab012003200720066b3602002001200128020020066a36020020062005470d6e0cce010b200241003a00800920024180096a20052006410047220410ce031a20062004490d910141042103200141046a200620046b22073602002001200520046a22103602002006450dbd0120022d0080092206410e4b0dbd01024020060e0f0053547950585b565d525e4f51594e000b20024180096a200110b60120022d00800922044102460dbd0120022d008309210f20022f00810921102002419c096a290200210820024198096a280200210e20024194096a280200210520024180096a41106a350200210c2002418c096a35020021112002290284092109200241a0016a200110f20220022903a001a7450dbd01200241a0016a41106a290300210b20022903a801210a200141046a22072802002106200241003a00800920024180096a2001280200220d2006410047220310ce031a20062003490db7012007200620036b3602002001200d20036a3602002006450dbd0120022d008009220d41024b0dbd012010200f41107472210f200c422086201184210c410121030c780b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b22033602002001200520046a22053602002006450d034105210420022d008009220641034b0dc801024020060e0400191718000b200241003602800920024180096a20052003410420034104491b220610ce031a200141046a220d200320066b22073602002001200520066a2205360200200341034d0dc8012002280280092103200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc8012002290380092109200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc8012002290380092108200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc801200229038009210a200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc801200229038009210b200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc801200229038009210c200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc8012002290380092111200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc8012002290380092112200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc8012002290380092113200241003602800920024180096a20052007410420074104491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741034d0dc8012002280280092107200241003602800920024180096a2005200e4104200e4104491b220610ce031a200141046a200e20066b3602002001200520066a360200200e41034d0dc8012002280280092101200220133703b008200220123703a808200220113703a008410121040cc9010b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b220e3602002001200520046a220f3602002006450d5e20022d0080092210410b4b0d5e41092104024020100e0c004344414748464bbe01424a40000b20024180096a200110b7012002280280092104200241a0086a20024180096a41047241dc0010ce031a2004410f460d5e200241c0076a200241a0086a41dc0010ce031a41e000101f2205450db10120052004360200200541046a200241c0076a41dc0010ce031a200241c8026a200110f20220022903c802a7450d5d200241d8026a290300210820022903d0022209422088a721032009a72107410121040c600b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b3602002001200520046a3602002006450dc90120022d008009450d050cc9010b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b22033602002001200520046a22053602002006450d014106210420022d008009220641044b0dc201024020060e050024212220000b20024180096a200110b7012002280280092101200241a0086a20024180096a41047241dc0010ce031a2001410f460dc201200241c0076a200241a0086a41dc0010ce031a41e000101f2205450da10120052001360200200541046a200241c0076a41dc0010ce031a410121040cc4010b410521040cc4010b410621040cc0010b200241d8046a200110b50120022802d804450dc80120022802dc042204417f4c0d8f012004450d34200410792206450d980120062001280200200141046a22032802002205200420052004491b220510ce031a200328020022072005490d99012003200720056b3602002001200128020020056a36020020052004470d350cbe010b200241086a2001105a2002290308a7450dc8012002290310210820004100360200200041086a2008370300200241e0096a24000f0b200241c8046a2001105a20022903c804a7450dc30120022903d00421082000410a360200200041086a2008370300200241e0096a24000f0b20024180096a200110b601200241a0086a41086a22062002418c096a290200370300200241a0086a41106a220320024194096a290200370300200241a0086a41186a22072002419c096a29020037030020022002290284093703a0084102210420022d00800922014102470d100b2000410f360200200241e0096a24000f0b20024180096a2003412020034120491b22056a41004100412020056b2005411f4b1b10cd031a20024180096a2004200510ce031a200141046a200320056b3602002001200420056a3602002003411f4d0d00200241f8066a41086a220420024180096a411f6a2d00003a0000200220022f0081093b01bc0720022002290097093703f80620022d00800921062002280083092105200229008f0921082002290087092109200241c0076a41086a20042d00003a0000200220022f01bc073b01fc08200220022903f8063703c007200241c0046a200110b5014103210420022802c004450d0120022802c4042103200141046a220e2802002107200241003a00800920024180096a2001280200220f2007410047220d10ce031a2007200d490d9801200e2007200d6b3602002001200f200d6a3602002007450d012009422088a721072009a7210120022d008009210d200241e8066a41086a200241c0076a41086a2d00003a0000200220022f01fc083b01f606200220022903c0073703e806410221040c020b410321040b0b20024180096a41086a220e200241e8066a41086a2d00003a0000200220022f01f6063b019807200220022903e80637038009200220022f01e6063b01fe08024020044103470d002000410f360200200241e0096a24000f0b200241d8066a41086a220f200e2d00003a0000200220022f0198073b01e40620022002290380093703d806200220022f01fe083b01d606200020063a0005200020043a000420004109360200200041146a2008370200200041106a20073602002000410c6a2001360200200041086a20053602002000200d3a0025200041286a2003360200200020022f01e4063b00062000411c6a20022903d806370200200041246a200f2d00003a0000200020022f01d6063b0126200241e0096a24000f0b20024180096a200110b60120022d00800922044102460d0120022d008309210d20022f008109210e2002419c096a290200210820024198096a280200210520024194096a280200210620024180096a41106a28020021032002418c096a28020021072002290284092109200241f8006a200110f2022002290378a7450d01200241f8006a41106a290300210a200229038001210b200241e0006a200110f2022002290360a7450d01200e200d411074722101200241f0006a29030021112002290368210c4102210d0b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2011370200200041c0006a200c370200200041386a200a370200200041306a200b370200200041286a2008370000200041246a2005360000200041206a20063600002000411c6a2003360000200041186a2007360000200041106a20093700002000410c6a20043a0000200041086a200d360200200241e0096a24000f0b2000410f360200200241e0096a24000f0b20024190016a2001105a200229039001a7450d012002290398012208422088a721052008a72106410221030c020b200241003a00800920024180096a20042007410047220510ce031a20072005490d840141042103200141046a200720056b3602002001200420056a3602002007450d0020022d0080092101410321030c020b0b0b20024180096a41086a2207200241a0086a41086a2d00003a0000200220022f01e8063b019807200220022903a00837038009200220022f01d8063b01fe08024020034104470d002000410f360200200241e0096a24000f0b200241c0076a41086a220d20072d00003a0000200220022f0198073b01fc0820022002290380093703c007200220022f01fe083b01f606200020013a0009200041086a20033a000020004104360200200041186a2008370200200041146a2005360200200041106a20063602002000410c6a2004360200200020022f01fc083b000a200041206a20022903c007370000200041286a200d2d00003a0000200020022f01f6063b012a200241e0096a24000f0b20024180096a200110b60120022d00800922064102460db10120022f00810920022d0083094110747221052002419c096a290200210b20024194096a290200210a2002418c096a2902002108200229028409210920024188066a200110f202200229038806a7450d6b20024188066a41106a290300210c2002290390062111200241f8056a2001105a20022903f805a7450d6b2002290380062112200241f0056a200110b50120022802f005450d6b20022802f4052203417f4c0d7e2003450d6920031079220d450da001200d2001280200200141046a220e2802002207200320072003491b220710ce031a200e280200220f2007490da101200e200f20076b3602002001200128020020076a36020020072003470d6a0cac010b200241b8066a200110f20220022903b806a7450db001200241c8066a290300210b20022903c006210c200241a8066a2001105a20022903a806a7450db00120022903b006211120024198096a420037030020024180096a41106a420037030020024188096a4200370300200242003703800920024180096a20012802002206200141046a22032802002204412020044120491b220510ce031a2003200420056b3602002001200620056a3602002004411f4d0d4c2002419a076a20022d0082093a0000200220022f0180093b01980720022d00830921062002290087092109200229008f092108200229009709210a200231009f09211220022f018409210420022d0086092105200241a0066a200110b501200420054110747221054105210420022802a006450da50120022802a4062203417f4c0d7d2003450d6b20031079220d450da101200d2001280200200141046a220e2802002207200320072003491b220710ce031a200e280200220f2007490da201200e200f20076b3602002001200128020020076a36020020072003470d6c0caa010b200241e0056a2001105a20022903e005a7450daf0120022903e8052108200241d8056a200110b50120022802d805450daf0120022802dc052203417f4c0d7c2003450d50200310792206450d910120062001280200200141046a22072802002205200320052003491b220510ce031a2007280200220d2005490d92012007200d20056b3602002001200128020020056a36020020052003470d510ca8010b20022f00810920022d00830941107472210520024198076a41186a200729030037030020024198076a41106a200329030037030020024198076a41086a2006290300370300200220022903a008370398070b200241f8066a41186a220620024198076a41186a290300370300200241f8066a41106a220320024198076a41106a290300370300200241f8066a41086a220720024198076a41086a29030037030020022002290398073703f806200041086a2005410874200141ff017172360200200020043602042000410e3602002000410c6a20022903f806370200200041146a20072903003702002000411c6a2003290300370200200041246a2006290300370200200241e0096a24000f0b200241d0056a200110b50120022802d005450d0520022802d40522044108762101410521050c030b200241c0056a200110b50120022802c005450d0420022802c4052104200241a8056a200110f20220022903a805a7450d04200241b8056a290300210820022903b005210920024198056a2001105a200229039805a7450d0420022903a005210a20024190056a200110b501200228029005450d042002280294052101200241b0086a2008370300200220093703a808200220013602a00820044108762101410321050c030b200241c8056a200110b50120022802c805450d0320022802cc0522044108762101410421050c010b200241f8046a200110f20220022903f804a7450d0220024188056a290300210820022002290380053703a008200220083703a808410221050b0b20024180096a41106a200241a0086a41106a290300220b37030020024180096a41086a200241a0086a41086a290300220c370300200241c0076a41086a2206200c370300200241c0076a41106a2203200b370300200220022903a008220b3703c0072002200b37038009200041386a2008370200200041306a20093702002000410c6a2001410874200441ff017172360200200041086a20053602002000410c360200200041286a200a370200200041106a20022903c007370200200041186a2006290300370200200041206a2003290300370200200241e0096a24000f0b20024180096a41106a200241a0086a41106a29030037030020024180096a41086a200241a0086a41086a290300370300200220022903a008370380092000410f360200200241e0096a24000f0b200241a8046a2001105a20022903a804a7450da20120022903b0042208422088a721012008a72106410521040c020b4100210620024180096a2003412020034120491b22076a41004100412020076b2007411f4b1b10cd031a20024180096a2005200710ce031a200141046a200320076b3602002001200520076a3602002003411f4d0d1820024198076a41086a220120024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d008009210d2002280083092105200229008f0921082002290087092109200241c0076a41086a20012d00003a0000200220022f01be073b01fc0820022002290398073703c0072009422088a721012009a72106410121030c190b20024198046a2001105a200229039804a7450da00120022903a0042208422088a721012008a72106410421040b0ca0010b4100210e20024180096a2003412020034120491b22066a41004100412020066b2006411f4b1b10cd031a20024180096a2005200610ce031a200141046a200320066b22073602002001200520066a22063602002003411f4d0d1720024198076a41086a220320024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d008009210d20022800830921052002290087092109200229008f092108200241a0086a41086a20032d00003a0000200220022f01be073b01fe0820022002290398073703a0084101210e0c180b200241286a200110b5012002280228450d57200228022c2205417f4c0d6d2005450d3d200510792204450d840120042001280200200141046a22032802002206200520062005491b220610ce031a200328020022072006490d85012003200720066b3602002001200128020020066a36020020062005470d3e0c98010b200241206a200110b5012002280220450d5620022802242205417f4c0d6c2005450d3e200510792204450d850120042001280200200141046a22032802002206200520062005491b220610ce031a200328020022072006490d86012003200720066b3602002001200128020020066a36020020062005470d3f0c96010b200242003703800920024180096a20072003410820034108491b220410ce031a41042106200141046a200320046b3602002001200720046a360200200341074d0d5520022903800921080ca3010b200241c0006a200110b5012002280240450d5420022802442214ad42187e2208422088a70d6a2008a72205417f4c0d6a2005450d422005101f22040d43200541041020000b20024180096a200110ab022002280280092204450d532002290284092108410721060ca1010b200241c8036a200110b50120022802c803450d3620022802cc032204410876210f42002108410521100c080b20024188046a2001105a200229038804a7450d35200229039004220942208821082009a722054108762101410a21100c090b200241b8036a200110b50120022802b803450d3420022802bc03210420024180096a200110b60120022d00800922054102460d3420022d008309210d20022f008109210f2002419c096a290200210920024194096a280200210620024180096a41106a28020021032002418c096a28020021072002290284092108200220024198096a2802003602a008200220093702a408200241b0036a200110b50120022802b003450d3420022802b403210e200241a8036a200110b50120022802a803450d34200f200d4110747221012008422088a7210d2009422088a721152004410876210f20022903a008210920022802ac03ad210a4200210b410321100c0a0b200241c0036a200110b50120022802c003450d3320022802c4032204410876210f42002108410421100c050b20024180096a200110b60120022d00800922044102460d3220022902840922094220882108410821102009a72205410876210120022f00810920022d00830941107472210f2002418c096a280200210d20024180096a41106a280200210720024194096a280200210320024198096a28020021062002419c096a29020021090c080b20024180096a200110ba022002280280092204450d312002290284092108200241a0036a200110b5012008a7210520022802a003450d3020022802a403210d200541087621012004410876210f20084220882108410221100b0c050b20024180096a200110b60120022d00800922044102460d2f20022d008309210520022f008109210e2002419c096a290200210920024198096a280200210620024194096a280200210320024180096a41106a28020021072002418c096a280200210d200229028409210c200241d8036a200110f20220022903d803a7450d2f200241d8036a41106a290300210b20022903e003210a200241d0036a200110b50120022802d003450d2f200e200541107472210f20022802d4032115200c4220882108200ca722054108762101410621100c050b200241f0036a200110b50120022802f003450d2e20022802f4032204410876210f42002108410721100b0c020b200241f8036a2001105a20022903f803a7450d2c200229038004220942208821082009a722054108762101410921100b0b0b20004107360200200041c0006a200b370200200041386a200a370200200041346a200e360200200041306a2015360200200041286a2009370200200041246a2006360200200041206a20033602002000411c6a2007360200200041186a200d360200200041086a20103602002000410c6a200f410874200441ff017172360200200041106a20084220862001ad42ffffff07834208862005ad42ff01838484370200200241e0096a24000f0b4101210641002004460d89010b2004450d92012006101d0c92010b41002101410021030b200241f8066a41086a2207200241c0076a41086a2d00003a0000200220022f01fc083b01bc07200220022903c0073703f80602402003450d00200241a0086a41086a220420072d00003a0000200220022f01bc0722033b01fe08200220022903f8063703a008200241e8066a41086a20042d00003a0000200220033b01f606200220022903a0083703e806410321040b0c89010b0b200241f8066a41086a2203200241a0086a41086a2d00003a0000200220022f01fe083b01bc07200220022903a0083703f8060240200e450d00200241c0076a41086a20032d00003a0000200220022f01bc073b01fc08200220022903f8063703c007200241003a00800920024180096a20062007410047220310ce031a20072003490d66200141046a200720036b3602002001200620036a3602002007450d0020022d0080092103200241e8066a41086a200241c0076a41086a2d00003a0000200220022f01fc083b01f606200220022903c0073703e8062009422088a721012009a72106410221040c88010b0c87010b410c21040c1f0b200241f0026a200110b501410d210420022802f002450d1e20022802f4022105200141046a22072802002106200241003a00800920024180096a2001280200220d2006410047220310ce031a20062003490d6e2007200620036b3602002001200d20036a3602002006450d1e20022d0080092106410421040c030b20024180096a200e4120200e4120491b22046a41004100412020046b2004411f4b1b10cd031a20024180096a200f200410ce031a200141046a200e20046b3602002001200f20046a360200200e411f4d0d1c20024198076a41086a220120024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d00800921062002280083092105200229008f0921082002290087092109200241f8066a41086a220420012d00003a0000200220022f01be0722013b01bc0720022002290398073703f806200241a0086a41086a220320042d00003a0000200220013b01fe08200220022903f8063703a008200241c0076a41086a220420032d00003a0000200220013b01fc08200220022903a0083703c007200241e8066a41086a20042d00003a0000200220013b01f606200220022903c0073703e8062009422088a721032009a72107410a21040c7b0b200241e0026a200110b5014102410d20022802e0021b210420022802e40221050c050b200241e8026a200110b501410d210420022802e802450d1b20022802ec022105200141046a22072802002106200241003a00800920024180096a2001280200220d2006410047220310ce031a20062003490d6c2007200620036b3602002001200d20036a3602002006450d1b20022d0080092106410321040b0c780b20024188036a2001105a410d2104200229038803a7450d19200229039003210820024180036a200110b501200228028003450d1920022802840321052008422088a721032008a72107410721040c1a0b20024180096a200110b7012002280280092104200241a0086a20024180096a41047241dc0010ce031a2004410f460d17200241c0076a200241a0086a41dc0010ce031a41e000101f2205450d6b20052004360200200541046a200241c0076a41dc0010ce031a200141046a22072802002104200241003a00800920024180096a2001280200220d2004410047220610ce031a20042006490d6c2007200420066b22033602002001200d20066a22073602002004450d1620022d008009220641024b0d16200242003703800920024180096a20072003410820034108491b220410ce031a200141046a200320046b3602002001200720046a360200200341074d0d162002290380092208422088a721032008a72107410521040c760b200241f8026a200110b5014106410d20022802f8021b210420022802fc0221050b0c170b20024180096a200e4120200e4120491b22046a41004100412020046b2004411f4b1b10cd031a20024180096a200f200410ce031a200141046a200e20046b22033602002001200f20046a2204360200200e411f4d0d1420024198076a41086a220720024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d008009210620022800830921052002290087092109200229008f092108200241f8066a41086a220d20072d00003a0000200220022f01be0722073b01bc0720022002290398073703f806200241c0076a41086a220e200d2d00003a0000200220073b01fc08200220022903f8063703c007200241a0086a41086a200e2d00003a0000200220073b01fe08200220022903c0073703a008200241003a00800920024180096a20042003410047220710ce031a20032007490d6a200141046a200320076b3602002001200420076a3602002003450d2d20022d008009210d200241e8066a41086a200241a0086a41086a2d00003a0000200220022f01fe083b01f606200220022903a0083703e8062009422088a721032009a72107410b21040c730b20024180096a200e4120200e4120491b22046a41004100412020046b2004411f4b1b10cd031a20024180096a200f200410ce031a200141046a200e20046b3602002001200f20046a360200200e411f4d0d134108210420024198076a41086a220120024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d00800921062002280083092105200229008f0921082002290087092109200241f8066a41086a220320012d00003a0000200220022f01be0722013b01bc0720022002290398073703f806200241e8066a41086a20032d00003a0000200220013b01f606200220022903f8063703e8062009422088a721032009a721070c720b200241c0026a200110b50120022802c002450d6f20022802c4022216ad2208421b88a70d482008420586a72205417f4c0d482005450d222005101f22040d23200541011020000b200241b0026a200110b50120022802b002450d6e20022802b4022204410876210f410c21030c0a0b20024180026a200110b501200228028002450d6d2002280284022105200241e8016a200110f20220022903e801a7450d6d200241f8016a290300210c20022903f0012109410521030c270b200241003a00800920024180096a20102007410047220410ce031a20072004490d56200141046a200720046b3602002001201020046a3602002007450d6c20022d008009210d410d21030c050b20024190026a2001105a200228029002450d6b410a210320022903980221090c0c0b200241b8016a200110f20220022903b801a7450d6a200241c8016a290300210c20022903c0012109410221030c010b200241d0016a200110f20220022903d001a7450d69200241e0016a290300210c20022903d8012109410321030b0c210b200241003a00800920024180096a20102007410047220410ce031a20072004490d52200141046a200720046b3602002001201020046a3602002007450d6720022d008009220d41034f0d67410821030b0c210b20024188026a200110b501200228028802450d65200228028c022216ad42247e2208422088a70d3e2008a72205417f4c0d3e2005450d1a2005101f22040d1b200541041020000b200241b8026a200110b50120022802b802450d6420022802bc022204410876210f410e21030b0c010b410721030b0c1a0b20024180096a200110b60120022d00800922044102460d6020022f00810920022d00830941107472210f2002418c096a290200210c20024194096a280200210520024198096a280200210e2002419c096a29020021082002290284092109410921030c1a0b200241a0026a2001105a20022802a002450d5f410b210320022903a80221090b0c160b2005103c2005101d0b410d21040b0b0c5c0b2005450d002004101d0b2000410f360200200241e0096a24000f0b410521040c580b4101210441002005460d5a0b20050d170c180b4101210441002005460d570b20050d150c160b4101210641002003460d570b2003450d5d2006101d0c5d0b4101210441002005460d600b20050d110c120b410421040b024002402014450d00420021084100210e4100210541002107201421150340200241386a200110b5012002280238450d11200228023c2203417f4c0d29024002402003450d0020031079220f450d36200f2001280200200141046a220d2802002206200320062003491b220610ce031a200d28020022102006490d37200d201020066b3602002001200128020020066a36020020062003460d010c120b4101210f41002003470d110b200241306a200110b5012002280230450d1020022802342206417f4c0d29024002402006450d00200610792210450d3220102001280200200141046a2217280200220d2006200d2006491b220d10ce031a20172802002218200d490d3320172018200d6b36020020012001280200200d6a360200200d2006460d010c110b4101211041002006470d100b200741016a210d024020072015470d00200e200d200d200e491b2215ad42187e2209422088a70d2b2009a722174100480d2b02402007450d00200420052017101e22040d010c300b2017101f2204450d2f0b200420056a2207200f360200200741146a2006360200200741106a20063602002007410c6a2010360200200741046a2003ad220942208620098437020020084280808080107c2108200e41026a210e200541186a2105200d2107200d2014490d000c020b0b41002115420021080b2004450d1020082015ad842108410621060c5e0b410121040b024002402016450d0020024180096a41176a211020024198096a211920024190096a211a20024180096a41086a211b200141046a210e20024180096a410f6a211c420021084100210d410021074100210320162118034020194200370300201a4200370300201b4200370300200242003703800920024180096a2001280200220f200e2802002205412020054120491b220610ce031a200e200520066b3602002001200f20066a3602002005411f4d0d0b200341016a210620024198076a41086a2205201041086a2d00003a0000200220022f008109220f3b01be072002201029000037039807201c290000210920022d00800921152002280083092117200229008709210a200241f8066a41086a221420052d00003a00002002200f3b01bc0720022002290398073703f806024020032018470d00200d20062006200d491b2218ad420586220b422088a70d29200ba722054100480d2902402003450d00200420072005101e22040d010c2c0b2005101f2204450d2b0b200420076a220520153a00002005410f6a2009370000200541076a200a370000200541036a2017360000200541016a20022f01bc073b00002005411f6a20142d00003a0000200541176a20022903f80637000020084280808080107c2108200d41026a210d200741206a21072006210320062016490d000c020b0b41002118420021080b2004450d4b20082018ad8421092004410876210f410f21030c020b410421040b024002402016450d004200210820024198096a211920024194096a211a2002418c096a211b41002107411c21034100210520162118034020024180096a200110b60120022d008009220d4102460d0a200541016a210620022d008309210e20022f008109210f2002419c096a290200210920192802002110201a280200211520024180096a41106a2802002117201b2802002114200229028409210a024020052018470d002007200620062007491b2218ad42247e220b422088a70d27200ba7221c4100480d2702402005450d002004200341646a201c101e22040d010c2b0b201c101f2204450d2a0b200420036a22052009370000200541676a200f200e41107472220e4110763a0000200541656a200e3b00002005417c6a2010360000200541786a2015360000200541746a2017360000200541706a2014360000200541686a200a370000200541646a200d3a000020084280808080107c2108200741026a2107200341246a21032006210520062016490d000c020b0b41002118420021080b2004450d4920082018ad8421092004410876210f410621030b0b0b0b0b200220022f01c00722013b018009200220013b01e806200041386a200b370000200041306a200a370000200041186a200c370000200041106a20093700002000200d3a0009200041086a20033a000020004105360200200041286a2008370000200041246a200e360000200041206a20053600002000410c6a200f410874200441ff017172360000200020022f01e8063b000a200241e0096a24000f0b410d21040c450b2018450d420c410b20180d400c410b2006450d002010101d0b2003450d00200f101d0b02402007450d002004210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200541686a22050d000b0b2015450d010b2004101d0b2000410f360200200241e0096a24000f0b4101210d41002003460d420b2003450d00200d101d0b0c470b4101210d41002003460d3e0b2003450d38200d101d0c380b20052004102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b102e000b1021000b20052007102a000b200541011020000b201c41041020000b201741041020000b41e00041081020000b200641011020000b200d2018102a000b200441011020000b20052007102a000b200341011020000b20062010102a000b41e00041081020000b200d2007102a000b41e00041081020000b20032007102a000b20042007102a000b20042007102a000b200541011020000b20062007102a000b200341011020000b2005200d102a000b200541011020000b20062007102a000b200541011020000b20062007102a000b20032006102a000b20032006102a000b41e00041081020000b41e00041081020000b20062004102a000b20072003102a000b20032006102a000b200341011020000b2007200f102a000b200341011020000b2007200f102a000b2004101d0b200220022f01c0073b0180092000410f360200200241e0096a24000f0b0c0c0b20024180096a41086a2201200241e8066a41086a2d00003a0000200220022f01f6063b019807200220022903e80637038009200220022f01e6063b01fe0802402004410d470d002000410f360200200241e0096a24000f0b200241d8066a41086a220e20012d00003a0000200220022f0198073b01e40620022002290380093703d806200220022f01fe083b01d606200020063a0009200041086a20043a000020004106360200200041186a2008370200200041146a2003360200200041106a20073602002000410c6a20053602002000200d3a0029200020022f01e4063b000a200041206a20022903d806370200200041286a200e2d00003a0000200020022f01d6063b012a200241e0096a24000f0b2005ad22084220862008842108410321060c0d0b2005ad22084220862008842108410521060c0c0b200641087621052003ad22094220862009842109410221040c080b200241f8066a41026a20024198076a41026a2d00003a00002002200c3703a008200220022f0198073b01f806200220113703b0082002200b3703a808200dad422086201284210b2003ad220c422086200c84210c410421040c070b200241b0086a200c370300200220113703a808200220033602a0082003ad422086200dad84210c2012422088a721072012a72103410321040c060b2006450d09200020063602042000410b360200200041086a2004ad2208422086200884370200200241e0096a24000f0b0b0b20024180096a41086a2207200241e8066a41086a2d00003a0000200220022f01f6063b019807200220022903e80637038009200220022f01e6063b01fe08024020044106470d002000410f360200200241e0096a24000f0b200241d8066a41086a220e20072d00003a0000200220022f0198073b01e40620022002290380093703d806200220022f01fe083b01d6062000200d3a0009200041086a20043a000020004108360200200041186a2008370200200041146a2001360200200041106a20063602002000410c6a2005360200200020033a0029200020022f01e4063b000a200041206a20022903d806370200200041286a200e2d00003a0000200020022f01d6063b012a200241e0096a24000f0b0b0b20024198076a41026a220d200241f8066a41026a2d00003a000020024180096a41086a220e200241a0086a41086a29030037030020024180096a41106a220f200241a0086a41106a290300370300200220022f01f8063b019807200220022903a00837038009024020044105470d002000410f360200200241e0096a24000f0b200241e8066a41026a2210200d2d00003a0000200241c0076a41086a220d200e290300370300200241c0076a41106a220e200f290300370300200220022f0198073b01e80620022002290380093703c0072000410f6a20054110763a00002000410d6a20053b0000200041086a20043a00002000410d360200200041306a200c370200200041286a200b370200200041206a200a370200200041186a2008370200200041106a20093702002000410c6a20063a0000200020022f01e8063b00092000410b6a20102d00003a0000200041386a20022903c007370200200041c0006a200d290300370200200041c8006a200e290300370200200041d8006a2001360200200041d0006a2007ad4220862003ad84370200200241e0096a24000f0b2000410f360200200241e0096a24000f0b2005ad22084220862008842108410121060b20004101360200200041106a20083702002000410c6a2004360200200041086a2006360200200241e0096a24000f0b2000410f360200200241e0096a24000f0b2000410f360200200241e0096a24000b130020004101360204200041b0d8c2003602000b9f0803037f017e077f0240024002400240024002400240024002400240024002402001280200417f6a220241064b0d0002400240024002400240024002400240024002400240024002400240024020020e0700040203010506000b2001410c6a2802002202417f4c0d17200128020421034101210102402002450d002002101f2201450d100b20012003200210ce0321012000410c6a2002360200200041086a200236020020002001360204200041013602000f0b2001410c6a2802002202417f4c0d16200128020421012002450d052002101f22030d06200241011020000b2001410c6a2802002202417f4c0d15200128020421012002450d062002101f22030d07200241011020000b20004104360200200041086a200141086a2903003703000f0b200041023602000f0b2001410c6a2802002204ad42187e2205422088a70d122005a72203417f4c0d12200128020421022003450d052003101f2206450d0b2004450d060c100b2001410c6a2802002207ad420c7e2205422088a70d112005a72202417f4c0d11200128020421032002450d062002101f2204450d0b410c21092007450d070c0c0b410121030b20032001200210ce0321012000410c6a2002360200200041086a200236020020002001360204200041053602000f0b410121030b20032001200210ce0321012000410c6a2002360200200041086a200236020020002001360204200041033602000f0b4104210620040d0a0b410021080c0a0b41042104410c210920070d050b410021080c050b41e8d0c200102c000b200241011020000b200341041020000b200241041020000b2003200720096c6a210c41002108200421020340200341086a2802002201417f4c0d052003280200210a024002402001450d002001101f220b0d010c040b4101210b0b200b200a200110ce03210a200241086a2001360200200241046a20013602002002200a360200200220096a2102200841016a2108200320096a2203200c470d000b0b2000200436020420004107360200200020096a2008360200200041086a20073602000f0b200141011020000b2002200441186c6a210741002108200621010340200241086a2802002203417f4c0d0220022802002109024002402003450d002003101f220a0d010c050b4101210a0b200a2009200310ce03210a200241146a2802002209417f4c0d022002410c6a280200210b024002402009450d002009101f220c0d010c060b4101210c0b200c200b200910ce03210b200141146a2009360200200141106a20093602002001410c6a200b360200200141086a2003360200200141046a20033602002001200a360200200141186a2101200841016a2108200241186a22022007470d000b0b20002006360204200041063602002000410c6a2008360200200041086a20043602000f0b102e000b200341011020000b200941011020000bcb0703037f047e077f230022022103200241e0026b416071220224002001411c6a22042902002105200420022903f801370200200141146a22042902002106200420022903f0013702002001410c6a22042902002107200420022903e801370200200241003a00e00120012902042108200120022903e00137020420022005370378200220063703702002200737036820022008370360200141246a2d00002109200241e0016a41176a22042002290078370000200241e0016a41106a220a2002290071370300200241e0016a41086a220b2002290069370300200220022900613703e00102400240024002402008a741ff01714101470d00200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b290300370300200220022903e0013703184115101f2204450d012004410d6a41002900c89b40370000200441086a41002900c39b40370000200441002900bb9b40370000200441154135101e2204450d0220042002290318370015200420093a00342004412c6a2002412f6a220a290000370000200441256a200241186a41106a220b2903003700002004411d6a200241186a41086a290300370000200241e0016a41086a220c4200370300200242003703e00120044135200241e0016a1001200241e0006a41086a200c290300370300200220022903e001370360200241e0016a200241e0006a105c20022d0081024102460d03200241e0006a200241e0016a41e30010ce031a200241386a41206a220c200241e0006a41206a2d00003a0000200241386a41186a220d200241e0006a41186a290300370300200241386a41106a220e200241e0006a41106a290300370300200241386a41086a220f200241e0006a41086a29030037030020022002290360370338200241e0016a200241e0006a41216a41c20010ce031a200141046a220141206a200241e0016a41c1006a2d00003a0000200141186a200241e0016a41396a290000370000200141106a200241e0016a41316a290000370000200141086a200241e0016a41296a290000370000200120022900810237000020002002290318370001200041096a200241186a41086a290300370000200041116a200b290300370000200041186a200a290000370000200041206a20093a0000200041013a0000200041216a2002290338370000200041296a200f290300370000200041316a200e290300370000200041396a200d290300370000200041c1006a200c2d00003a00002004101d200324000f0b200041003a0000200324000f0b411541011020000b413541011020000b41a49ac20041d700103a000b13002000410c36020420004198ddc2003602000b13002000410936020420004195a5c0003602000b130020004110360204200041e0e4c2003602000bb70101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a2205420037030020024200370300024002404120101f2206450d0020062002290300370000200641186a2003290300370000200641106a2004290300370000200641086a20052903003700002006412041c000101e2206450d01200042c0808080900437020420002006360200200641003a0020200241206a24000f0b412041011020000b41c00041011020000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a20021062200041086a200228020836020020002002290300370200200241106a24000bd10301047f230041d0006b2202240002400240410f101f2203450d00200341076a41002900b39b40370000200341002900ac9b403700002003410f412f101e2203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241306a41086a22014200370300200242003703302003412f200241306a1001200241206a41086a200129030037030020022002290330370320024002400240200241206a411041f8b3c200410041001002417f460d00200241306a41186a4200370300200241306a41106a42003703002001420037030020024200370330200241206a4110200241306a4120410010022201417f460d022001411f4d0d02200241186a2201200241306a41186a290300370300200241106a2204200241306a41106a290300370300200241086a2205200241306a41086a29030037030020022002290330370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b2003101d200241d0006a24000f0b41df88c0004133103a000b410f41011020000b412f41011020000bf70401027f02400240024020012d0000417f6a2202410b4b0d004109210302400240024002400240024002400240024002400240024020020e0c000406020809070b05030a01000b41e000101f2202450d0c2002200141046a28020010c201200041046a2002360200200041106a200141106a290300370300200041086a200141086a290300370300200041013a00000f0b2000410c3a00000f0b200020012d00013a0001200041046a200141046a280200360200200041043a00000f0b20002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700002000410a3a00000f0b200041046a200141046a280200360200410221030b200020033a00000f0b200020012d00013a0001200041046a200141046a280200360200200041033a00000f0b200041086a200141086a290300370300200041046a200141046a280200360200200041073a00000f0b41e000101f2202450d052002200141046a28020010c201200041046a2002360200200041086a200141086a290300370300200020012d00013a0001200041053a00000f0b200041046a200141046a280200360200200041063a00000f0b20002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00002000410b3a00000f0b20002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a290000370000200041083a00000f0b41c8f3c200102c000b41e00041081020000b41e00041081020000bb91c04047f027e027f027e23004180016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002b05090d0a0608040b030c0102000b200241206a200141086a10b90120004101360200200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b200241206a200141086a10c301200041086a200241206a41d80010ce031a2000410d36020020024180016a24000f0b200128020422044102460d0b4101210320044101470d29200141086a10c40121010c160b2001410c6a2802002203417f4c0d29200128020421012003450d0e2003101f22040d0f200341011020000b4102210320012d000422044102460d0a20044101470d29200141086a280200210541e000101f2204450d2e20042001410c6a28020010c501410121030c0b0b200141086a28020022034102460d0b20034101470d292001410c6a22032d00004101470d14200141106a2802002104410121030c150b200241206a200141086a10c60120004107360200200041c0006a200241206a41386a290300370300200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b20004100360200200041086a200141086a29030037030020024180016a24000f0b200141086a22042d0000417f6a220341044b0d27024020030e05001d191b17000b2001410c6a10c4012101410121030c1d0b41032103200141086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d27200241046a200441066a2f00003b0100200241286a200141206a290200370300200241206a41106a200141286a2d00003a00002002200441026a2800003602002002200141186a290200370320200141106a2902002106200141096a2d000021010c0c0b200241206a200141086a10c10120004106360200200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b2000410a360200200041086a200141086a29030037030020024180016a24000f0b200141086a280200417f6a220341044b0d25024020030e05001b161814000b200141386a2903002106200141306a2903002107410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b200241206a200141086a10c70120004105360200200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b41012103200141086a2d00004101470d082001410c6a28020021040c090b200241026a200141046a220441036a2d00003a0000200241206a41086a200141186a2902003703002002412d6a2001411d6a290000370000200220042f00013b01002002200141106a290200370320200141256a2d00004100472108200141286a28020021092001410c6a2802002104200141086a28020021050b200020022f01003b0005200020033a0004200020083a0025200041093602002000410c6a2004360200200041086a2005360200200041106a2002290320370200200041286a2009360200200041076a200241026a2d00003a0000200041186a200241206a41086a2903003702002000411d6a2002412d6a29000037000020024180016a24000f0b410121032001410c6a22042d00004101470d0a200141106a28020021040c0b0b410121040b20042001200310ce0321012000410c6a2003360200200041086a2003360200200020013602042000410b36020020024180016a24000f0b200141106a29030021060c010b20042d000141004721010b200020013a00092000200228020036010a20004104360200200041086a20033a0000200041106a2006370300200041186a20022903203703002000410e6a200241046a2f01003b0100200041206a200241206a41086a290300370300200041286a200241206a41106a29030037030020024180016a24000f0b200241086a200141186a290200370300200241106a200141206a2802003602002002200141106a290200370300200141246a350200200141286a310000422086842106200141096a2f00002001410b6a2d00004110747221052001410c6a2802002104410021030b200241206a41106a200241106a280200360200200241206a41086a200241086a2903003703002002200229030037032020032005410874722101410221030b200020033602042000410e3602002000410c6a2004360200200041086a2001360200200041106a2002290320370200200041246a2006370200200041186a200241206a41086a290300370200200041206a200241206a41106a28020036020020024180016a24000f0b200241fe006a200341036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220032f00013b017c2002200141146a290200370320200141106a2802002104410021030b2002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141386a2903002106200141306a2903002107410121050c020b200241fe006a200441036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220042f00013b017c2002200141146a290200370320200141106a2802002104410021030b410221052002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141c8006a290300210a200141c0006a290300210b200141386a2903002106200141306a29030021070b200020022f011c3b000d20004103360200200041c8006a200a370300200041c0006a200b370300200041386a2006370300200041306a20073703002000410c6a20033a0000200041086a2005360200200041106a2004360200200041146a20022903003702002000410f6a2002411e6a2d00003a00002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a28020036020020024180016a24000f0b200141106a2903002106410521030c060b2001410c6a28020022034108762104410521010c090b41032103200241fe006a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141106a29020021062001410c6a28020021010c040b200241206a41106a200141206a2903003703002002200141186a2903003703282002200141106a2802003602202001410c6a28020022034108762104200141286a290300210b410321010c070b200141106a2903002106410421030c020b2001410c6a28020022034108762104410421010c050b41022103200241fc006a41026a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141296a2d00004100472104200141106a29020021062001410c6a28020021010b200020022f017c3b0009200020043a00292000200228010036012a200041086a20033a0000200041106a20063703002000410c6a2001360200200041186a20022903203703002000410b6a200241fe006a2d00003a0000200041206a200241206a41086a290300370300200041286a200241206a41106a2d00003a00002000412e6a200241046a2f01003b01002000410836020020024180016a24000f0b2002200141186a2903003703282002200141106a29030037032041022101410021030c020b200241086a2001411c6a290200370300200241106a200141246a2802003602002002200141146a290200370300200141286a3502002001412c6a31000042208684210b2001410d6a2f00002001410f6a2d0000411074722104200141106a2802002101410021030b2002412c6a200241086a290300370200200241346a200241106a2802003602002002200229030037022420022001360220410121010b2000410c360200200041386a2006370300200041306a2007370300200041086a2001360200200041106a2002290320370300200041286a200b3703002000410c6a2004410874200341ff017172360200200041186a200241206a41086a290300370300200041206a200241206a41106a29030037030020024180016a24000f0b10c801000b4184adc300102c000b102e000b41d0a7c400102c000b41888cc300102c000b419cadc300102c000b41bcc4c300102c000b41d4c4c300102c000b41e00041081020000bcd0803047f037e017f230041306b220224000240024020012d0000417f6a220341034b0d00024002400240024002400240024002400240024020030e0400030102000b200041d0006a200141d0006a280200360200200041c8006a200141c8006a290300370300200041c0006a200141c0006a290300370300200041386a200141386a290300370300200041306a200141306a290300370300200041286a200141286a290300370300200041206a200141206a290300370300200041186a200141186a290300370300200041106a200141106a290300370300200041086a200141086a290300370300200041013a0000200241306a24000f0b41012104200141046a2d00004101470d02200141086a28020021050c030b200141386a2903002106200141306a2903002107200141c0006a2903002108200241286a200141196a290000370300200241206a200141116a290000370300200241186a200141096a290000370300200220012900013703102001412c6a2802002203417f4c0d08200141246a28020021012003450d032003101f22040d04200341011020000b2001410c6a2802002203417f4c0d07200141046a2802002104200141106a29030021062003450d042003101f22010d05200341011020000b2002410e6a200141076a2d00003a0000200241106a41086a200141146a290000370300200241206a2001411c6a290000370300200241286a200141246a2d00003a00002002200141056a2f00003b010c20022001410c6a290000370310200141086a2800002105410021040b200141306a2802002203417f4c0d05200141c0006a2903002106200141386a2903002107200141286a2802002109200141c8006a2903002108024002402003450d002003101f22010d01200341011020000b410121010b20012009200310ce032101200041c0006a2006370300200041386a2007370300200041046a20043a0000200041086a2005360200200041c8006a2008370300200041306a20033602002000412c6a2003360200200041286a2001360200200041056a20022f010c3b0000200041076a2002410e6a2d00003a00002000410c6a2002290310370200200041146a200241106a41086a2903003702002000411c6a200241206a290300370200200041246a200241286a280200360200200041033a0000200241306a24000f0b410121040b20042001200310ce032101200041386a2006370300200041306a2007370300200041c0006a20083703002000412c6a2003360200200041286a2003360200200041246a2001360200200041043a000020002002290310370001200041096a200241186a290300370000200041116a200241206a290300370000200041196a200241286a290300370000200241306a24000f0b410121010b20012004200310ce0321012000410c6a2003360200200041086a2003360200200041046a2001360200200041106a2006370300200041023a0000200241306a24000f0b41a4a4c400102c000b102e000bd91c04057f027e027f027e23004180016b22012400024002400240024002400240024002400240024041e000101f2202450d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002200280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002c05090d0a0608040b030c0102000b200141086a200041086a10b90120024101360200200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200141086a200041086a10c301200241086a200141086a41d80010ce031a2002410d36020020014180016a240020020f0b200028020422044102460d0b4101210320044101470d2a200041086a10c40121000c160b2000410c6a2802002203417f4c0d2a200028020421002003450d0e2003101f22040d0f200341011020000b4102210320002d000422044102460d0a20044101470d2a200041086a280200210541e000101f2204450d2f20042000410c6a28020010c501410121030c0b0b200041086a28020022034102460d0b20034101470d2a2000410c6a22032d00004101470d14200041106a2802002104410121030c150b200141086a200041086a10c60120024107360200200241c0006a200141086a41386a290300370300200241386a200141086a41306a290300370300200241306a200141086a41286a290300370300200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200241003602002002200041086a29030037030820014180016a240020020f0b200041086a22042d0000417f6a220341044b0d28024020030e05001d191b17000b2000410c6a10c4012100410121030c1d0b41032103200041086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d28200141e4006a200441066a2f00003b0100200141106a200041206a290000370300200141086a41106a200041286a2d00003a00002001200441026a2800003602602001200041186a290000370308200041106a2900002106200041096a2d000021000c0c0b200141086a200041086a10c10120024106360200200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200041086a29030021062002410a3602002002200637030820014180016a240020020f0b200041086a280200417f6a220341044b0d26024020030e05001b161814000b200041386a2903002106200041306a2903002107410121032000410c6a2d00004101470d1b200041106a28020021000c1c0b200141086a200041086a10c70120024105360200200241386a200141086a41306a290300370300200241306a200141086a41286a290300370300200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b41012103200041086a2d00004101470d082000410c6a2802002104410021050c090b200141e0006a41026a200041046a220441036a2d00003a0000200141086a41086a200041186a290000370300200141156a2000411d6a290000370000200120042f00013b01602001200041106a290000370308200041256a2d00004100472108200041286a28020021092000410c6a2800002104200041086a28000021050b200220012f01603b0005200220033a00042002200436020c200220053602082002200129030837021020022009360228200220083a002520024109360200200241076a200141e2006a2d00003a0000200241186a200141106a2903003702002002411d6a200141156a29000037000020014180016a240020020f0b410121032000410c6a22042d00004101470d0a200041106a28020021040c0b0b410121040b20042000200310ce0321002002200336020c20022003360208200220003602042002410b36020020014180016a240020020f0b200041106a29030021060c010b20042d000141004721000b200220003a0009200220033a00082002200128026036010a2002200637031020022001290308370318200241043602002002410e6a200141e0006a41046a2f01003b0100200241206a200141106a290300370300200241286a200141186a29030037030020014180016a240020020f0b200141086a41086a200041186a290000370300200141086a41106a200041206a290000370300200141086a41186a200041286a2d00003a00002001200041106a290000370308200041096a2f00002000410b6a2d00004110747241087421052000410c6a2800002104410021030b200141e0006a41186a200141086a41186a280200360200200141e0006a41106a200141086a41106a290300370300200141e0006a41086a200141086a41086a2903003703002001200129030837036020032005722100410221030b2002200436020c2002200036020820022003360204200220012903603702102002410e360200200241186a200141e8006a290300370200200241206a200141f0006a290300370200200241286a200141e0006a41186a28020036020020014180016a240020020f0b200141fe006a200341036a2d00003a0000200141106a2000411c6a290200370300200141086a41106a200041246a290200370300200141206a2000412c6a2d00003a0000200120032f00013b017c2001200041146a290200370308200041106a2802002104410021030b200141046a41026a200141fc006a41026a2d00003a0000200141e0006a41086a200141086a41086a290300370300200141e0006a41106a200141086a41106a290300370300200141e0006a41186a200141086a41186a280200360200200120012f017c3b010420012001290308370360200041386a2903002106200041306a2903002107410121050c020b200141fe006a200441036a2d00003a0000200141106a2000411c6a290200370300200141086a41106a200041246a290200370300200141206a2000412c6a2d00003a0000200120042f00013b017c2001200041146a290200370308200041106a2802002104410021030b41022105200141046a41026a200141fc006a41026a2d00003a0000200141e0006a41086a200141086a41086a290300370300200141e0006a41106a200141086a41106a290300370300200141e0006a41186a200141086a41186a280200360200200120012f017c3b010420012001290308370360200041c8006a290300210a200041c0006a290300210b200041386a2903002106200041306a29030021070b2002200b37034020022007370330200220033a000c20022005360208200220012f01043b000d200220043602102002200129036037021420024103360200200241c8006a200a370300200241386a20063703002002410f6a200141066a2d00003a00002002411c6a200141e8006a290300370200200241246a200141f0006a2903003702002002412c6a200141f8006a28020036020020014180016a240020020f0b200041106a2903002106410521030c060b2000410c6a28020022034108762104410521000c090b41032103200141fe006a200441036a2d00003a0000200141106a200041206a290000370300200141086a41106a200041286a2d00003a0000200120042f00013b017c2001200041186a290000370308200041106a29000021062000410c6a28000021000c040b200141086a41106a200041206a2903003703002001200041186a2903003703102001200041106a2802003602082000410c6a28020022034108762104200041286a290300210b410321000c070b200041106a2903002106410421030c020b2000410c6a28020022034108762104410421000c050b41022103200141fc006a41026a200441036a2d00003a0000200141106a200041206a290000370300200141086a41106a200041286a2d00003a0000200120042f00013b017c2001200041186a290000370308200041296a2d00004100472104200041106a29000021062000410c6a28000021000b200220012f017c3b0009200220033a0008200220063703102002200036020c20022001290308370318200220043a00292002200128016036012a2002410b6a200141fe006a2d00003a0000200241206a200141086a41086a290300370300200241286a200141186a2d00003a00002002412e6a200141e4006a2f01003b01002002410836020020014180016a240020020f0b2001200041186a2903003703102001200041106a29030037030841022100410021030c020b200141e8006a2000411c6a290200370300200141e0006a41106a200041246a2802003602002001200041146a290200370360200041286a3502002000412c6a31000042208684210b2000410d6a2f00002000410f6a2d0000411074722104200041106a2802002100410021030b200141146a200141e8006a2903003702002001411c6a200141f0006a2802003602002001200129036037020c20012000360208410121000b2002200737033020022000360208200220012903083703102002200b3703282002410c360200200241386a200637030020022004410874200341ff01717236020c200241186a200141086a41086a290300370300200241206a200141186a29030037030020014180016a240020020f0b41e00041081020000b10c801000b4184adc300102c000b102e000b41d0a7c400102c000b41888cc300102c000b419cadc300102c000b41bcc4c300102c000b41d4c4c300102c000b41e00041081020000bb91c04047f027e027f027e23004180016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002b05090d0a0608040b030c0102000b200241206a200141086a10b90120004101360200200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b200241206a200141086a10c301200041086a200241206a41d80010ce031a2000410d36020020024180016a24000f0b200128020422044102460d0b4101210320044101470d29200141086a10c40121010c160b2001410c6a2802002203417f4c0d29200128020421012003450d0e2003101f22040d0f200341011020000b4102210320012d000422044102460d0a20044101470d29200141086a280200210541e000101f2204450d2e20042001410c6a28020010c501410121030c0b0b200141086a28020022034102460d0b20034101470d292001410c6a22032d00004101470d14200141106a2802002104410121030c150b200241206a200141086a10c60120004107360200200041c0006a200241206a41386a290300370300200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b20004100360200200041086a200141086a29030037030020024180016a24000f0b200141086a22042d0000417f6a220341044b0d27024020030e05001d191b17000b2001410c6a10c4012101410121030c1d0b41032103200141086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d27200241046a200441066a2f00003b0100200241286a200141206a290200370300200241206a41106a200141286a2d00003a00002002200441026a2800003602002002200141186a290200370320200141106a2902002106200141096a2d000021010c0c0b200241206a200141086a10c10120004106360200200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b2000410a360200200041086a200141086a29030037030020024180016a24000f0b200141086a280200417f6a220341044b0d25024020030e05001b161814000b200141386a2903002106200141306a2903002107410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b200241206a200141086a10c70120004105360200200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b41012103200141086a2d00004101470d082001410c6a28020021040c090b200241026a200141046a220441036a2d00003a0000200241206a41086a200141186a2902003703002002412d6a2001411d6a290000370000200220042f00013b01002002200141106a290200370320200141256a2d00004100472108200141286a28020021092001410c6a2802002104200141086a28020021050b200020022f01003b0005200020033a0004200020083a0025200041093602002000410c6a2004360200200041086a2005360200200041106a2002290320370200200041286a2009360200200041076a200241026a2d00003a0000200041186a200241206a41086a2903003702002000411d6a2002412d6a29000037000020024180016a24000f0b410121032001410c6a22042d00004101470d0a200141106a28020021040c0b0b410121040b20042001200310ce0321012000410c6a2003360200200041086a2003360200200020013602042000410b36020020024180016a24000f0b200141106a29030021060c010b20042d000141004721010b200020013a00092000200228020036010a20004104360200200041086a20033a0000200041106a2006370300200041186a20022903203703002000410e6a200241046a2f01003b0100200041206a200241206a41086a290300370300200041286a200241206a41106a29030037030020024180016a24000f0b200241086a200141186a290200370300200241106a200141206a2802003602002002200141106a290200370300200141246a350200200141286a310000422086842106200141096a2f00002001410b6a2d00004110747221052001410c6a2802002104410021030b200241206a41106a200241106a280200360200200241206a41086a200241086a2903003703002002200229030037032020032005410874722101410221030b200020033602042000410e3602002000410c6a2004360200200041086a2001360200200041106a2002290320370200200041246a2006370200200041186a200241206a41086a290300370200200041206a200241206a41106a28020036020020024180016a24000f0b200241fe006a200341036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220032f00013b017c2002200141146a290200370320200141106a2802002104410021030b2002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141386a2903002106200141306a2903002107410121050c020b200241fe006a200441036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220042f00013b017c2002200141146a290200370320200141106a2802002104410021030b410221052002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141c8006a290300210a200141c0006a290300210b200141386a2903002106200141306a29030021070b200020022f011c3b000d20004103360200200041c8006a200a370300200041c0006a200b370300200041386a2006370300200041306a20073703002000410c6a20033a0000200041086a2005360200200041106a2004360200200041146a20022903003702002000410f6a2002411e6a2d00003a00002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a28020036020020024180016a24000f0b200141106a2903002106410521030c060b2001410c6a28020022034108762104410521010c090b41032103200241fe006a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141106a29020021062001410c6a28020021010c040b200241206a41106a200141206a2903003703002002200141186a2903003703282002200141106a2802003602202001410c6a28020022034108762104200141286a290300210b410321010c070b200141106a2903002106410421030c020b2001410c6a28020022034108762104410421010c050b41022103200241fc006a41026a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141296a2d00004100472104200141106a29020021062001410c6a28020021010b200020022f017c3b0009200020043a00292000200228010036012a200041086a20033a0000200041106a20063703002000410c6a2001360200200041186a20022903203703002000410b6a200241fe006a2d00003a0000200041206a200241206a41086a290300370300200041286a200241206a41106a2d00003a00002000412e6a200241046a2f01003b01002000410836020020024180016a24000f0b2002200141186a2903003703282002200141106a29030037032041022101410021030c020b200241086a2001411c6a290200370300200241106a200141246a2802003602002002200141146a290200370300200141286a3502002001412c6a31000042208684210b2001410d6a2f00002001410f6a2d0000411074722104200141106a2802002101410021030b2002412c6a200241086a290300370200200241346a200241106a2802003602002002200229030037022420022001360220410121010b2000410c360200200041386a2006370300200041306a2007370300200041086a2001360200200041106a2002290320370300200041286a200b3703002000410c6a2004410874200341ff017172360200200041186a200241206a41086a290300370300200041206a200241206a41106a29030037030020024180016a24000f0b10c801000b4184adc300102c000b102e000b41d0a7c400102c000b41888cc300102c000b419cadc300102c000b41bcc4c300102c000b41d4c4c300102c000b41e00041081020000bb20a01047f230041206b2202240002400240024002402001280200417f6a220341094b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b2001410c6a2802002203417f4c0d124101210402402003450d00200128020421052003101f2204450d1420042005200310ce031a0b20002004360204200041013602002000410c6a2003360200200041086a2003360200200041106a200141106a280200360200200241206a24000f0b2000410536020020002001280204360204200241206a24000f0b2000410a360200200041086a200141086a290300370300200241206a24000f0b2001280204210441012103200141086a22052d00004101470d062001410c6a28020021050c070b2000410436020020002001280204360204200241206a24000f0b4101210320012d00044101470d06200141086a28020021010c070b2001410c6a2802002203417f4c0d0c2003450d09200128020421052003101f2204450d0e20042005200310ce031a0c0a0b4101210320012d00044101470d06200141086a28020021040c070b2000410736020020002001280204360204200241206a24000f0b20004109360200200041086a200141086a290300370300200241206a24000f0b2002411e6a200541036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220052f00013b011c2002200141106a2902003703002001410c6a2802002105410021030b20002004360204200020022f011c3b0009200041086a20033a00002000410c6a2005360200200041106a20022903003702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a2802003602002000412c6a2001412c6a29020037020020004103360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030b200020022f011c3b0005200020033a000420004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002104410021030b200020033a0004200020022f011c3b0005200041086a20043602002000410c6a2002290300370200200041386a200141386a290300370300200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141286a280200210120004106360200200041286a2001360200200241206a24000f0b410121040b20002004360204200041023602002000410c6a2003360200200041086a2003360200200041106a200141106a280200360200200241206a24000f0b41a8a9c300102c000b102e000b200341011020000b200341011020000be70d03047f017e057f230041206b220224000240024002400240024002400240024020012d0000417f6a2203410e4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0f00090607030a0c080d050e02040b01000b41012103200141046a2d00004101470d0e200141086a28020021040c0f0b2001410c6a2802002205ad2206421b88a70d162006420586a72203417f4c0d16200141046a28020021072003450d112003101f2208450d172005450d120c1b0b2000410c3a0000200041046a200141046a280200360200200241206a24000f0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a280200360200200241206a24000f0b2000410d3a0000200020012d00014100473a0001200241206a24000f0b2000410a3a0000200041086a200141086a290300370300200241206a24000f0b200041033a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b200041043a0000200241206a24000f0b200041083a0000200020012d00013a0001200241206a24000f0b200041023a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b2001410c6a280200220aad42247e2206422088a70d0d2006a72204417f4c0d0d200141046a28020021032004450d0a2004101f220b450d0f200a450d0b0c100b2000410e3a0000200041046a200141046a280200360200200241206a24000f0b200041073a0000200241206a24000f0b41012103200141046a2d00004101470d03200141086a28020021010c040b2000410b3a0000200041086a200141086a290300370300200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030b200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041286a200141286a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141016a2d00002101200041013a0000200020013a0001200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030b200041093a0000200041056a20022f011c3b0000200041046a20033a0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b4101210820050d090b41002105410021010c090b4104210b200a0d050b410021040c050b41a880c400102c000b102e000b200341011020000b200441041020000b200a41246c2105410021042002411e6a2109200b210103400240024020032d00004101470d00200341046a2802002107410121080c010b2009200341036a2d00003a0000200341046a2800002107200341016a2f00002108200241186a200341206a2d00003a0000200241106a200341186a290000370300200241086a200341106a290000370300200220083b011c2002200341086a290000370300410021080b200341246a2103200120083a0000200141046a2007360200200141036a20092d00003a0000200141016a20022f011c3b0000200141206a200241186a280200360200200141186a200241106a290300370200200141106a200241086a290300370200200141086a2002290300370200200141246a2101200441016a21042005415c6a22050d000b0b200041063a00002000410c6a2004360200200041086a200a360200200041046a200b360200200241206a24000f0b20054105742104416020076b21092008210120072103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200720054105746a20096a41057641016a21010b2000410f3a00002000410c6a2001360200200041086a2005360200200041046a2008360200200241206a24000b0a004198dac300102c000ba9830105037f027e047f017e057f23004190056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410b4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0c00070405020809060c030b01000b200141106a2903002106200141086a2903002107200141046a280200210420022d0001210820022d00002105200341d8026a22092002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d1d410121090c1e0b20022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d0c410121040c0d0b200141046a280200210420022d000120022d000072450d0e2004103c2004101d20012d00002104410021090c070b200341d8016a41186a200141196a290000370300200341d8016a41106a200141116a290000370300200341d8016a41086a200141096a290000370300200320012900013703d80120022d0001210920022d00002105200341c0026a41186a22042002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d0e410121040c0f0b200141046a280200210920012d0001210820022d0001210a20022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d10410121040c110b200141046a280200210a20012d0001210b20022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d12410121040c130b200341f0036a41186a200141196a290000370300200341f0036a41106a200141116a290000370300200341f0036a41086a200141096a290000370300200320012900013703f00320022d0001210920022d00002105200341c0026a41186a22042002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d14410121040c150b200141046a280200210820022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d19410121040c1a0b4101210920022d000120022d0000720d01200141046a28020010a5010c740b4101210920022d000120022d000072450d1a0b41c9b4c000210241282105200441ff017122044101460d0220044105470d772009450d77200141046a2201280200103c2001280200101d0c770b200141216a2d00002109200341286a41186a200141196a290000370300200341286a41106a200141116a290000370300200341286a41086a200141096a2900003703002003200129000137032820022d0001210820022d00002105200341c0026a41186a22042002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d19410121040c1a0b20022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d1b410121040c1c0b200141046a2201280200103c2001280200101d0c740b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341b8016a41026a2209200341f0036a41026a2d00003a0000200341b0036a41086a2208200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d30200341b3026a2008290300370000200341b8026a200341b0036a410d6a290000370000200320032f01b8013b01a002200320053600a702200320023600a302200320032903b0033700ab02200320092d00003a00a2024115101f2202450d3d2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d3e200220032903a0023700152002412d6a200341b8026a290300370000200241256a200341a0026a41106a2903003700002002411d6a200341a0026a41086a29030037000020034180056a41086a2205420037030020034200370380052002413520034180056a1001200341d8046a41086a200529030037030020032003290380053703d804200341d8046a411041f8b3c20041004100100221052002101d2005417f460d214115101f2202450d4b2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d4c200220032903a0023700152002412d6a200341a0026a41186a290300370000200241256a200341a0026a41106a2903003700002002411d6a200341a0026a41086a2903003700004200210c20034180056a41086a2205420037030020034200370380052002413520034180056a1001200341f0046a41086a200529030037030020032003290380053703f004200341c0026a200341f0046a105c024020032d00e102220941024622050d00200341f0046a411010090b200341d0036a41086a2208200341ea026a290100370300200341d0036a41106a200341f2026a290100370300200341d0036a41186a200341fa026a290100370300200341b0036a41086a220a2003418b036a290000370300200341b0036a41106a20034193036a290000370300200341b0036a41186a2003419b036a290000370300200320032901e2023703d003200320034183036a2900003703b00320034182036a2d0000210420033000e00221062002101d20050d6b200341d8016a41186a200341d0036a41186a290300370300200341d8016a41106a200341d0036a41106a290300370300200341d8016a41086a200829030037030020034188016a41086a200a29030037030020034188016a41106a200341b0036a41106a29030037030020034188016a41186a200341b0036a41186a290300370300200320032903d0033703d801200320032903b00337038801410021020240200441ff01714101470d004115101f2202450d5e2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d5f20022003290388013700152002412d6a200341a0016a290300370000200241256a20034198016a2903003700002002411d6a20034188016a41086a2903003700000b20094101470d2a4115101f2205450d5f2005410d6a41002900c89b40370000200541086a41002900c39b40370000200541002900bb9b40370000200541154135101e2205450d60200520032903d8013700152005412d6a200341d8016a41186a290300370000200541256a200341d8016a41106a2903003700002005411d6a200341d8016a41086a29030037000020034180056a41086a2208420037030020034200370380052005413520034180056a1001200341f0046a41086a200829030037030020032003290380053703f004200341c0026a200341f0046a105c20032d00e1024102460d61200341f0036a200341c0026a41c20010ce031a200341f0036a41c2006a20043a0000200341b3046a200329038801370000200341bb046a20034188016a41086a290300370000200341c3046a20034188016a41106a290300370000200341cb046a20034188016a41186a29030037000020034180056a41086a2204420037030020034200370380052005413520034180056a1001200341f0046a41086a200429030037030020032003290380053703f004200341003602c802200342013703c0024120101f2204450d62200420032903f003370000200441086a200341f0036a41086a290300370000200441106a200341f0036a41106a290300370000200441186a200341f0036a41186a290300370000200342a080808080043702c402200320043602c0022004412041c000101e2204450d63200420034190046a2d00003a0020200342c080808090043702c402200320043602c00220034191046a200341c0026a10ca0120032802c4022104200341f0046a411020032802c0022208200341c8026a280200100302402004450d002008101d0b2005101d410121082002450d340c680b200141086a290300210720012d0001210220034180056a41086a220542003703002003420037038005418cb9c000410d20034180056a1001200341f0046a41086a200529030037030020032003290380053703f004420021060240200341f0046a411041f8b3c200410041001002417f460d00200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d3a20032903c00221060b20034180056a41086a22054200370300200342003703800541869bc000411620034180056a1001200341f0046a41086a200529030037030020032003290380053703f004200341f0046a411041f8b3c200410041001002417f460d23200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d3a20032903c002210c0c240b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c702210520034188016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b018801200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341e8006a41026a220920034188016a41026a2d00003a0000200341d0036a41086a2208200341c0026a41086a290300370300200341d0036a41106a200341c0026a41106a290300370300200320032f0188013b0168200320032903c0023703d00320040d2c20034183046a200829030037000020034188046a200341d0036a410d6a290000370000200320032f01683b01f003200320053600f703200320023600f303200320032903d0033700fb03200320092d00003a00f203200341c0026a200341d8016a10c0014101210420032d00c0024101470d18200341ba016a20032d00c3023a0000200341b0036a41086a200341d4026a290200370300200341b0036a410d6a200341d9026a290000370000200320032f00c1023b01b8012003200341cc026a2902003703b003200341c0026a41086a28020021054100210420032802c40221020c190b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220b2004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200a41ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200b290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a220a200341f0036a41026a2d00003a0000200341b0036a41086a220b200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d29200341c8006a41026a2204200a2d00003a0000200341a0026a41086a220a200b290300370300200341a0026a410d6a220b200341b0036a410d6a290000370000200320032f01b8013b0148200320032903b0033703a002200341d3026a200a290300370000200341d8026a200b290000370000200320053600c702200320023600c302200320042d00003a00c202200320032f01483b01c002200320032903a0023700cb02200341186a200341c0026a2009200810cb01200328021c2105200328021821020c290b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a2209200341f0036a41026a2d00003a0000200341b0036a41086a2208200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d2620034183046a200829030037000020034188046a200341b0036a410d6a290000370000200320032f01b8013b01f003200320053600f703200320023600f303200320032903b0033700fb03200320092d00003a00f203200341c0026a200341f0036a10c0014101210420032d00c0024101470d14200341ca006a20032d00c3023a000020034188016a41086a200341d4026a29020037030020034188016a410d6a200341d9026a290000370000200320032f00c1023b01482003200341cc026a29020037038801200341c0026a41086a28020021054100210420032802c40221020c150b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341d8016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01d801200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a2209200341d8016a41026a2d00003a0000200341b0036a41086a2208200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01d8013b01b801200320032903c0023703b00320040d23200341c8006a41026a20092d00003a0000200341a0026a41086a2008290300370300200341a0026a410d6a200341b0036a410d6a290000370000200320032f01b8013b0148200320032903b0033703a002410f101f2204450d32200441076a41002900b39b40370000200441002900ac9b403700002004410f412f101e2204450d33200420032903f00337000f200441276a200341f0036a41186a22082903003700002004411f6a200341f0036a41106a220a290300370000200441176a200341f0036a41086a220b29030037000020034180056a41086a2209420037030020034200370380052004412f20034180056a1001200341d8046a41086a200929030037030020032003290380053703d804200341d8046a411041f8b3c20041004100100221092004101d2009417f460d16419fb3c0002102410f21050c230b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220a2009290000370000200320032f01c0023b018005200320032900cb023703d80441012109200841ff01714101470d0020032800c302210220032800c7022105200341d8016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200a290000370000200320032f0180053b01d801200320032903d8043703c002410021090c010b41f1b4c0002102412a21050b200341b8016a41026a2208200341d8016a41026a2d00003a0000200341b0036a41086a220a200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01d8013b01b801200320032903c0023703b00320090d0b20034183046a200a290300370000200341f0036a41186a200341bd036a290000370000200320032f01b8013b01f003200320053600f703200320023600f303200320032903b0033700fb03200320082d00003a00f20320034180056a41086a2202420037030020034200370380054189b2c000411820034180056a1001200341f0046a41086a200229030037030020032003290380053703f004200341f0046a411041f8b3c200410041001002417f460d0a200342003703c802200342003703c002200341f0046a4110200341c0026a4110410010022202417f460d2c2002410f4d0d2c20032903c002200756200341c8026a290300220c200656200c2006511b450d0a41a1b2c0002102410d21050c0b0b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220a2004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341d8016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200a290000370000200320032f0180053b01d801200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a2209200341d8016a41026a2d00003a0000200341b0036a41086a220a200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01d8013b01b801200320032903c0023703b00320040d1d20034183046a200a290300370000200341f0036a41186a200341bd036a290000370000200320032f01b8013b01f003200320053600f703200320023600f303200320032903b0033700fb03200320092d00003a00f203200341c0026a200810920120032802d002220a450d0f200341dc026a280200210b200341c0026a41186a280200210220032802d4022104200341106a200341f0036a20032902c402220642208620033502c002842207200341cc026a350200422086200642208884220610cc012003280210450d144185b3c0002102411a21052004450d1d200a101d0c1d0b200141046a2802002102200341f0036a200141086a290300220610ad01024020032802f803220520024d0d00024020032802f003200241e8006c6a2202280200410f460d002002103c0b2002410f360200200241046a200341c0026a41e40010ce031a0b4117101f2202450d342002410f6a41002900f89c40370000200241086a41002900f19c40370000200241002900e99c4037000020024117412e101e2202450d352002200637001720034180056a41086a2204420037030020034200370380052002411f20034180056a1001200341f0046a41086a200429030037030020032003290380053703f004200341103602c4022003200341f0046a3602c002200341f0036a200341c0026a10ae012002101d20032802f003210402402005450d00200541e8006c210520042102034002402002280200410f460d002002103c0b200241e8006a2102200541987f6a22050d000b0b20032802f403450d582004101d0c580b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220a2004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200841ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200a290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341b8016a41026a2208200341f0036a41026a2d00003a0000200341b0036a41086a220a200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d19200341fb006a200a290300370000200341e8006a41186a2204200341b0036a410d6a290000370000200320032f01b8013b01682003200536006f2003200236006b200320032903b003370073200320082d00003a006a200341a0026a41186a2004290300370300200341a0026a41106a200341e8006a41106a290300370300200341a0026a41086a200341e8006a41086a290300370300200320032903683703a00220034188016a41186a200341286a41186a29030037030020034188016a41106a200341286a41106a29030037030020034188016a41086a200341286a41086a290300370300200320093a00a80120032003290328370388014115101f2202450d2a2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d2b200220032903a0023700152002412d6a200341a0026a41186a290300370000200241256a200341a0026a41106a2903003700002002411d6a200341a0026a41086a29030037000020034180056a41086a2204420037030020034200370380052002413520034180056a1001200341f0046a41086a200429030037030020032003290380053703f004200341f0036a200341f0046a105c20032d00910422044102470d0920034180056a41086a22044200370300200342003703800541939dc000411d20034180056a1001200341f0046a41086a2209200429030037030020032003290380053703f004200341f0046a411041f8b3c200410041001002417f460d12200341d8026a4200370300200341c0026a41106a4200370300200341c0026a41086a4200370300200342003703c002200341f0046a4110200341c0026a4120410010022204417f460d362004411f4d0d3620034180056a41026a220b20032d00c2023a0000200341d8046a41086a2204200341d3026a290000370300200341d8046a410d6a2209200341d8026a290000370000200320032f01c0023b018005200320032900cb023703d80420032800c302210820032800c702210a200341d0016a41026a220d200b2d00003a0000200341b8016a41086a220b2004290300370300200341b8016a410d6a220e2009290000370000200320032f0180053b01d001200320032903d8043703b801200341d4016a41026a200d2d00003a00002004200b2903003703002009200e290000370000200320032f01d0013b01d401200320032903b8013703d8044115101f2204450d3a2004410d6a41002900c89b40370000200441086a41002900c39b40370000200441002900bb9b40370000200441154135101e2204450d3b200420032f01d4013b00152004200a36001c20042008360018200420032903d804370020200441176a200341d4016a41026a2d00003a0000200441286a200341d8046a41086a2903003700002004412d6a200341e5046a29000037000020034180056a41086a2209420037030020034200370380052004413520034180056a1001200341f0046a41086a220b200929030037030020032003290380053703f004200341c0026a200341f0046a105c20032d00e1024102460d3c200341d0036a41186a220d200341c0026a41186a290300370300200341d0036a41106a220e200341c0026a41106a290300370300200341d0036a41086a220f200341c0026a41086a290300370300200320032903c0023703d00320032d00e0022110200341d8016a200341e1026a41c20010ce031a200341b0036a41186a2211200d290300370300200341b0036a41106a220d200e290300370300200341b0036a41086a220e200f290300370300200320032903d0033703b003200341c0026a200341d8016a41c20010ce031a200341d8016a41186a220f2011290300370300200341d8016a41106a2211200d290300370300200341d8016a41086a200e290300370300200320032903b0033703d80120032d00e102210d2009420037030020034200370380052004413520034180056a1001200b200929030037030020032003290380053703f0044120101f2209450d3d200920032903d801370000200941186a200f290300370000200941106a2011290300370000200941086a200341d8016a41086a2903003700002009412041c000101e2209450d3e200941013a0021200920103a0020200941c000418001101e2209450d3f200920032903a0023700222009413a6a200341a0026a41186a290300370000200941326a200341a0026a41106a2903003700002009412a6a200341a0026a41086a290300370000200341e2026a4100200d4101461b220b450d15200941c2006a41013a0000200941db006a200b41186a290000370000200941d3006a200b41106a290000370000200941cb006a200b41086a2900003700002009200b29000037004341e300210b0c160b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341b8016a41026a2209200341f0036a41026a22082d00003a0000200341b0036a41086a220a200341c0026a41086a220b290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d16200341c8006a41026a220420092d00003a0000200341a0026a41086a2209200a290300370300200341a0026a410d6a220a200341b0036a410d6a290000370000200320032f01b8013b0148200320032903b0033703a002200820042d00003a0000200b2009290300370300200341c0026a410d6a200a290000370000200320032f01483b01f003200320032903a0023703c002410f101f2204450d29200441076a41002900b39b40370000200441002900ac9b403700002004410f412f101e2204450d2a200420032f01f0033b000f2004200536001620042002360012200420032903c00237001a200441116a200341f2036a2d00003a0000200441226a200341c0026a41086a290300370000200441276a200341cd026a29000037000020034180056a41086a2202420037030020034200370380052004412f20034180056a1001200341d8046a41086a200229030037030020032003290380053703d804200341d8046a411010092004101d41012109410121080c4d0b200341086a200341f0036a2007200610cc012003280208450d0b41aeb2c0002102411a21050b2004103c2004101d410021084101210920012d000022044101470d540c530b410b2105419a80c10021020b200341c8006a41026a2209200341b8016a41026a2d00003a000020034188016a41086a2208200341b0036a41086a29030037030020034188016a41106a200341b0036a41106a290300370300200320032f01b8013b0148200320032903b0033703880120040d12200341d3026a2008290300370000200341c0026a41186a220420034195016a290000370000200320032f01483b01c002200320053600c702200320023600c30220032003290388013700cb02200320092d00003a00c202200341c0026a200341f0036a412010d003450d0a41aeb3c0002102410b21050c120b410b2105419a80c10021020b200341e8006a41026a2209200341c8006a41026a2d00003a0000200341d0036a41086a220820034188016a41086a290300370300200341d0036a41106a20034188016a41106a290300370300200320032f01483b016820032003290388013703d00320040d10200341d8016a41026a220420092d00003a0000200341a0026a41086a22092008290300370300200341a0026a410d6a2208200341d0036a410d6a290000370000200320032f01683b01d801200320032903d0033703a002200341d3026a2009290300370000200341d8026a2008290000370000200320053600c702200320023600c302200320042d00003a00c202200320032f01d8013b01c002200320032903a0023700cb02200341206a200341c0026a200a200b10cb0120032802242105200328022021020c100b200341c8006a41186a200341aa046a290100370300200341c8006a41106a200341a2046a290100370300200341c8006a41086a2003419a046a290100370300200341d0036a41026a200341b5046a2d00003a0000200341d8016a41086a200341c6046a290100370300200341e5016a200341cb046a29000037000020032003290192043703482003200341b3046a2f00003b01d0032003200341be046a2901003703d801200341ba046a280100210a200341b6046a2801002108200341b2046a2d000021090c0e0b41b9b3c0002102410d21050c0e0b41e1b2c0002102412421050c0d0b200341c0026a41186a2008290300370300200341c0026a41106a200a290300370300200341c0026a41086a200b290300370300200320032903f0033703c00220034188016a41026a200341c8006a41026a2d00003a0000200341d8016a41086a200341a0026a41086a290300370300200341d8016a410d6a200341a0026a410d6a290000370000200320032f01483b018801200320032903a0023703d801410f101f2204450d2a200441076a41002900b39b40370000200441002900ac9b403700002004410f412f101e2209450d2b200920032903c00237000f200941276a200341c0026a41186a2903003700002009411f6a200341c0026a41106a290300370000200941176a200341c0026a41086a29030037000020034180056a41086a2204420037030020034200370380052009412f20034180056a1001200341f0046a41086a200429030037030020032003290380053703f0044120101f2204450d2c200420032f0188013b00002004200536000720042002360003200420032903d80137000b200441026a20034188016a41026a2d00003a0000200441136a200341d8016a41086a290300370000200441186a200341e5016a290000370000200341f0046a41102004412010032004101d2009101d0c480b42e807210c0b200341c0026a200441e00010ce031a200341f0036a200c20067c200341c0026a20022007109501200341f8036a280200210520032802f403210220032802f003210a2004101d410121084100210920024100200a4101461b210220012d000022044101470d4a0c490b20034180056a41086a22024200370300200342003703800541c8b2c000411920034180056a1001200341f0046a41086a200229030037030020032003290380053703f004410021090240200341f0046a411041f8b3c200410041001002417f460d00200341003602c002200341f0046a4110200341c0026a41044100100241016a41044d0d2120032802c00221090b20034180056a41086a22054200370300200342003703800541c8b2c000411920034180056a1001200341f0046a41086a2208200529030037030020032003290380053703f0042003200941016a3602c002200341f0046a4110200341c0026a410410034120101f2202450d31200220032903f003370000200341d4026a428180808010370200200241186a200341f0036a41186a290300370000200241106a200341f0036a41106a290300370000200241086a200341f0036a41086a290300370000200320073703c002200320023602d002200320063703c8022009200341c0026a10cd0120054200370300200342003703800541939cc000411520034180056a10012008200529030037030020032003290380053703f00441002102200341f0046a411041f8b3c200410041001002417f460d0a200342103702dc012003200341f0046a3602d801200341c0026a200341d8016a10910120032802c0022208450d35200341c8026a280200210220032802c402210a0c0b0b200341c8006a41186a2209200341f0036a41186a290300370300200341c8006a41106a220d200341f0036a41106a290300370300200341c8006a41086a220e200341f0036a41086a290300370300200320032903f00337034820042002470d03200441016a22052004490d222004410174220f20052005200f491b220fad420586220c422088a70d22200ca722054100480d222004450d0f200a20044105742005101e220a0d100c3c0b2004200341d8016a41186a290300370300200341c0026a41106a200341d8016a41106a290300370300200341c0026a41086a200341d8016a41086a290300370300200320032903d8013703c002410f101f2205450d3041002102200541076a41002900b39b40370000200541002900ac9b403700002005410f412f101e2205450d31200520032903c00237000f200541276a200341d8026a2903003700002005411f6a200341c0026a41106a290300370000200541176a200341c0026a41086a29030037000020034180056a41086a2204420037030020034200370380052005412f20034180056a1001200341d8046a41086a200429030037030020032003290380053703d804200341d8046a411010092005101d0c440b20044200370300200342003703800541939dc000411d20034180056a10012009200429030037030020032003290380053703f0044120101f2204450d31200420032903a002370000200441186a200341a0026a41186a290300370000200441106a200341a0026a41106a290300370000200441086a200341a0026a41086a290300370000200341f0046a41102004412010032004101d410021090c040b200441ff01714101470d0820034180056a41086a22054200370300200342003703800541939dc000411d20034180056a1001200341f0046a41086a200529030037030020032003290380053703f0044120101f2205450d3a2005200329038801370000200541186a20034188016a41186a290300370000200541106a20034188016a41106a290300370000200541086a20034188016a41086a290300370000200341f0046a41102005412010032005101d410021054100210820020d3d0c090b2004210f0c0c0b200941c2006a41003a000041c300210b0b200341f0046a41102009200b10032009101d2004101d20034180056a41086a22044200370300200342003703800541939dc000411d20034180056a1001200341f0046a41086a200429030037030020032003290380053703f0044120101f2204450d29200420032903a002370000200441186a200341a0026a41186a290300370000200441106a200341a0026a41106a290300370000200441086a200341a0026a41086a290300370000200341f0046a41102004412010032004101d200341d0036a41026a200341d4016a41026a2d00003a0000200341d8016a41086a200341d8046a41086a290300370300200341d8016a410d6a200341d8046a410d6a290000370000200320032f01d4013b01d003200320032903d8043703d801410121090b410021040b200341e5026a20093a0000200341ed026a200a360000200341e9026a2008360000200341c0026a410d6a200341c8006a41086a290300370000200341d5026a200341c8006a41106a290300370000200341dd026a200341c8006a41186a290300370000200341e6026a20032f01d0033b0100200341e8026a200341d2036a2d00003a0000200341f1026a20032903d801370000200341f9026a200341d8016a41086a290300370000200341fe026a200341d8016a410d6a290000370000200320043a00c402200320032903483700c502200320034188016a3602c00220034180056a41086a2204420037030020034200370380052002413520034180056a1001200341d8046a41086a200429030037030020032003290380053703d804200341003602f803200342013703f0034120101f2204450d152004200329038801370000200441086a20034188016a41086a290300370000200441106a20034188016a41106a290300370000200441186a20034188016a41186a290300370000200342a080808080043702f403200320043602f0032004412041c000101e2204450d162004200341a8016a2d00003a0020200342c080808090043702f403200320043602f003200341c0026a410472200341f0036a10ca0120032802f4032104200341d8046a411020032802f0032209200341f0036a41086a280200100302402004450d002009101d0b2002101d200342e4cab5fbb6ccdcb0e3003703b001200341b0016a200341e8006a427f109d01200341c0026a41086a41073a0000200341c9026a2003290368370000200341d1026a200341e8006a41086a290300370000200341d9026a200341e8006a41106a290300370000200341e1026a200341e8006a41186a290300370000200341e9026a2003290328370000200341f1026a200341286a41086a290300370000200341f9026a200341286a41106a29030037000020034181036a200341286a41186a290300370000200341053a00c002200341c0026a108b01410021020b410121094101210820012d000022044101460d3e0c3f0b410821084100210a0b200341c0026a200410c201200341c8006a41186a220b200341f0036a41186a290300370300200341c8006a41106a220d200341f0036a41106a290300370300200341c8006a41086a220e200341f0036a41086a290300370300200320032903f003370348200a2002470d33200241016a22052002490d172002410174220a20052005200a491b220aad4288017e220c422088a70d17200ca722054100480d172002450d02200820024188016c2005101e2208450d030c330b20034180056a41086a22054200370300200342003703800541939dc000411d20034180056a1001200341d8046a41086a200529030037030020032003290380053703d804200341d8046a41101009410021054100210820020d340b41002104200820054572450d340c350b2005101f22080d300b200541081020000b2005101f220a450d2c0b200a20024105746a22052003290348370000200541186a2009290300370000200541106a200d290300370000200541086a200e29030037000041012109200341c0026a41186a200241016a360200200341d4026a200f360200200320063703c802200320073703c0022003200b3602dc022003200a3602d0022008200341c0026a10cd01410021020c350b200341d4026a4101360200200341183602f403200341c0adc4003602f003200342013702c402200341c8adc4003602c0022003200341f0036a3602d002200341c0026a41e0f3c20010cf01000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411541011020000b413541011020000b410f41011020000b412f41011020000b411541011020000b413541011020000b410f41011020000b412f41011020000b412041011020000b41c00041011020000b41df88c0004133103a000b411741011020000b412e41011020000b1021000b411541011020000b413541011020000b41df88c0004133103a000b410f41011020000b412f41011020000b412041011020000b411541011020000b413541011020000b4193f1c100419f01103a000b412041011020000b41c00041011020000b41800141011020000b412041011020000b412041011020000b410f41011020000b412f41011020000b412041011020000b41df88c0004133103a000b411541011020000b413541011020000b411541011020000b413541011020000b41f5d7c10041d300103a000b412041011020000b41c00041011020000b200541011020000b412041011020000b200820024188016c220f6a200341c0026a41e00010ce0322052009360260200541fc006a200b290300370200200541f4006a200d290300370200200541ec006a200e290300370200200520032903483702642003200241016a22023602c8022003200a3602c402200320083602c00220034180056a41086a22054200370300200342003703800541939cc000411520034180056a1001200341f0046a41086a200529030037030020032003290380053703f004200341103602dc012003200341f0046a3602d801200341c0026a200341d8016a10930102402002450d00200f4188016a21052008210203402002103c20024188016a2102200541f87e6a22050d000b0b0240200a450d002008101d0b200341d8026a2006370300200341d0026a2007370300200341cc026a200936020041002108200341c8026a41003a0000200341053a00c002200341c0026a108b012004103c2004101d410121090b4100210220012d000022044101470d080c070b20034180056a41086a2204420037030020034200370380052002413520034180056a1001200341f0046a41086a220a200429030037030020032003290380053703f004200341c0026a200341f0046a105c20032d00e1024102460d0b200341f0036a200341c0026a41e30010ce031a20034192046a20032903d8013701002003419a046a200341d8016a41086a290300370100200341a2046a200341d8016a41106a290300370100200341aa046a200341d8016a41186a290300370100200320093a0091042004420037030020034200370380052002413520034180056a1001200a200429030037030020032003290380053703f004200341003602c802200342013703c0024120101f2204450d0c200420032903f003370000200441086a200341f0036a41086a290300370000200441106a200341f0036a41106a290300370000200441186a200341f0036a41186a290300370000200342a080808080043702c402200320043602c0022004412041c000101e2204450d0d200420034190046a2d00003a0020200342c080808090043702c402200320043602c00220034191046a200341c0026a10ca0120032802c4022104200341f0046a411020032802c0022209200341c0026a41086a280200100302402004450d002009101d0b2002101d410121042008200545720d010b2005101d0b02402002452004720d002002101d0b2006210c0b4200210620034180056a41086a22024200370300200342003703800541a89cc000411520034180056a1001200341f0046a41086a200229030037030020032003290380053703f004420021070240200341f0046a411041f8b3c200410041001002417f460d00200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d0720032903c00221070b20034180056a41086a220242003703002003420037038005418cb9c000410d20034180056a1001200341f0046a41086a200229030037030020032003290380053703f0040240200341f0046a411041f8b3c200410041001002417f460d00200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d0820032903c00221060b200342e4cab5fbb6ccdcb0e300370368200341e8006a200341a0026a427f427f200c20077e20067c410210d001200341c0026a41086a41083a0000200341c9026a20032903a002370000200341d1026a200341a0026a41086a290300370000200341d9026a200341b0026a290300370000200341e1026a200341b8026a290300370000200341053a00c002200341c0026a108b010b410021020b410121090b4101210820012d000022044101470d010b2008450d01200141046a2201280200103c2001280200101d0c010b20044105470d002009450d00200141046a2201280200103c2001280200101d0b200020053602042000200236020020034190056a24000f0b41df88c0004133103a000b41df88c0004133103a000b41f5d7c10041d300103a000b412041011020000b41c00041011020000bf90801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024002400240024002400240024020002d00004101470d0020022003470d01200341016a22022003490d0c20034101742204200220022004491b22044100480d0c2003450d03200128020020032004101e2202450d040c090b20022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d04200128020020032004101e2202450d050c060b200128020021020c080b200128020021020c050b2004101f22020d050b200441011020000b2004101f22020d010b200441011020000b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c020b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0620024101742203200420042003491b22034100480d062002450d01200128020020022003101e2202450d020c030b200128020021020c030b2003101f22020d010b200341011020000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a28020021030240024002400240024002400240024002400240024020002d00214101470d0020022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d03200128020020032004101e2202450d040c090b20022003470d01200341016a22002003490d0a20034101742202200020002002491b22024100480d0a2003450d04200128020020032002101e2200450d050c060b200128020021020c080b200128020021000c050b2004101f22020d050b200441011020000b2002101f22000d010b200241011020000b20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a0000024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0320024101742203200420042003491b22034100480d032002450d01200128020020022003101e2202450d020c040b200128020021020c040b2003101f22020d020b200341011020000b1021000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000b980f03087f017e077f230041d0006b22042400200441306a41086a220542003703002004420037033041c6b3c0004118200441306a1001200441c0006a41086a2005290300370300200420042903303703404100210502400240024002400240024002400240024002400240024002400240200441c0006a411041f8b3c200410041001002417f460d00200441003a0010200441c0006a4110200441106a41014100100241016a41014d0d0120042d001021050b0240024002400240200341187441187541077620037341187441808080086a41187520054118744118754c0d0041deb3c0002105411d21060c010b411a101f2205450d04200541186a41002f00e89b403b0000200541106a41002900e09b40370000200541086a41002900d89b40370000200541002900d09b403700002005411a4134101e2205450d052005200236001a200441306a41086a22064200370300200442003703302005411e200441306a1001200441c0006a41086a200629030037030020042004290330370340200441c0006a411041f8b3c20041004100100221062005101d0240024002400240024002402006417f460d00200441106a41186a200141186a290000370300200441106a41106a200141106a290000370300200441106a41086a200141086a290000370300200420012900003703104110101f2205450d0c200541086a41002900a49b403700002005410029009c9b40370000200541104120101e2205450d0d200520023600102005412041c000101e2205450d0e200520042903103700142005412c6a200441106a41186a2207290300370000200541246a200441106a41106a22082903003700002005411c6a200441106a41086a2209290300370000200441306a41086a220642003703002004420037033020054134200441306a1001200441c0006a41086a200629030037030020042004290330370340200441c0006a411041f8b3c20041004100100221062005101d2006417f470d05200420021099012007200141186a2900003703002008200141106a2900003703002009200141086a29000037030020042001290000370310200428020822052004280204220a470d01200541016a22062005490d072005410174220b20062006200b491b220aad420586220c422088a70d07200ca722064100480d072005450d02200428020020054105742006101e220d0d030c150b41fbb3c0002105412221060c050b2004280200210d0c020b2006101f220d450d120b2004200a3602042004200d3602000b200441086a200541016a220b360200200d20054105746a22062004290310370000200641186a200441106a41186a290300370000200641106a200441106a41106a290300370000200641086a200441106a41086a2903003700004113101f2206450d0e2006410f6a410028008f9d40360000200641086a41002900889d40370000200641002900809d40370000200641134126101e220e450d0f200e2002360013200441306a41086a2206420037030020044200370330200e4117200441306a1001200441c0006a41086a20062903003703002004200429033037034020044100360218200442013703102004200b360230200441306a200441106a106202400240200b450d00200541057441206a210f4100200441106a41086a28020022066b21102004280210211120042802142112200d210503400240201220106a411f4b0d00200641206a220b2006490d0620124101742213200b200b2013491b220b4100480d06024002402012450d0020112012200b101e22110d010c090b200b101f2211450d080b200b21120b201120066a220b2005290000370000200b41186a200541186a290000370000200b41106a200541106a290000370000200b41086a200541086a290000370000201041606a2110200641206a2106200541206a2105200f41606a220f0d000b200441186a200636020020042012360214200420113602100c010b200441106a41086a280200210620042802142112200428021021110b200441c0006a411020112006100302402012450d002011101d0b200e101d200a450d00200d101d0b2007200141186a2900003703002008200141106a2900003703002009200141086a290000370300200420012900003703104110101f2205450d09200541086a41002900a49b403700002005410029009c9b40370000200541104120101e2205450d0a200520023600102005412041c000101e2205450d0b200520042903103700142005412c6a200441286a290300370000200541246a200441106a41106a2903003700002005411c6a200441106a41086a290300370000200441306a41086a220642003703002004420037033020054134200441306a1001200441c0006a41086a2006290300370300200420042903303703404101101f2206450d0c200620033a0000200441c0006a41102006410110032006101d2005101d410021050b2000200636020420002005360200200441d0006a24000f0b1021000b200b41011020000b41df88c0004133103a000b411a41011020000b413441011020000b411041011020000b412041011020000b41c00041011020000b411041011020000b412041011020000b41c00041011020000b410141011020000b411341011020000b412641011020000b200641011020000ba90604027f017e017f037e230041306b22042400024002400240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41086a220742003703002004420037032020054134200441206a1001200441106a41086a200729030037030020042004290320370310024002400240200441106a411041f8b3c200410041001002417f460d002004420037032820044200370320200441106a4110200441206a4110410010022207417f460d022007410f4d0d02200441286a2903002108200429032021060c010b420021080b2005101d0240024020062002542205200820035420082003511b450d0041d4d4c0002105411521010c010b200441086a20014104200620027d2206200820037d2005ad7d2208103d024020042802082205450d00200428020c21010c010b4118101f2205450d05200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0620052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002109200441206a41086a220742003703002004420037032020054138200441206a1001200441106a41086a20072903003703002004200429032037031002400240200441106a411041f8b3c200410041001002417f460d002004420037032820044200370320200441106a4110200441206a4110410010022207417f460d062007410f4d0d06200441286a290300210a200429032021090c010b4200210a0b2005101d2001200920027c2202200a20037c2002200954ad7c10e70120012006200810e201410021050b2000200136020420002005360200200441306a24000f0b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b411841011020000b413841011020000bfd0403037f027e067f230041306b220224000240024002404113101f2203450d002003410f6a41002800f99b40360000200341086a41002900f29b40370000200341002900ea9b40370000200341134126101e2204450d0120042000360013200241186a41086a220342003703002002420037031820044117200241186a1001200241086a41086a2003290300370300200220022903183703082002410036022020024201370318200141086a2903002105200129030021064110101f2203450d02200320063700002003200537000820024290808080800237021c20022003360218200128021021072002200141186a280200220336022c2002412c6a200241186a106202400240024002402003450d0020034105742108200241186a41086a280200210020022802182109200228021c210a2007210303400240024002400240200a20006b41204f0d00200041206a220b2000490d07200a410174220c200b200b200c491b220c4100480d07200a450d012009200a200c101e22090d020c080b200041206a210b0c020b200c101f2209450d060b200c210a0b200920006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a290000370000200b2100200341206a2103200841606a22080d000b200241206a200b3602002002200a36021c200220093602180c010b200241206a280200210b200228021c210a200228021821090b200241086a41102009200b10030240200a450d002009101d0b2004101d0240200141146a280200450d002007101d0b200241306a24000f0b1021000b200c41011020000b411341011020000b412641011020000b411041011020000b110020012000280200200028020410ef020b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241e8b1c400360204200241f8b3c200360200200210bb03000b95140f017f017e027f017e057f017e0a7f037e077f037e027f027e027f027e027f230041a0016b2206240042002107200641086a41086a2208420037030020064200370308418cb9c000410d200641086a1001200641f8006a41086a200829030037030020062006290308370378024002400240024002400240024002400240200641f8006a411041f8b3c200410041001002417f460d0020064200370308200641f8006a4110200641086a41084100100241016a41084d0d01200629030821070b200641086a41106a2003370300200641086a41286a20053a0000200641086a41186a2004370300200641286a22092000290000370300200620023703104201210a20064201370308200641f8006a200110ea012006280278210b200628027c210c200628028001220d450d02200641f8006a41186a220e2000460d01200d41286c210f4201210a200b21050340200541086a2903002104200541106a2903002102200541186a290300210320052903002110200641f8006a41206a200541206a290300370300200641f8006a41186a2003370300200641f8006a41106a22112002370300200641f8006a41086a2004370300200620103703780240024002400240200e2900002000290000510d0020112903002007580d01200641e8006a41086a200e41086a2903003703002006200e2903003703682011290300210220062903800121032006290378211042014201520d030c020b200641e8006a41086a200941086a290300370300200629030821044200210a2006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310211020044201510d010c020b42004201520d010b200541286a2111200a21040c050b200541286a2105200f41586a220f0d000c030b0b41df88c0004133103a000b200d41286c2105200b41286a2111200641206a290300210220062903182103200629031021102006290308210a0340200641e8006a41086a200941086a290300370300420021042006420037030820062009290300370368200a4201510d02201141286a21114200210a200541586a22050d000b0b4100210e0240200c450d00200b101d0b4108211241002113200a4201510d010c040b200641d8006a41086a2205200641e8006a41086a29030037030020062006290368370358200641c8006a41086a220f200529030037030020062006290358370348200641386a41086a2205200f2903003703002006200629034837033802400240024002404128101f2212450d00201220062903383703182012201037030020122003370308201241206a2005290300370300201241106a2002370300024002402011200b200d41286c6a460d00200641f8006a41186a220f2000460d0141282114200b200d41286c6a221541586a21164101211741202118411021194108211a4201211b4228211c4220211d4100211e4101210e41012113410021050c030b4101210e41012113200c0d030c040b41282122200b200d41286c6a222341586a2124200641086a41186a290300212520062903182126200629031021272006290308210441012128410821294200212a4201212b4110212c200641f8006a41106a212d4228212e4220212f41002130412021314101210e41012113410121050c010b412841081020000b03400240024002400240024020050e020001010b201121050340200641f8006a20186a221f200520186a290300370300200f200541186a290300370300200641f8006a20196a220d200520196a290300370300200641f8006a201a6a22202005201a6a290300370300200620052903003703780240024002400240200f2900002000290000510d00200d2903002007580d01200641e8006a201a6a200f201a6a2903003703002006200f290300370368200d29030021022006290380012103200629037821104201201b520d030c020b200641e8006a201a6a2009201a6a2903003703002006290308210a420021042006420037030820062009290300370368200641086a41186a29030021022006290318210320062903102110200a201b510d010c020b4200201b520d010b200641d8006a201a6a2211200641e8006a201a6a29030037030020062006290368370358200641c8006a201a6a2221201129030037030020062006290358370348200d2002370300200f2006290348370300200f201a6a202129030037030020062003370380012006201037037802402013200e470d00200e20176a2211200e490d0b200e2017742213201120112013491b2213ad201c7e2202201d88a70d0b2002a72211201e480d0b0240200e450d002012200e20146c2011101e22120d010c060b2011101f2212450d050b200520146a21112012200e20146c6a22212006290378370300202120186a201f290300370300202141186a200f290300370300202120196a200d2903003703002021201a6a2020290300370300200e20176a210e20162005460d03410021050c060b2015200520146a2205470d000c020b0b2011210502400340200641e8006a20296a2211200920296a2903003703002006202a370308200620092903003703682004202b510d01420021042023200520226a2205470d000c020b0b200641d8006a20296a220d201129030037030020062006290368370358200641c8006a20296a2211200d29030037030020062006290358370348202d2025370300200f2006290348370300200f20296a201129030037030020062026370380012006202737037802402013200e470d00200e20286a2211200e490d08200e202874220d20112011200d491b2213ad202e7e2204202f88a70d082004a722112030480d080240200e450d002012200e20226c2011101e22120d010c030b2011101f2212450d020b200520226a21112012200e20226c6a220d2006290378370300200d20316a200641f8006a20316a290300370300200d41186a200f290300370300200d202c6a202d290300370300200d20296a200641f8006a20296a290300370300200e20286a210e4200210420242005470d020b200c450d040c030b201141081020000b410121050c000b0b200b101d0b20044201520d030b200641f8006a41206a2209200841206a290300370300200641f8006a41186a220f200841186a290300370300200641f8006a41106a2200200841106a290300370300200641f8006a41086a221a200841086a29030037030020062008290300370378200e2013470d01200e41016a2205200e490d00200e4101742211200520052011491b2213ad42287e2204422088a70d002004a722054100480d0002400240200e450d002012200e41286c2005101e2212450d010c030b2005101f22120d020b200541081020000b1021000b2012200e41286c6a22052006290378370300200541206a2009290300370300200541186a200f290300370300200541106a2000290300370300200541086a201a290300370300200e41016a210e0b2006200e360280012006201336027c200620123602782001200641f8006a10f101200641a0016a24000ba20b02037f017e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022024101460d00024020024102460d0020024103470d02200141046a280200200141086a2802002202470d05200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0b200128020020022004101e2203450d0c0c150b200141046a280200200141086a2802002202470d02200241016a22032002490d1620024101742204200320032004491b22044100480d162002450d06200128020020022004101e2203450d070c120b200141046a280200200141086a2802002202470d02200241016a22032002490d1520024101742204200320032004491b22044100480d152002450d07200128020020022004101e2203450d080c0f0b200141046a280200200141086a2802002202470d03200241016a22032002490d1420024101742204200320032004491b22044100480d142002450d0a200128020020022004101e2203450d0b0c0c0b200128020021030c100b200128020021030c0d0b200128020021030c100b200128020021030c090b2004101f22030d0b0b200441011020000b2004101f22030d070b200441011020000b2004101f22030d090b200441011020000b2004101f22030d010b200441011020000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0b20024101742200200420042000491b22004100480d0b2002450d01200128020020022000101e2202450d020c030b200128020021020c030b2000101f22020d010b200041011020000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000200041086a290300210502400240024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0920024101742200200320032000491b22004100480d092002450d01200128020020022000101e2202450d020c030b200128020021020c030b2000101f22020d010b200041011020000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0720024101742200200420042000491b22004100480d072002450d01200128020020022000101e2202450d020c030b200128020021020c030b2000101f22020d010b200041011020000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a0000200041086a2903002105024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0320024101742200200320032000491b22004100480d032002450d01200128020020022000101e2202450d020c040b200128020021020c040b2000101f22020d020b200041011020000b1021000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000bd61701267f230041900d6b2203240020034100360210419bb5c0004110200341106a41041003200341086a2204420037030020034200370300418cb9c000410d20031001200341106a41086a2205200429030037030020032003290300370310200320003703f00c200341106a4110200341f00c6a41081003200442003703002003420037030041eab8c0004111200310012005200429030037030020032003290300370310200341106a4110200141201003024002404110101f2204450d00200441086a410029009dba4037000020044100290095ba40370000200441104120101e2205450d0120052000427f7c370010200341086a22044200370300200342003703002005411820031001200341106a41086a2206200429030037030020032003290300370310200341106a41102001412010032005101d20044200370300200342003703004199b9c0004115200310012006200429030037030020032003290300370310200341106a41102002412010032004420037030020034200370300418cb9c000410d2003100120062004290300370300200320032903003703100240200341106a411041f8b3c200410041001002417f460d00200342003703f00c02400240200341106a4110200341f00c6a41084100100241016a41084d0d0020032903f00c4200510d02200341086a2204420037030020034200370300418cb9c000410d20031001200341106a41086a20042903003703002003200329030037031041002107427f21000240200341106a411041f8b3c200410041001002417f460d00200342003703f00c200341106a4110200341f00c6a41084100100241016a41084d0d0220032903f00c427f7c21000b200341106a410041e00c10cd031a41002108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f41002120410021214100212241002123410021244100212541002126410021270340200341f00c6a42002000427f7c2000501b220010af01200341106a202722014103704105746a220441186a200341f00c6a41186a290200370000200441106a200341f00c6a41106a290200370000200441086a200341f00c6a41086a290200370000200420032902f00c370000200141016a21274100210541002102024003402001200141036e2206417d6c6a4102470d01200341106a20056a220441df006a2d000022262004411f6a2d000022287120262028722004413f6a2d00007172211c200441de006a2d000022262004411e6a2d000022287120262028722004413e6a2d00007172211b200441dd006a2d000022262004411d6a2d000022287120262028722004413d6a2d00007172211a200441dc006a2d000022262004411c6a2d000022287120262028722004413c6a2d000071722119200441db006a2d000022262004411b6a2d000022287120262028722004413b6a2d000071722118200441da006a2d000022262004411a6a2d000022287120262028722004413a6a2d000071722117200441d9006a2d00002226200441196a2d00002228712026202872200441396a2d000071722116200441d8006a2d00002226200441186a2d00002228712026202872200441386a2d000071722115200441d7006a2d00002226200441176a2d00002228712026202872200441376a2d000071722114200441d6006a2d00002226200441166a2d00002228712026202872200441366a2d000071722113200441d5006a2d00002226200441156a2d00002228712026202872200441356a2d000071722112200441d4006a2d00002226200441146a2d00002228712026202872200441346a2d000071722111200441d3006a2d00002226200441136a2d00002228712026202872200441336a2d000071722110200441d2006a2d00002226200441126a2d00002228712026202872200441326a2d00007172210f200441d1006a2d00002226200441116a2d00002228712026202872200441316a2d00007172210e200441d0006a2d00002226200441106a2d00002228712026202872200441306a2d00007172210d200441cf006a2d000022262004410f6a2d000022287120262028722004412f6a2d00007172210c200441ce006a2d000022262004410e6a2d000022287120262028722004412e6a2d00007172210b200441cd006a2d000022262004410d6a2d000022287120262028722004412d6a2d00007172210a200441cc006a2d000022262004410c6a2d000022287120262028722004412c6a2d000071722109200441cb006a2d000022262004410b6a2d000022287120262028722004412b6a2d000071722108200441ca006a2d000022262004410a6a2d000022287120262028722004412a6a2d000071722107200441c9006a2d00002226200441096a2d00002228712026202872200441296a2d00007172211d200441c8006a2d00002226200441086a2d00002228712026202872200441286a2d00007172211e200441c7006a2d00002226200441076a2d00002228712026202872200441276a2d00007172211f200441c6006a2d00002226200441066a2d00002228712026202872200441266a2d000071722120200441c5006a2d00002226200441056a2d00002228712026202872200441256a2d000071722121200441c4006a2d00002226200441046a2d00002228712026202872200441246a2d000071722122200441c3006a2d00002226200441036a2d00002228712026202872200441236a2d000071722123200441c2006a2d00002226200441026a2d00002228712026202872200441226a2d000071722124200441c1006a2d00002226200441016a2d00002228712026202872200441216a2d000071722125200441c0006a2d0000222620042d00002228712026202872200441206a2d000071722126200541800c460d01200341106a20052006410574200141096e41e0006c6b6a6a220441ff006a201c3a0000200441fe006a201b3a0000200441fd006a201a3a0000200441fc006a20193a0000200441fb006a20183a0000200441fa006a20173a0000200441f9006a20163a0000200441f8006a20153a0000200441f7006a20143a0000200441f6006a20133a0000200441f5006a20123a0000200441f4006a20113a0000200441f3006a20103a0000200441f2006a200f3a0000200441f1006a200e3a0000200441f0006a200d3a0000200441ef006a200c3a0000200441ee006a200b3a0000200441ed006a200a3a0000200441ec006a20093a0000200441eb006a20083a0000200441ea006a20073a0000200441e9006a201d3a0000200441e8006a201e3a0000200441e7006a201f3a0000200441e6006a20203a0000200441e5006a20213a0000200441e4006a20223a0000200441e3006a20233a0000200441e2006a20243a0000200441e1006a20253a0000200441e0006a20263a0000200541e0006a210520062101200241016a22024111490d000b0b202741d100470d000b2003201c3a008f0d2003201b3a008e0d2003201a3a008d0d200320193a008c0d200320183a008b0d200320173a008a0d200320163a00890d200320153a00880d200320143a00870d200320133a00860d200320123a00850d200320113a00840d200320103a00830d2003200f3a00820d2003200e3a00810d2003200d3a00800d2003200c3a00ff0c2003200b3a00fe0c2003200a3a00fd0c200320093a00fc0c200320083a00fb0c200320073a00fa0c2003201d3a00f90c2003201e3a00f80c2003201f3a00f70c200320203a00f60c200320213a00f50c200320223a00f40c200320233a00f30c200320243a00f20c200320253a00f10c200320263a00f00c200341086a220442003703002003420037030041fbb8c000411120031001200341106a41086a2205200429030037030020032003290300370310200341106a4110200341f00c6a41201003200442003703002003420037030041a5bac000410d200310012005200429030037030020032003290300370310200341106a41101009200341900d6a24000f0b41df88c0004133103a000b41df88c0004133103a000b41f0f3c200102c000b411041011020000b412041011020000bc41905027f017e157f017e097f230041f0026b22022400200241186a200110d501024002400240024002400240024002400240024002402002280218450d00200228021c2203ad42287e2204422088a70d0a2004a72205417f4c0d0a2005450d012005101f2206450d032003450d020c040b20004100360200200241f0026a24000f0b4108210620030d020b41002116410021130c020b200541081020000b200241ec016a2105200241d8016a41086a2107200241d8016a41047221082002419d016a2109200241d8016a41076a210a200241206a410172210b200241a0026a210c200241eb016a220d41056a210e20024190026a210f410021104100211141002112200321130340200241003a00d8012001280200200141046a2214280200200241d8016a4101200141086a22152802001002211620152015280200201641016a41014b22166a22173602002016450d0220022d00d801221641044b0d0202400240024002400240024002400240024002400240024002400240024020160e050004020301000b200241086a200110d5012002280208450d10200228020c2216417f4c0d142016450d04201610792218450d0a20152016410020012802002014280200201820162015280200100222142014417f461b2214201420164b1b221420152802006a36020020142016460d050c090b20142802002116200241003602d8012015410020012802002016200241d8016a41042017100222162016417f461b22164104201641044922161b20152802006a36020020160d0f20022802d8012116200241106a200110d5012002280210450d0f20022802142217417f4c0d132017450d06201710792219450d0a20152017410020012802002014280200201920172015280200100222142014417f461b2214201420174b1b221420152802006a36020020142017470d070c0b0b200241d8016a41186a221b4200370300200241d8016a41106a2219420037030020074200370300200242003703d8012015410020012802002014280200200241d8016a41202017100222162016417f461b2216412020164120491b20152802006a3602002016411f4d0d0e200241c8016a41086a200a41086a2800003602002002200a2900003703c8012002200d290000370390012002200e2900003700950120022f01d801211520022d00da01211620022800db0121182009411f6a200241d8016a411f6a290000370000200941186a201b290000370000200941106a2019290000370000200941086a2007290000370000200920022900d8013700002018410876211b20152016411074722116410121190c0b0b200242003703d8012015410020012802002014280200200241d8016a41082017100222162016417f461b2216410820164108491b20152802006a2217360200201641074d0d0d20022903d8012104200f4200370300200241d8016a41306a4200370300200241d8016a41286a4200370300200241d8016a41206a4200370300200241d8016a41186a4200370300200241d8016a41106a420037030020074200370300200242003703d8012015410020012802002014280200200241d8016a41c0002017100222162016417f461b221641c000201641c000491b20152802006a3602002016413f4d0d0d200241c8016a41086a200a41086a28000036020020024190016a41086a200d41086a29000037030020024190016a41106a200d41106a29000037030020024190016a41186a200d41186a29000037030020024190016a41206a200d41206a29000037030020024190016a41256a200d41256a2900003700002002200a2900003703c8012002200d2900003703900120022800db012218410876211b20022f01d80120022d00da01411074722116410221190c0a0b200241a8026a2001105e20022802a8022218450d0c20022902ac022104200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220043703c80120022008290200370390012018410876211b410021190c020b410121182001280200201428020041014100201528020010021a41002016470d040b200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220082902003703900120022016ad22044220862004843703c8012018410876211b410421190b0c060b410121192001280200201428020041014100201528020010021a41002017460d040b2017450d072019101d0c070b2016450d062018101d0c060b201641011020000b201741011020000b2019450d032016411876211820022017ad221a422086201a843702cc01200220193602c801410321190b200241e0026a41086a221c200241c8016a41086a280200360200200241a8026a41086a221520024190016a41086a290300370300200241a8026a41106a221420024190016a41106a290300370300200241a8026a41186a221720024190016a41186a290300370300200241a8026a41206a221d20024190016a41206a290300370300200241a8026a41286a221e20024190016a41286a290300370300200241a8026a41306a221f20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a80220024180016a41086a2220201c280200360200200241c8006a41086a221c2015290300370300200241c8006a41106a22212014290300370300200241c8006a41186a22222017290300370300200241c8006a41206a2223201d290300370300200241c8006a41286a221d201e290300370300200241c8006a41306a221e201f280200360200200220022903e00237038001200220022903a8023703482007200229038001370000200741086a202028020036000020052002290348370000200541086a201c290300370000200541106a2021290300370000200541186a2022290300370000200541206a2023290300370000200541286a201d290300370000200541306a201e2802003600002002201b410874201841ff0171723602dc01200220193a00d801200220163b00d901200220164110763a00db01200c2004370300200241206a200241d8016a10b70220022d00202118200241a8026a411f6a2219200b411f6a2900003700002017200b41186a2900003703002014200b41106a2900003703002015200b41086a2900003703002002200b2900003703a80220184103460d03201241016a2116200241d8016a411f6a221c2019290000370000200241d8016a41186a22192017290300370300200241d8016a41106a2217201429030037030020072015290300370300200220022903a8023703d801024020122013470d002010201620162010491b2213ad42287e221a422088a70d05201aa722154100480d0502402012450d00200620112015101e22060d010c070b2015101f2206450d060b200620116a221520183a0000201541206a201c290000370000201541196a2019290300370000201541116a2017290300370000201541096a2007290300370000201541016a20022903d801370000201041026a2110201141286a21112016211220162003490d000b0b2000201336020420002006360200200041086a2016360200200241f0026a24000f0b200241e0026a41086a200241c8016a41086a280200360200200241a8026a41086a220520024190016a41086a290300370300200241a8026a41106a220120024190016a41106a290300370300200241a8026a41186a221520024190016a41186a290300370300200241a8026a41206a20024190016a41206a290300370300200241a8026a41286a20024190016a41286a290300370300200241a8026a41306a20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a802200241033a0020200241a8026a411f6a200b411f6a2900003700002015200b41186a2900003703002001200b41106a2900003703002005200b41086a2900003703002002200b2900003703a8020b2000410036020002402012450d00200621050340024020052d00002201450d00024020014101470d00200541086a280200450d01200541046a280200101d200541286a2105201141586a22110d020c030b200541106a280200450d002005410c6a280200101d0b200541286a2105201141586a22110d000b0b02402013450d002006101d0b200241f0026a24000f0b1021000b201541081020000b102e000bd90f03047f017e037f230041206b2202240002400240024020012d000022034101460d0020030d0241012103200141016a21010c010b2001410c6a2802002104200141046a2802002101410021030b200241106a20043602002002200136020c200220033602082000200241086a107f200241206a24000f0b20024100360210200242013703080240024002400240024002400240024002404101101f2203450d002002410136020c200241086a41086a22042004280200220541016a36020020022003360208200320056a41023a00000240024002400240024002400240200141086a2802004101470d00200228020c20042802002203470d01200341016a22042003490d0d20034101742205200420042005491b22054100480d0d2003450d03200228020820032005101e2204450d040c0a0b200228020c20042802002203470d01200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d04200228020820032005101e2204450d050c070b200228020821040c090b200228020821040c060b2005101f22040d060b200541011020000b2005101f22040d020b200541011020000b410141011020000b2002200536020c20022004360208200241106a28020021030b200241086a41086a2205200341016a360200200420036a41003a0000200141186a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0820044101742203200520052003491b22034100480d082004450d01200228020820042003101e2204450d020c030b200228020821040c030b2003101f22040d010b200341011020000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2207200341086a360200200420036a20063700002001410c6a28020021032002200141146a280200220136021c2002411c6a200241086a10622001450d022003200141286c6a21080240024003400240024002400240200228020c2204200728020022096b41204f0d00200941206a22012009490d0a20044101742205200120012005491b22014100480d0a2004450d01200228020820042001101e22050d020c050b200228020821050c020b2001101f2205450d030b2002200136020c2002200536020820072802002109200121040b2007200941206a2201360200200520096a220941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020092003290000370000200341206a29030021060240200420016b41074b0d00200141086a22092001490d0720044101742201200920092001491b22014100480d07024002402004450d00200520042001101e22050d010c050b2001101f2205450d040b2002200136020c20022005360208200728020021010b2007200141086a360200200520016a20063700002008200341286a2203470d000c050b0b200141011020000b200141011020000b2002200536020c20022004360208200241106a28020021030b200241086a41086a2205200341016a360200200420036a41013a0000200141186a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0620044101742203200520052003491b22034100480d062004450d01200228020820042003101e2204450d020c030b200228020821040c030b2003101f22040d010b200341011020000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2205200341086a360200200420036a2006370000200141206a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0620044101742203200520052003491b22034100480d062004450d01200228020820042003101e2204450d020c030b200228020821040c030b2003101f22040d010b200341011020000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2207200341086a360200200420036a20063700002001410c6a28020021032002200141146a280200220136021c2002411c6a200241086a10622001450d002003200141286c6a210803400240024002400240200228020c2204200728020022096b41204f0d00200941206a22012009490d0620044101742205200120012005491b22014100480d062004450d01200228020820042001101e22050d020c070b200228020821050c020b2001101f2205450d050b2002200136020c2002200536020820072802002109200121040b2007200941206a2201360200200520096a220941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020092003290000370000200341206a29030021060240200420016b41074b0d00200141086a22092001490d0320044101742201200920092001491b22014100480d03024002402004450d00200520042001101e22050d010c070b2001101f2205450d060b2002200136020c20022005360208200728020021010b2007200141086a360200200520016a20063700002008200341286a2203470d000b0b200228020c210120022802082103200241106a220420042802003602002002200336020c200241043602082000200241086a107f02402001450d002003101d0b200241206a24000f0b1021000b200141011020000b200141011020000bc90301057f230041106b2202240041002103200241003a000f200128020020012802042002410f6a410120012802081002210420012001280208200441016a41014b22046a22053602080240024002402004450d0002400240024020022d000f220641037122044102460d0020044101460d0120040d0220064102762104410121030c050b20024100360208200220063a000841012103200141086a220441002001280200200141046a280200200241086a41017241032005100222012001417f461b22014103200141034922011b20042802006a36020020010d03200228020841027621040c040b41002103200241003b0106200220063a00062001280200200141046a280200200241066a4101724101200510022104200141086a22012001280200200441016a220141014b6a36020020014102490d0120022f01064102762104410121030c030b200641034b0d02200141046a28020021044100210320024100360200200141086a2206410020012802002004200241042005100222012001417f461b22014104200141044922011b20062802006a36020020010d0020022802002104410121030c020b0c010b410021030b2000200436020420002003360200200241106a24000bf19601060a7f027e057f027e037f087e230041d0026b22022400200241003a001020012802002001280204200241106a410120012802081002210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00102203410c4b0d0a024020030e0d00090607030a0c080e050d0204000b41002105200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22012001280200200341016a41014b22016a3602002001450d10024020022d00102201450d004101210520014101470d110b200020053a0001200041003a0000200041026a200241106a41ee0010ce031a200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d4a20022d0010220341054b0d4a024020030e06003836373539000b200241286a4200370300200241206a22064200370300200241106a41086a2207420037030020024200370310200141086a220841002001280200200141046a2209280200200241106a41202004100222032003417f461b2203412020034120491b20082802006a220a3602002003411f4d0d4a20022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200642003703002007420037030020024200370328200242003703102008410020012802002009280200200241106a4120200a100222062006417f461b2206412020064120491b20082802006a22113602002006411f4d0d4a2002412e6a2f010021122002412a6a2801002107200241286a2f01002109200241276a2d0000210a200241106a410f6a2900002113200229001721142002280013210620022f0011211520022d00102116200242003703182002420037031041002108200141086a221741002001280200200141046a280200200241106a41102011100222012001417f461b2201411020014110491b20172802006a3602002001410f4d0d4a2012ad42ffff03832118200241106a41086a29030021192002290310211a0c4e0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1620022d001022034102460d1420034101460d1320030d1620024200370318200242003703104100210b200141086a220341002001280200200141046a280200200241106a41102004100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d16200241106a41086a290300210d200229031021132002350097022002419b026a310000422086842118200241a8026a290300210c20022903a0022114200228029c022101200228009302210e20022f009102210f20022d00900221100c150b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1020022d001022034101460d0e20030d1041002103200241003a00102001280200200141046a280200200241106a4101200410022104200141086a22012001280200200441016a41014b22016a3602002001450d1020022d001021010c0f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d4e20022d0010450d0c0c4e0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d164103210520022d0010220341034b0d16024020030e040015164d000b20024188026a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d162005290300210d200241fb016a3100002118200229038002210c20022802fc01210920022800f301210720022f00f101210620022d00f001210820023500f70121132002420037031820024200370310200341002001280200200b280200200241106a4110200e100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d1620132018422086842118200241186a2903002213422088a7210a2002290310211b2013a7210b4200211341002105420021140c4c0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d0820022d00100d0820024200370310200141086a220341002001280200200141046a280200200241106a41082004100222012001417f461b2201410820014108491b20032802006a360200200141074d0d0820022903102118200041033a0000200041086a2018370300200020022800a801360001200041046a200241a8016a41036a280000360000200041106a200241106a41e00010ce031a200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1e20022d001022034101460d0d20030d1e20024188026a220e420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f00141002105200141086a220b41002001280200200141046a280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a22043602002003411f4d0d1920023500f701200241fb016a310000422086842118200e290300210c200229038002210d20022802fc01210320022800f301210b20022f00f101210e20022d00f001210f410121050c1a0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d0520022d00100d0520024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d05200241f0016a410b6a310000211820022800f301210f20022f00f101211020022d00f001210820022802fc012104200229038002210c20023500f701210d200241e1016a22062005290300370000200220183c00d4012002200d3e02d0012002200c3700d901200220043600d501200b2802002104200241003602102003410020012802002004200241106a4104200e100222012001417f461b2201410420014104491b20032802006a360200200141034d0d0520022802102101200241d0016a41096a29000021182006290000210c20022800d501210320023502d001210d200041136a20023100d4013c00002000410f6a200d3e0000200041206a200c370000200041186a2018370000200041013a0000200041146a20033600002000410b6a200f360000200041096a20103b0000200041086a20083a0000200041046a2001360000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041286a200241106a41c80010ce031a200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d3d20022d0010220341084b0d3d024020030e090037333432383a363c000b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d3d20022802102103420021182002420037031820024200370310200541002001280200200b280200200241106a41102004100222012001417f461b2201411020014110491b20052802006a3602002001410f4d0d3d2002290214220c422088a72105200228021c210f20022802102101200ca721104100210b420021130c3c0b2000410d3a0000200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d3d20022d0010220341034b0d3d024020030e0400141213000b20024188026a220e420037030020024180026a4200370300200241f0016a41086a220f4200370300200242003703f001200141086a220b41002001280200200141046a2210280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a22083602002003411f4d0d3d200241fb016a2207310000210d200e290300211820022802fc01210620022800f301210320022f00f101210420022d00f001210520023500f7012113200229038002210c200e4200370300200f42003703002002420037038002200242003703f001200b410020012802002010280200200241f0016a41202008100222012001417f461b2201412020014120491b200b2802006a3602002001411f4d0d3d20073100002114200241fc016a2802002101200241f0016a41106a290300211920022d00f001210b20022f00f101210e20022800f301210f20023500f701211a200241e1016a200241f0016a41186a290300370000200220193700d901200220013600d5012002411f6a200241d0016a41086a290300370000200241276a200241d0016a41106a290300370000200241106a411f6a200241d0016a41186a2d00003a0000200220143c00d4012002201a3e02d0012002200f3600132002200e3b00112002200b3a0010200220022903d00137001720024190026a41186a2201200241106a41186a29030037030020024190026a41106a220b200241106a41106a29030037030020024190026a41086a220e200241106a41086a290300370300200220022903103703900220024180016a411f6a220f201842188822144220883c0000200220063b018c012002418e016a20064110763a00002002200ca722103b01900120024192016a20104110763a0000200241b5016a200e290300370000200241bd016a200b290300370000200241c5016a200129030037000020022013200d42208684220d3e0087012002200d4220883c008b01200220064118763a008f01200220143e009b012002200c4218882018422886842218370093012002200336008301200220043b008101200220053a008001200220143e02a80120022002290390023700ad012002200f2d00003a00ac01200228008b01210f200228008f01210e200da7210b410021100c140b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d2620022d0010220341044b0d26024020030e0500231e201b000b200141046a28020021054100210320024100360210200141086a220b410020012802002005200241106a41042004100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d2620022802102101420021130c240b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d2720022d0010220341044b0d27024020030e0500271e201b000b20024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d27200241fb016a310000211820023100f001211920023300f101211c20023500f301211d200229038002211b20023500f701210c20022802fc012104200241e1016a2005290300221a370000200220043600d501200220183c00d4012002200c3e02d0012002201b3700d901200241d0016a41086a310000211e20022903d0012118200b2802002104200241003602102003410020012802002004200241106a4104200e100222042004417f461b2204410420044104491b20032802006a2205360200200441034d0d272002280210210e20024188026a2204420037030020024180026a220b4200370300200241f0016a41086a4200370300200242003703f001200141086a220f41002001280200200141046a2210280200200241f0016a41202005100222032003417f461b2203412020034120491b200f2802006a22083602002003411f4d0d272004290300210d200b2903002113200241fc016a2802002103200241fb016a310000210c20022800f301210420022f00f101210520022d00f001210b20023500f701211f2010280200211020024100360210200f410020012802002010200241106a41042008100222012001417f461b2201410420014104491b200f2802006a360200200141034d0d27201e42388620184208888421142018423886201d42188684201c420886842019842119201f200c422086842118201b421888201a42288684210c201a421888211a201ea741ff0171211020022802102108201ba72101410021060c1b0b2000410d3a0000200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200241106a200110a40120022802102201450d4120022902142118200041093a0000200041086a2018370000200041046a2001360000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041106a200241106a41e00010ce031a200241d0026a24000f0b20024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d01200241fb016a310000210d20022800f301210f20022f00f101211020022d00f0012101200229038002210c20023500f701211320022802fc012103200241e1016a20052903002218370000200220033600d5012002200d3c00d401200220133e02d0012002200c3700d901200c423888201842088684a7210e2018423088a721042018421088a7210520022903d001210d20022903d801210c2018a7210b410121030b200020033a00012000410c3a0000200041206a20043b00002000411c6a20053600002000411a6a200b3b0000200041196a200e3a0000200041116a200c370000200041096a200d370000200041056a200f360000200041036a20103b0000200041026a20013a0000200041226a200241106a41ce0010ce031a200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b20024188026a220e420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f00141002105200141086a220b41002001280200200141046a280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a220b3602002003411f4d0d0d200229038002221842ffffff0783210c2018428080807883210d20022802fc01220341ffffff077121052003418080807871210320023500f701200241fb016a310000422086842118200e290300211320022800f301210e20022f00f101210f20022d00f0012110410121040c0e0b20024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220b41002001280200200141046a220e280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a220f3602002003411f4d0d022005290300210c200241f0016a410b6a310000210d200229038002211820022802fc01211020022800f301210320022f00f101210420022d00f001210520023500f7012113200e280200210e20024100360210200b41002001280200200e200241106a4104200f100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d0220022802102101200220103b018c012002418e016a20104110763a000020022013200d42208684220d3e00870120024180016a410b6a200d4220883c000020022018a7220b3b01900120024192016a200b4110763a00002002419f016a200c4238883c00002002419b016a200c4218883e000020022018421888200c4228868437009301200220104118763a008f012002200336008301200220043b008101200220053a0080012018423888200c42088684a72110200c4230882118200c421088a7210e2002290087012113200229008f01210d200ca7210f4101210b0c010b20024188026a220e4200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220b41002001280200200141046a220f280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a22103602002003411f4d0d01200241fb016a310000211820022800f301210320022f00f101210420022d00f001210520022802fc012108200229038002210c20023500f701210d200241c1026a200e290300370000200220183c00b4022002200d3e02b0022002200c3700b902200220083600b502200242003703b001200242003703a801200b41002001280200200f280200200241a8016a41102010100222012001417f461b2201411020014110491b200b2802006a3602002001410f4d0d01200241a8016a41086a290300210c20022903a8012114200241106a410f6a2201200241b0026a41086a2903003700002002412f6a200241c8026a2d00003a000020022003360013200220043b0011200220053a0010200220022903b0023700172002200241c0026a2903003700272001290000210d20022900172113200233012e2118200228012a210e20022f0128210f20022d002721104102210b0b200020022800a801360001200041043a00002000412b6a20184220883c0000200041276a20183e0000200041386a200c370000200041306a20143700002000412c6a2001360000200041236a200e360000200041216a200f3b0000200041206a20103a0000200041186a200d370000200041106a20133700002000410c6a20033600002000410a6a20043b0000200041096a20053a0000200041086a200b3a0000200041c0006a2002290310370300200041046a200241ab016a280000360000200041c8006a200241106a41086a290300370300200041d0006a200241106a41106a290300370300200041d8006a200241106a41186a290300370300200041e0006a200241106a41206a290300370300200041e8006a200241386a290300370300200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f0014100210b200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d01200241fb016a310000211820022d00f001210120022f00f101210320022800f301210420023500f701210c20022802fc01210e200229038002210d200241e1016a20052903003700002002200d3700d9012002200e3600d5012002419f026a200241d0016a41086a290300370000200241a7026a200241d0016a41106a29030037000020024190026a411f6a200241d0016a41186a2d00003a0000200220183c00d4012002200c3e02d0012002200436009302200220033b009102200220013a009002200220022903d00137009702200229039002221342388820024190026a41086a290300220c420886842118200c422088a721092013421888a721072013420888a7210620024190026a41186a290300210d20022903a002210c2013a72108410121054100210a0c370b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220341002001280200200141046a220e280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d00200241fb016a2207310000211820022d00f001210420022f00f101211020022800f301210820023500f701210c20022802fc012106200229038002210d200241d0016a41116a20052903003700002002200d3700d901200220063600d501200241106a410f6a200241d0016a41086a290300370000200241276a200241d0016a41106a290300370000200241106a411f6a200241d0016a41186a2d00003a0000200220183c00d4012002200c3e02d00120022008360013200220103b0011200220043a0010200220022903d001370017200241106a41186a290300210d200241106a41086a290300211a2002290320210c2002290310211920054200370300200b42003703002002420037038002200242003703f001200341002001280200200e280200200241f0016a4120200f100222042004417f461b2204412020044120491b20032802006a22053602002004411f4d0d00200241fc016a2802002103200241f0016a41106a29030021182007310000211320022800f301211020022f00f101210f20022d00f001210e20023500f7012114200241b0026a41116a20024188026a290300370000200220133c00b402200220143e02b002200220183700b902200220033600b5022002420037031820024200370310200141086a220341002001280200200141046a220b280200200241106a41102005100222042004417f461b2204411020044110491b20032802006a22053602002004410f4d0d00200241106a41086a2903002114200229031021132002420037031820024200370310200341002001280200200b280200200241106a41102005100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d002019423888201a4208868421182019421888a721072019420888a721062019a72108200241106a41086a290300211c2002290310211e2002419f016a2201200241c8026a2d00003a000020022010360083012002200f3b0081012002200e3a008001200220022903b002370087012002200241b0026a41086a29030037008f012002200241c0026a29030037009701201a422088a7418080807871201a422088a741ffffff07717221092001310000211a2002290097012119200228009301210a200228008f01210b200229008701211b410221050c360b2000410d3a0000200241d0026a24000f0b200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100222012001417f461b2201410420014104491b20052802006a360200200141034d0d2b20022802102103200241a8016a411d6a200241106a411d6a290000370000200241a8016a41186a200241106a41186a290200370300200241a8016a41106a200241106a41106a290200370300200241a8016a41086a200241106a41086a290200370300200220022902103703a801410221100c020b200241106a2001105e20022802102203450d2a2002290214210c200241106a2001105e200ca7210b2002280210220e450d2920022902142118200241a8016a411d6a200241106a411d6a290000370000200241a8016a41186a200241106a41186a290200370300200241a8016a41106a200241106a41106a290200370300200241a8016a41086a200241106a41086a290200370300200220022902103703a801200c422088a7210f410321100c010b200241f0016a41186a220b4200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d29200241fb016a310000210d20022800f301210320022f00f101210420022d00f001210520023500f701210c200229038002211820022802fc012101200241c1026a200b2903002213370000200241b5016a200241106a41086a290000370000200241bd016a200241106a41106a290000370000200241c5016a200241106a41186a290000370000200220013600b5022002200d3c00b402200220183700b9022002200c3e02b002200220022900103700ad01200220022802c4023602a8012002200241b0026a41186a2d00003a00ac012018421888201342288684211820022802b402210f20022802b802210e200ca7210b410121100b200241106a411d6a2208200241a8016a411d6a290000370000200241106a41186a2201200241a8016a41186a290300370300200241106a41106a2206200241a8016a41106a290300220c370300200241106a41086a2207200241a8016a41086a290300220d37030020024180016a41086a2209200d37030020024180016a41106a220a200c37030020024180016a41186a2215200129030037030020024180016a411d6a22162008290000370000200220022903a801220c370380012002200c370310200041063a0000200041186a2018370000200041146a200e360000200041106a200f3600002000410c6a200b360000200041086a2003360000200041066a20043b0000200041056a20053a0000200041046a20103a0000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041206a200229038001370000200041286a2009290300370000200041306a200a290300370000200041386a20152903003700002000413d6a2016290000370000200041e8006a200241106a41206a290300370300200041e0006a2001290300370300200041d8006a2006290300370300200041d0006a2007290300370300200041c8006a2002290310370300200241d0026a24000f0b0b200241e1016a200c3700002002200d3700d901200220033600d501200220183e02d001200220184220883c00d4012005450d03200141046a2208280200211020024100360210200141086a2205410020012802002010200241106a41042004100222042004417f461b2204410420044104491b20052802006a2210360200200441034d0d032002280210210620082802002104200241003602102005410020012802002004200241106a41042010100222042004417f461b2204410420044104491b20052802006a2210360200200441034d0d0320022802102104200141046a28020021084100210520024100360210200141086a2207410020012802002008200241106a41042010100222012001417f461b2201410420014104491b20072802006a360200200141034d0d03200228021021012002419b016a200c42188822133e00002002419f016a20134220883c00002002200da722103b01900120024192016a20104110763a0000200220033b018c012002418e016a20034110763a0000200220183e0087012002418b016a20184220883c00002002200d421888200c422886843700930120024190026a41186a20024180016a41186a29030037030020024190026a41106a200229039001370300200220034118763a008f0120024190026a41086a20024180016a41086a2903003703002002200b360083012002200e3b0081012002200f3a0080012002200229038001370390020c020b4200210c4200210d4200211341002103410021040b200241e1016a20134200843700002002200d200c843700d901200220032005723600d501200220183e02d001200220184220883c00d4012004450d01200241b0026a41186a200241d0016a41186a2d00003a0000200241b0026a41106a200241d0016a41106a290300370300200241b0026a41086a200241d0016a41086a290300370300200220022903d0013703b002200141046a22052802002104200241003602a801200141086a2203410020012802002004200241a8016a4104200b100222042004417f461b2204410420044104491b20032802006a220b360200200441034d0d0120022802a801210620052802002104200241003602a8012003410020012802002004200241a8016a4104200b100222042004417f461b2204410420044104491b20032802006a2205360200200441034d0d0120022802a8012104200141046a2802002103200241003602a801200141086a220b410020012802002003200241a8016a41042005100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d0120022802a80121012002411f6a200241b0026a41086a290300370000200241276a200241b0026a41106a2903003700002002412f6a200241b0026a41186a2d00003a00002002200e3600132002200f3b0011200220103a0010200220022903b00237001720024190026a41186a200241106a41186a29030037030020024190026a41106a200241106a41106a29030037030020024190026a41086a200241106a41086a2903003703002002200229031037039002410121050b200241a8016a41186a20024190026a41186a2903002218370300200241a8016a41106a20024190026a41106a290300220c370300200241a8016a41086a20024190026a41086a290300220d37030020024180016a41086a2203200d37030020024180016a41106a220b200c37030020024180016a41186a220e20183703002002200229039002221837038001200220183703a801200041073a0000200041046a20053a0000200041306a20013600002000412c6a2004360000200041286a2006360000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041056a2002290380013700002000410d6a2003290300370000200041156a200b2903003700002000411d6a200e290300370000200041346a20022902103702002000413c6a200241106a41086a290200370200200041c4006a200241106a41106a290200370200200041cc006a200241106a41186a290200370200200041d4006a200241306a290200370200200041dc006a200241106a41286a290200370200200041e4006a200241106a41306a290200370200200041ec006a200241c8006a280200360200200241d0026a24000f0b200241a8016a41186a20024190026a41186a290300370300200241a8016a41106a20024190026a41106a290300370300200241a8016a41086a20024190026a41086a29030037030020022002290390023703a8012000410d3a0000200241d0026a24000f0b4200210c20024200370318200242003703104104210341002105200141086a220b41002001280200200141046a280200200241106a41102004100222012001417f461b2201411020014110491b200b2802006a3602002001410f4d0d0b200241106a41086a2903002113200229031021144200210d0c080b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d0c200241f0016a410b6a310000211820022d00f001210f20022f00f101211020022800f301210820023500f701210c20022802fc012104200229038002210d200241b0026a41186a200529030022134238883c0000200241c4026a20134218883e02002002200da722053b00b902200241b0026a410b6a20054110763a0000200241106a410b6a20183c00002002200d4218882013422886843702bc02200241106a41186a200241c1026a290000370300200220044118763a00b802200220044110763a00b702200220043b00b502200220183c00b4022002200c3e02b0022002200c3e001720022008360013200220103b00112002200f3a0010200220022800b50236021c200220022900b902370320200241003a00a8012001280200200b280200200241a8016a4101200e1002210120032003280200200141016a41014b22016a3602002001450d0c20022d00a801210b200241206a2903002218421888200241286a290300220d42288684210c200d421888211a200241186a2903002214423888a72110200229031021192018a72101410421060b0c270b200141046a220b280200210520024100360210200141086a2203410020012802002005200241106a41042004100222042004417f461b2204410420044104491b20032802006a220e360200200441034d0d08200228021021052002420037031820024200370310200341002001280200200b280200200241106a4110200e100222042004417f461b2204411020044110491b20032802006a220b3602002004410f4d0d08200241106a41086a290300210d2002290310210c20024188026a22044200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a4120200b100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d08200241fb016a310000211320022800f301210120022f00f101210f20022d00f001211020023500f701211420022802fc0121032002290380022118200241c1026a20042903002219370000200220183700b902200220033600b502200220133c00b402200220143e02b0022018423888201942088684a7210e201942308821182019421088a72104200241b0026a41086a290300211320022903b00221142019a7210b410221030c070b200241f0016a41186a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d092005290300211820022d00f001210320022f00f101210420022800f301210520022802fc012101200229038002210d20023500f701211320024190026a410b6a200241f0016a410b6a31000022143c000020024190026a41186a2018370300200220133e0097022002200d3703a0022002200136029c022002200536009302200220043b009102200220033a009002200d421888201842288684210c2001ad4220862013201442208684221342088884211420134238862005ad421886842004ad42ffff0383420886842003ad42ff0183842119200141187621102018421888211a200da72101410221060c020b2002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d06200241106a41086a29030021132002290310211420023502d00120023100d401422086842118200241e1016a290000210d20022900d901210c20022800d5012105410321030c030b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0720052903002118200241f0016a410b6a310000210d20022d00f001210420022f00f101210520022900f3012113200229038002210c2002418e016a220b20022802fc0122034110763a000020024180016a410b6a200d3c000020024180016a411f6a20184238883c00002002419b016a2018421888221a3e000020024192016a200ca722014110763a0000200220033b018c012002201337008301200220053b008101200220043a008001200220013b0190012002200341187622103a008f012002200c421888201842288684220c3700930120024180016a41086a350200200233018c01200b310000421086844220868421142002290380012119410321060b0c220b200242003703b001200242003703a801200141086a220341002001280200200141046a280200200241a8016a41102004100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d03200241a8016a41086a290300211320022903a801211420023500172002411b6a310000422086842118200241286a290300210d2002290320210c200228021c21052002280013210420022f0011210b20022d0010210e410121030b0b0b200020022800a8013600012000410a3a00002000412b6a20184220883c0000200041276a20183e0000200041386a200d370000200041306a200c3700002000412c6a2005360000200041236a2004360000200041216a200b3b0000200041206a200e3a0000200041186a2013370000200041106a20143700002000410c6a20013600002000410a6a200f3b0000200041096a20103a0000200041086a20033a0000200041c0006a2002290310370300200041046a200241ab016a280000360000200041c8006a200241106a41086a290300370300200041d0006a200241106a41106a290300370300200041d8006a200241106a41186a290300370300200041e0006a200241106a41206a290300370300200041e8006a200241386a290300370300200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b20024188026a2205420037030020024180026a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220341002001280200200141046a220e280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d002005290300211a200241fb016a22103100002114200229038002211b20022802fc01210820022800f301210620022f00f101210720022d00f001210920023500f701211920054200370300200b42003703002002420037038002200242003703f001200341002001280200200e280200200241f0016a4120200f100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d0020024188026a290300210d20024180026a2903002113200241fc016a28020021032010310000211820022800f301210420022f00f101210520022d00f001210b20023500f701210c200241003a00102001280200200141046a2210280200200241106a4101200e1002210f200141086a220e200e280200200f41016a41014b220f6a220a360200200f450d0020022d0010210f2010280200211020024100360210200e410020012802002010200241106a4104200a100222102010417f461b2210410420104104491b200e2802006a220a360200201041034d0d002002280210210e200141046a280200211020024100360210200141086a2215410020012802002010200241106a4104200a100222012001417f461b2201410420014104491b20152802006a360200200141034d0d00200c2018422086842118201b421888201a42288684210c2008ad422086201920144220868442ffffffffff1f83221942088884211420194238862006ad421886842007ad42ffff0383420886842009ad42ff018384211920084118762110201a421888211a20022802102108201ba72101410121060c1c0b2000410d3a0000200241d0026a24000f0b200241286a4200370300200241206a4200370300200241106a41086a420037030020024200370310200141086a220841002001280200200141046a2206280200200241106a41202004100222032003417f461b2203412020034120491b20082802006a22073602002003411f4d0d1520022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200241003a001020012802002006280200200241106a410120071002210120082008280200200141016a41014b22016a3602002001450d1520022d00102116410421080c190b200241286a4200370300200241206a4200370300200241106a41086a420037030020024200370310200141086a220341002001280200200141046a280200200241106a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d1420022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110410221080c180b200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100222012001417f461b2201410420014104491b20052802006a36020041032108200141034d0d132002280210210e0c170b200241286a4200370300200241206a22064200370300200241106a41086a2207420037030020024200370310200141086a220841002001280200200141046a2209280200200241106a41202004100222032003417f461b2203412020034120491b20082802006a220a3602002003411f4d0d1220022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200642003703002007420037030020024200370328200242003703102008410020012802002009280200200241106a4120200a100222012001417f461b2201412020014120491b20082802006a3602002001411f4d0d122002412e6a33010021182002412a6a2801002107200241286a2f01002109200241276a2d0000210a2002411f6a2900002113200229001721142002280013210620022f0011211520022d00102116410121080c160b200241286a4200370300200241206a4200370300200241106a41086a420037030020024200370310200141086a220541002001280200200141046a280200200241106a41202004100222032003417f461b2203412020034120491b20052802006a3602002003411f4d0d1120022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200241086a200110d5012002280208450d11200228020c2208417f4c0d122008450d0f200810792206450d13200141086a2207200841002001280200200141046a280200200620082007280200100222012001417f461b2201200120084b1b220120072802006a36020020012008470d100c140b4104210b200141046a28020021034100210520024100360210200141086a220e410020012802002003200241106a41042004100222012001417f461b2201410420014104491b200e2802006a360200200141034b0d020c0b0b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d0a20022802102103200241003a00102001280200200b280200200241106a410120041002210120052005280200200141016a41014b22016a3602002001450d0a20022d0010220441034f0d0a4102210b0c070b200141046a28020021034100210520024100360210200141086a220b410020012802002003200241106a41042004100222012001417f461b2201410420014104491b200b2802006a3602004103210b200141034d0d090b200228021021030c030b20024188026a220b420037030020024180026a4200370300200241f0016a41086a220f4200370300200242003703f001200141086a220541002001280200200141046a2210280200200241f0016a41202004100222032003417f461b2203412020034120491b20052802006a22083602002003411f4d0d07200241fb016a2207310000210d200b290300211820022802fc01210620022800f301210320022f00f101210e20022d00f001210420023500f7012113200229038002210c200b4200370300200f42003703002002420037038002200242003703f0012005410020012802002010280200200241f0016a41202008100222012001417f461b2201412020014120491b20052802006a3602002001411f4d0d0720073100002114200241fc016a2802002101200241f0016a41106a290300211920022d00f001210520022f00f101210b20022800f301210f20023500f701211a200241e1016a200241f0016a41186a290300370000200220193700d901200220013600d501200241106a410f6a200241d0016a41086a290300370000200241276a200241d0016a41106a290300370000200241106a411f6a200241d0016a41186a2d00003a0000200220143c00d4012002201a3e02d0012002200f3600132002200b3b0011200220053a0010200220022903d00137001720024190026a41186a200241106a41186a29030037030020024190026a41106a200241106a41106a29030037030020024190026a41086a200241106a41086a2903003703002002200229031037039002200220063b018c012002418e016a20064110763a00002002200ca722013b01900120024192016a20014110763a00002002200c421888201842288684221b370093012002419b016a201842188822143e000020024180016a411f6a20144220883c000020022013200d42208684221a3e0087012002201a4220883c008b01200220064118763a008f0120022003360083012002200e3b008101200220043a008001200c423888201842088684210c2018423888200235029002200233019402200231009602421086844220868442088684210d20024190026a410f6a290000211320024190026a411f6a3100002119200229009702211820022900a7022114200228008b012110200228008f012105201ba7210f201aa721014107210b0c060b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d06200228021021032002420037031820024200370310200541002001280200200b280200200241106a41102004100222042004417f461b2204411020044110491b20052802006a3602002004410f4d0d06200241186a290300210d2002290310210c200241106a2001105e20022802102201450d0620022902142218422088a721052018a72110420021184101210b420021130c050b200141046a28020021034100210520024100360210200141086a220b410020012802002003200241106a41042004100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d05200228021021034105210b0b0c030b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d0320022802102103200241003a00102001280200200b280200200241106a410120041002210120052005280200200141016a41014b22016a3602002001450d0320022d001021044106210b0b410021050c010b20024188026a2205420037030020024180026a42003703004108210b200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d01200241fb016a310000210c20022800f301210320022f00f101210e20022d00f001210420023500f701211320022802fc0121012002290380022118200241c1026a2005290300220d370000200220183700b902200220013600b5022002200c3c00b402200220133e02b0022018423888200d42088684210c200d423888210d2018421888a7210f20022902b4022218422088a721052013a721012018a721100b200020022800a801360001200041053a0000200041c8006a2019370000200041c0006a2014370000200041386a2013370000200041306a2018370000200041286a200d370000200041206a200c3700002000411c6a200f360000200041106a20013600002000410c6a20033600002000410a6a200e3b0000200041096a20043a0000200041086a200b3a0000200041d0006a2002290310370300200041046a200241ab016a280000360000200041d8006a200241106a41086a290300370300200041e0006a200241106a41106a290300370300200041e8006a200241286a290300370300200041146a2005ad4220862010ad84370000200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200b450d002003101d0b200241106a411d6a200241a8016a411d6a290000370000200241106a41186a200241a8016a41186a290300370300200241106a41106a200241a8016a41106a290300370300200241106a41086a200241a8016a41086a290300370300200220022903a8013703102000410d3a0000200241d0026a24000f0b410121062001280200200141046a28020041014100200141086a28020010021a41002008460d040b2008450d002006101d0b2000410d3a0000200241d0026a24000f0b102e000b200841011020000b2008ad22184220862018842114410521080b200020022800a8013600012000410b3a0000200041cb006a20184220883c0000200041c7006a20183e0000200041d8006a2019370000200041d0006a201a370000200041c3006a2007360000200041c1006a20093b0000200041c0006a200a3a0000200041386a2013370000200041306a20143700002000412c6a20063600002000412a6a20153b0000200041296a20163a0000200041276a20033b0000200041236a2004360000200041216a20053b0000200041206a200b3a0000200041186a200c370000200041106a200d3700002000410c6a200e3600002000410a6a200f3b0000200041096a20103a0000200041086a20083a0000200041046a200241ab016a280000360000200041e8006a200241106a41086a290300370300200041e0006a2002290310370300200241d0026a24000f0b200020022f00a8013b0001200041083a0000200041306a20184220883c00002000412c6a20183e00002000413d6a200d370000200041356a2013370000200041056a2019370000200041cc006a2008360000200041c8006a200e360000200041c5006a200f3a0000200041316a2003360000200041286a2004360000200041266a20053b0000200041256a200b3a0000200041046a20063a0000200041d0006a2002290310370300200041036a200241aa016a2d00003a0000200041d8006a200241106a41086a290300370300200041e0006a200241206a290300370300200041e8006a200241286a2903003703002000411d6a201a421886200c42288884370000200041156a200c4218862001ad42ffffff0783843700002000410d6a2010ad423886201442ffffffffffffffff008384370000200241d0026a24000f0b20002002280010360001200041023a0000200041146a20184220883c0000200041106a20183e0000200041e8006a201c370000200041e0006a201e370000200041d8006a2014370000200041d0006a2013370000200041c8006a201a370000200041c0006a2019370000200041306a201b370000200041216a200d370000200041196a200c3700002000412c6a20103600002000412a6a200f3b0000200041296a200e3a0000200041156a20093600002000410c6a20073600002000410a6a20063b0000200041096a20083a0000200041086a20053a0000200041046a200241136a280000360000200041386a200aad422086200bad84370000200241d0026a24000f0b2000410d3a0000200241d0026a24000bc40101017f024020002d0000417b6a220141064b0d00024002400240024020010e0700010404020403000b200041086a2d00004101470d03200041146a280200450d03200041106a280200101d0f0b200041046a2d00004103470d0202402000410c6a280200450d00200041086a280200101d0b200041186a280200450d02200041146a280200101d0f0b200041086a280200450d01200041046a280200101d0f0b200041086a2d00004105490d00200041306a280200450d002000412c6a280200101d0b0bf8d20105067f017e017f017e027f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a2203410b4b0d0002400240024020030e0c0008050602090a070c040b01000b200141046a280200200141086a2802002203470d13200341016a22042003490d5220034101742205200420042005491b22054100480d522003450d27200128020020032005101e2204450d280c500b200141046a280200200141086a2802002203470d0b200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d18200128020020032005101e2204450d190c4a0b200141046a2205280200200141086a22042802002203470d0b200341016a22062003490d5020034101742207200620062007491b22074100480d502003450d19200128020020032007101e2206450d1a0c450b200141046a280200200141086a2802002203470d0b200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d1a200128020020032005101e2204450d1b0c420b200141046a280200200141086a2802002203470d0b200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d1b200128020020032005101e2204450d1c0c3f0b200141046a280200200141086a2802002203470d0b200341016a22042003490d4d20034101742205200420042005491b22054100480d4d2003450d1c200128020020032005101e2204450d1d0c3c0b200141046a280200200141086a2802002203470d0b200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d1d200128020020032005101e2204450d1e0c390b200141046a280200200141086a2802002203470d0b200341016a22042003490d4620034101742205200420042005491b22054100480d462003450d1e200128020020032005101e2204450d1f0c360b200141046a280200200141086a2802002203470d0c200341016a22042003490d4a20034101742205200420042005491b22054100480d4a2003450d21200128020020032005101e2204450d220c330b200141046a280200200141086a2802002203470d0c200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d22200128020020032005101e2204450d230c300b200141046a280200200141086a2802002203470d0c200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d23200128020020032005101e2204450d240c2d0b200141046a280200200141086a2802002203470d0c200341016a22042003490d4220034101742205200420042005491b22054100480d422003450d24200128020020032005101e2204450d250c2a0b200141046a280200200141086a2802002203470d0c200341016a22042003490d4120034101742205200420042005491b22054100480d412003450d25200128020020032005101e2204450d260c270b200128020021040c3f0b200128020021060c3a0b200128020021040c370b200128020021040c340b200128020021040c310b200128020021040c2e0b200128020021040c2b0b200128020021040c3d0b200128020021040c270b200128020021040c240b200128020021040c210b200128020021040c1e0b200128020021040c1b0b2005101f22040d310b200541011020000b2007101f22060d2b0b200741011020000b2005101f22040d270b200541011020000b2005101f22040d230b200541011020000b2005101f22040d1f0b200541011020000b2005101f22040d1b0b200541011020000b2005101f22040d170b200541011020000b2005101f22040d280b200541011020000b2005101f22040d110b200541011020000b2005101f22040d0d0b200541011020000b2005101f22040d090b200541011020000b2005101f22040d050b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1d20034101742205200420042005491b22044100480d1d2003450d01200128020020032004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200041046a280200210320022000410c6a280200220036020c2002410c6a200110622000450d142003200041286c6a2109200141046a2105024002400340024002400240024020052802002206200428020022006b41204f0d00200041206a22072000490d1f20064101742200200720072000491b22004100480d1f2006450d01200128020020062000101e22060d020c050b200128020021060c020b2000101f2206450d030b2001200636020020052000360200200428020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2903002108024002400240024020052802002206200428020022006b41084f0d00200041086a22072000490d1f20064101742200200720072000491b22004100480d1f2006450d01200128020020062000101e22060d020c060b200128020021060c020b2000101f2206450d040b2001200636020020052000360200200428020021000b2004200041086a360200200620006a20083700002009200341286a2203470d000c170b0b200041011020000b200041011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341044b0d000240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d08200341016a22042003490d3920034101742205200420042005491b22054100480d392003450d11200128020020032005101e2204450d120c210b200141046a280200200141086a2802002203470d04200341016a22042003490d3820034101742205200420042005491b22054100480d382003450d0a200128020020032005101e2204450d0b0c1e0b200141046a280200200141086a2802002203470d04200341016a22042003490d3720034101742205200420042005491b22054100480d372003450d0b200128020020032005101e2204450d0c0c1b0b200141046a280200200141086a2802002203470d04200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d0c200128020020032005101e2204450d0d0c180b200141046a280200200141086a2802002203470d05200341016a22042003490d3520034101742205200420042005491b22054100480d352003450d0f200128020020032005101e2204450d100c150b200141046a28020020052802002203470d05200341016a22042003490d3420034101742205200420042005491b22054100480d342003450d10200128020020032005101e2204450d110c120b200128020021040c1a0b200128020021040c170b200128020021040c140b200128020021040c190b200128020021040c100b200128020021040c0d0b2005101f22040d130b200541011020000b2005101f22040d0f0b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d0f0b200541011020000b2005101f22040d050b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2520044101742203200520052003491b22034100480d252004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2520044101742203200520052003491b22034100480d252004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002108200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d2520044101742203200020002003491b22034100480d252004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2320044101742203200520052003491b22034100480d232004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2120044101742203200520052003491b22034100480d212004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041296a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1f20044101742203200520052003491b22034100480d1f2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a28020021062002200041346a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002200200528020022046b20034f0d00200420036a22052004490d1d20004101742204200520052004491b22044100480d1d2000450d01200128020020002004101e2200450d020c030b200128020021000c030b2004101f22000d010b200441011020000b20012000360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200020046a2006200310ce031a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a0000200041056a2104200141046a28020021062005280200210302400240024002400240024002400240024002400240200041046a2d00004101470d0020062003470d01200341016a22052003490d1f20034101742206200520052006491b22064100480d1f2003450d03200128020020032006101e2205450d040c090b20062003470d01200341016a22052003490d2320034101742206200520052006491b22064100480d232003450d04200128020020032006101e2205450d050c060b200128020021050c080b200128020021050c050b2006101f22050d050b200641011020000b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41003a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d2020054101742203200620062003491b22034100480d202005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041286a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d2020044101742203200620062003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a20053600002000412c6a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d2020044101742203200620062003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041306a280200210002400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22052003490d2020044101742203200520052003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41013a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d1920054101742203200620062003491b22034100480d192005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041286a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d1920044101742203200620062003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a20053600002000412c6a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d1920044101742203200620062003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041306a280200210002400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22052003490d1920044101742203200520052003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2e20034101742205200420042005491b22054100480d2e2003450d0b200128020020032005101e2204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2d20034101742205200420042005491b22054100480d2d2003450d06200128020020032005101e2204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d07200128020020032005101e2204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0a200128020020032005101e2204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2005101f22040d090b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2220044101742203200520052003491b22034100480d222004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2220044101742203200520052003491b22034100480d222004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041086a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041086a28020021032002200041106a280200220436020c2002410c6a200110620240024002402004450d0020044105742107200141046a21090340024002400240024020092802002206200528020022046b41204f0d00200441206a220b2004490d1f20064101742204200b200b2004491b22044100480d1f2006450d01200128020020062004101e22060d020c060b200128020021060c020b2004101f2206450d040b2001200636020020092004360200200528020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200041146a280200210320022000411c6a280200220436020c2002410c6a200110622004450d1020044105742106200141086a2100200141046a21070340024002400240024020072802002205200028020022046b41204f0d00200441206a22092004490d1e20054101742204200920092004491b22044100480d1e2005450d01200128020020052004101e22050d020c060b200128020021050c020b2004101f2205450d040b2001200536020020072004360200200028020021040b2000200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200641606a22060d000c110b0b200441011020000b200441011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2c20034101742200200420042000491b22004100480d2c2003450d0b200128020020032000101e2204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d06200128020020032005101e2204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d07200128020020032005101e2204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0a200128020020032005101e2204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2000101f22040d090b200041011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d2020044101742203200020002003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002108200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320083700082003200a370000200041e8006a2903002108200041e0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1c20044101742203200020002003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41033a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0f200128020020032005101e2204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d08200128020020032005101e2204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d09200128020020032005101e2204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2820034101742205200420042005491b22054100480d282003450d0a200128020020032005101e2204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0d200128020020032005101e2204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005101f22040d0f0b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1920044101742203200520052003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041256a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1720044101742203200520052003491b22034100480d172004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041c8006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a200636000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041256a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041cc006a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041256a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a200041c5006a2d00003a0000200041c8006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041cc006a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d0020034102470d01200141046a280200200141086a2802002203470d03200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d07200128020020032005101e2204450d080c0f0b200141046a28020020052802002203470d01200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d04200128020020032005101e2204450d050c0c0b200141046a280200200141086a2802002203470d02200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d07200128020020032005101e2204450d080c090b200128020021040c0b0b200128020021040c0c0b200128020021040c070b2005101f22040d070b200541011020000b2005101f22040d070b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1a20044101742203200020002003491b22034100480d1a2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1820044101742203200520052003491b22034100480d182004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1820044101742203200520052003491b22034100480d182004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1620044101742203200520052003491b22034100480d162004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1620044101742203200020002003491b22034100480d162004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041086a290300210802400240024002400240200141046a2802002204200528020022036b41084f0d00200341086a22002003490d1420044101742203200020002003491b22034100480d142004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341086a360200200420036a2008370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2520034101742205200420042005491b22054100480d252003450d0f200128020020032005101e2204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d08200128020020032005101e2204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d09200128020020032005101e2204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0a200128020020032005101e2204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0d200128020020032005101e2204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005101f22040d0f0b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000412c6a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320083700082003200a37000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1320044101742203200020002003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1120044101742203200020002003491b22034100480d112004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d0d20044101742203200020002003491b22034100480d0d2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a28020021042005280200210302400240024002400240024002400240024002400240200041016a2d00004101470d0020042003470d01200341016a22042003490d1620034101742200200420042000491b22004100480d162003450d03200128020020032000101e2204450d040c090b20042003470d01200341016a22042003490d1520034101742200200420042000491b22004100480d152003450d04200128020020032000101e2204450d050c060b200128020021040c080b200128020021040c050b2000101f22040d050b200041011020000b2000101f22040d010b200041011020000b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341074b0d000240024002400240024002400240024020030e080005020301060704000b200528020020042802002203470d0c200341016a22062003490d3e20034101742207200620062007491b22074100480d3e2003450d19200128020020032007101e2206450d1a0c330b200528020020042802002203470d07200341016a22062003490d3d20034101742207200620062007491b22074100480d3d2003450d10200128020020032007101e2206450d110c300b200528020020042802002203470d07200341016a22062003490d3c20034101742207200620062007491b22074100480d3c2003450d11200128020020032007101e2206450d120c2d0b200528020020042802002203470d07200341016a22062003490d3b20034101742207200620062007491b22074100480d3b2003450d12200128020020032007101e2206450d130c2a0b200528020020042802002203470d07200341016a22062003490d3a20034101742207200620062007491b22074100480d3a2003450d13200128020020032007101e2206450d140c270b200528020020042802002203470d08200341016a22062003490d3920034101742207200620062007491b22074100480d392003450d16200128020020032007101e2206450d170c240b200528020020042802002203470d08200341016a22062003490d3820034101742207200620062007491b22074100480d382003450d17200128020020032007101e2206450d180c210b200528020020042802002203470d08200341016a22062003490d3720034101742207200620062007491b22074100480d372003450d18200128020020032007101e2206450d190c1e0b200528020020042802002203470d08200341016a22062003490d3620034101742207200620062007491b22074100480d362003450d19200128020020032007101e2206450d1a0c1b0b200128020021060c290b200128020021060c260b200128020021060c230b200128020021060c200b200128020021060c270b200128020021060c1c0b200128020021060c190b200128020021060c160b200128020021060c130b2007101f22060d1f0b200741011020000b2007101f22060d1b0b200741011020000b2007101f22060d170b200741011020000b2007101f22060d130b200741011020000b2007101f22060d190b200741011020000b2007101f22060d0d0b200741011020000b2007101f22060d090b200741011020000b2007101f22060d050b200741011020000b2007101f22060d010b200741011020000b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41003a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1e20064101742203200920092003491b22034100480d1e2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041186a2903002108200041106a290300210a0240024002400240024020052802002200200428020022036b41104f0d00200341106a22052003490d1e20004101742203200520052003491b22034100480d1e2000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341106a360200200020036a220120083700082001200a370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d1c20064101742203200720072003491b22034100480d1c2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1c20054101742203200620062003491b22034100480d1c2005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41063a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1a20064101742203200920092003491b22034100480d1a2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240200528020020042802002203470d00200341016a22052003490d1a20034101742206200520052006491b22064100480d1a2003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41023a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1820064101742203200920092003491b22034100480d182006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200528020020042802002203470d03200341016a22002003490d2420034101742205200020002005491b22054100480d242003450d07200128020020032005101e2200450d080c0f0b200528020020042802002203470d01200341016a22002003490d2320034101742205200020002005491b22054100480d232003450d04200128020020032005101e2200450d050c0c0b200528020020042802002203470d02200341016a22002003490d2220034101742205200020002005491b22054100480d222003450d07200128020020032005101e2200450d080c090b200128020021000c0b0b200128020021000c0c0b200128020021000c070b2005101f22000d070b200541011020000b2005101f22000d070b200541011020000b2005101f22000d010b200541011020000b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41003a00000c0e0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41013a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41083a00000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1620054101742203200620062003491b22034100480d162005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41043a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1420004101742203200520052003491b22034100480d142000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41033a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1220004101742203200520052003491b22034100480d122000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1020004101742203200520052003491b22034100480d102000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41013a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d0e20064101742203200920092003491b22034100480d0e2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041286a2903002108200041206a290300210a0240024002400240024020052802002206200428020022036b41104f0d00200341106a22072003490d0e20064101742203200720072003491b22034100480d0e2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200620036a220320083700082003200a370000200041106a28020021032002200041186a280200220036020c2002410c6a200110622000450d0020004105742107200141046a210c0340024002400240024020052802002206200428020022006b41204f0d00200041206a22092000490d0e20064101742200200920092000491b22004100480d0e2006450d01200128020020062000101e22060d020c060b200128020021060c020b2000101f2206450d040b20012006360200200c2000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000b0b200241106a24000f0b200041011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a0000200041026a2104200141046a2802002106200528020021030240024002400240024002400240024002400240024020002d00014101470d0020062003470d01200341016a22002003490d0b20034101742205200020002005491b22054100480d0b2003450d03200128020020032005101e2200450d040c090b20062003470d01200341016a22002003490d0a20034101742205200020002005491b22054100480d0a2003450d04200128020020032005101e2200450d050c060b200128020021000c080b200128020021000c050b2005101f22000d050b200541011020000b2005101f22000d010b200541011020000b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22002003490d0720034101742205200020002005491b22054100480d072003450d01200128020020032005101e2200450d020c030b200128020021000c030b2005101f22000d010b200541011020000b20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a20042d00003a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a0000024002400240200141046a2802002200200528020022036b41204f0d00200341206a22052003490d0320004101742203200520052003491b22034100480d032000450d01200128020020002003101e2200450d020c040b200128020021000c040b2003101f22000d020b200341011020000b1021000b20012000360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200020036a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a29000037000020012004290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a2802002100024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0320044101742203200520052003491b22034100480d032004450d01200128020020042003101e2204450d020c040b200128020021040c040b2003101f22040d020b200341011020000b1021000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000b130020004106360204200041efbbc0003602000bce0101047f230041206b22002400024002400240419bb5c000411041f8b3c200410041001002417f460d002000410036021041012101419bb5c0004110200041106a41044100100241016a41044d0d0220002802102102419bb5c000411010090c010b410021010b200041106a41086a2203420037030020004200370310419db4c0004115200041106a1001200041086a20032903003703002000200029031037030020002002410020011b36021020004110200041106a41041003200041206a24000f0b41df88c0004133103a000b13002000410b360204200041dcf5c2003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120101f2206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b412041011020000bd31206037f017e057f017e037f027e230041d0016b22012400200141b0016a41086a22024200370300200142003703b00141fbb8c0004111200141b0016a100120014190016a41086a22032002290300370300200120012903b0013703900120014190016a4110100920024200370300200142003703b001419db4c0004115200141b0016a100120032002290300370300200120012903b0013703900120014190016a4110100920024200370300200142003703b00141b2b4c0004117200141b0016a100120032002290300370300200120012903b0013703900120014190016a411010092001418cb9c000410d108f01200129030821042001280200210520024200370300200142003703b00141eab8c0004111200141b0016a1001200141f0006a41086a2002290300370300200120012903b001370370024002400240024002400240024002400240200141f0006a411041f8b3c200410041001002417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010022202417f460d022002411f4d0d0220014190016a41186a2206200141b0016a41186a220229030037030020014190016a41106a2207200141b0016a41106a220329030037030020014190016a41086a2208200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100920022006290300370300200320072903003703002009200829030037030020012001290390013703b001200141106a41186a2002290300370300200141106a41106a2003290300370300200141106a41086a2009290300370300200120012903b0013703100c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a2903003703002002200329030037030020012001290390013703b001200141106a41186a4200370300200141106a41106a4200370300200141106a41086a4200370300200142003703100b410821064200210a200141b0016a41086a22024200370300200142003703b00141ddb8c000410d200141b0016a1001200141f0006a41086a2002290300370300200120012903b0013703700240200141f0006a411041f8b3c200410041001002417f460d0020014210370294012001200141f0006a36029001200141b0016a20014190016a10d30120012802b0012206450d0420012902b401210a200141f0006a411010090b200141b0016a41086a22024200370300200142003703b0014199b9c0004115200141b0016a1001200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041f8b3c200410041001002417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010022202417f460d032002411f4d0d0320014190016a41186a2207200141b0016a41186a220229030037030020014190016a41106a2208200141b0016a41106a220329030037030020014190016a41086a220b200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100920022007290300370300200320082903003703002009200b29030037030020012001290390013703b001200141306a41186a2002290300370300200141306a41106a2003290300370300200141306a41086a2009290300370300200120012903b0013703300c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141306a41186a4200370300200141306a41106a4200370300200141306a41086a4200370300200142003703300b200141f0006a41186a22024200370300200141f0006a41106a22034200370300200141f0006a41086a2209420037030020014200370370200141f0006a100d200141d0006a41186a2002290300370300200141d0006a41106a2003290300370300200141d0006a41086a200929030037030020012001290370370350200141b0016a41186a2207200141106a41186a290300370300200141b0016a41106a2208200141106a41106a290300370300200141b0016a41086a220b200141106a41086a290300370300200120012903103703b00120024200370300200342003703002009420037030020014200370370200141b0016a41202004420020051b2204427f7c200141f0006a100e450d0620014190016a41186a2205200229030037030020014190016a41106a220c200329030037030020014190016a41086a220d20092903003703002001200129037037039001200220052903003703002003200c2903003703002009200d29030037030020012001290390013703702007200229030037030020082003290300370300200b2009290300370300200120012903703703b001024002400240200a422088220ea72202200aa7470d00200241016a22032002490d05200ea74101742209200320032009491bad220f42287e220e422088a70d05200ea722034100480d052002450d012006200241286c2003101e2206450d020c070b200a210f0c070b2003101f22060d050b200341081020000b41df88c0004133103a000b41df88c0004133103a000b1021000b41df88c0004133103a000b200a422088220ea721020b2006200241286c6a220241003a0000200241196a200141c8016a290300370000200241116a200141c0016a290300370000200241096a200141b8016a290300370000200220012903b001370001200241216a200128009001360000200241246a20014193016a280000360000200f42ffffffff0f83200e4220864280808080107c84210a0b2000200129031037001420002004370300200020012903503700342000412c6a200141106a41186a290300370000200041246a200141106a41106a2903003700002000411c6a200141106a41086a2903003700002000413c6a200141d0006a41086a290300370000200041c4006a200141d0006a41106a290300370000200041cc006a200141d0006a41186a290300370000200041ec006a200141306a41186a290300370000200041e4006a200141306a41106a290300370000200041dc006a200141306a41086a290300370000200020012903303700542000410c6a200a37020020002006360208200141d0016a24000b9e0a06037f027e017f017e027f017e230041c0006b220724002004a72108024002400240024002400240024002400240024002400240024002400240024020014201520d004101210920084101470d01427f200320067c200220057c22012002542208ad7c22022008200220035420022003511b22081b210a427f200120081b210b4100210c4201210d200450450d060c070b4101210c20084101470d012002200556200320065620032006511b450d02200320067d2002200554ad7d210a200220057d210b4200210d4100210c41012109200150450d030c040b200741086a20042005200642012002200310de01200741186a290300210a2007290310210b2007290308210d0c0a0b427f200320067c200220057c220b2002542208ad7c220a2008200a200354200a2003511b22081b210a427f200b20081b210b4200210d41002109200150450d010c020b200620037d2005200254ad7d210a200520027d210b4201210d4100210c410121092001500d010b200741306a41086a220842003703002007420037033041aeb9c0004116200741306a1001200741206a41086a220e20082903003703002007200729033037032002400240200741206a411041f8b3c200410041001002417f460d002007420037033820074200370330200741206a4110200741306a411041001002220f417f460d0a200f410f4d0d0a200741386a2903002101200729033021100c010b42002110420021010b200842003703002007420037033041aeb9c0004116200741306a1001200e20082903003703002007200729033037032020074200200120037d2010200254ad7d2203201020027d2202201056200320015620032001511b22081b37033820074200200220081b370330200741206a4110200741306a411010030b2004500d010b200c450d05200741306a41086a220842003703002007420037033041aeb9c0004116200741306a1001200741206a41086a220c200829030037030020072007290330370320200741206a411041f8b3c200410041001002417f460d012007420037033820074200370330200741206a4110200741306a4110410010022209417f460d072009410f4d0d07200741386a2903002103200729033021020c020b2009450d04200741306a41086a220842003703002007420037033041aeb9c0004116200741306a1001200741206a41086a220c200829030037030020072007290330370320200741206a411041f8b3c200410041001002417f460d022007420037033820074200370330200741206a4110200741306a4110410010022209417f460d072009410f4d0d07200741386a2903002103200729033021020c030b42002102420021030b200842003703002007420037033041aeb9c0004116200741306a1001200c20082903003703002007200729033037032020074200200320067d2002200554ad7d2204200220057d2205200256200420035620042003511b22081b37033820074200200520081b370330200741206a4110200741306a411010030c020b42002102420021030b200842003703002007420037033041aeb9c0004116200741306a1001200c2008290300370300200720072903303703202007427f200320067c200220057c22052002542208ad7c22022008200220035420022003511b22081b3703382007427f200520081b370330200741206a4110200741306a411010030b2000200b3703082000200d370300200041106a200a370300200741c0006a24000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000bd20503027f037e017f230041206b220424004101210502402001a74101470d00200041086a2205427f2005290300220620037c2000290300220720027c22082007542205ad7c22072005200720065420072006511b22051b3703002000427f200820051b370300410021050b0240024002400240024002400240024020014201510d004200210620014200510d03200441106a41086a220042003703002004420037031041aeb9c0004116200441106a1001200441086a22052000290300370300200420042903103703002004411041f8b3c200410041001002417f460d01200442003703182004420037031020044110200441106a4110410010022209417f460d062009410f4d0d06200441186a2903002101200429031021060c020b2005450d02200441106a41086a220042003703002004420037031041aeb9c0004116200441106a1001200441086a22052000290300370300200420042903103703002004411041f8b3c200410041001002417f460d03200442003703182004420037031020044110200441106a4110410010022209417f460d062009410f4d0d06200441186a2903002101200429031021060c040b420021010b200042003703002004420037031041aeb9c0004116200441106a100120052000290300370300200420042903103703002004427f200120037c200620027c22032006542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a411010030b200441206a24000f0b42002106420021010b200042003703002004420037031041aeb9c0004116200441106a100120052000290300370300200420042903103703002004427f200120037c200620027c22032006542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a41101003200441206a24000f0b41df88c0004133103a000b41df88c0004133103a000b130020004102360204200041d0ffc2003602000bc20806027f017e017f047e017f037e230041d0006b22022400024002400240024002404110101f2203450d00200341086a41002900d3c740370000200341002900cbc740370000200341104130101e2203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000042002104200241c0006a41086a220542003703002002420037034020034130200241c0006a1001200241306a41086a200529030037030020022002290340370330024002400240024002400240200241306a411041f8b3c200410041001002417f460d002002420037034820024200370340200241306a4110200241c0006a4110410010022205417f460d052005410f4d0d05200241c8006a2903002106200229034021072002420037034820024200370340200241306a4110200241c0006a4110411010022205417f460d052005410f4d0d05200241c0006a41086a2903002108200229034021092003101d4114101f2203450d09200341106a41002800d5ba40360000200341086a41002900cdba40370000200341002900c5ba40370000200341144134101e2203450d0a200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241c0006a41086a220142003703002002420037034020034134200241c0006a1001200241306a41086a2205200129030037030020022002290340370330200241306a411041f8b3c200410041001002417f460d012002420037034820024200370340200241306a4110200241c0006a411041001002220a417f460d08200a410f4d0d08200241c8006a290300210b2002290340210c0c020b2003101d4200210b0c020b4200210c4200210b0b2003101d2001420037030020024200370340418cb9c000410d200241c0006a100120052001290300370300200220022903403703300240200241306a411041f8b3c200410041001002417f460d0020024200370340200241306a4110200241c0006a41084100100241016a41084d0d02200229034021040b4200210d2002420042002009420010d203200241106a200842002004420010d203200241206a200442002009420010d2034200210402404200420052200842005271200229030842005272200229031842005272200241286a2903002209200229030020022903107c7c2208200954720d00200620082002290320220d200754200820065420082006511b22011b20087d2007200d20011b2208200d54ad7d21042008200d7d210d0b2004200b200c200d56200b200456200b2004511b22011b210b200d200c20011b21040b200020043703002000200b370308200241d0006a24000f0b41df88c0004133103a000b41df88c0004133103a000b411041011020000b413041011020000b41df88c0004133103a000b411441011020000b413441011020000bbf1b05017f017e017f017e067f230041d0016b220324004200210420034190016a41086a22054200370300200342003703900141c4b9c000411b20034190016a1001200341a0016a41086a200529030037030020032003290390013703a0010240024002400240200341a0016a411041f8b3c200410041001002417f460d002003420037032820034200370320200341a0016a4110200341206a4110410010022205417f460d022005410f4d0d02200341286a290300210620032903202104411421074114101f2205450d010c030b42002106411421074114101f22050d020b200741011020000b41df88c0004133103a000b200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba4037000002400240024002400240024002400240024002400240024002400240200520074134101e2205450d00200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413420034190016a1001200341a0016a41086a200729030037030020032003290390013703a0012003200137032020032002370328200341a0016a4110200341206a411010032005101d2004200158200620025820062002511b0d0c4114101f2205450d02200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d03200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341086a2005413410e301200341086a41106a290300210120032903102102200328020821082005101d410e101f2205450d04200541066a41002900f7ba40370000200541002900f1ba403700002005410e412e101e2205450d052005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41086a2207420037030020034200370390012005412e20034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d02402002200184500d002008450d0020034190016a41086a22054200370300200342003703900141aeb9c000411620034190016a1001200341a0016a41086a2207200529030037030020032003290390013703a00102400240200341a0016a411041f8b3c200410041001002417f460d002003420037032820034200370320200341a0016a4110200341206a4110410010022208417f460d0b2008410f4d0d0b200341286a2903002106200329032021040c010b42002104420021060b20054200370300200342003703900141aeb9c000411620034190016a10012007200529030037030020032003290390013703a00120034200200620017d2004200254ad7d2201200420027d2202200456200120065620012006511b22051b37032820034200200220051b370320200341a0016a4110200341206a411010030b410e101f2205450d06200541066a41002900b3c541370000200541002900adc5413700002005410e412e101e2205450d072005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41086a2207420037030020034200370390012005412e20034190016a1001200341c0016a41086a200729030037030020032003290390013703c00102400240200341c0016a411041f8b3c200410041001002417f460d00200341206a41186a4200370300200341206a41106a4200370300200341206a41086a420037030020034200370320200341c0016a4110200341206a4120410010022207417f460d032007411f4d0d03200341a0016a41186a2207200341206a41186a2208290300370300200341a0016a41106a2209200341206a41106a220a290300370300200341a0016a41086a220b200341206a41086a220c290300370300200320032903203703a001200341c0016a411010092005101d20082007290300370300200a2009290300370300200c200b290300370300200320032903a001370320410e101f2205450d0b200541066a41002900e5c541370000200541002900dfc5413700002005410e412e101e2205450d0c2005200329032037000e200541266a200341386a2903003700002005411e6a200341206a41106a290300370000200541166a200341206a41086a29030037000020034190016a41086a2207420037030020034200370390012005412e20034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d410d2107410d101f2205450d010c0d0b2005101d410d2107410d101f22050d0c0b200741011020000b413441011020000b41df88c0004133103a000b411441011020000b413441011020000b410e41011020000b412e41011020000b410e41011020000b412e41011020000b41df88c0004133103a000b410e41011020000b412e41011020000b200541056a41002900e1ee41370000200541002900dcee41370000024002400240024002400240024002400240024020052007412d101e2205450d002005200029000037000d200541256a200041186a2900003700002005411d6a200041106a290000370000200541156a200041086a29000037000020034190016a41086a2207420037030020034200370390012005412d20034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d4112101f2205450d01200541106a41002f0087d7413b0000200541086a41002900ffd641370000200541002900f7d641370000200541124132101e2205450d02200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413220034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d200010e401200010e5014113101f2205450d032005410f6a41002800d5f341360000200541086a41002900cef341370000200541002900c6f341370000200541134133101e2205450d04200520002900003700132005412b6a200041186a290000370000200541236a200041106a2900003700002005411b6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413320034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d200341206a20001033024020032802282205450d00200328022c21072005200341206a41106a280200100f2007450d002005101d0b4112101f2205450d05200541106a41002f00cca8413b0000200541086a41002900c4a841370000200541002900bca841370000200541124132101e2205450d06200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413220034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d4118101f2205450d07200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0820052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413820034190016a1001200341a0016a41086a200729030037030020032003290390013703a00102400240200341a0016a411041f8b3c200410041001002417f460d002003420037032820034200370320200341a0016a4110200341206a4110410010022207417f460d012007410f4d0d01200341286a290300210220032903202101410021072005101d2001200284504101710d0d0c0b0b410121072005101d4100410171450d0a0c0c0b41df88c0004133103a000b412d41011020000b411241011020000b413241011020000b411341011020000b413341011020000b411241011020000b413241011020000b411841011020000b413841011020000b20070d010b200341d0016a24000f0b024002404113101f2205450d002005410f6a41002800c1ba40360000200541086a41002900baba40370000200541002900b2ba40370000200541134133101e2205450d01200520002900003700132005412b6a200041186a2207290000370000200541236a200041106a22082900003700002005411b6a200041086a220929000037000020034190016a41086a220a420037030020034200370390012005413320034190016a1001200341c0016a41086a200a29030037030020032003290390013703c001200341c0016a411010092005101d200341206a41086a41013a0000200341296a2000290000370000200341316a2009290000370000200341396a2008290000370000200341c1006a2007290000370000200341023a0020200341206a108b01200341d0016a24000f0b411341011020000b413341011020000bde0104017f017e017f027e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1001200341086a2005290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d00200342003703182003420037031020034110200341106a4110410010022201417f460d022001410f4d0d02200341186a290300210620032903102107200341101009420121040c010b0b2000200437030020002007370308200041106a2006370300200341206a24000f0b41df88c0004133103a000bec1201077f230041b0036b2201240002400240024002400240024002400240024002400240024002400240024002404112101f2202450d00200241106a41002f00ddc5413b0000200241086a41002900d5c541370000200241002900cdc541370000200241124132101e2202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e8016a41086a22004200370300200142003703e80120024132200141e8016a1001200141b0026a41086a2000290300370300200120012903e8013703b00202400240200141b0026a411041f8b3c200410041001002417f460d002001421037026c2001200141b0026a360268200141d0026a200141e8006a10eb0220012d00e80222034102460d0420014188016a41186a20014181036a29000037030020014188016a41106a200141f9026a29000037030020014188016a41086a200141f1026a290000370300200141e8016a41086a20014192036a290100370300200141e8016a41106a2001419a036a290100370300200141e8016a41186a200141a2036a290100370300200120012900e9023703880120012001418a036a2901003703e80120014189036a2d00002104200141b0026a411010090c010b410221030b200141286a41186a20014188016a41186a290300370300200141286a41106a220020014188016a41106a290300370300200141286a41086a220520014188016a41086a290300370300200141086a41086a2206200141e8016a41086a290300370300200141086a41106a2207200141e8016a41106a290300370300200141086a41186a200141e8016a41186a2903003703002001200129038801370328200120012903e8013703082002101d20034102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2000290300370300200141e8006a41086a2005290300370300200141c8006a41086a2006290300370300200141c8006a41106a2007290300370300200141c8006a41186a200141086a41186a2903003703002001200129032837036820012001290308370348410021020240200441ff01714101470d004112101f2202450d06200241106a41002f00ddc5413b0000200241086a41002900d5c541370000200241002900cdc541370000200241124132101e2202450d07200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d004112101f2200450d09200041106a41002f00ddc5413b0000200041086a41002900d5c541370000200041002900cdc541370000200041124132101e2200450d0a200020012903683700122000412a6a20014180016a290300370000200041226a200141e8006a41106a2903003700002000411a6a200141e8006a41086a290300370000200141e8016a41086a22054200370300200142003703e80120004132200141e8016a1001200141b0026a41086a2005290300370300200120012903e8013703b002200141b0026a411041f8b3c200410041001002417f460d0b200142103702c4022001200141b0026a3602c002200141d0026a200141c0026a10eb0220012d00e80222054102460d0c20014188016a41106a200141d0026a41106a29030037030020014188016a41086a200141d0026a41086a290300370300200120012903d00237038801200141e8016a200141d0026a41196a41c70010ce031a200120053a00a00120014188016a41196a200141e8016a41c70010ce031a200141c1016a20043a0000200141c2016a2001290348370100200141ca016a200141c8006a41086a290300370100200141d2016a200141c8006a41106a290300370100200141da016a200141e0006a290300370100200141e8016a41086a22044200370300200142003703e80120004132200141e8016a1001200141b0026a41086a2004290300370300200120012903e8013703b002200141103602d4022001200141b0026a3602d00220014188016a200141d0026a10f9022000101d4101210420020d010c0e0b0240200441ff01714101470d00200141e8016a41086a22004200370300200142003703e80141c8d8c100411a200141e8016a1001200141b0026a41086a2000290300370300200120012903e8013703b0024120101f2200450d0d20002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141b0026a41102000412010032000101d410021004100210420020d010c0e0b200141e8016a41086a22004200370300200142003703e80141c8d8c100411a200141e8016a1001200141d0026a41086a2000290300370300200120012903e8013703d002200141d0026a4110100941002100410021042002450d0d0b200141e8016a41086a22054200370300200142003703e80120024132200141e8016a1001200141b0026a41086a2005290300370300200120012903e8013703b002200141b0026a411041f8b3c200410041001002417f460d03200142103702c4022001200141b0026a3602c002200141d0026a200141c0026a10eb0220012d00e8024102460d0420014188016a41106a200141d0026a41106a29030037030020014188016a41086a200141d0026a41086a290300370300200120012903d00237038801200141e8016a200141d0026a41196a41c70010ce031a20014188016a41196a200141e8016a41c70010ce032001290368370000200141a9016a200141e8006a41086a290300370000200141b1016a200141e8006a41106a290300370000200141b9016a20014180016a290300370000200120033a00a001200141e8016a41086a22034200370300200142003703e80120024132200141e8016a1001200141b0026a41086a2003290300370300200120012903e8013703b002200141103602d4022001200141b0026a3602d00220014188016a200141d0026a10f9022002101d410121032004200045720d0e0c0d0b411241011020000b413241011020000b41df88c0004133103a000b41f5d7c10041d300103a000b41df88c0004133103a000b411241011020000b413241011020000b411241011020000b413241011020000b41f5d7c10041d300103a000b41df88c0004133103a000b412041011020000b410021032004200045720d010b2000101d0b2002452003720d002002101d0b200141b0036a24000bd416010e7f230041c0026b220124000240024002400240024002400240024002400240024002400240024002404112101f2202450d00200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e2202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a29000037000020014190026a41086a2200420037030020014200370390022002413220014190026a100120014180026a41086a20002903003703002001200129039002370380020240024020014180026a411041f8b3c200410041001002417f460d002001421037029402200120014180026a36029002200141c0006a20014190026a105e20012802402203450d0520012802442104200141b0016a20014190026a105f20012d00b00122054102460d04200141e0006a41186a200141c9016a290000370300200141e0006a41106a200141c1016a290000370300200141e0006a41086a200141b9016a290000370300200141a0026a41086a200141da016a290100370300200141a0026a41106a200141e2016a290100370300200141a0026a41186a200141ea016a290100370300200120012900b1013703602001200141d2016a2901003703a002200141d1016a2d0000210020014180026a411010090c010b410221050b200141206a41186a200141e0006a41186a290300370300200141206a41106a2206200141e0006a41106a290300370300200141206a41086a2207200141e0006a41086a290300370300200141086a2208200141a0026a41086a2209290300370300200141106a220a200141a0026a41106a220b290300370300200141186a200141a0026a41186a29030037030020012001290360370320200120012903a0023703002002101d20054102460d0e200141a0026a41186a200141206a41186a290300370300200b200629030037030020092007290300370300200141c0006a41086a2008290300370300200141c0006a41106a200a290300370300200141c0006a41186a200141186a290300370300200120012903203703a002200120012903003703404100210c0240200041ff01714101470d004112101f2202450d06200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e220c450d07200c2001290340370012200c412a6a200141d8006a290300370000200c41226a200141c0006a41106a290300370000200c411a6a200141c0006a41086a2903003700000b0240024002400240024020054101470d004112101f2202450d0c200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e220d450d0d200d20012903a002370012200d412a6a200141a0026a41186a290300370000200d41226a200141a0026a41106a290300370000200d411a6a200141a0026a41086a29030037000020014190026a41086a220242003703002001420037039002200d413220014190026a100120014180026a41086a2002290300370300200120012903900237038002200141b0016a20014180026a105d20012d00bc014102460d0e200141e0006a200141b0016a41d00010ce031a2001418d016a20003a00002001418e016a200129034037010020014196016a200141c0006a41086a2903003701002001419e016a200141c0006a41106a290300370100200141a6016a200141c0006a41186a29030037010020014190026a41086a220242003703002001420037039002200d413220014190026a100120014180026a41086a2002290300370300200120012903900237038002200141003602b801200142013703b0012001280260210e2001200128026822023602900220014190026a200141b0016a106202402002450d00200241057421094100200141b0016a41086a28020022006b210720012802b001210a20012802b4012108200e210203400240200820076a411f4b0d00200041206a22062000490d052008410174220b20062006200b491b22064100480d05024002402008450d00200a20082006101e220a0d010c090b2006101f220a450d080b200621080b200a20006a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a290000370000200741606a2107200041206a2100200241206a2102200941606a22090d000b200141b8016a2000360200200120083602b4012001200a3602b0010b200141ec006a200141b0016a10ca0120012802b401210220014180026a411020012802b0012200200141b0016a41086a280200100302402002450d002000101d0b02402001280264450d00200e101d0b200d101d4101210e200c0d010c100b0240200041ff01714101470d0020014190026a41086a22024200370300200142003703900241adeec100411a20014190026a100120014180026a41086a20022903003703002001200129039002370380024120101f2202450d0f20022001290340370000200241186a200141c0006a41186a290300370000200241106a200141c0006a41106a290300370000200241086a200141c0006a41086a29030037000020014180026a41102002412010032002101d4100210d4100210e200c0d010c100b20014190026a41086a22024200370300200142003703900241adeec100411a20014190026a1001200141b0016a41086a200229030037030020012001290390023703b001200141b0016a411010094100210d4100210e200c450d0f0b20014190026a41086a220242003703002001420037039002200c413220014190026a100120014180026a41086a22002002290300370300200120012903900237038002200141b0016a20014180026a105d20012d00bc014102460d07200141e0006a200141b0016a41d00010ce031a200141ed006a20012903a002370000200141f5006a200141a0026a41086a290300370000200141fd006a200141a0026a41106a29030037000020014185016a200141a0026a41186a290300370000200120053a006c200242003703002001420037039002200c413220014190026a100120002002290300370300200120012903900237038002200141003602b801200142013703b001200128026021052001200128026822023602900220014190026a200141b0016a106202402002450d00200241057421094100200141b0016a41086a28020022006b210720012802b001210a20012802b40121082005210203400240200820076a411f4b0d00200041206a22062000490d032008410174220b20062006200b491b22064100480d03024002402008450d00200a20082006101e220a0d010c060b2006101f220a450d050b200621080b200a20006a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a290000370000200741606a2107200041206a2100200241206a2102200941606a22090d000b200141b8016a2000360200200120083602b4012001200a3602b0010b200141ec006a200141b0016a10ca0120012802b401210220014180026a411020012802b0012200200141b8016a280200100302402002450d002000101d0b02402001280264450d002005101d0b200c101d41012102200e200d45720d100c0f0b1021000b200641011020000b200641011020000b411241011020000b413241011020000b2004450d002003101d0b41df88c0004133103a000b41f5d7c10041d300103a000b411241011020000b413241011020000b411241011020000b413241011020000b41f5d7c10041d300103a000b412041011020000b41002102200e200d45720d010b200d101d0b02400240200c45200272450d002004450d020c010b200c101d2004450d010b2003101d0b200141c0026a24000b130020004108360204200041dbc7c0003602000b8f0d05017f017e017f017e057f230041b0016b2203240042002104200341a0016a41086a22054200370300200342003703a00141c4b9c000411b200341a0016a100120034190016a41086a2005290300370300200320032903a00137039001024002400240024020034190016a411041f8b3c200410041001002417f460d00200342003703282003420037032020034190016a4110200341206a4110410010022205417f460d022005410f4d0d02200341286a290300210620032903202104411821074118101f2205450d010c030b42002106411821074118101f22050d020b200741011020000b41df88c0004133103a000b200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba403700000240024002400240024002400240024002400240200520074138101e2205450d0020052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341a0016a41086a22074200370300200342003703a00120054138200341a0016a100120034190016a41086a2007290300370300200320032903a00137039001200320013703202003200237032820034190016a4110200341206a411010032005101d2004200158200620025820062002511b0d084118101f2205450d02200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0320052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341086a2005413810e301200341086a41106a290300210120032802082107200329031021022005101d02402002200184500d002007450d00200341a0016a41086a22054200370300200342003703a00141aeb9c0004116200341a0016a100120034190016a41086a22072005290300370300200320032903a001370390010240024020034190016a411041f8b3c200410041001002417f460d00200342003703282003420037032020034190016a4110200341206a4110410010022208417f460d092008410f4d0d09200341286a2903002106200329032021040c010b42002104420021060b20054200370300200342003703a00141aeb9c0004116200341a0016a100120072005290300370300200320032903a0013703900120034200200620017d2004200254ad7d2201200420027d2202200456200120065620012006511b22051b37032820034200200220051b37032020034190016a4110200341206a411010030b4114101f2205450d04200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d05200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341a0016a41086a22074200370300200342003703a00120054134200341a0016a100120034190016a41086a2007290300370300200320032903a00137039001024020034190016a411041f8b3c200410041001002417f460d00200342003703282003420037032020034190016a4110200341206a4110410010022207417f460d022007410f4d0d02200341286a290300210220032903202101410021072005101d2001200284504101710d0a0c080b410121072005101d4100410171450d070c090b413841011020000b41df88c0004133103a000b411841011020000b413841011020000b411441011020000b413441011020000b41df88c0004133103a000b20070d010b200341b0016a24000f0b024002404113101f2205450d002005410f6a41002800c1ba40360000200541086a41002900baba40370000200541002900b2ba40370000200541134133101e2205450d01200520002900003700132005412b6a200041186a2207290000370000200541236a200041106a22082900003700002005411b6a200041086a2209290000370000200341a0016a41086a220a4200370300200342003703a00120054133200341a0016a1001200341206a41086a220b200a290300370300200320032903a001370320200341206a411010092005101d200b41013a0000200341296a2000290000370000200341316a2009290000370000200341396a2008290000370000200341c1006a2007290000370000200341023a0020200341206a108b01200341b0016a24000f0b411341011020000b413341011020000b13002000410a360204200041a082c3003602000b3901017f02404110101f2202450d002002420037000820024200370000200042908080808002370204200020023602000f0b411041011020000b880807047f017e097f047e017f017e017f230041c0006b220224000240024002400240024002400240024002400240410e101f2203450d00200341066a41002900f7ba40370000200341002900f1ba403700002003410e412e101e2204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241306a41086a22014200370300200242003703302004412e200241306a1001200241086a41086a2001290300370300200220022903303703080240024002400240200241086a411041f8b3c200410041001002417f460d002002421037021c2002200241086a3602182002200241186a10d5012002280200450d0b20022802042205ad42287e2206422088a70d032006a72201417f4c0d032001450d012001101f2207450d062005450d020c070b20004100360208200042083702000c080b4108210720050d050b4100210e420021062007450d080c050b102e000b410e41011020000b412e41011020000b200141081020000b200241186a41086a22032802002108200228021c21092002280218210a200241336a210b420021064100210c4100210d410021012005210e03402002420037033020034100200a2009200241306a410820081002220f200f417f461b220f4108200f4108491b20086a2208360200200f41074d0d0320022903302110200242003703382002420037033020034100200a2009200241306a411020081002220f200f417f461b220f4110200f4110491b20086a2208360200200f410f4d0d03200241306a41086a2903002111200229033021122002420037033020034100200a2009200241306a410820081002220f200f417f461b220f4108200f4108491b20086a2208360200200f41074d0d0320022903302113200241003a003020032008200a2009200241306a41012008100241016a41014b220f6a2208360200200f450d03200141016a210f20022d003021142002200b28000036002b200220022800303602282002200228002b3600332002200228022836023002402001200e470d00200c200f200f200c491b220ead42287e2215422088a70d062015a722164100480d0602402001450d002007200d2016101e22070d010c080b2016101f2207450d070b2007200d6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141246a2002280033360000200141216a200228023036000020064280808080107c2106200c41026a210c200d41286a210d200f2101200f2005490d000b2007450d030b20002006200ead84370204200020073602000b2004101d200241c0006a24000f0b200e450d002007101d0b41df88c0004133103a000b1021000b201641081020000bdc0202027f027e230041206b22022400024002404114101f2203450d00200341106a41002800d5ba40360000200341086a41002900cdba40370000200341002900c5ba40370000200341144134101e2203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241106a41086a220142003703002002420037031020034134200241106a1001200241086a2001290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022201417f460d022001410f4d0d02200241186a2903002105200229031021040c010b420021050b2003101d2000200537030820002004370300200241206a24000f0b41df88c0004133103a000b411441011020000b413441011020000bd10903037f037e017f23004190016b22042400024002400240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000020044180016a41086a2206420037030020044200370380012005413420044180016a1001200441f0006a41086a200629030037030020042004290380013703700240024002400240200441f0006a411041f8b3c200410041001002417f460d002004420037030820044200370300200441f0006a411020044110410010022206417f460d022006410f4d0d02200441086a2903002107200429030021080c010b42002108420021070b2005101d20044180016a41086a22054200370300200442003703800141c4b9c000411b20044180016a1001200441f0006a41086a200529030037030020042004290380013703700240200441f0006a411041f8b3c200410041001002417f460d002004420037030820044200370300200441f0006a411020044110410010022205417f460d022005410f4d0d0220082007844200520d002004290300200258200441086a290300220920035820092003511b0d0020004200370300200041013a0018200041106a4200370300200041086a420037030020044190016a24000f0b20044180016a41086a22054200370300200442003703800141c4b9c000411b20044180016a1001200441f0006a41086a2005290300370300200420042903800137037002400240200441f0006a411041f8b3c200410041001002417f460d002004420037030820044200370300200441f0006a411020044110410010022205417f460d062005410f4d0d062004290300200256200441086a290300220920035620092003511b450d0020012002200310e201410121010c010b4114101f2205450d06200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d07200520012900003700142005412c6a200141186a220a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000020044180016a41086a2206420037030020044200370380012005413420044180016a1001200441086a200629030037030020042004290380013703002004411041f8b3c20041004100100221062005101d02402006417f470d00200110ed01200441386a2003370300200441306a2002370300200441086a41003a0000200441096a2001290000370000200441116a200141086a290000370000200441196a200141106a290000370000200441216a200a290000370000200441023a00002004108b010b20012002200310e201410021010b2000200220087d200820027d20082002582007200358200720035122051b22061b370308200020013a001820002008200256200720035620051bad370300200041106a200320077d2002200854ad7d200720037d2008200254ad7d20061b37030020044190016a24000f0b41df88c0004133103a000b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b411441011020000b413441011020000b9d0803037f017e077f23004190016b22012400200141106a41086a220242003703002001420037031041c8c2c1004113200141106a100120014180016a41086a20022903003703002001200129031037038001410021020240024002400240024020014180016a411041f8b3c200410041001002417f460d002001410036021020014180016a4110200141106a41044100100241016a41044d0d01200128021021020b4120101f2203450d01200320002900002204370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a29000037000020032d000121052003101d20014180016a20054108742004a7220341c0017172410676220510b00102400240024002402003413f7122032001280288014f0d00200120012802800120034105746a2203109a012001290300200141086a290300844200510d010b0240200128028401450d00200128028001101d0b200141106a200210b001024020012802182203413f4d0d00200141186a21050340200241016a210202402001280214450d002001280210101d0b200141106a200210b0012005280200220341c0004f0d000b0b2001280210210620012802142107200141106a41186a2208200041186a290000370300200141106a41106a2209200041106a290000370300200141106a41086a220a200041086a29000037030020012000290000370310200341016a210520072003470d0620034101742207200520052007491b2207ad4205862204422088a70d052004a7220b4100480d052003450d0120062003410574200b101e2206450d020c060b20032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a290000370000200141106a41086a20014180016a41086a28020036020020012001290380013703102005200141106a10e70220014190016a24000f0b200b101f22060d040b200b41011020000b41df88c0004133103a000b412041011020000b1021000b200241067420036a210b200620034105746a22032001290310370000200341186a2008290300370000200341106a2009290300370000200341086a200a2903003700000240200541c000470d00200141106a41086a220342003703002001420037031041c8c2c1004113200141106a100120014180016a41086a200329030037030020012001290310370380012001200241016a36021020014180016a4110200141106a410410030b2001200536021820012007360214200120063602102002200141106a10e702200141106a41086a2000290000370300200141106a41106a200041086a290000370300200141106a41186a200041106a290000370300200141306a200041186a2900003703002001200b360214200141013a0010200141106a108b0120014190016a24000bcc0304027f017e017f027e230041306b2204240020042001109a0102400240024002400240024002402004290300200441086a290300844200510d004114101f2205450d05200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d06200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41086a220742003703002004420037032020054134200441206a1001200441106a41086a200729030037030020042004290320370310200441106a411041f8b3c200410041001002417f460d012004420037032820044200370320200441106a4110200441206a4110410010022207417f460d042007410f4d0d04200441286a2903002108200429032021060c020b20004184b8c000360204200041086a4122360200410121010c020b420021080b2005101d2001200620027c2209200820037c2009200654ad7c10e201200041106a2003370300200041086a2002370300410021010b20002001360200200441306a24000f0b41df88c0004133103a000b411441011020000b413441011020000be10604027f017e017f057e230041206b22042400024002400240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441106a41086a220742003703002004420037031020054134200441106a1001200441086a2007290300370300200420042903103703000240024002402004411041f8b3c200410041001002417f460d00200442003703182004420037031020044110200441106a4110410010022207417f460d022007410f4d0d02200441186a2903002108200429031021090c010b42002109420021080b2005101d20012009200220092009200256200820035620082003511b22051b220a7d20082003200820051b220b7d2009200a54ad7d10e20102400240024002402002200a7d22092003200b7d2002200a54ad7d220c84500d004118101f2205450d08200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0920052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002102200441106a41086a220742003703002004420037031020054138200441106a1001200441086a2007290300370300200420042903103703002004411041f8b3c200410041001002417f460d01200442003703182004420037031020044110200441106a4110410010022207417f460d072007410f4d0d07200441186a2903002103200429031021020c020b4200210c0c020b420021030b2005101d200120022009200220022009562003200c562003200c511b22051b22087d2003200c200320051b22067d2002200854ad7d10e701200c20067d2009200854ad7d210c2006200b7c2008200a7c2202200854ad7c2103200920087d21060b2000200637031020002002370300200041186a200c37030020002003370308200441206a24000f0b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b411841011020000b413841011020000bca0504027f017e017f027e230041306b2205240002400240024002404114101f2206450d00200641106a41002800d5ba40360000200641086a41002900cdba40370000200641002900c5ba40370000200641144134101e2206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002107200541206a41086a220842003703002005420037032020064134200541206a1001200541106a41086a200829030037030020052005290320370310024002400240200541106a411041f8b3c200410041001002417f460d002005420037032820054200370320200541106a4110200541206a4110410010022208417f460d022008410f4d0d02200541286a2903002109200529032021070c010b420021090b2006101d024002400240200720027d220a200756200920037d2007200254ad7d220720095620072009511b450d00200041a6b8c000360204200041086a411d3602000c010b200541206a41086a220642003703002005420037032041c4b9c000411b200541206a1001200541106a41086a2006290300370300200520052903203703100240200541106a411041f8b3c200410041001002417f460d002005420037032820054200370320200541106a4110200541206a4110410010022206417f460d062006410f4d0d06200a20052903205a2007200541206a41086a29030022095a20072009511b0d00200041c3b8c000360204200041086a411a3602000c010b200541086a20012004200a2007103d20052802082206450d01200528020c210120002006360204200041086a20013602000b410121060c050b2001200a200710e201200041106a2003370300200041086a2002370300410021060c040b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b20002006360200200541306a24000be00702097f027e230041306b2202240002400240410e101f2203450d00200341066a41002900f7ba40370000200341002900f1ba403700002003410e412e101e2204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241186a41086a22054200370300200242003703182004412e200241186a1001200241086a41086a20052903003703002002200229031837030820024100360220200242013703182001280200210620022001280208220036022c2002412c6a200241186a106202400240024002400240024002402000450d00200041286c210720052802002108200228021c210003400240024002400240200020086b41084f0d00200841086a22092008490d0720004101742203200920092003491b220a4100480d072000450d0120022802182000200a101e22030d020c080b200841086a2109200228021821030c020b200a101f2203450d060b2002200a36021c20022003360218200a21000b20052009360200200320086a200641186a290000370000200641086a290300210b2006290300210c0240024002400240200020096b41104f0d00200941106a22082009490d072000410174220a20082008200a491b220a4100480d072000450d0120032000200a101e22030d020c090b200941106a21080c020b200a101f2203450d070b2002200a36021c20022003360218200a21000b200320096a2209200b3700082009200c37000020052008360200200641106a290300210b0240200020086b41074b0d00200841086a22092008490d042000410174220a20092009200a491b22094100480d04024002402000450d00200320002009101e22030d010c090b2009101f2203450d080b2002200936021c200220033602180b2005200841086a360200200320086a200b3700000240024002400240200228021c220020052802002203470d00200341016a22002003490d0720034101742208200020002008491b22004100480d072003450d01200228021820032000101e22090d020c0b0b200228021821090c020b2000101f2209450d090b2002200036021c200220093602180b2005200341016a2208360200200920036a200641206a2d00003a0000200641286a2106200741586a22070d000c020b0b20052802002108200228021c2100200228021821090b200241086a411020092008100302402000450d002009101d0b2004101d0240200141046a280200450d002001280200101d0b200241306a24000f0b1021000b200a41011020000b200a41011020000b200941011020000b200041011020000b410e41011020000b412e41011020000b940304027f017e017f017e230041206b22042400024002404118101f2205450d00200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0120052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002106200441106a41086a220742003703002004420037031020054138200441106a1001200441086a2007290300370300200420042903103703000240024002402004411041f8b3c200410041001002417f460d00200442003703182004420037031020044110200441106a4110410010022207417f460d022007410f4d0d02200441186a2903002108200429031021060c010b420021080b2005101d20012006200220062006200256200820035620082003511b22051b22027d20082003200820051b22037d2006200254ad7d10e7012000200337030820002002370300200441206a24000f0b41df88c0004133103a000b411841011020000b413841011020000bb70202047f027e230041206b22022400200241106a41086a220342003703002002420037031041aeb9c0004116200241106a1001200241086a22042003290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022205417f460d022005410f4d0d02200241186a2903002106200229031021070c010b42002107420021060b200342003703002002420037031041aeb9c0004116200241106a1001200420032903003703002002200229031037030020024200200620017d2007200054ad7d2201200720007d2200200756200120065620012006511b22031b37031820024200200020031b37031020024110200241106a41101003200241206a24000f0b41df88c0004133103a000bba2504057f027e037f0a7e230041c0026b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022044101460d0020044102470d0f200341106a41026a200141076a2d00003a0000200341306a41086a2205200141186a290200370300200341306a410d6a22062001411d6a290000370000200320012f00053b01102003200141106a2902003703304128210720022d000020022d000172450d0141c9b4c00021040c190b200141306a2903002108200141286a29030021092003412c6a41026a200141076a2d00003a0000200341106a41086a200141186a290200370300200341106a410d6a2001411d6a290000370000200320012f00053b012c2003200141106a290200370310200141086a28020021052001410c6a280200210620012d0004210a200341a0026a41026a2201200241046a2d00003a000020034190016a41086a220b200241156a29000037030020034190016a410d6a220c2002411a6a2900003700002003200241026a2f01003b01a00220032002410d6a2900003703900120022d0000450d01410121010c020b200141c0006a2903002108200141386a2903002109200141306a290300210d200141286a290300210e2001410c6a2802002107200141086a280200210420012d00042101200341bc026a41026a2202200341106a41026a2d00003a0000200341a0026a41086a2005290300370300200341a0026a410d6a2006290000370000200320032f01103b01bc02200320032903303703a002200141ff01714101470d03200341d0006a200441067610b0012003280250210220032802582004413f7122014d0d0a2003419c026a41026a200220014105746a220141026a2d00003a000020034188026a200141136a2900003703002003418d026a200141186a290000370000200320012f00003b019c022003200129000b370380022001280007210720012800032104410121012003280254450d130c120b200241096a2800002107200241056a280000210420022d0001210220034180026a41026a20012d00003a0000200341f0006a41086a200b290300370300200341f0006a410d6a200c290000370000200320032f01a0023b018002200320032903900137037041012101200241ff01714101470d00200341a0026a41026a20034180026a41026a2d00003a000020034190016a41086a200341f0006a41086a29030037030020034190016a410d6a200341f0006a410d6a290000370000200320032f0180023b01a0022003200329037037039001410021010c010b412a210741f1b4c00021040b200341bc026a41026a2202200341a0026a41026a2d00003a0000200341d0006a41086a220b20034190016a41086a290300370300200341d0006a41106a20034190016a41106a290300370300200320032f01a0023b01bc02200320032903900137035020010d14200341c3006a200b290300370000200341c8006a200341d0006a410d6a290000370000200320032f01bc023b013020032007360037200320043600332003200329035037003b200320022d00003a003220022003412c6a41026a2d00003a0000200341a0026a41086a200341106a41086a290300370300200341a0026a410d6a2201200341106a410d6a290000370000200320032f012c3b01bc02200320032903103703a0020240200a41ff01714101470d0020034190016a200541067610b00120032802900121022003280298012005413f7122014d0d022003419c026a41026a200220014105746a220141026a2d00003a000020034188026a200141136a2900003703002003418d026a200141186a290000370000200320012f00003b019c022003200129000b370380022001280007210620012800032105410121012003280294010d030c040b2003419c026a41026a200341bc026a41026a2d00003a000020034180026a41086a200341a0026a41086a29030037030020034180026a410d6a2001290000370000200320032f01bc023b019c02200320032903a002370380020c040b2003419c026a41026a20022d00003a000020034180026a41086a200341a0026a41086a29030037030020034180026a410d6a200341a0026a410d6a290000370000200320032f01bc023b019c02200320032903a002370380020c100b41002101200328029401450d010b2002101d0b2001450d010b200341a0026a41026a2003419c026a41026a2d00003a000020034190016a41086a20034180026a41086a29030037030020034190016a410d6a20034180026a410d6a290000370000200320032f019c023b01a002200320032903800237039001410021010c010b4101210141d7c0c1002105411521060b2003418c016a41026a2202200341a0026a41026a2d00003a0000200341f0006a41086a220420034190016a41086a290300370300200341f0006a41106a20034190016a41106a290300370300200320032f01a0023b018c01200320032903900137037002402001450d0020062107200521040c0e0b200341e3006a2004290300370000200341e8006a200341fd006a290000370000200320032f018c013b015020032006360057200320053600532003200329037037005b200320022d00003a00524114101f2201450d05200141106a41002800d5ba40360000200141086a41002900cdba40370000200141002900c5ba40370000200141144134101e2201450d06200120032903303700142001412c6a200341c8006a290300370000200141246a200341306a41106a2903003700002001411c6a200341306a41086a2903003700004200210d200341f0006a41086a220242003703002003420037037020014134200341f0006a1001200341a0026a41086a2002290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0120034200370398012003420037039001200341a0026a411020034190016a4110410010022202417f460d042002410f4d0d0420034198016a290300210e200329039001210d2001101d411421024114101f2201450d020c070b4100210120032802540d070c080b4200210e2001101d411421024114101f22010d050b200241011020000b200341a4016a410136020020034118360254200341c0adc4003602502003420137029401200341c8adc400360290012003200341d0006a3602a00120034190016a41a08cc30010cf01000b41df88c0004133103a000b411441011020000b413441011020000b200141106a41002800d5ba40360000200141086a41002900cdba40370000200141002900c5ba4037000002400240024002400240200120024134101e2201450d00200120032903503700142001412c6a200341e8006a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341f0006a41086a220242003703002003420037037020014134200341f0006a1001200341a0026a41086a2002290300370300200320032903703703a002024002400240200341a0026a411041f8b3c200410041001002417f460d0020034200370398012003420037039001200341a0026a411020034190016a4110410010022202417f460d022002410f4d0d0220034198016a290300210f20032903900121100c010b420021104200210f0b2001101d200341f0006a41086a220142003703002003420037037002400240024002402010200f8422114200510d0041add5c0004114200341f0006a1001200341a0026a41086a2001290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0220034200370398012003420037039001200341a0026a411020034190016a4110410010022201417f460d062001410f4d0d0620034198016a29030021120c010b4199d5c0004114200341f0006a1001200341a0026a41086a2001290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0120034200370398012003420037039001200341a0026a411020034190016a4110410010022201417f460d062001410f4d0d0620034198016a29030021120b20032903900121130c010b42002113420021120b0240200920137c22142009542201200820127c2001ad7c221520085420152008511b450d004128210741aad6c00021040c0c0b0240200d20147d2216200d56200e20157d200d201454ad7d220d200e56200d200e511b450d00411d2107418dd6c00021040c0c0b20114200520d05200341f0006a41086a220142003703002003420037037041c4b9c000411b200341f0006a1001200341a0026a41086a2001290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0520034200370398012003420037039001200341a0026a411020034190016a4110410010022201417f460d042001410f4d0d0420032903900120095620034198016a290300220e200856200e2008511b450d05411f210741eed5c00021040c0b0b41df88c0004133103a000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200341086a200341306a41022016200d103d024020032802082204450d00200328020c21070c060b0240201020097c22152010542201200f20087c2001ad7c220e200f54200e200f511b450d00412d210741c1d5c00021040c060b200341306a200341d0006a412010d003450d04200341306a2016200d10e201024002404114101f2201450d00200141106a41002800d5ba40360000200141086a41002900cdba40370000200141002900c5ba40370000200141144134101e2201450d01200120032903503700142001412c6a200341e8006a2204290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a2903003700004200210d200341f0006a41086a220242003703002003420037037020014134200341f0006a100120034190016a41086a2002290300370300200320032903703703900120034190016a411041f8b3c20041004100100221022001101d02402002417f470d00200341d0006a10ed01200341c8016a200e370300200341c0016a201537030020034190016a41086a41003a000020034199016a2003290350370000200341a1016a200341d0006a41086a290300370000200341a9016a200341e0006a290300370000200341b1016a2004290300370000200341023a00900120034190016a108b010b200341d0006a2015200e10e201200341f0006a41086a220142003703002003420037037041aeb9c0004116200341f0006a1001200341a0026a41086a22022001290300370300200320032903703703a002024002400240200341a0026a411041f8b3c200410041001002417f460d0020034200370398012003420037039001200341a0026a411020034190016a4110410010022204417f460d022004410f4d0d0220034198016a290300210e200329039001210d0c010b4200210e0b200142003703002003420037037041aeb9c0004116200341f0006a100120022001290300370300200320032903703703a00220034200200e20127d200d201354ad7d2215200d20137d220f200d562015200e562015200e511b22011b3703980120034200200f20011b37039001200341a0026a411020034190016a4110100320034190016a41086a41023a000020034199016a2003290330370000200341a1016a200341306a41086a290300370000200341a9016a200341306a41106a290300370000200341b1016a200341306a41186a290300370000200341b9016a2003290350370000200341c1016a200341d0006a41086a290300370000200341c9016a200341d0006a41106a290300370000200341d1016a200341d0006a41186a290300370000200341023a009001200341f8016a2012370300200341f0016a2013370300200341e8016a2008370300200341e0016a200937030020034190016a108b010c070b41df88c0004133103a000b411441011020000b413441011020000b2002101d0b20010d00410121014115210741d7c0c10021040c010b200341a0026a41026a2003419c026a41026a2d00003a0000200341d0006a41086a20034180026a41086a290300370300200341d0006a410d6a20034180026a410d6a290000370000200320032f019c023b01a0022003200329038002370350410021010b2003418c016a41026a2202200341a0026a41026a2d00003a0000200341f0006a41086a2205200341d0006a41086a290300370300200341f0006a41106a200341d0006a41106a290300370300200320032f01a0023b018c012003200329035037037020010d01200341a3016a2005290300370000200341a8016a200341fd006a290000370000200320032f018c013b019001200320073600970120032004360093012003200329037037009b01200320022d00003a00920120034190016a200e200d10e20120034190016a2009200810e7010b410021040b2000200736020420002004360200200341c0026a24000bc70202047f047e230041206b22012400200141106a41086a220242003703002001420037031041aeb9c0004116200141106a1001200141086a22032002290300370300200120012903103703000240024002402001411041f8b3c200410041001002417f460d00200142003703182001420037031020014110200141106a4110410010022204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b200041086a290300210720002903002108200242003703002001420037031041aeb9c0004116200141106a100120032002290300370300200120012903103703002001427f200520077c200620087c22072006542202ad7c22062002200620055420062005511b22021b3703182001427f200720021b37031020014110200141106a41101003200141206a24000f0b41df88c0004133103a000b1c0020012802184190cfc200410b2001411c6a28020028020c1100000b900501137f02400240200128020022064100480d00200641ffffffff07460d002001200641016a360200200141046a2107200141086a28020021080c010b103f000b410021060340024002400240024002400240024002400240024020060e020001010b2007280200220a41086a210b200a2f0106220941057421064100210c0240024003402006450d012002200b412010d003220d450d02200641606a2106200c41016a210c200b41206a210b200d417f4a0d000b200c417f6a21090b2008450d022008417f6a2108200a20094102746a4180096a2107410021060c0a0b200a41e8026a200c41c8006c6a2206450d01200641186a210e2006411c6a280200210f41082110410c2111417f21124102211341900221144101211541742116410021170c080b200e280200220920106a210620092f0106221820116c210b4100210c0240024002400340200c210d200b450d01024002400240200420062802002006280208220c2005200c2005491b10d003220e450d004101210a200e20174e0d010c020b200c2005460d0520122015200c20054b1b210a0b200620116a2106200d20156a210c200b20166a210b200a2012470d010b0b200f0d010c030b2018210d200f450d020b200f20126a210f2009200d2013746a20146a210e410121060c090b2009418c016a220b200d410c6c6a2206450d0020062802002205450d01200b200d410c6c6a2802082206417f4c0d062006450d022006101f220b0d03200641011020000b200020012802102002200320042005200141146a28020028020c1105000c040b4100210b0c020b4101210b0b200b2005200610ce031a0b200020063602042000200b360200200041086a20063602000b20012001280200417f6a3602000f0b102e000b410121060c000b0bca16050f7f017e1f7f017e067f230041a0036b2204240020022802082105200228020421062002280200210702400240024002402001280200220841f0c0c100460d00200128020421090c010b419002101f2208450d0141002109200841003b010620084100360200200841086a200441e8006a41880210ce031a20014100360204200120083602000b0c010b41900241041020000b41002102024003400240024002400240024002400240024020020e020001010b200841086a210220082f0106220b410c6c210c4100210d024002400240024002400340200d210a200c450d01024002400240200720022802002002280208220d20052005200d4b1b10d003220e450d004101210f200e41004e0d010c020b2005200d460d06417f41012005200d491b210f0b2002410c6a2102200a41016a210d200c41746a210c200f417f470d010b0b20090d010c020b200b210a2009450d010b2009417f6a21092008200a4102746a4190026a2802002108410021020c0a0b200441186a20083602002001200128020841016a3602082004411c6a200aad4220862001ad843702002004200636020c2004200736020820042005ad370310200441c8006a41086a220c200341086a2802003602002004200329020037034820082f0106220d410b4f0d01200841086a2202200a410c6c2210410c6a22116a200220106a2202200d200a6b410c6c10cf031a2002200536020820022006360204200220073602002008418c016a220220116a200220106a2202200841066a220d2f0100200a6b410c6c10cf031a200241086a200c28020036020020022004290348370200200d200d2f010041016a3b01000c0a0b02402006450d002007101d0b200441e8006a41086a22022008200a410c6c6a220c4194016a220d2802003602002004200c418c016a220c290200370368200d200341086a280200360200200c2003290200370200200441086a41086a220c200228020036020020042004290368370308200041013602002000410c6a200c28020036020020002004290308370204200441a0036a24000f0b419002101f2212450d04201241003b010620124100360200201241086a200441e8006a41880210ce03210c200441e8006a41086a220d200841dc016a280200360200200420082902d401370368200841d4006a290200211320082802502114200c200841dc006a200841066a22102f010041796a2202410c6c221110ce03210c2012418c016a200841e0016a201110ce032111201041063b0100201220023b0106200441d8006a41086a200d2802003602002004200429036837035802400240200a41064b0d00200841086a2202200a410c6c220d410c6a22106a2002200d6a220c200841066a22022f0100200a6b410c6c10cf031a200c2005360208200c2006360204200c20073602002008418c016a220c20106a200c200d6a220c20022f0100200a6b410c6c10cf031a200c41086a200441c8006a41086a280200360200200c20042903483702000c010b200c200a410c6c220d41b87f6a22106a200c200d41ac7f6a220d6a220c200241ffff0371200a41796a220a6b410c6c10cf031a200c2005360208200c2006360204200c2007360200201120106a2011200d6a220c201241066a22022f0100200a6b410c6c10cf031a200c41086a200441c8006a41086a280200360200200c20042903483702000b41012110200220022f010041016a3b010041082115200441386a41086a2216200441d8006a41086a221728020036020020042004290358370338200441286a41086a221820162802003602002004200429033837032820082802002219450d0120082f0104211a41ffff03211b410a211c41c002211d4100211e41b802211f41d400212041d000212141dc01212241d401212341dc0021244106212541792126410c212741e0012128418c01212941ac02212a419002212b417a212c4102212d419402212e4104211141ac7f212f41b87f2130416c213141f80121320c060b200441c8006a20156a2235201828020036020020042004290328370348201a201b71210f20192f01062202201c4d0d01201d101f220a450d02200a201e3b0106200a201e360200200a20156a200441e8006a201f10ce032102201920206a2902002133201920216a2802002134200441e8006a20156a220b201920226a2802003602002004201920236a2902003703682002201920246a201920256a22362f0100220c20266a220d20276c220e10ce032137200a20296a201920286a200e10ce032138200a202b6a2019202a6a200c202c6a220e202d7410ce032139203620253b0100200a200d3b01060240200e450d00410021022039210c0340200c280200220d20023b0104200d200a360200200c20116a210c200e200220106a2202470d000b0b2017200b28020036020020042004290368370358200b20172802003602002004200429035837036802400240201a201b71220220254b0d00201920156a220d200f20276c220c20276a220e6a200d200c6a220d20362f0100221a200f6b20276c223910cf031a200d2013370204200d2014360200201920296a220d200e6a200d200c6a220c203910cf031a200c20156a2035280200360200200c20042903483702002036201a20106a220c3b01002019202b6a220d200f202d7422366a20156a200d200f20106a220e202d746a221a200c201b71220d200e6b202d7410cf031a201a20123602002002200d4f0d01201920366a202e6a210203402002280200220c200f20106a220f3b0104200c2019360200200220116a2102200d200f470d000c020b0b2037200f20276c220220306a220e6a20372002202f6a221a6a220c200a20256a220d2f0100200f20266a22026b20276c10cf031a200c2013370204200c20143602002038200e6a2038201a6a220c200d2f0100220e20026b20276c10cf031a200c20156a2035280200360200200c2004290348370200200d200e20106a220e3b01002039200f202d74221a6a20316a2039200f202c6a220c202d746a220d200e201b71220f200c6b202d7410cf031a200d2012360200200c200f4b0d00200a201a6a20326a210c0340200c280200220d200220106a22023b0104200d200a360200200c20116a210c200f2002470d000b0b2016200b280200360200200420042903683703382018201628020036020020042004290338370328024020192802002202450d0020192f0104211a203321132034211420022119200a2112410121020c070b2033211320342114200a21120b41c002101f2202450d03200241003b010620024100360200200241086a200441e8006a41b80210ce03210d20022001280200220c36029002200120023602002001200128020441016a360204200c41003b0104200c2002360200200d20022f0106220c410c6c22106a220d2013370204200220106a22104194016a200441286a41086a2802003602002010418c016a2004290328370200200d201436020020024190026a200c41016a220c4102746a20123602002002200c3b01062012200c3b0104201220023602000c060b201941086a220d200f410c6c220c410c6a22106a200d200c6a220d2002200f6b410c6c220a10cf031a200d2013370204200d20143602002019418c016a220d20106a200d200c6a220c200a10cf031a200c41086a200441c8006a41086a280200360200200c2004290348370200201941066a200241016a220c3b010020194190026a220d200f4102746a41086a200d200f41016a22024102746a220d200c41ffff0371221020026b41027410cf031a200d2012360200201a41ffff037120104f0d0520192002417f6a22024102746a4194026a210c0340200c280200220d200241016a22023b0104200d2019360200200c41046a210c20102002470d000c060b0b41c00241041020000b41900241041020000b41c00241041020000b410121020c000b0b20004100360200200441a0036a24000b7701017f230041c0006b220024002000411036020c200041eca8c100360208200041346a411e360200200041246a41023602002000411836022c20004202370214200041b8b1c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8b1c40010cf01000b13002000410a360204200041c08ec3003602000bed0201027f230041206b22022400024002404116101f2203450d002003410e6a41002900d7d940370000200341086a41002900d1d940370000200341002900c9d940370000200341164136101e2203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241106a41086a220142003703002002420037031020034136200241106a1001200241086a2001290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d002002410036021020024110200241106a41044100100241016a4105490d02200228021021012002410036021020024110200241106a41044104100241016a4105490d02200041086a200228021036020020002001360204200041013602000c010b200041003602000b2003101d200241206a24000f0b41df88c0004133103a000b411641011020000b413641011020000b130020004107360204200041a5edc0003602000b1300200041143602042000419896c3003602000b7801047f230041106b22022400200241003602082002420137030002404101101f2203450d00200220033602002002410136020420002002290300370200200241086a22042004280200220441016a2205360200200320046a41003a0000200041086a2005360200200241106a24000f0b410141011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241003600000f0b410441011020000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242053700000f0b410841011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241013600000f0b410441011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241023600000f0b410441011020000b3901017f02404110101f2202450d002002420037000820024201370000200042908080808002370204200020023602000f0b411041011020000b3901017f02404110101f2202450d002002420037000820024209370000200042908080808002370204200020023602000f0b411041011020000b9e0403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d002003200041306c6a2104200241086a280200210520022802002106200228020421000340200341086a2903002107200329030021080240024002400240200020056b41104f0d00200541106a22092005490d062000410174220a20092009200a491b220a4100480d062000450d0120062000200a101e22060d020c070b200541106a21090c020b200a101f2206450d050b200a21000b200620056a22052007370008200520083700000240024002400240200020096b41204f0d00200941206a22052009490d062000410174220a20052005200a491b220a4100480d062000450d0120062000200a101e22060d020c080b200941206a21050c020b200a101f2206450d060b200a21000b200620096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032004470d000b200241086a20053602002002200036020420022006360200200128020020012802042006200510032000450d050c040b200228020421032001280200200128020420022802002206200241086a280200100320030d030c040b1021000b200a41011020000b200a41011020000b2006101d0b200241106a24000bcf0506027f017e0b7f017e027f017e230041d0006b22022400200241086a200110d5010240024002400240024002400240024002402002280208450d00200228020c2203ad42307e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210d4100210c0c030b102e000b200541081020000b200141046a2107200141086a2108200241306a41186a21094100210a4100210b410021052003210c0240034020024200370338200242003703302008410020012802002007280200200241306a411020082802001002220d200d417f461b220d4110200d4110491b20082802006a220e360200200d410f4d0d01200241306a41086a220f29030021042002290330211020094200370300200241306a41106a22114200370300200f4200370300200242003703302008410020012802002007280200200241306a4120200e1002220d200d417f461b220d4120200d4120491b20082802006a360200200d411f4d0d01200541016a210d200241106a41186a220e2009290300370300200241106a41106a22122011290300370300200241106a41086a2211200f2903003703002002200229033037031002402005200c470d00200a200d200d200a491b220cad42307e2213422088a70d042013a7220f4100480d0402402005450d002006200b200f101e22060d010c060b200f101f2206450d050b2006200b6a2205200437030820052010370300200541286a200e290300370300200541206a2012290300370300200541186a2011290300370300200541106a2002290310370300200a41026a210a200b41306a210b200d2105200d2003490d000c020b0b200041003602000240200c450d002006101d0b200241d0006a24000f0b2000200c36020420002006360200200041086a200d360200200241d0006a24000f0b1021000b200f41081020000ba00402087f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d002003200041286c6a2104200241086a220528020021002002280204210603400240024002400240200620006b41204f0d00200041206a22072000490d0620064101742208200720072008491b22094100480d062006450d01200228020020062009101e22080d020c070b200041206a2107200228020021080c020b2009101f2208450d050b2002200936020420022008360200200921060b20052007360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a290300210a0240024002400240200620076b41084f0d00200741086a22002007490d0620064101742209200020002009491b22094100480d062006450d01200820062009101e22080d020c080b200741086a21000c020b2009101f2208450d060b2002200936020420022008360200200921060b20052000360200200820076a200a3700002004200341286a2203470d000b200128020020012802042008200010032006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100320030d030c040b1021000b200941011020000b200941011020000b2008101d0b200241106a24000b820101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004413c6a411f3602002004412c6a4102360200200441183602342004420237021c200441b8b1c4003602182004200441106a3602382004200441086a3602302004200441306a360228200441186a41c8b1c40010cf01000ba11102177f017e230041206b220224002000280204210320002802002104410121050240200128021841222001411c6a2802002802101106000d00024002402003450d00200420036a2106200141186a21072001411c6a2108200421094100210a4100210b024003402009210c200941016a2100024002400240024002400240024002400240024020092c0000220d4100480d00200d41ff0171210d0c010b02400240024020002006460d0020002d0000413f71210e200941026a22092100200d411f71210f200d41ff0171220d41e001490d010c020b4100210e20062109200d411f71210f200d41ff0171220d41e0014f0d010b200e200f41067472210d0c010b0240024020092006460d00200941016a2200211020092d0000413f71200e41067472210e200d41f001490d010c030b200621104100200e41067472210e200d41f0014f0d020b200e200f410c7472210d0b2000210941022100200d41776a220f411e4d0d010c020b0240024020102006460d00201041016a210920102d0000413f71210d0c010b4100210d200021090b200e410674200f411274418080f0007172200d72220d418080c400460d0841022100200d41776a220f411e4b0d010b41f400210e024002400240200f0e1f07010505000505050505050505050505050505050505050505040505050504070b41f200210e0c010b41ee00210e0b0c040b200d41dc00470d010b0c010b0240200d10ec020d0002400240200d41ffff034b0d00200d4180fe0371410876211141d8b7c200211241002113410021000c010b0240200d41ffff074b0d00200d4180fe037141087621164193bdc200211741002118410121000c010b200d41ef83384b0d01200d41e28b746a41e28d2c490d01200d419fa8746a419f18490d01200d41dee2746a410e490d01200d41feffff0071419ef00a460d01200d41a9b2756a4129490d01200d41cb91756a410a4d0d010c040b024003400240024020000e020001010b201241026a2114201320122d000122006a2110024002400240024002400240024020122d0000220e2011470d0020102013490d06201041b0024f0d05201341a8b8c2006a210e03402000450d022000417f6a2100200e2d0000210f200e41016a210e200f200d41ff0171470d000c0b0b0b200e20114b0d012010211320142112201441a8b8c200470d030c010b2010211320142112201441a8b8c200470d010b200d41ffff0371210e41d7bac20021004101210f02400340200041016a21100240024020002d000022144118744118752215417f4c0d0020102100200e20146b220e4100480d030c010b024020104193bdc200460d00200041016a2110200041026a2100200e201541ff007141087420102d0000726b220e41004e0d010c030b4190b3c400102c000b200f410173210f20004193bdc200470d000b0b200f410171450d070c0a0b410021000c040b410021000c030b201041af02102b000b20132010102a000b201741026a2114201820172d000122006a211002400240024002400240024020172d0000220e2016470d0020102018490d072010419f014f0d05201841d5bdc2006a210e03402000450d022000417f6a2100200e2d0000210f200e41016a210e200f200d41ff0171470d000c090b0b200e20164b0d012010211820142117201441d5bdc200470d030c010b2010211820142117201441d5bdc200470d010b200d41ffff0371210e41f3bec20021004101210f02400340200041016a21100240024020002d000022144118744118752215417f4c0d0020102100200e20146b220e4100480d030c010b0240201041f0c1c200460d00200041016a2110200041026a2100200e201541ff007141087420102d0000726b220e41004e0d010c030b4190b3c400102c000b200f410173210f200041f0c1c200470d000b0b200f410171450d050c080b410121000c020b410121000c010b0b2010419e01102b000b20182010102a000b200d41017267410276410773ad4280808080d000842119410321000b200d210e0b20022003360204200220043602002002200a3602082002200b36020c02400240200b200a490d000240200a450d00200a2003460d00200a20034f0d012004200a6a2c000041bf7f4c0d010b0240200b450d00200b2003460d00200b20034f0d012004200b6a2c000041bf7f4c0d010b20072802002004200a6a200b200a6b200828020028020c1100000d010340024002400240024002400240024020004101460d0041dc00210a024020004102460d0020004103470d062019422088a741ff0171417f6a220041044b0d06024020000e050006040503000b201942ffffffff8f608321194103210041fd00210a0c070b410121000c060b41002100200e210a0c050b201942ffffffff8f60834280808080c000842119410321000c040b201942ffffffff8f60834280808080208421194103210041fb00210a0c030b201942ffffffff8f60834280808080308421194103210041f500210a0c020b200e2019a7220f410274411c7176410f712200413072200041d7006a2000410a491b210a0240200f450d002019427f7c42ffffffff0f83201942808080807083842119410321000c020b201942ffffffff8f6083428080808010842119410321000c010b410121000240200d418001490d0041022100200d418010490d0041034104200d41808004491b21000b2000200b6a210a200b200c6b20096a210b20062009470d050c060b2007280200200a2008280200280210110600450d000b200241206a240041010f0b20022002410c6a3602182002200241086a36021420022002360210200241106a10ed02000b200241206a240041010f0b200b200c6b20096a210b20062009470d000b0b200a450d01200a2003460d010240200a20034f0d002004200a6a2c000041bf7f4a0d020b20042003200a200310ee02000b4100210a0b200141186a22002802002004200a6a2003200a6b2001411c6a220b28020028020c1100000d0020002802004122200b28020028021011060021050b200241206a240020050bc10201037f23004180016b220224000240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001108b02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b2004418001102a000b2004418001102a000bd40203037f017e027f230041306b220324004127210402400240024020004290ce00540d00412721040340200341096a20046a2205417c6a200020004290ce0080220642f0b17f7e7ca7220741e4006e220841017441aab4c2006a2f00003b00002005417e6a2008419c7f6c20076a41017441aab4c2006a2f00003b00002004417c6a2104200042ffc1d72f5621052006210020050d000b2006a7220541e3004c0d020c010b20002206a7220541e3004c0d010b200341096a2004417e6a22046a2006a7220741ffff037141e4006e2205419c7f6c20076a41ffff037141017441aab4c2006a2f00003b00000b02400240200541094a0d00200341096a2004417f6a22046a200541306a3a00000c010b200341096a2004417e6a22046a200541017441aab4c2006a2f00003b00000b2002200141f8b3c2004100200341096a20046a412720046b108c022104200341306a240020040be60601067f0240024002400240024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21082006410471450d010c020b200541016a2108412d2107200028020022064104710d010b410021024101210120002802084101470d010c020b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21084101210120002802084101460d010b200020072002200310c9030d012000280218200420052000411c6a28020028020c1100000f0b0240024002400240024002400240024002400240024002402000410c6a280200220920084d0d0020064108710d01200920086b2101410120002d0030220920094103461b2209410371450d0220094102460d034100210b200121090c040b200020072002200310c9030d0b2000280218200420052000411c6a28020028020c1100000f0b41012101200041013a003020004130360204200020072002200310c9030d0a200920086b21014101200041306a2d0000220920094103461b2209410371450d0320094102460d0441002108200121090c050b410021092001210b0c010b20014101762109200141016a410176210b0b417f2101200041046a210a200041186a21082000411c6a210602400340200141016a220120094f0d012008280200200a2802002006280200280210110600450d000c050b0b200041046a280200210a41012101200020072002200310c9030d07200041186a2209280200200420052000411c6a220328020028020c1100000d0720092802002100417f2109200328020041106a21030340200941016a2209200b4f0d06410121012000200a2003280200110600450d000c080b0b41002109200121080c010b20014101762109200141016a41017621080b417f2101200041046a210a200041186a21032000411c6a21020340200141016a220120094f0d022003280200200a2802002002280200280210110600450d000b0b410121010c030b200041046a280200210a41012101200041186a2209280200200420052000411c6a220328020028020c1100000d0220092802002100417f2109200328020041106a21030340200941016a220920084f0d02410121012000200a2003280200110600450d000c030b0b41000f0b41000f0b20010b1c002001280218419bcfc200410e2001411c6a28020028020c1100000bfab3010f0c7f017e027f027e0a7f027e037f017e067f027e067f037e027f027e407f230041e0036b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441094b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0a00060304010708050902000b2001410c6a2802002105200141086a2802002106200141106a280200210720012802042108200241096a2800002109200241056a280000210420022d0001210a20022d0000210b200341e4026a41026a220c200241046a2d00003a0000200341a8026a41086a220d200241156a290000370300200341a8026a410d6a220e2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d13410121020c140b20012802042105200241096a2800002109200241056a280000210420022d0001210620022d0000210b200341e4026a41026a2208200241046a2d00003a0000200341a8026a41086a2207200241156a290000370300200341a8026a410d6a220a2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d09410121020c0a0b20022d000120022d0000720d07200141086a290300210f200341e8026a41086a22024200370300200342003703e80241dafcc0004114200341e8026a100120034190016a41086a2002290300370300200320032903e802370390012003200f3703b80120034190016a4110200341b8016a410810030c580b200141306a280200210e2001412c6a280200211020012802042111200341b4016a41026a2001410b6a2d00003a0000200341f0006a41086a2001411c6a290200370300200341f0006a410d6a200141216a290000370000200320012f00093b01b4012003200141146a290200370370200141086a2d000021052001410c6a2802002106200141106a2802002108200241096a2800002109200241056a280000210420022d0001210720022d0000210b200341e4026a41026a220a200241046a2d00003a0000200341a8026a41086a220c200241156a290000370300200341a8026a410d6a220d2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d0a410121020c0b0b2001280204210a200241096a2800002109200241056a280000210420022d0001210520022d0000210b200341e4026a41026a2206200241046a2d00003a0000200341a8026a41086a2208200241156a290000370300200341a8026a410d6a22072002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d0c410121020c0d0b200341f0006a41026a2205200141076a2d00003a0000200341c8026a41086a220e200141186a290200370300200341c8026a410d6a22112001411d6a290000370000200320012f00053b01702003200141106a2902003703c80220022d000120022d0000720d042001410c6a2802002109200141086a280200210420012d00042102200341e4026a41026a20052d00003a0000200341b8016a41086a200e290300370300200341b8016a410d6a2011290000370000200320032f01703b01e402200320032903c8023703b801200241ff01714101470d1e200341b8036a200441067610b00120032802b803210520032802c0032004413f7122024d0d22200341e0026a41026a200520024105746a220241026a2d00003a0000200341f0026a200241136a290000370300200341f5026a200241186a290000370000200320022f00003b01e0022003200229000b3703e80220022800072109200228000321044101210220032802bc03450d4b0c4a0b2001410c6a280200210d200141086a2802002106200141106a280200210e20012802042108200241096a2800002109200241056a280000210420022d0001210520022d0000210b200341e4026a41026a2207200241046a2d00003a0000200341a8026a41086a220a200241156a290000370300200341a8026a410d6a220c2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d10410121020c110b200141386a2903002112200141306a2903002113200141286a2802002114200341b4016a41026a200141076a2d00003a0000200341f0006a41086a200141186a290200370300200341f0006a410d6a2001411d6a290000370000200320012f00053b01b4012003200141106a290200370370200141086a28020021152001410c6a280200211620012d00042117200241096a2800002109200241056a280000210420022d0001211820022d00002119200341e4026a41026a221a200241046a2d00003a0000200341a8026a41086a221b200241156a290000370300200341a8026a410d6a221c2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a8022019450d12410121020c130b20022d000120022d0000720d0120012802042102200341e8026a41086a22044200370300200342003703e80241b2fcc0004114200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001200320023602b80120034190016a4110200341b8016a410410030c520b20022d000120022d000072450d130b41c9b4c0002104412821090c550b200341e0026a41026a20082d00003a0000200341c8026a41086a2007290300370300200341c8026a410d6a200a290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200641ff01714101470d0020034190036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b019003200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b20034190036a41026a2d00003a000020034190016a41086a2206200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f0190033b01ac01200320032903b8013703900120020d49200341cb036a2006290300370000200341d0036a2003419d016a290000370000200320032f01ac013b01b803200320093600bf03200320043600bb0320032003290390013700c3032003200b2d00003a00ba034116101f2202450d262002410e6a41002900d7d940370000200241086a41002900d1d940370000200241002900c9d940370000200241164136101e2202450d27200220032903b8033700162002412e6a200341d0036a290300370000200241266a200341b8036a41106a290300370000411e21092002411e6a200341b8036a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024136200341e8026a1001200341a8026a41086a2004290300370300200320032903e8023703a802200341a8026a411041f8b3c200410041001002210b2002101d418e83c1002104200b417f470d49200341e8026a41086a22024200370300200342003703e80241e7fdc0004116200341e8026a100120034190016a41086a2002290300370300200320032903e802370390014100210a024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d2620032802b801210a0b200341e8026a41086a22024200370300200342003703e80241d5fdc0004112200341e8026a100120034190016a41086a2002290300370300200320032903e802370390014100210c20034190016a411041f8b3c200410041001002417f460d1d2003421037029403200320034190016a36029003200341b8016a20034190036a105e20032802b801220d450d2a200341c0016a280200210220032802bc01210c200a2005460d1e0c1f0b200341e0026a41026a200a2d00003a0000200341c8026a41086a200c290300370300200341c8026a410d6a200d290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200741ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b2003418c016a41026a220b200341b8036a41026a2d00003a0000200341e8026a41086a2207200341b8016a41086a220a290300370300200341e8026a41106a200341b8016a41106a290300370300200320032f01b8033b018c01200320032903b8013703e80220020d46200341a3036a2007290300370000200341a8036a200341e8026a410d6a2202290000370000200320032f018c013b01900320032009360097032003200436009303200320032903e80237009b032003200b2d00003a009203200341e4026a41026a200341b4016a41026a2d00003a0000200a200341f0006a41086a290300370300200341b8016a410d6a2204200341f0006a410d6a290000370000200320032f01b4013b01e402200320032903703703b801200541ff01714101470d0d200341a8026a200641067610b00120032802a802210420032802b0022006413f7122024d0d16200341e0026a41026a200420024105746a220241026a2d00003a0000200341f0026a200241136a290000370300200341f5026a200241186a290000370000200320022f00003b01e0022003200229000b3703e80220022800072108200228000321064101210220032802ac02450d3b0c3a0b200341e0026a41026a20062d00003a0000200341c8026a41086a2008290300370300200341c8026a410d6a2007290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200541ff01714101470d0020034190036a41026a200341e0026a41026a2d00003a0000200341b8036a41086a200341c8026a41086a290300370300200341b8036a410d6a200341c8026a410d6a290000370000200320032f01e0023b019003200320032903c8023703b803410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b20034190036a41026a2d00003a000020034190016a41086a2205200341b8036a41086a29030037030020034190016a41106a200341b8036a41106a290300370300200320032f0190033b01ac01200320032903b8033703900120020d43200341cb016a2005290300370000200341d0016a2003419d016a290000370000200320032f01ac013b01b801200320093600bf01200320043600bb0120032003290390013700c3012003200b2d00003a00ba01200341e8026a41086a22024200370300200342003703e80241c6fcc0004114200341e8026a1001200341a8026a41086a2002290300370300200320032903e8023703a802200341a8026a411041f8b3c200410041001002417f460d0f41a782c1002104411e21090c430b200341e0026a41026a200c2d00003a0000200341c8026a41086a200d290300370300200341c8026a410d6a200e290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200a41ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b200341b8036a41026a2d00003a000020034190016a41086a220a200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01b8033b01ac01200320032903b8013703900102402002450d004100210b410121052006450d422008101d200128020022024102470d490c480b2003418c016a41026a2202200b2d00003a0000200341f0006a41086a220b200a290300370300200341f0006a410d6a220a20034190016a410d6a290000370000200320032f01ac013b018c012003200329039001370370200341cb016a200b290300370000200341d0016a200a290000370000200320093600bf01200320043600bb01200320022d00003a00ba01200320032f018c013b01b801200320032903703700c301200320053602c003200320063602bc03200320083602b8032003200341b8016a200341b8036a2007108f0220032802042109200328020021044100210b41012105200128020022024102470d480c470b200341e0026a41026a20072d00003a0000200341c8026a41086a200a290300370300200341c8026a410d6a200c290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200541ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b200341b8036a41026a2d00003a000020034190016a41086a2205200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01b8033b01ac01200320032903b8013703900120020d07200341cb036a2005290300370000200341d0036a20034190016a410d6a290000370000200320032f01ac013b01b803200320093600bf03200320043600bb0320032003290390013700c3032003200b2d00003a00ba03200341b8016a200341b8036a10c0014101210220032d00b8014101470d052003418e016a20032d00bb013a0000200341e8026a41086a200341cc016a290200370300200341e8026a410d6a200341d1016a290000370000200320032f00b9013b018c012003200341c4016a2902003703e802200341b8016a41086a28020021094100210220032802bc0121040c060b200341e0026a41026a201a2d00003a0000200341c8026a41086a201b290300370300200341c8026a410d6a201c290000370000200320032f01e4023b01e002200320032903a8023703c80241012102201841ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b412a210941f1b4c00021040b2003418c016a41026a2219200341b8036a41026a2d00003a0000200341e8026a41086a2218200341b8016a41086a290300370300200341e8026a41106a200341b8016a41106a290300370300200320032f01b8033b018c01200320032903b8013703e80220020d3a200341a3036a2018290300370000200341a8036a200341e8026a410d6a290000370000200320032f018c013b01900320032009360097032003200436009303200320032903e80237009b03200320192d00003a0092032013201284500d08200341e4026a41026a2202200341b4016a41026a2d00003a0000200341b8016a41086a2204200341f0006a41086a290300370300200341b8016a410d6a200341f0006a410d6a290000370000200320032f01b4013b01e402200320032903703703b801201741ff01714101470d09200341a8026a201541067610b00120032802a802210420032802b0022015413f7122024d0d0c200341e0026a41026a200420024105746a220241026a2d00003a0000200341f0026a200241136a290000370300200341f5026a200241186a290000370000200320022f00003b01e0022003200229000b3703e80220022800072116200228000321154101210220032802ac02450d2b0c2a0b200141086a290300210f200341e8026a41086a22024200370300200342003703e80241eefcc000411c200341e8026a100120034190016a41086a2002290300370300200320032903e802370390012003200f3703b80120034190016a4110200341b8016a410810030c3d0b200341e0026a41026a200341e4026a41026a2d00003a0000200341e8026a41086a200341b8016a41086a29030037030020022004290000370000200320032f01e4023b01e002200320032903b8013703e8020c2e0b410b2109419a80c10021040b200341b4016a41026a220b2003418c016a41026a2d00003a000020034190036a41086a2205200341e8026a41086a29030037030020034190036a41106a200341e8026a41106a290300370300200320032f018c013b01b401200320032903e802370390032002450d010b4101210b410021052006450d362008101d200128020022024102470d3d0c3c0b200341b0016a41026a2202200b2d00003a0000200341f0006a41086a220b2005290300370300200341f0006a410d6a220520034190036a410d6a290000370000200320032f01b4013b01b0012003200329039003370370200341cb016a200b290300370000200341d0016a2005290000370000200320093600bf01200320043600bb01200320022d00003a00ba01200320032f01b0013b01b801200320032903703700c3012003200d3602c003200320063602bc03200320083602b803200341086a200341b8016a200341b8036a200e108f02200328020c2109200328020821044101210b41002105200128020022024102470d3c0c3b0b4114101f2202450d12200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d13200220032903b801370014411821092002412c6a200341b8016a41186a290300370000200241246a200341b8016a41106a2903003700002002411c6a200341b8016a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024134200341e8026a1001200341a8026a41086a2004290300370300200320032903e8023703a802200341a8026a411041f8b3c20041004100100221042002101d2004417f460d06200341e8026a41086a22024200370300200342003703e802418afdc000410e200341e8026a100120034190016a41086a2002290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002417f460d0a2003421037029403200320034190016a36029003200341b8036a20034190036a105e20032802b8032202450d1520032802bc03210b200341c0036a2802002204200a4d0d0b2002200a4105746a2209200341b8016a460d0d2009200341b8016a412010d003450d0d41f582c100210441192109200b0d0c0c330b200341e0026a41026a200341e4026a41026a2d00003a0000200341e8026a41086a200341b8016a41086a290300370300200341e8026a410d6a200341b8016a410d6a290000370000200320032f01e4023b01e002200320032903b8013703e8020c2d0b41e083c100210441d00021090c310b200341e0026a41026a20022d00003a0000200341e8026a41086a2004290300370300200341e8026a410d6a200341b8016a410d6a290000370000200320032f01e4023b01e002200320032903b8013703e8020c220b4100210220032802ac020d230c240b4100210220032802bc030d270c280b4100210220032802ac020d1d0c1e0b41c582c10021040c2c0b4101210d41002102200a2005470d010b20022005460d0e0b41ac83c100210441162109200220054d0d0e200341d0016a4200370300200341c8016a4200370300200341c0016a4200370300200342003703b801200d20054105746a220b200341b8016a460d0d200b200341b8016a412010d0030d0e0c0d0b41dd82c10021040c280b41dd82c100210441182109200b450d270b2002101d0c260b200320043602c0032003200b3602bc03200320023602b803200341b8016a200a200341b8036a1090024200210f200341e8026a41086a22024200370300200342003703e802418582c1004112200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001410021040240024020034190016a411041f8b3c200410041001002417f460d00200342003703c003200342003703b80320034190016a4110200341b8036a4110410010022202417f460d0a2002410f4d0d0a200341c0036a290300212320032903b803210f0c010b420021230b200341b8016a200f20231094010c2a0b200341cc016a4101360200200341183602bc03200341c0adc4003602b803200342013702bc01200341c8adc4003602b8012003200341b8036a3602c801200341b8016a41c0a9c30010cf01000b41df88c0004133103a000b411641011020000b413641011020000b411441011020000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b4200210f200341e8026a41086a22044200370300200342003703e802418efec0004115200341e8026a100120034190016a41086a2004290300370300200320032903e802370390010240024020034190016a411041f8b3c200410041001002417f460d00200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022204417f460d042004410f4d0d04200341c0016a290300210f20032903b80121230c010b420921230b200341306a200341b8036a2023200f10cc012003280230450d0141c283c1002104411e21090b200c450d1a200d101d0c1a0b200341e8026a41086a22044200370300200342003703e80241fdfdc0004111200341e8026a100120034190016a41086a2004290300370300200320032903e802370390014100210b024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0220032802b801210b0b4116101f2204450d022004410e6a41002900d7d940370000200441086a41002900d1d940370000200441002900c9d940370000200441164136101e2204450d03200420032903b8033700162004412e6a200341d0036a290300370000200441266a200341c8036a2903003700002004411e6a200341b8036a41086a290300370000200341e8026a41086a22094200370300200342003703e80220044136200341e8026a100120034190016a41086a2009290300370300200320032903e802370390014104101f2209450d042009200b360000200941044108101e2209450d052009200536000420034190016a41102009410810032009101d2004101d02400240024020022005470d00200341b8016a41186a2204200341b8036a41186a290300370300200341b8016a41106a200341b8036a41106a290300370300200341b8016a41086a2209200341b8036a41086a290300370300200320032903b8033703b801200c2005470d0a200541016a22022005490d1a2005410174220b20022002200b491b220cad420586220f422088a70d1a200fa722024100480d1a2005450d01200d20054105742002101e220d450d020c0a0b200341b8016a41186a2209200341b8036a41186a290300370300200341b8016a41106a200341b8036a41106a290300370300200341b8016a41086a220b200341b8036a41086a290300370300200320032903b8033703b801200220054d0d08200d20054105746a220420032903b801370000200441186a2009290300370000200441106a200341b8016a41106a290300370000200441086a200b2903003700000c0a0b2002101f220d0d080b200241011020000b41df88c0004133103a000b41df88c0004133103a000b411641011020000b413641011020000b410441011020000b410841011020000b4198a9c30020052002104b000b200d20054105746a220220032903b801370000200241186a2004290300370000200241106a200341b8016a41106a290300370000200241086a2009290300370000200541016a21020b200341e8026a41086a22044200370300200342003703e80241d5fdc0004112200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001200341003602c001200342013703b801200320023602900320034190036a200341b8016a10620240024002402002450d00200d20024105746a21084100200341b8016a41086a28020022046b210b20032802b801210620032802bc012105200d2102034002402005200b6a411f4b0d00200441206a22092004490d1320054101742207200920092007491b22094100480d13024002402005450d00200620052009101e22060d010c060b2009101f2206450d050b200921050b200620046a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200b41606a210b200441206a2104200241206a2209210220082009470d000b200341c0016a2004360200200320053602bc01200320063602b8010c010b200341b8016a41086a280200210420032802bc01210520032802b80121060b20034190016a411020062004100302402005450d002006101d0b0240200c450d00200d101d0b200341e8026a41086a22024200370300200342003703e80241e7fdc0004116200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001410121052003200a41016a3602b80120034190016a4110200341b8016a410410030c090b200941011020000b2004101d0b20020d004101210241d7c0c1002115411521160c010b200341a8026a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341e8026a41086a290300370300200341b8016a410d6a200341e8026a410d6a290000370000200320032f01e0023b01a802200320032903e8023703b801410021020b200341ac016a41026a2209200341a8026a41026a2d00003a000020034190016a41086a2204200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01a8023b01ac01200320032903b8013703900102402002450d0020162109201521040c0d0b200341cb036a2004290300370000200341d0036a2003419d016a290000370000200320032f01ac013b01b803200320163600bf03200320153600bb0320032003290390013700c303200320092d00003a00ba03200341e8026a41086a22024200370300200342003703e80241fdfdc0004111200341e8026a100120042002290300370300200320032903e80237039001410021020240024002400240024002400240024002400240024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0120032802b80121020b0240024002400240024002400240024020022014470d00200341e8026a41086a22024200370300200342003703e80241c6fcc0004114200341e8026a100120034190016a41086a22042002290300370300200320032903e80237039001200341b8016a20034190016a106020032802c401221b450d0120032903c801211e20024200370300200342003703e8024198fdc0004118200341e8026a100120042002290300370300200320032903e802370390014100211520034190016a411041f8b3c200410041001002417f460d02200342103702ec02200320034190016a3602e802200341e8006a200341e8026a10d5012003280268450d07200328026c221aad221f421c88a70d0b201f420486a72202417f4c0d0b2002450d032002101f22190d04200241081020000b41dd84c1002104411121090c230b41b084c1002104412d21090c220b410821194108212d410021020c020b410821190b02400240201a450d00200341e8026a41086a280200211620032802ec02211c20032802e8022117410021184100210941002104201a21150340200342003703c001200342003703b80141002017201c200341b8016a41102016100222022002417f461b2202411020024110491b20166a21162002410f4d0d04200441016a2102200341b8016a41086a290300211f20032903b8012132024020042015470d002018200220022018491b2215ad4204862233422088a70d212033a722144100480d2102402004450d00201920092014101e22190d010c090b2014101f2219450d080b201920096a2204201f37030820042032370300201841026a2118200941106a2109200221042002201a490d000b200341f0026a201636020020190d010c040b41002102410021152019450d030b2019212d0b200341e8026a41086a22044200370300200342003703e802418afdc000410e200341e8026a100120034190016a41086a2004290300370300200320032903e802370390014100211a0240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a105e20032802b801221c450d0e200341c0016a280200212e20032802bc01211a0c010b4101211c4100212e0b4200211f200341e8026a41086a22044200370300200342003703e80241c986c100411c200341e8026a100120034190016a41086a2004290300370300200320032903e802370390010240024020034190016a411041f8b3c200410041001002417f460d00200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022204417f460d082004410f4d0d08200341c0016a290300211f20032903b80121320c010b420121320b200341d8006a2032201f202ead420010d2034114101f2204450d08200341d8006a41086a290300211f20032903582134200441106a41002800d5ba40360000200441086a41002900cdba40370000200441002900c5ba40370000200441144134101e2204450d0920042003290390033700142004412c6a200341a8036a290300370000200441246a20034190036a41106a2903003700002004411c6a20034190036a41086a29030037000042002133200341e8026a41086a22094200370300200342003703e80220044134200341e8026a1001200341a8026a41086a2009290300370300200320032903e8023703a80202400240200341a8026a411041f8b3c200410041001002417f460d00200342003703c001200342003703b801200341a8026a4110200341b8016a4110410010022209417f460d092009410f4d0d09200341c0016a290300213220032903b80121330c010b420021320b2004101d0240024002400240024020332034542032201f542032201f511b450d00419f85c1002104412e2109201a0d010c020b200341e8026a41086a22044200370300200342003703e80241c2fdc0004113200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001024002400240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a10860220032802b8012216450d15200341b8016a41086a2802002218450d1620032802bc01211741cd85c1002104412321092016290300201354201641086a290300223220125420322012511b450d0341082131200341e8026a41086a22044200370300200342003703e80241dfd9c0004115200341e8026a100120034190016a41086a2004290300370300200320032903e802370390014100213520034190016a411041f8b3c200410041001002417f460d01200342103702ec02200320034190016a3602e802200341b8016a200341e8026a10a40120032802b8012231450d17200341c0016a280200213620032802bc0121350c020b41ee84c100210441312109201a0d030c040b410021360b2031203641286c6a2130203121044100211402400240024002400340203020046b419f014d0d012004200341b8036a460d0220142004200341b8036a412010d003222f4100476a2114202f450d02200441286a222f200341b8036a460d022014202f200341b8036a412010d003222f4100476a2114202f450d02200441d0006a222f200341b8036a460d022014202f200341b8036a412010d003222f4100476a2114202f450d02200441f8006a222f200341b8036a460d02200441a0016a21042014202f200341b8036a412010d003222f4100476a2114202f0d000c020b0b20302004460d012031203641286c6a21300340200341b8036a2004460d0120142004200341b8036a412010d003222f4100476a2114202f450d012030200441286a2204470d000c020b0b2014201e422088a74f0d010b02402035450d002031101d0b200341b8016a200341b8036a10fb0141a686c100210420032802b8014101470d01200241ffffffff00712202202e41ffffff3f712204200420024b1b222f450d04200341c0016a280200213120032802bc012130201c210441002109420021374200213803404114101f2202450d11200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d12200220042900003700142002412c6a200441186a290000370000200241246a200441106a2900003700002002411c6a200441086a290000370000200341e8026a41086a22144200370300200342003703e80220024134200341e8026a100120034190016a41086a2014290300370300200320032903e8023703900102400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0e20032802b801212e41002114200941016a21092002101d202e20304f0d010c020b41012114200941016a21092002101d41002030490d010b20140d00200341b8016a200410910242002132420021330240200341b8016a41086a28020020314d0d00202d41086a290300420020032802b80120316a2d000022021b2133202d290300420020021b21320b024020032802bc01450d0020032802b801101d0b203320387c203220377c2237203254ad7c21380b200441206a2104202d41106a212d2009202f490d000c060b0b41f085c1002104413621092035450d002031101d0b02402017450d002016101d0b201a450d010b201c101d0b02402015450d002019101d0b201ea7450d200c130b42002137420021380b2016201841306c6a2114201621020240024002400340201420026b41bf014d0d0141012109200241106a2204200341b8036a460d022004200341b8036a412010d003450d02200241c0006a2204200341b8036a460d022004200341b8036a412010d003450d02200241f0006a2204200341b8036a460d022004200341b8036a412010d003450d02200241a0016a2204200341b8036a460d02200241c0016a21022004200341b8036a412010d0030d000c020b0b024020022014460d00034041012109200241106a2202200341b8036a460d022002200341b8036a412010d003450d02200241206a22022014470d000b0b4100210920372013852038201285844200520d00200341b8036a41086a290300211f200341b8036a41106a2903002132200341b8036a41186a290300213320032903b80321342016201237030820162013370300200341b8016a41186a2033370300200341b8016a41106a2032370300200341b8016a41086a201f37030020162034370310201641186a201f370300201641206a2032370300201641286a2033370300200320343703b801201841144b0d014101213a201841014d0d1f417f213b2018417f6a213c4130213d2016201841306c6a213e4102213f41082140411021414128214241182143412021444103214541e80021464150214741782148417021494168214a4160214b4158214c4138214d410121020c1d0b200341386a20034190036a2034201f10ef012003290338200341c0006a29030010f30102402017450d002016101d0b0240201a450d00201c101d0b02402015450d002019101d0b41e586c10041fb86c10020091b21044116410f20091b2109201ea70d120c1f0b2018410176224ead42307e220f422088a70d05200fa72202417f4c0d054108210b024002402002450d002002101f224f450d12204f21500c010b4108214f410821500b4150210c201641506a21514130210d201641306a2152201641f07e6a21534100215441042155417f215641012139420321234220210f4103215741022158417d21594158215a4128210a412021074118210641102108417e215b4174215c4164215d41a87f215e41a07f215f4109216041e80021614178216241702163416821644160216541382166410a216741042168410021694100216a2018216b410221020c1b0b200341f0026a20163602002015450d002019101d0b41df88c0004133103a000b41df88c0004133103a000b201441081020000b41df88c0004133103a000b102e000b41df88c0004133103a000b41df88c0004133103a000b411441011020000b413441011020000b411441011020000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b4188a9c30041004100104b000b41df88c0004133103a000b200241081020000b201b101d0c0c0b2004101d0b20020d004101210241d7c0c1002106411521080c010b200341a8026a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341e8026a41086a290300370300200341b8016a410d6a200341e8026a410d6a290000370000200320032f01e0023b01a802200320032903e8023703b801410021020b200341ac016a41026a2204200341a8026a41026a2d00003a000020034190016a41086a2209200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01a8023b01ac01200320032903b8013703900102402002450d00410121054101210b2008210920062104200128020022024102470d110c100b200341cb036a2009290300370000200341d0036a2003419d016a290000370000200320032f01ac013b01b803200320083600bf03200320063600bb0320032003290390013700c303200320042d00003a00ba03200341e8026a41086a22024200370300200342003703e80241c6fcc0004114200341e8026a1001200341a8026a41086a2002290300370300200320032903e8023703a8020240200341a8026a411041f8b3c200410041001002417f460d0041b980c1002104412621090c090b024002400240024002404114101f2202450d00200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d012002200329039003370014411821092002412c6a20034190036a41186a290300370000200241246a20034190036a41106a2903003700002002411c6a20034190036a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024134200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d042002101d4114101f2202450d09200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d0a200220032903b803370014412c21092002412c6a200341d0036a290300370000200241246a200341b8036a41106a2903003700002002411c6a200341b8036a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024134200341e8026a100120034190016a41086a2004290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002417f460d01200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0520032802b801210b2002101d200341e8026a41086a22024200370300200342003703e80241fdfdc0004111200341e8026a100120034190016a41086a2002290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002417f460d02200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0620032802b801200e470d030c0b0b2002101d41df80c10021040c130b2002101d41ac81c10021040c120b4100200e460d080b41f780c1002104411621090c100b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411441011020000b413441011020000b411441011020000b413441011020000b200341e8026a41086a22024200370300200342003703e80241ea81c100411b200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001024002400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0220032802b801200b6a200e4f0d010c030b4101200b6a200e490d020b418d81c1002104411f21090c0a0b41df88c0004133103a000b200341e8026a41086a22024200370300200342003703e802418afdc000410e200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001024002400240024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a105e20032802b8012205450d0220032802bc01210641d881c1002104411221090240200341c0016a280200220720114d0d000240200520114105746a220220034190036a460d00200220034190036a412010d0030d010b419782c100210441102109200720104d0d00200520104105746a2202200341b8036a460d022002200341b8036a412010d003450d020b2006450d122005101d0c120b41d881c1002104411221090c110b200341a8026a200341b8036a10910220032802b002210220032802a8022109200341e8026a41086a22044200370300200342003703e80241d5fdc0004112200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001410021040240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a105e20032802b8012224450d03200341c0016a280200210420032802bc0121390c010b41012124410021390b02400240200441ffffff3f7122042002200220044b1b2208450d0041002104200341d0016a210a200341c8016a210c200341c0016a210d2024210203400240200920046a2d0000450d00200a4200370300200c4200370300200d4200370300200342003703b801200341b8016a2002460d002002200341b8016a412010d003450d00200341b8016a200210fb014101210e20032802b8014101470d0020032802bc01200b4d0d030b200241206a2102200441016a22042008490d000b0b4100210e0b02402039450d002024101d0b024020032802ac02450d002009101d0b200320073602c001200320063602bc01200320053602b80120034190036a200341b8036a200e1b20112010200e1b200341b8016a1090024200210f200341e8026a41086a22024200370300200342003703e802418582c1004112200341e8026a100120034190016a41086a2002290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002210202400240024002400240200e450d002002417f460d01200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022202417f460d072002410f4d0d07200341c0016a290300210f20032903b80121230c020b2002417f460d02200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022202417f460d072002410f4d0d07200341c0016a290300212b20032903b801210f0c030b420021234200210f0b200341106a20034190036a2023200f10f2012003290310200341106a41086a29030010f301200341c5016a20034190036a41086a290300370000200341cd016a200341a0036a290300370000200341d5016a200341a8036a29030037000041012105200341013a00bc01200341063a00b80120032003290390033700bd01200341b8016a108b010c0a0b4200212b0b200341206a20034190036a109a010240024002402003290320200341286a29030084500d004118101f2202450d08200241106a41002900e9ba40370000200241086a41002900e1ba40370000200241002900d9ba40370000200241184138101e2202450d09200220032903b803370018200241306a200341d0036a290300370000200241286a200341b8036a41106a290300370000200241206a200341b8036a41086a29030037000042002123200341e8026a41086a22044200370300200342003703e80220024138200341e8026a1001200341a8026a41086a2004290300370300200320032903e8023703a802200341a8026a411041f8b3c200410041001002417f460d01200342003703c001200342003703b801200341a8026a4110200341b8016a4110410010022204417f460d072004410f4d0d07200341c0016a290300211e20032903b80121232002101d411421044114101f2202450d020c0a0b4184b8c0002104412221090c120b4200211e2002101d411421044114101f22020d080b200441011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411841011020000b413841011020000b200241106a41002800d5ba40360000200241086a41002900cdba40370000200241002900c5ba403700000240200220044134101e2202450d0020022003290390033700142002412c6a20034190036a41186a2204290300370000200241246a20034190036a41106a2903003700002002411c6a20034190036a41086a2903003700004200212a200341e8026a41086a22094200370300200342003703e80220024134200341e8026a1001200341a8026a41086a2009290300370300200320032903e8023703a802024002400240200341a8026a411041f8b3c200410041001002417f460d00200342003703c001200342003703b801200341a8026a4110200341b8016a4110410010022209417f460d022009410f4d0d02200341c0016a290300211220032903b801212a0c010b420021120b2002101d20034190036a202a200f20232023200f56201e202b56201e202b511b22021b220f7c22132012202b201e20021b222b7c2013202a54ad7c10e201200341b8036a2023200f7d201e202b7d2023200f54ad7d10e701200341c5016a200341b8036a41086a290300370000200341cd016a200341b8036a41106a290300370000200341d5016a200341b8036a41186a290300370000200341dd016a200329039003370000200341e5016a20034190036a41086a290300370000200341ed016a20034190036a41106a290300370000200341f5016a200429030037000041002104200341003a00bc01200341063a00b801200320032903b8033700bd01200341b8016a108b010c0f0b41df88c0004133103a000b413441011020000b410021040c0d0b2005101d0b20020d004101210241d7c0c1002104411521090c010b200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341e8026a41086a290300370300200341b8016a410d6a200341e8026a410d6a290000370000200320032f01e0023b01b803200320032903e8023703b801410021020b200341ac016a41026a220e200341b8036a41026a2d00003a000020034190016a41086a2205200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01b8033b01ac01200320032903b8013703900120020d03200341bb026a2005290300370000200341c0026a2003419d016a290000370000200320032f01ac013b01a802200320093600af02200320043600ab0220032003290390013700b3022003200e2d00003a00aa02200341e8026a41086a22024200370300200342003703e80241dfd9c0004115200341e8026a100120052002290300370300200320032903e802370390014100211d0240024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200342103702bc03200320034190016a3602b803200341b8016a200341b8036a10a40120032802b801220e450d0620032802bc01211d41282109200341c0016a280200221141286c22050d010c020b4108210e4100211141282109410041286c2205450d010b410021040340200341b8016a41206a200e20046a220241206a290300370300200341b8016a41186a200241186a290300370300200341b8016a41106a200241106a290300370300200341b8016a41086a200241086a290300370300200320022903003703b801200341b8016a200341a8026a412010d0030d022005200420096a2204470d000b0b4108212041002121201d450d01200e101d410021220c0b0b200341b8036a41206a2209200341b8016a41206a290300370300200341b8036a41186a2205200341b8016a41186a290300370300200341b8036a41106a2210200341b8016a41106a290300370300200341b8036a41086a2224200341b8016a41086a290300370300200320032903b8013703b80320034190036a41206a2225200929030037030020034190036a41186a2209200529030037030020034190036a41106a2205201029030037030020034190036a41086a22102024290300370300200320032903b80337039003200341e8026a41206a22242025290300370300200341e8026a41186a22252009290300370300200341e8026a41106a22092005290300370300200341e8026a41086a2205201029030037030020032003290390033703e8024128101f2220450d03202020032903e802370300202041206a2024290300370300202041186a2025290300370300202041106a2009290300370300202041086a2005290300370300201141286c41586a2004460d01200241286a212641282125200e201141286c6a222741586a212841012129412021054118212441102110410821114228212a4220212b4100212c4101212141012122410021020c040b410021220c090b41012121410121220c070b41df88c0004133103a000b412841081020000b02400340024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000102020b2026210202400340200341b8016a20056a2204200220056a290300370300200341b8016a20246a2209200220246a290300370300200341b8016a20106a2214200220106a290300370300200341b8016a20116a222d200220116a290300370300200320022903003703b801200341b8016a200341a8026a200510d0030d012027200220256a2202470d000c1a0b0b200341b8036a20056a22262004290300370300200341b8036a20246a222e2009290300370300200341b8036a20106a222f2014290300370300200341b8036a20116a2230202d290300370300200320032903b8013703b80320034190036a20056a2231202629030037030020034190036a20246a2226202e29030037030020034190036a20106a222e202f29030037030020034190036a20116a222f2030290300370300200320032903b8033703900320042031290300370300200920262903003703002014202e290300370300202d202f29030037030020032003290390033703b801024020222021470d00202120296a22222021490d1520212029742226202220222026491b2222ad202a7e2212202b88a70d152012a72226202c480d1502402021450d002020202120256c2026101e22200d010c040b2026101f2220450d030b200220256a21262020202120256c6a222e20032903b801370300202e20056a2004290300370300202e20246a2009290300370300202e20106a2014290300370300202e20116a202d290300370300202120296a212120282002470d070c180b2018203c2202203b6a223c490d0202402018203c6b2209203f490d0020162002203d6c6a22022903002016203c203d6c6a2204290300221f5a200220406a22142903002213200420406a222d29030022125a20132012511b0d0020042002290300370300202d201429030037030020042903102113200420416a200220416a290300370300200341b8016a20436a222f200420426a2214290300370300200341b8016a20416a2230200420446a222d290300370300200341b8016a20406a2231200420436a222e290300370300202e200220436a290300370300202d200220446a2903003703002014200220426a290300370300200320133703b80141012114024020092045490d002004290360201f5a200420466a290300221320125a20132012511b0d0041032114203e212d02400340202d220220476a2002290300370300200220486a200220426a290300370300200220496a200220446a2903003703002002204a6a200220436a2903003703002002204b6a200220416a2903003703002002204c6a200220406a2903003703002014222e20094f0d01202e203a6a21142002203d6a222d290300201f5a2002204d6a290300221320125a20132012511b450d000b0b202e203b6a21140b2002201f3703002002201237030820042014203d6c6a220220426a202f290300370300200220446a2030290300370300200220436a2031290300370300200220032903b8013703100b203e20476a213e203c0d070c140b206b216c4100216b4101216d206c20566a222f450d0702400240024002400240024002402016202f200d6c6a22022903002016206c200d6c222d6a2204205f6a2903002213542002200b6a290300221f2004205e6a290300221254201f2012511b450d002053202d6a21020340202f2039460d0220132002290300223254210420122002200b6a290300221f5121092012201f5421142002200c6a2102202f20566a212f20322113201f21122004201420091b0d000c030b0b206c205b6a212e2053202d6a21024100216b410021040340202e2004460d052013200229030022325a210920122002200b6a290300221f5121142012201f5a212d2002200c6a2102200420396a210420322113201f21122009202d20141b0d000b200420396a216d206c20046b20566a222f0d030c020b4100212f0b206c202f490d06206c20184b0d080240206c202f6b226d2039762209450d002051202d6a21022016202f200d6c6a21040340200341b8016a200a6a22142004200a6a222d290300370300200341b8016a20076a222e200420076a2230290300370300200341b8016a20066a2231200420066a2235290300370300200341b8016a20086a2236200420086a226e290300370300200341b8016a200b6a226f2004200b6a2270290300370300200320042903003703b8012002200b6a22712903002112200220086a22722903002113200220066a2273290300211f200220076a2274290300213220022903002133202d2002200a6a2275290300370300203020323703002035201f370300206e20133703002070201237030020042033370300207520142903003703002074202e29030037030020732031290300370300207220362903003703002071206f290300370300200220032903b8013703002004200d6a21042002200c6a2102200920566a22090d000b0b202f0d010b202f216b2069206a460d0f0c100b206d20604b0d01206c20184b0d052052202f200d6c6a2176410021770c100b206c216d2069206a460d090c0a0b202f216b2069206a470d0b0c0a0b202641081020000b203c2018102a000b202f206c102a000b206c202f417f6a226b490d0d0b206c2018102b000b410021020c0a0b410121020c090b410021020c070b410121020c060b410221020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b2069206a470d10410121020c140b206920396a22022069490d1620692039742204200220022004491b2202ad2023862212200f88a70d162012a722042054480d16024002402069450d00206820692057742004101e22680d010c030b2004101f2268450d020b20022169410221020c130b2068206a2057746a2202206d3602042002206b360200206a20396a2278216a20782058490d02410121770c110b200441041020000b0240024020770e020001010b206c202f20566a226b490d130240206c206b6b226d2058490d002016202f200d6c6a22022903002016206b200d6c6a2204290300221f5a2002200b6a220929030022132004200b6a221429030022125a20132012511b0d00200420022903003703002014200929030037030020042903102113200420086a200220086a290300370300200341b8016a20066a222e2004200a6a2209290300370300200341b8016a20086a2230200420076a2214290300370300200341b8016a200b6a2231200420066a222d290300370300202d200220066a2903003703002014200220076a29030037030020092002200a6a290300370300200320133703b801410121090240206d2057490d002004290360201f5a200420616a290300221320125a20132012511b0d0041032109207621140240034020142202200c6a2002290300370300200220626a2002200a6a290300370300200220636a200220076a290300370300200220646a200220066a290300370300200220656a200220086a2903003703002002205a6a2002200b6a2903003703002009222d206d4f0d01202d20396a21092002200d6a2214290300201f5a200220666a290300221320125a20132012511b450d000b0b202d20566a21090b2002201f3703002002201237030820042009200d6c6a2202200a6a202e290300370300200220076a2030290300370300200220066a2031290300370300200220032903b8013703100b206b450d0c2076200c6a2176206b212f206d2067490d0a410021020c110b024002400240024020682078223120566a22782057746a2202280200450d00206820312057746a222d205c6a2802002214200228020422044d0d004102216a203141024d0d042068203120596a22022057746a2802042209200420146a4d0d014103216a203141034d0d04202d205d6a280200200920146a4d0d010c050b20312057490d01200228020421042068203120596a22022057746a28020421090b20092004490d010b2031205b6a21020b2031200220396a22704d0d03203120024d0d04206820022057746a2236280204227120362802006a2202206820702057746a226e280200226f490d05200220184b0d06203620556a21722016206f200d6c6a2230206e2802042235200d6c22046a216a2002200d6c2109024002400240024002402002206f6b222d20356b220220354f0d00204f206a2002200d6c220410ce031a205020046a211420352039480d0120022039480d01205120096a2109206a2102034020092002200c6a226a2014200c6a222d202d290300206a290300542014205a6a29030022122002205a6a29030022135420122013511b222e1b22042903003703002009200a6a2004200a6a290300370300200920076a200420076a290300370300200920066a200420066a290300370300200920086a200420086a2903003703002009200b6a2004200b6a2903003703002014202d202e1b21142030206a2002202e1b22024f0d042009200c6a21092050210420502014490d000c050b0b204f2030200410ce031a205020046a211420352039480d01202d20354c0d01201620096a212e205021042030210203402002206a2004206a290300200429030054206a200b6a29030022122004200b6a29030022135420122013511b222d1b22092903003703002002200a6a2009200a6a290300370300200220076a200920076a290300370300200220066a200920066a290300370300200220086a200920086a2903003703002002200b6a2009200b6a29030037030020042004200d6a202d1b21042002200d6a2102206a200d6a206a202d1b226a202e4f0d04201420044b0d000c040b0b206a21020c010b203021020b205021040b20022004201420046b22092009200d706b10ce031a2072207120356a3602002036206f360200206e206e200b6a207020567320316a20577410cf031a2078216a207820394b0d0a0b206b0d060c010b2031216a206b0d060b02402069450d002068101d0b204e450d11204f101d0c110b4188bfc30020702031104b000b4188bfc30020022031104b000b206f2002102a000b20022018102b000b410221020c090b410221020c080b410021770c030b410121770c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b206b206c102a000b1021000b200320183602c001200320173602bc01200320163602b801200341e8026a41086a22024200370300200342003703e80241c2fdc0004113200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001200341103602ec02200320034190016a3602e802200341b8016a200341e8026a10850202402017450d002016101d0b0240201a450d00201c101d0b02402015450d002019101d0b410021040240201ea7450d00201b101d0b0b410121054101210b0b200128020022024102460d050c060b201d450d00200e101d0b200320213602c001200320223602bc01200320203602b801200341e8026a41086a22024200370300200342003703e80241dfd9c0004115200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001200341103602bc03200320034190016a3602b803200341b8016a200341b8036a1087022022450d002020101d0b410021040b410121050b4101210b200128020022024102470d010b2005450d01200141086a280200450d012001280204101d0c010b20024101470d00200b450d00200141086a280200450d002001280204101d0b2000200936020420002004360200200341e0036a24000bdf1505067f017e047f017e047f230041d0006b22042400200441c0006a41086a220542003703002004420037034041d5fdc0004112200441c0006a1001200441306a41086a200529030037030020042004290340370330410021060240024002400240024002400240200441306a411041f8b3c200410041001002417f460d00200442103702442004200441306a360240200441106a200441c0006a105e20042802102207450d02200441186a2802002106200428021421080c010b41012107410021080b200441c0006a41086a220542003703002004420037034041c6fcc0004114200441c0006a1001200441106a41086a2005290300370300200420042903403703100240200441106a411041f8b3c200410041001002417f460d00419d87c1002105412e21062008450d040c030b200542003703002004420037034041fdfdc0004111200441c0006a1001200441306a41086a200529030037030020042004290340370330024002400240200441306a411041f8b3c200410041001002417f460d0020044100360210200441306a4110200441106a41044100100241016a41044d0d0220042802102003470d010c040b41002003460d030b41cb87c10021054114210620080d030c040b41df88c0004133103a000b41df88c0004133103a000b024002402006450d002006200241086a28020022094f0d0141a088c100210541c500210620080d020c030b41df87c100210541c100210620080d010c020b02400240024002400240024002400240024002400240024002404114101f2205450d00200541106a41002800b58041360000200541086a41002900ad8041370000200541002900a58041370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a2900003700004200210a200441c0006a41086a220642003703002004420037034020054134200441c0006a1001200441106a41086a200629030037030020042004290340370310200441106a411041f8b3c20041004100100221062005101d2006417f470d05200441c0006a41086a2205420037030020044200370340418582c1004112200441c0006a1001200441306a41086a20052903003703002004200429034037033002400240200441306a411041f8b3c200410041001002417f460d002004420037031820044200370310200441306a4110200441106a4110410010022205417f460d042005410f4d0d04200441186a290300210f2004290310210a0c010b4200210f0b200441086a2001200a200f10cc01024020042802082205450d00200428020c210620080d0e0c0f0b200441c0006a41086a2205420037030020044200370340418afdc000410e200441c0006a1001200441306a41086a20052903003703002004200429034037033041002105024002400240200441306a411041f8b3c200410041001002417f460d00200442103702442004200441306a360240200441106a200441c0006a105e20042802102210450d06200441106a41086a2206280200210e20042802142105200441106a41186a200141186a290000370300200441106a41106a200141106a2900003703002006200141086a29000037030020042001290000370310200441106a210620052111200e2005460d010c020b200441106a41186a200141186a290000370300200441106a41106a200141106a290000370300200441106a41086a200141086a2900003703002004200129000037031041012110200441106a21060b200541016a220e2005490d092005410174220d200e200e200d491b2211ad420586220a422088a70d09200aa7220d4100480d0902402005450d002005210e20102005410574200d101e22100d010c060b2005210e200d101f2210450d050b2010200e410574220d6a22052006290000370000200541186a200641186a290000370000200541106a200641106a290000370000200541086a200641086a290000370000200441c0006a41086a2205420037030020044200370340418afdc000410e200441c0006a1001200441306a41086a20052903003703002004200429034037033020044100360218200442013703102004200e41016a2205360240200441c0006a200441106a10620240024002402005450d00200d41206a210b4100200441106a41086a28020022066b210d200428021021122004280214210c2010210503400240200c200d6a411f4b0d00200641206a220e2006490d0d200c4101742213200e200e2013491b220e4100480d0d02400240200c450d002012200c200e101e22120d010c060b200e101f2212450d050b200e210c0b201220066a220e2005290000370000200e41186a200541186a290000370000200e41106a200541106a290000370000200e41086a200541086a290000370000200d41606a210d200641206a2106200541206a2105200b41606a220b0d000b200441186a20063602002004200c360214200420123602100c010b200441106a41086a28020021062004280214210c200428021021120b200441306a41102012200610030240200c450d002012101d0b2011450d062010101d411421064114101f22050d070c080b200e41011020000b411441011020000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b200d41011020000b411421064114101f2205450d010b200541106a41002800b58041360000200541086a41002900ad8041370000200541002900a58041370000200520064134101e2205450d03200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441c0006a41086a220642003703002004420037034020054134200441c0006a1001200441306a41086a20062903003703002004200429034037033020042003360210200441306a4110200441106a410410032005101d2002280204210b2002280200210c4113101f2202450d042002410f6a41002800998741360000200241086a410029009287413700002002410029008a8741370000200241134133101e220d450d05200d2001290000370013200d412b6a200141186a290000370000200d41236a200141106a290000370000200d411b6a200141086a290000370000200441c0006a41086a2202420037030020044200370340200d4133200441c0006a1001200441306a41086a200229030037030020042004290340370330200441003602182004420137031020042009360240200441c0006a200441106a1062024002402009450d00200441186a220e280200210220042802142105200c21060340024002400240024020022005470d00200541016a22012005490d0820054101742203200120012003491b22034100480d082005450d01200428021020052003101e22010d020c090b200428021021010c020b2003101f2201450d070b2004200336021420042001360210200321050b200e200241016a2203360200200120026a20062d00003a000020032102200641016a21062009417f6a22090d000c020b0b200441186a280200210320042802142105200428021021010b200441306a411020012003100302402005450d002001101d0b200d101d0240200b450d00200c101d0b4100210502402008450d002007101d0b0c080b200641011020000b1021000b200341011020000b413441011020000b411341011020000b413341011020000b2007101d0b200241046a280200450d002002280200101d0b2000200636020420002005360200200441d0006a24000bef0703057f037e037f230041306b22032400024002400240024002402002280208220420014d0d0020022802002105200241086a2004417f6a2206360200200520064105746a22072900002108200729000821092007290010210a200520014105746a220141186a200741186a2900003700002001200a37001020012009370008200120083700002002280204210b200341106a41086a2202420037030020034200370310418afdc000410e200341106a1001200341206a41086a20022903003703002003200329031037032020034100360218200342013703102003200636020c2003410c6a200341106a106202400240024002402006450d00200441057441606a2104200228020021062003280210210c200328021421012005210203400240024002400240200120066b41204f0d00200641206a22072006490d072001410174220d20072007200d491b220d4100480d072001450d01200c2001200d101e220c0d020c080b200641206a21070c020b200d101f220c450d060b200d21010b200c20066a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020072106200241206a2102200441606a22040d000b200341186a2007360200200320013602142003200c3602100c010b20022802002107200328021421012003280210210c0b200341206a4110200c2007100302402001450d00200c101d0b0240200b450d002005101d0b4113101f2202450d032002410f6a41002800998741360000200241086a410029009287413700002002410029008a8741370000200241134133101e2202450d04200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a290000370000200341106a41086a220642003703002003420037031020024133200341106a1001200341206a41086a200629030037030020032003290310370320200341206a411010092002101d4114101f2202450d05200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d06200220002900003700142002412c6a200041186a290000370000200241246a200041106a2900003700002002411c6a200041086a290000370000200341106a41086a220642003703002003420037031020024134200341106a1001200341206a41086a200629030037030020032003290310370320200341206a411010092002101d200341306a24000f0b1021000b200d41011020000b4198a9c30020012004104b000b411341011020000b413341011020000b411441011020000b413441011020000bcc0201027f230041306b220224000240024002404113101f2203450d002003410f6a41002800998741360000200341086a410029009287413700002003410029008a8741370000200341134133101e2203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241206a41086a220142003703002002420037032020034133200241206a1001200241086a200129030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a10920220022802202201450d0420002002290224370204200020013602000c010b20004100360208200042013702000b2003101d200241306a24000f0b411341011020000b413341011020000b41df88c0004133103a000bf602010a7f230041106b220224002002200110d501024002400240024002400240024002402002280200450d0020022802042203417f4c0d062003450d012003101f2204450d07200141046a2105200141086a21064100210741002108200321090340200241003a000f200128020020052802002002410f6a410120062802001002210a20062006280200200a41016a41014b220a6a360200200a450d04200841016a210a20022d000f210b024020082009470d002007200a200a2007491b22094100480d0602402008450d00200420082009101e22040d010c080b2009101f2204450d070b200420086a200b3a0000200741026a2107200a2108200a2003490d000c030b0b20004100360200200241106a24000f0b410121044100210a410021090b2000200936020420002004360200200041086a200a360200200241106a24000f0b2000410036020002402009450d002004101d0b200241106a24000f0b1021000b200941011020000b102e000b200341011020000bcc0403037f017e047f23004180026b220424000240024020012d000d450d0041b489c1002102413121050c010b2001280200200141046a2205280200200141086a220628020010940220054200370200200141f0c0c100360200200420022900002207370310024002400240024041e401101f2208450d00200841003b010620084100360200200841086a200441206a41dc0110ce031a200541003602002001200836020020082f01062209410374210a417f210541002102024002400240024002400340200a2002460d01200441106a200820026a41086a410810d003220b450d03200241086a2102200541016a2105200b41004e0d000c020b0b200921050b20042007370234200420063602302004200536022c2004200136022820042008360224200441003602202004410036021820044201370310200328020021082004200328020422023602002004200441106a106202402004280214220b200428021822056b20024f0d00200520026a220a2005490d05200b4101742203200a200a2003491b220a4100480d05200b450d022004280210200b200a101e220b450d030c060b2004280210210b0c060b418789c1002102412d21050c060b200a101f220b0d030b200a41011020000b41e40141041020000b1021000b2004200a3602142004200b3602100b200441106a41086a220a200520026a360200200b20056a2008200210ce031a200441086a200a28020036020020042004290310370300200441206a200410950220014180023b010c410021020b200020053602042000200236020020044180026a24000be20303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200141016a2101200441e0006a2802002204450d030c010b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b2000101d2005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b2001101d2005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a2802002104024020064101460d00410120066b2101034020002802e4012100200141016a22010d000b0b410021012004450d020b2002417f6a210202402005a7450d002004101d0b20020d000b0b0240200041f0c0c100460d00200028020021012000101d2001450d00200128020021042001101d2004450d00024020042802002201450d0003402004101d2001210420012802002200210120000d000b0b2004101d0b0bea1105027f017e067f037e0b7f230041e0026b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241306a41086a2207200141086a28020036020020022001290200370330024020002f01062201410b4f0d00200020034103746a220841106a200841086a2208200120036b41037410cf031a2008200437000020002003410c6c6a220141ec006a200141e0006a2209200041066a22082f010020036b410c6c10cf031a200141e8006a200728020036020020092002290330370200200820082f010041016a3b01002002200036001720022006360013200241e0026a24000f0b02400240024041e401101f220a450d00200a41003b0106200a4100360200200a41086a200241d0006a41dc0110ce032107200241d0006a41086a2208200041b0016a280200360200200220002902a8013703502000413c6a330000210b2000413e6a310000210c20002d003f21092000350038210d2007200041c0006a200041066a220e2f010041796a220141037410ce032107200a41e0006a200041b4016a2001410c6c10ce03210f200e41063b0100200a20013b0106200241c0006a41086a200828020036020020022002290350370340200d200b200c4210868442208684210b02400240200341064b0d00200041086a20034103746a220741086a2007200041066a22012f010020036b41037410cf031a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c10cf031a200741086a200241306a41086a280200360200200720022903303702000c010b200720034103746a41506a2007200341796a22084103746a2207200141ffff037120086b41037410cf031a20072004370000200f2003410c6c6a220341b87f6a200341ac7f6a2207200a41066a22012f010020086b410c6c10cf031a200341b47f6a200241306a41086a280200360200200720022903303702000b200120012f010041016a3b0100200241206a41086a2210200241c0006a41086a2211280200360200200220093a0017200220022903403703202002200b3e02102002200b4230883c00162002200b4220883d0114200241086a22122010280200360200200220022903203703002002290310210402400240024020002802002209450d0020002f0104211303402002200641016a220636021020022009360214200241306a41086a2214201228020036020020022002290300370330201341ffff0371210820092f01062200410a4d0d02419402101f2207450d03200741003b010620074100360200200741086a200241d0006a418c0210ce032103200941386a290000210b200241d0006a41086a220f200941b0016a2802003602002002200941a8016a2902003703502003200941c0006a200941066a22152f0100220141796a220041037410ce032116200741e0006a200941b4016a2000410c6c10ce032117200741e4016a20094180026a2001417a6a220e41027410ce032118201541063b0100200720003b01060240200e450d00410021002018210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b2011200f28020036020020022002290350370340200f20112802003602002002200229034037035002400240201341ffff0371220341064b0d00200941086a2200200841016a220e4103746a200020084103746a220020152f0100220120086b221341037410cf031a20002004370000200941e0006a2008410c6c6a2200410c6a20002013410c6c10cf031a200041086a2014280200360200200020022903303702002015200141016a22003b0100200941e4016a2201200841027422156a41086a2001200e4102746a2213200041ffff03712201200e6b41027410cf031a2013200a360200200320014f0d01200920156a41e8016a2100034020002802002203200841016a22083b010420032009360200200041046a210020012008470d000c020b0b20162008417a6a22034103746a2016200841796a22004103746a220e200741066a22012f010020006b41037410cf031a200e200437000020172008410c6c6a220e41b87f6a200e41ac7f6a221320012f0100221520006b410c6c10cf031a200e41b47f6a2014280200360200201320022903303702002001201541016a220e3b01002018200841027422136a416c6a201820034102746a2201200e41ffff0371220820036b41027410cf031a2001200a360200200320084b0d00200720136a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320082000470d000b0b2010200f280200360200200220022903503703202012201028020036020020022002290320370300024020092802002200450d0020092f0104211320002109200b21042007210a0c010b0b2007210a200b21040b419402101f2200450d03200041003b010620004100360200200041086a200241d0006a418c0210ce0321012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f010622034103746a200437000020002003410c6c6a220141e8006a200241086a280200360200200141e0006a2002290300370200200041e4016a200341016a22034102746a200a360200200020033b0106200a20033b0104200a20003602000c040b200941086a2201200841016a22034103746a200120084103746a2201200020086b220741037410cf031a2001200437000020092008410c6c6a220141ec006a200141e0006a220e2007410c6c10cf031a200141e8006a200241306a41086a280200360200200e2002290330370200200941066a200041016a22003b0100200941e4016a220120084102746a41086a200120034102746a2201200041ffff0371220720036b41027410cf031a2001200a360200201341ffff037120074f0d0320092003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b010420012009360200200341046a210320072000470d000c040b0b41940241041020000b41e40141041020000b41940241041020000b200241e0026a24000bae0901097f230041106b2202240020024100360208200242013703002002410436020c2002410c6a200210620240024002400240024002400240024020022802042203200228020822046b41044f0d00200441046a22052004490d0520034101742206200520052006491b22064100480d052003450d01200228020020032006101e2203450d020c030b200441046a2105200228020021030c030b2006101f22030d010b200641011020000b20022006360204200220033602000b200241086a22062005360200200320046a41eede91ab063600002002410e36020c2002410c6a200210620240024002400240024020022802042203200628020022066b410e4f0d002006410e6a22052006490d0520034101742204200520052004491b22074100480d052003450d01200228020020032007101e2204450d020c030b2006410e6a2105200228020021040c030b2007101f22040d010b200741011020000b2002200736020420022004360200200721030b200241086a22072005360200200420066a220641066a41002900848c42370000200641002900fe8b423700000240200320056b41034b0d00200541046a22062005490d0120034101742208200620062008491b22064100480d010240024002402003450d00200420032006101e2204450d010c020b2006101f22040d010b200641011020000b20022006360204200220043602000b2007200541046a360200200420056a410a360000024020022802042203200728020022056b41034b0d00200541046a22062005490d0120034101742207200620062007491b22064100480d010240024002402003450d00200420032006101e2204450d010c020b2006101f22040d010b200641011020000b20022006360204200220043602000b200241086a2203200541046a360200200420056a41393600000240024002400240024020022802042205200328020022046b41044f0d00200441046a22032004490d0520054101742206200320032006491b22034100480d052005450d01200228020020052003101e2205450d020c030b200228020021050c030b2003101f22050d010b200341011020000b20022003360204200220053602000b200241086a2208200441046a360200200520046a41393600002002410836020c2002410c6a2002106220082802002106418c8cc20021072002280204210503400240024002400240200520066b41084f0d00200641086a22042006490d0520054101742203200420042003491b22094100480d052005450d01200228020020052009101e22030d020c060b200641086a2104200228020021030c020b2009101f2203450d040b2002200936020420022003360200200921050b20082004360200200320066a2007290000370000200741086a28020021090240200520046b41034b0d00200441046a22062004490d022005410174220a20062006200a491b22064100480d02024002402005450d00200320052006101e22030d010c060b2006101f2203450d050b2002200636020420022003360200200621050b2008200441046a2206360200200320046a20093600002007410c6a220741ec8cc200470d000b200241106a24002006ad4220862003ad840f0b1021000b200941011020000b200641011020000bff1b05027f017e087f017e027f23004180096b22022400024002402001450d00200220003602180c010b200241f8b3c2003602180b2002200136021c20024198076a200241186a109802024002400240024002400240024020022802a007450d00200241206a20024198076a41880110ce031a200241a8016a200241206a41880110ce031a20022903a801200241bc016a2201200241fc016a220310d201200241086a419090c1004115108f01024020022802084101470d002002290310210420024198076a41086a22004200370300200242003703980741a590c100411720024198076a1001200241a8036a41086a2205200029030037030020022002290398073703a803200241a8036a411041f8b3c200410041001002417f470d0020004200370300200242003703980741a590c100411720024198076a10012005200029030037030020022002290398073703a8032002200437039807200241a8036a411020024198076a410810030b024002400240024020022903a8012204500d0020024198076a2004427f7c10af0120024198076a2001412010d0030d004100210620022802a0022100024002400240200241a8026a280200220141e8016c41e801490d002001410c6c2205101f2207450d0b2001210820010d010c020b41042107410021082001450d010b200141e8016c2105200141037441786a2109200721010340200220003602a80320024198076a200241a8036a109902200141086a20024198076a41086a28020036020020012002290398073702002001410c6a2101200041e8016a2100200541987e6a22050d000b200941037641016a21060b4104210a410021054100210b02402006410c6c2201410c490d002001410c6e220b41037422004100480d0a2000101f220a450d0b0b0240200720016a220c2007460d0041002105200a210120072100034020002802002109200141046a200041086a28020036020020012009360200200141086a2101200541016a21052000410c6a2200200c470d000b0b20024198076a200a2005109a020240200b450d00200a101d0b02402006450d002006410c6c21002007210103400240200141046a280200450d002001280200101d0b2001410c6a2101200041746a22000d000b0b02402008450d002007101d0b0240200320024198076a412010d003450d004189aec200410e100a20034120101220024198076a412010120b200320024198076a412010d0030d05200241a4026a2802002106200241a8016a41f8006a2802002107200241a8026a2802002105200241b0026a200241a8016a41f80010ce031a2007200541e8016c6a210020022903b002210d20072101024002400240024002402005450d00200241a8036a41f8006a210920024198076a41086a210c200721010340200241a8066a200141f00010ce031a200141f0006a2903002104200241b8056a200141f8006a41f00010ce031a20044203510d02200241a8036a200241a8066a41f00010ce031a200241a8036a41f0006a20043703002009200241b8056a41f00010ce031a2002200241a8036a3602900520024198076a20024190056a109902200c28020021050240200228029c07450d00200228029807101d0b20024198076a200241a8036a41e80110ce031a200241003602a00520024190056a20024198076a2005200241a0056a1086012002280290054101460d0502402002280294052205450d00200520024190056a41086a280200100a0b200141e8016a22012000470d000b200021010b20012000470d010c020b200141e8016a22012000460d010b200241a0086a210520024198076a41f8006a2109034020024198076a200141f00010ce031a200141f0006a2903002104200241a8036a200141f8006a41f00010ce031a20044203510d01200241a8066a20024198076a41f00010ce031a200241b8056a200241a8036a41f00010ce031a20024198076a200241a8066a41f00010ce031a20024198076a41f0006a20043703002009200241b8056a41f00010ce031a2005103c200141e8016a22012000470d000b0b02402006450d002007101d0b10da01200d108d0120024198076a10dd012002200241b0026a41106a280200220a3602b00520022802b802210b200220024198076a41106a28020022013602b405200a2001470d0720022802a007210302400240200a450d0041002106034002400240200b200641286c22006a22012d00002205200320006a22002d0000470d0002400240024020054101460d0020054102470d0120012802082209200041086a280200470d03200141186a210c2009450d02200c290300200041186a290300520d032001290320200041206a290300520d03200141146a280200220e200041146a280200470d032001410c6a28020022092000410c6a280200220c460d04417f21070340200741016a2207200e4f0d052009200c412010d0030d04200c41206a2108200941206a210f200941286a2109200c41286a210c200f2903002008290300510d000c040b0b2001410c6a28020022082000410c6a280200470d022008450d03200141046a2802002209200041046a280200220c460d034100210703402009200c412010d0030d03200941206a2109200c41206a210c200741016a22072008490d000c040b0b20002001460d02200141016a200041016a412010d0030d010c020b200c290300200041186a290300520d00200141146a280200220e200041146a280200470d002001410c6a28020022092000410c6a280200220c460d01417f21070340200741016a2207200e4f0d022009200c412010d0030d01200c41206a2108200941206a210f200941286a2109200c41286a210c200f2903002008290300510d000b0b41c38dc2004114100a200241a8036a200110d40120022802a8032209200241a8036a41086a22052802001012024020022802ac03450d002009101d0b200241a8036a200010d40120022802a803220920052802001012024020022802ac03450d002009101d0b20012d000020002d00002205470d030b024002400240024020054101460d0020054102470d0120012802082205200041086a280200470d06200141186a21092005450d022009290300200041186a290300520d062001290320200041206a290300520d06200141146a2802002207200041146a280200470d062001410c6a28020022012000410c6a2802002200460d03417f21050340200541016a220520074f0d0420012000412010d0030d07200041206a2109200141206a210c200141286a2101200041286a2100200c2903002009290300510d000c070b0b2001410c6a28020022092000410c6a280200470d052009450d02200141046a2802002201200041046a2802002200460d0241002105034020012000412010d0030d06200141206a2101200041206a2100200541016a22052009490d000c030b0b20002001460d01200141016a200041016a412010d003450d010c040b2009290300200041186a290300520d03200141146a2802002207200041146a280200470d032001410c6a28020022012000410c6a2802002200460d00417f21050340200541016a220520074f0d0120012000412010d0030d04200041206a2109200141206a210c200141286a2101200041286a2100200c2903002009290300510d000c040b0b200641016a2206200a490d000b0b200241a8036a41186a22014200370300200241a8036a41106a22004200370300200241a8036a41086a22054200370300200242003703a803200241a8036a100d200241a8066a41186a2001290300370300200241a8066a41106a2000290300370300200241a8066a41086a2005290300370300200220022903a8033703a8060240200241e4026a2201200241a8066a412010d003450d004189aec200410e100a200141201012200241a8066a412010120b2001200241a8066a412010d0030d090240200a450d00200a41286c2100200321010340024020012d00002205450d00024020054101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b0240200241a4076a280200450d002003101d0b0240200241b0026a41106a2802002200450d00200241b0026a41086a2802002101200041286c21000340024020012d00002205450d00024020054101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b0240200241bc026a280200450d00200241b8026a280200101d0b20024180096a240042010f0b41e8d7c200102c000b2002280294052202450d0120024103460d0220024104460d0341b8d7c200102c000b41c0d6c200102c000b4188d7c200102c000b41f0d6c200102c000b41a0d7c200102c000b200241bc036a4101360200200241183602ac01200241d0a9c3003602a801200242013702ac03200241d8a9c3003602a8032002200241a8016a3602b803200241a8036a41e0a9c30010cf01000b41d8d6c200102c000b2002200241b0056a3602a0052002200241b4056a36029005200241a8036a41146a4100360200200241a8066a41146a411c360200200241b4066a4120360200200241b8056a41146a4103360200200241f8b3c2003602b803200242013702ac03200241d0d7c2003602a803200241203602ac06200242033702bc05200241e0b0c4003602b8052002200241a8036a3602b806200220024190056a3602b0062002200241a0056a3602a8062002200241a8066a3602c805200241b8056a41d8d7c20010cf01000b4180d8c200102c000b200541041020000b1021000b200041041020000bfb0609047f017e017f017e037f017e047f017e017f230041a0066b22022400200241d8026a20011059200241e8026a280200210320022802e402210420022802e002210520022903d8022106200241b0056a200241ec026a41e40010ce031a024002400240024002400240024002400240024002402005450d00200241106a200241b0056a41e40010ce031a200241086a200110b5012002280208450d08200228020c2207ad42e8017e2208422088a70d032008a72209417f4c0d032009450d012009101f220a450d042007450d020c050b20004100360208200241a0066a24000f0b4108210a20070d030b4100210f4200210c200a450d050c030b102e000b200941081020000b200241d8026a41f8006a210b4200210c4100210d410021094100210e2007210f0340200241d8026a200110b401200241b0056a200241d8026a41f00010ce031a200241d8026a41f0006a2903002108200241c0046a200b41f00010ce031a20084203510d02200e41016a2110200241e8016a200241b0056a41f00010ce031a200241f8006a200241c0046a41f00010ce031a0240200e200f470d00200d20102010200d491b220fad42e8017e2211422088a70d052011a722124100480d050240200e450d00200a20092012101e220a0d010c070b2012101f220a450d060b200a20096a200241e8016a41f00010ce03220e41f0006a2008370300200e41f8006a200241f8006a41f00010ce031a200c4280808080107c210c200d41026a210d200941e8016a21092010210e20102007490d000b200a450d020b200241d8026a200241106a41e40010ce031a200041106a20033602002000200436020c2000200536020820002006370300200041146a200241d8026a41e40010ce031a200041fc006a200c200fad84370200200041f8006a200a360200200241a0066a24000f0b0240200e450d00200a4188016a211003402010103c201041e8016a2110200941987e6a22090d000b0b200f450d00200a101d0b2000410036020802402003450d00200341286c2110200521090340024020092d0000220e450d000240200e4101470d00200941086a280200450d01200941046a280200101d200941286a2109201041586a22100d020c030b200941106a280200450d002009410c6a280200101d0b200941286a2109201041586a22100d000b0b02402004450d002005101d0b200241a0066a24000f0b1021000b201241081020000b8a1203047f027e097f230041206b22022400024002400240024002400240024002400240024002400240024041ea01101f2203450d00200242ea0137020420022003360200200341003b00002002410236020802400240024002400240200128020022032903704202520d0020022802044102470d01200228020041024104101e2201450d062002410436020420022001360200200241086a28020021040c020b20022802044102470d02200228020041024104101e2201450d062002410436020420022001360200200241086a28020021040c030b41022104200228020021010b200120046a41013a0000200241086a2201200128020041016a3602000c070b41022104200228020021010b200120046a4181013a0000200241086a2201200128020041016a360200200341086a200210bc0202400240024020022802042204200128020022016b41c0004f0d00200141c0006a22052001490d0920044101742201200520052001491b22014100480d092004450d01200228020020042001101e2204450d020c060b200228020021040c060b2001101f22040d040b200141011020000b41ea0141011020000b410441011020000b410441011020000b2002200136020420022004360200200241086a28020021010b200241086a2205200141c0006a360200200420016a220141086a200341346a290000370000200141106a2003413c6a290000370000200141186a200341c4006a290000370000200141206a200341cc006a290000370000200141286a200341d4006a290000370000200141306a200341dc006a290000370000200141386a200341e4006a2900003700002001200329002c3700002003200210b10102400240024002400240024002400240024002400240200341f0006a2903004201520d0020032903782206420c882207420120074201561b22074200510d0620034180016a290300200780210720022802042204200241086a28020022016b41024f0d01200141026a22052001490d0c20044101742201200520052001491b22014100480d0c2004450d04200228020020042001101e2204450d050c090b0240200228020420052802002201470d00200141016a22042001490d0c20014101742205200420042005491b22054100480d0c2001450d02200228020020012005101e2204450d030c070b200228020021040c070b200228020021040c080b2005101f22040d040b200541011020000b2001101f22040d040b200141011020000b41a88ec300102c000b2002200536020420022004360200200241086a28020021010b200241086a200141016a360200200420016a41003a00000c020b2002200136020420022004360200200241086a28020021010b200241086a200141026a360200200420016a2007a741047420067aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b20034188016a200210b201200241086a22032802002101200241003602182002420137031020022001417e6a36021c2002411c6a200241106a1062024002400240024002402003280200220141014d0d002002280218210520022802102108200228021421092003410036020020022802002103024002400240024002400240024002402001417e6a220a450d004102210b2005450d12200320082d00003a00004101210c200241086a2204200428020041016a36020020054101460d12200820056a210d200320082d00013a00012004200428020041016a3602004102210b200841026a21044100210e2005417e6a2203450d052002280204220b20016b20034f0d01200120036a220c2001490d0d200b4101742201200c200c2001491b220c4100480d0d200b450d022002280200200b200c101e22010d030c0a0b0240024002402002280204220120054f0d0020014101742204200520052004491b22044100480d0f2001450d01200320012004101e2203450d020c110b4100210b2005450d120c110b2004101f22030d0f0b200441011020000b200228020021010c020b200c101f2201450d070b2002200c360204200220013602000b200120056a200141026a200a10cf031a02402005200241086a220b280200220c460d002002280200200c6a210120052103034020034102460d03200120042d00003a0000200b200b28020041016a360200200141016a2101200441016a2104200c2003417f6a2203470d000b200d20046b2203450d030b20034100480d082003101f220c450d042005210b2003210e0b200d2004460d060c050b2005210b200a0d0b0c0c0b4101210c2005210b200d2004470d030c040b41b0aec400102c000b200341011020000b200c41011020000b200c20042d00003a00004101210f0240200441016a2203200d460d00200c41016a2101200520046b21040340200120032d00003a0000200141016a2101200d200341016a2203470d000b200820046a220f450d010b200c200f6a210d024002400240024020022802042203200b200a6a22016b200f4f0d002001200f6a22042001490d0520034101742201200420042001491b22014100480d052003450d01200228020020032001101e22030d020c060b200228020021030c020b2001101f2203450d040b20022001360204200220033602000b2003200f200b6a22106a2003200b6a200a10cf031a02402010200241086a22042802002203460d00200228020020036a2101200f200b6a20036b2105200c21030340200d2003460d01200120032d00003a00002004200428020041016a360200200341016a2103200141016a21012005417f6a22050d000b0b2010210b0b0240200e450d00200c101d0b200a450d060c050b1021000b200141011020000b2002200436020420022003360200200241086a280200210b0b2003200b6a220120082d00003a0000024020054101470d00200b41016a210b0c010b2005417f6a2104200841016a2103200141016a21010340200120032d00003a0000200141016a2101200341016a21032004417f6a22040d000b200b20056a210b0b200241086a200b3602004102210b200a450d010b0240200b200241086a22012802002203460d002002280200220420036a2004200b6a200a10cf031a0b20012003200a6a3602000b02402009450d002008101d0b20002002290300370200200041086a200241086a280200360200200241206a24000bcb03010b7f230041206b22032400024002402002450d0020024102742204101f22050d01200441041020000b410421050b0240024002400240200120024103746a22062001460d0020024103742107200141046a210420052108034020082004280200360200200441086a2104200841046a2108200741786a22070d000b200641786a20016b41037641016a21094101210a4100210b4100210403402001280200210c0240024002400240200b20046b200141046a28020022084f0d00200420086a22072004490d07200b410174220d20072007200d491b220d4100480d07200b450d01200a200b200d101e220a0d020c080b200820046a21070c020b200d101f220a450d060b200d210b0b200a20046a200c200810ce031a20072104200141086a22012006470d000c020b0b4101210a410021094100210b0b200341186a22044200370300200341106a22014200370300200341086a2208420037030020034200370300200a2005200920031017200041186a2004290300370000200041106a2001290300370000200041086a2008290300370000200020032903003700000240200b450d00200a101d0b02402002450d002005101d0b200341206a24000f0b1021000b200d41011020000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10c1032100200241206a240020000bc80201037f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001108b02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b2004418001102a000b2004418001102a000bb50403017f017e017f230041a0026b22022400024002402001450d00200220003602180c010b200241f8b3c2003602180b2002200136021c20024198016a200241186a1059024020022802a001450d00200241206a20024198016a41f80010ce031a2002290320200241346a200241f4006a10d201200241086a419090c1004115108f01024020022802084101470d002002290310210320024198016a41086a22014200370300200242003703980141a590c100411720024198016a100120024190026a41086a2200200129030037030020022002290398013703900220024190026a411041f8b3c200410041001002417f470d0020014200370300200242003703980141a590c100411720024198016a100120002001290300370300200220022903980137039002200220033703980120024190026a411020024198016a410810030b0240200241206a41106a2802002200450d0020022802282101200041286c21000340024020012d00002204450d00024020044101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b02402002412c6a280200450d00200241286a280200101d0b200241a0026a240042010f0b200241346a41013602002002411836029402200241f0a9c3003602900220024201370224200241d8a9c300360220200220024190026a360230200241206a41e0a9c30010cf01000b0600109f02000b0a00418ca4c400102c000bdc0d01087f230041206b220224002002410036021820024201370310024002400240024002400240024002404104101f2203450d0020024104360214200241186a22042004280200220541046a36020020022003360210200320056a41edcad18b06360000024002400240200228021420042802002203470d00200341016a22042003490d0620034101742205200420042005491b22044100480d062003450d01200228021020032004101e2205450d020c040b200228021021050c040b2004101f22050d020b200441011020000b410441011020000b2002200436021420022005360210200241186a28020021030b200241186a2204200341016a360200200520036a41033a00004111200241106a10a10241002103024003402003418c83c4006a2802002003419083c4006a280200200241106a10a202024002400240024002400240024002400240024002400240024002400240024002402003419483c4006a2802004101470d002003419883c4006a2802002003419c83c4006a280200200241106a10a202200341a083c4006a22062802004102460d010c020b20022003419883c4006a28020011040020022802002002280204200241106a10a202200341a083c4006a22062802004102470d010b02400240024002400240200228021420042802002205470d00200541016a22062005490d1620054101742207200620062007491b22074100480d162005450d01200228021020052007101e22060d020c040b200228021021060c020b2007101f2206450d020b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341b083c4006a22062802004102470d020c030b200741011020000b0240024002400240200228021420042802002205470d00200541016a22072005490d1420054101742208200720072008491b22084100480d142005450d01200228021020052008101e22070d020c0d0b200228021021070c020b2008101f2207450d0b0b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10a302200341b083c4006a22062802004102460d010b0240200228021420042802002205470d00200541016a22072005490d1020054101742208200720072008491b22084100480d102005450d02200228021020052008101e22070d030c0a0b200228021021070c030b0240200228021420042802002205470d00200541016a22062005490d0f20054101742207200620062007491b22074100480d0f2005450d04200228021020052007101e22060d050c0a0b200228021021060c050b2008101f2207450d070b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10a402200341c083c4006a22062802004102460d030c080b2007101f2206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c083c4006a22062802004102470d050b0240024002400240200228021420042802002205470d00200541016a22062005490d0b20054101742207200620062007491b22074100480d0b2005450d01200228021020052007101e22060d020c070b200228021021060c020b2007101f2206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c8006a220341c809470d050c060b200841011020000b200841011020000b200741011020000b200741011020000b0240024002400240200228021420042802002205470d00200541016a22072005490d0620054101742208200720072008491b22084100480d062005450d01200228021020052008101e22070d020c070b200228021021070c020b2008101f2207450d050b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10a502200341c8006a220341c809470d000b0b200241186a2802002103200228021421072002280210210620024100360218200242013703102002200336020c2002410c6a200241106a106202400240024020022802142205200228021822046b20034f0d00200420036a22082004490d0320054101742209200820082009491b22084100480d032005450d01200228021020052008101e2205450d020c050b2002280210220520046a2006200310ce031a200420036a21032007450d060c050b2008101f22050d030b200841011020000b1021000b200841011020000b2002200836021420022005360210200520046a2006200310ce031a200420036a21032007450d010b2006101d0b200241206a24002003ad4220862005ad840b910701037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000413f4b0d00200141046a280200200141086a2802002202470d01200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d05200128020020022004101e2203450d060c170b2000418080014f0d01200141046a2802002203200141086a28020022026b41024f0d02200241026a22042002490d1020034101742202200420042002491b22024100480d102003450d08200128020020032002101e2203450d090c140b200128020021030c160b20004180808080044f0d01200141046a2802002203200141086a28020022026b41044f0d04200241046a22042002490d0e20034101742202200420042002491b22024100480d0e2003450d08200128020020032002101e22030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004101e22030d0a0c0e0b2004101f22030d110b200441011020000b200128020021030c050b200128020021030c070b2002101f22030d0b0b200241011020000b2002101f2203450d060b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b2004101f2203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00000240024002400240200141046a2802002203200428020022026b41044f0d00200241046a22042002490d0420034101742202200420042002491b22024100480d042003450d01200128020020032002101e22030d020c070b200128020021030c020b2002101f2203450d050b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b1021000b200241011020000b200441011020000b200241011020000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000bc60801037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d05200228020020032005101e2204450d060c160b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1820044101742203200520052003491b22034100480d182004450d08200228020020042003101e2204450d090c130b200228020021040c150b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d08200228020020042003101e22040d090c0e0b200228020021040c110b200241046a280200200241086a2802002203470d03200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d09200228020020032005101e22040d0a0c0d0b2005101f22040d100b200541011020000b200228020021040c050b200228020021040c070b2003101f22040d0a0b200341011020000b2003101f2204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c0a0b2005101f2204450d030b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0c20044101742203200520052003491b22034100480d0c2004450d01200228020020042003101e22040d020c060b200228020021040c020b2003101f2204450d040b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c070b200341011020000b200541011020000b200341011020000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000c020b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000b024002400240200241046a2802002204200241086a28020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d01200228020020042003101e2204450d020c040b200228020021040c040b2003101f22040d020b200341011020000b1021000b20022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a2000200110ce031a0bff0901097f230041206b22022400024002400240024002400240024020002802004101470d00200041046a28020021032000410c6a2802002200200110a1022000450d01200041e4006c2104410021050340200320056a220041046a280200200041086a280200200110a202200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041e0006a2d00004101470d0020072009470d01200941016a22072009490d0d2009410174220a20072007200a491b220a4100480d0d2009450d0320012802002009200a101e22070d040c0e0b20072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0520012802002009200a101e22070d060c0e0b200128020021070c030b200128020021070c050b200a101f2207450d0a0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a101f2207450d080b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110ba0302400240200041c0006a2802004101470d00200041c4006a280200200041cc006a280200200110a2020c010b200241106a200041c4006a280200200041c8006a28020028020c11030020022802102209200241106a41086a280200200110a2022002280214450d002009101d0b200041d4006a28020021090240200041d0006a2802004101470d002009200041dc006a280200200110b8032004200541e4006a2205470d010c030b2009200041d8006a280200200110b8032004200541e4006a2205470d000c020b0b200241086a200041046a28020011040020022802082103200228020c2200200110a1022000450d00200041e4006c2104410021050340200320056a220041046a280200200041086a280200200110a202200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041e0006a2d00004101470d0020072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0320012802002009200a101e22070d040c0f0b20072009470d01200941016a22072009490d0b2009410174220a20072007200a491b220a4100480d0b2009450d0520012802002009200a101e22070d060c0f0b200128020021070c030b200128020021070c050b200a101f2207450d0b0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a101f2207450d090b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110ba0302400240200041c0006a2802004101470d00200041c4006a280200200041cc006a280200200110a2020c010b200241106a200041c4006a280200200041c8006a28020028020c11030020022802102209200241106a41086a280200200110a2022002280214450d002009101d0b200041d4006a28020021090240200041d0006a2802004101470d002009200041dc006a280200200110b8032004200541e4006a2205470d010c020b2009200041d8006a280200200110b8032004200541e4006a2205470d000b0b200241206a24000f0b1021000b200a41011020000b200a41011020000b200a41011020000b200a41011020000bf40201057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a2802002200200110a1022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a2022000410c6a200110b903200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c030b2006200041246a280200200110b80320042005412c6a2205470d000c020b0b200241086a200041046a28020011040020022802082103200228020c2200200110a1022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a2022000410c6a200110b903200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c020b2006200041246a280200200110b80320042005412c6a2205470d000b0b200241106a24000bda0301057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a2802002200200110a1022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a202200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110b8030c010b2006200041146a280200200110b8030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c030b2006200041246a280200200110b80320042005412c6a2205470d000c020b0b200241086a200041046a28020011040020022802082103200228020c2200200110a1022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a202200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110b8030c010b2006200041146a280200200110b8030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c020b2006200041246a280200200110b80320042005412c6a2205470d000b0b200241106a24000be10301017f230041f0056b22022400024002402001450d00200220003602000c010b200241f8b3c2003602000b20022001360204200241f8036a200210b40102400240024002400240024020022903e8044203510d00200241086a200241f8036a41e80110ce031a200241f0016a200241086a41e80110ce031a2002200241f0016a3602f803200241d8036a200241f8036a10990220022802e0032101200241f8036a200241f0016a41e80110ce031a200241e8056a20022802e003360200200220022903d8033703e005200241e8036a200241f8036a2001200241e0056a1086010240024020022802e8034101470d004280828898f01f20022802ec03410374ad88a721004101101f210141010d010c050b20022802ec0341004721004101101f21014100450d040b2001450d01200141013a0000200141014102101e2201450d020c040b20024184026a41013602002002411836020c200241f8a9c300360208200242013702f401200241d8a9c3003602f0012002200241086a36028002200241f0016a41e0a9c30010cf01000b410141011020000b410241011020000b2001450d01200141003a0000200141014102101e22010d00410241011020000b200120003a0001200241f0056a24002001ad428080808020840f0b410141011020000bb91203027f017e0b7f230041c0016b2202240010da01200241086a41086a2203420037030020024200370308418cb9c000410d200241086a100120024180016a41086a20032903003703002002200229030837038001420021040240024002400240024002400240024020024180016a411041f8b3c200410041001002417f460d002002420037030820024180016a4110200241086a41084100100241016a41084d0d01200229030821040b2004108d01200241b0016a41086a22034200370300200242003703b001419db4c0004115200241b0016a1001200241a0016a41086a2003290300370300200220022903b0013703a001200241a0016a411041f8b3c200410041001002417f460d01410021052002410036020841042106410121070240200241a0016a4110200241086a41044100100241016a41044d0d0020022802082208450d032008ad420c7e2204422088a70d042004a722034100480d0402402003101f2206450d00200621094100210a034002400240024002400240024002404114101f2203450d00200341106a41002800b4b640360000200341086a41002900acb640370000200341002900a4b640370000200341144128101e220b450d01200b200a360014200241b0016a41086a22034200370300200242003703b001200b4118200241b0016a1001200241086a41086a2003290300370300200220022903b001370308200241086a411041f8b3c200410041001002417f460d0520024210370284012002200241086a36028001200220024180016a10d50102402002280200450d0020022802042203417f4c0d03024002402003450d0020031079220c450d0620024180016a41086a22052005280200220520034100200228028001200228028401200c20032005100222052005417f461b2205200520034b1b22056a36020020052003470d010c070b4101210c2002280280012002280284014101410020024180016a41086a28020010021a41002003460d060b2003450d00200c101d0b41df88c0004133103a000b411441011020000b412841011020000b102e000b200341011020000b200241086a41101009200c0d010b4101210c410021030b200b101d200941086a2003360200200941046a20033602002009200c3602002009410c6a21092008200a41016a220a470d000b41002107200821050c040b200341041020000b41df88c0004133103a000b41df88c0004133103a000b4100210541012107410421060b410421084100210b4100210d02400240024002402005410c6c2203410c490d002003410c6e220d41037422094100480d042009101f2208450d010b0240200620036a220a2006460d004100210b200821032006210903402009280200210c200341046a200941086a2802003602002003200c360200200341086a2103200b41016a210b2009410c6a2209200a470d000b0b20024180016a2008200b109a020240200d450d002008101d0b02402005450d002005410c6c21092006210303400240200341046a280200450d002003280200101d0b2003410c6a2103200941746a22090d000b0b024020070d002006101d0b200241086a41186a20024180016a41186a290300370300200241086a41106a20024180016a41106a290300370300200241086a41086a20024180016a41086a2903003703002002200229038001370308200241b0016a41086a220b4200370300200242003703b0014199b9c0004115200241b0016a1001200241a0016a41086a200b290300370300200220022903b0013703a001200241a0016a4110200241086a41201003200241086a10dd01200241003602b801200242013703b00102404120101f2203450d00200242a080808080043702b401200220033602b0012003200229021c370000200341086a200241246a290200370000200341106a2002412c6a290200370000200341186a200241346a290200370000200241086a200241b0016a10b10102400240024020022802b4012209200b280200220c6b41204f0d00200c41206a2203200c490d072009410174220b20032003200b491b220a4100480d072009450d0120022802b0012009200a101e220b450d020c050b200c41206a210320022802b001210b0c050b200a101f220b0d030b200a41011020000b412041011020000b200941041020000b2002200a3602b4012002200b3602b001200a21090b200241b0016a41086a220a2003360200200b200c6a220c41086a200241c4006a290200370000200c41106a200241cc006a290200370000200c41186a200241d4006a290200370000200c200229023c3700000240200920036b411f4b0d00200341206a220c2003490d0120094101742208200c200c2008491b220c4100480d010240024002402009450d00200b2009200c101e220b450d010c020b200c101f220b0d010b200c41011020000b2002200c3602b4012002200b3602b0010b200a200341206a360200200b20036a220341186a200241f4006a290200370000200341106a200241ec006a290200370000200341086a200241e4006a2902003700002003200229025c3700002002280210210e2002200241086a41106a280200220f3602800120024180016a200241b0016a10620240200f450d00200f41286c2106200241b0016a41086a2207280200210320022802b401210a200e210b034020024180016a200b10d40120022802800121080240024002400240200a20036b20024180016a41086a280200220c4f0d002003200c6a22092003490d06200a4101742205200920092005491b220d4100480d06200a450d0120022802b001200a200d101e22050d020c070b2003200c6a210920022802b00121050c020b200d101f2205450d050b2002200d3602b401200220053602b001200d210a0b20072009360200200520036a2008200c10ce031a0240200228028401450d002008101d0b200b41286a210b20092103200641586a22060d000b0240200f450d00200f41286c210b200e21030340024020032d0000220c450d000240200c4101470d00200341086a280200450d01200341046a280200101d200341286a2103200b41586a220b0d020c030b200341106a280200450d002003410c6a280200101d0b200341286a2103200b41586a220b0d000b0b200241146a280200450d040c030b200241b8016a280200210920022802b0012105200241146a2802000d020c030b1021000b200d41011020000b200e101d0b200241c0016a24002009ad4220862005ad840b9f0f03017f037e117f23004180026b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c200241306a200241086a10a9020240024002402002280230450d00200241106a41086a2201200241306a41086a220028020036020020022002290330370310200241206a41086a20012802003602002002200229031037032020024190016a200241206a10aa022002280290014101460d0120024190016a41086a22012903002103200142003703002002420037039001418390c100410d20024190016a100120002001290300370300200220022903900137033042002104024002400240200241306a411041f8b3c200410041001002417f460d002002420037039001200241306a411020024190016a41084100100241016a41084d0d0120022903900121040b20024190016a41086a22014200370300200242003703900141a590c100411720024190016a1001200241306a41086a2001290300370300200220022903900137033002400240200241306a411041f8b3c200410041001002417f460d002002420037039001200241306a411020024190016a41084100100241016a41084d0d03200229039001210541e801210141e801101f2206450d010c060b4203210541e801210141e801101f22060d050b200141081020000b41df88c0004133103a000b41df88c0004133103a000b200241a4016a4101360200200241183602840120024180aac300360280012002420137029401200241d8a9c30036029001200220024180016a3602a00120024190016a41e0a9c30010cf01000b41af92c100412820022802940120024190016a41086a280200108802000b200620024190016a41f00010ce03220742023703702007410036028801200720022903800137037820074180016a20024180016a41086a29030037030020072003200520047c220420042003541b3703900120074198016a200241306a41d00010ce031a2002280220220821092002280224220a210b41002101037e02400240024020010e020001010b200941086a210020092f0106220d4103742101417f210c02400240024003402001450d0141bd8ec0002000410810d003220e450d03200141786a2101200c41016a210c200041086a2100200e417f4a0d000b200b0d010c020b200d210c200b450d010b200b417f6a210b2009200c4102746a41e4016a2802002109410021010c030b4108210f41032110417f21114102211241e401211341d2d6c000211441782115410121160c010b2008200f6a210020082f0106220d20107421014100210c02400240024002400240024003402001450d0120142000200f10d003220e450d02200120156a2101200c20166a210c2000200f6a2100200e20114a0d000b200c20116a210d0b200a450d01200a20116a210a2008200d2012746a20136a2802002108410121010c060b200841e0006a200c410c6c6a2200450d002000280208210120002802002100200242003703900120024190016a20002001410820014108491b10ce031a200141074d0d01200229039001210320024190016a41086a22014200370300200242003703900141978bc000411520024190016a1001200241306a41086a200129030037030020022002290390013703304100210102400240200241306a411041f8b3c200410041001002417f460d0020024210370284012002200241306a3602800120024190016a20024180016a10a701200228029001220f450d0420024198016a2802002101200228029401210c0c010b4108210f4100210c0b4100210002402001417f6a220e20014b0d00200e20014f0d00200f200e4103746a2201450d00200129030020035221000b0240200c450d00200f101d0b024002402000450d00200741e80141d003101e2206450d05200641e8016a20024190016a41f00010ce031a200642023703d802200620033703f8022006410a3602f00220062002290380013703e002200641e8026a20024188016a29030037030020064180036a200241306a41d00010ce031a410221090c010b410121090b20022802202002280224200228022810940220024100360238200242013703302002200936029001200941e8016c211520024190016a200241306a10622002280234210e2002280238210120024190016a41086a21084100210f02400240034020022006200f6a3602800120024190016a20024180016a10990220022802900121110240024002400240200e20016b2008280200220c4f0d002001200c6a22002001490d05200e4101742214200020002014491b22164100480d05200e450d012002280230200e2016101e22140d020c060b2001200c6a2100200228023021140c020b2016101f2214450d040b20022016360234200220143602302016210e0b200241306a41086a2000360200201420016a2011200c10ce031a0240200228029401450d002011101d0b200021012015200f41e8016a220f470d000b200941e8016c210f410021010340200620016a4188016a103c200f200141e8016a2201470d000b2006101d20024180026a24002000ad4220862014ad840f0b1021000b201641011020000b41f48ec000412b41dad6c0004128108802000b41f48ec000412b41f4abc2004129108802000b41df88c0004133103a000b41d00341081020000b410121010c000b0b890a06027f017e097f017e077f017e23004190026b22022400200241086a200110b501024002402002280208450d000240024002400240024002400240024002400240024002400240024002400240200228020c2203ad2204421d88a70d002004420386a72205417f4c0d00024002402005450d002005101f2206450d032003450d010c040b4101210620030d030b410021054100210b2006450d100c030b102e000b200541011020000b200141046a210741002108410021094100210a2003210b034020024200370330200241306a2001280200220c20072802002205410820054108491b220d10ce031a20072005200d6b3602002001200c200d6a360200200541074d0d02200a41016a2105200229033021040240200a200b470d002008200520052008491b220bad420386220e422088a70d09200ea7220d4100480d090240200a450d0020062009200d101e22060d010c0b0b200d101f2206450d0a0b200620096a2004370000200841026a2108200941086a21092005210a20052003490d000b2006450d0d0b2005ad422086200bad84210e200241306a200110ab022002280230220f450d0120022802342110200241306a41086a2802002205200e422088a7470d0220024200370214200241f0c0c100360210200f2005410c6c6a210320054103742205450d03200620056a2111200241106a41086a2112200241c4006a2113200241c0006a2114200f21012006210b0340200122052003460d062005410c6a210120052802002215450d05200529020421042002200b2900002216370320024002402002280210220841f0c0c100460d00200228021421070c010b41e401101f2208450d0a41002107200841003b010620084100360200200841086a200241306a41dc0110ce031a20024100360214200220083602100b200b41086a210b02400340200841086a210a20082f0106220c410374210541002109024003402005450d01200241206a200a410810d003220d450d03200541786a2105200941016a2109200a41086a210a200d417f4a0d000b2009417f6a210c0b02402007450d002007417f6a21072008200c4102746a41e4016a28020021080c010b0b2013201637020020142012360200200241306a410c6a200c360200200241306a41086a200241106a36020020022008360234200241003602302002200437022420022015360220200241306a200241206a109502200b2011470d010c060b20082009410c6c6a220541e4006a220a2802002109200a2004370200200541e0006a220a2802002105200a201536020002402005450d002009450d002005101d0b200b2011470d000c050b0b200b450d0b0c0a0b200ea70d090c0a0b2000410036020002402005450d002005410c6c210a200f210503400240200541046a280200450d002005280200101d0b2005410c6a2105200a41746a220a0d000b0b02402010450d00200f101d0b200ea7450d0a2006101d20024190026a24000f0b200f21010b200ea7450d050c040b20032101200ea70d030c040b1021000b200d41011020000b41e40141041020000b2006101d0b024020012003460d00034020012802002205450d010240200141046a280200450d002005101d0b2001410c6a22012003470d000b0b02402010450d00200f101d0b200241306a41086a2205200241106a41086a28020036020020022002290310370330200041086a20052802003602002000200229033037020020024190026a24000f0b2006101d0b200041003602000b20024190026a24000bae0201077f230041106b2202240020012802042103024002400240024003402001280200220541086a210620052f010622044103742101410021070240024003402001450d0141d7acc2002006410810d0032208450d02200141786a2101200741016a2107200641086a21062008417f4a0d000b2007417f6a21040b2003450d022003417f6a2103200520044102746a41e4016a21010c010b0b200541e0006a2007410c6c6a2206450d00200628020821012006280200210620024200370308200241086a20062001410820014108491b10ce031a200141074d0d01200041086a2002290308370300410021010c030b20004188adc200360204200041086a41283602000c010b200041dfacc200360204200041086a41293602000b410121010b20002001360200200241106a24000bdb0403027f017e0a7f230041106b22022400200241086a200110b5010240024002400240024002400240024002402002280208450d00200228020c2203ad420c7e2204422088a70d082004a72205417f4c0d082005450d012005101f2206450d032003450d020c040b20004100360200200241106a24000f0b4104210620030d020b4100210d4100210a0c020b200541041020000b4100210741002108410021092003210a03402002200110b50102400240024002402002280200450d0020022802042205417f4c0d08024002402005450d0020051079220b450d03200b2001280200200141046a220c280200220d2005200d2005491b220d10ce031a200c280200220e200d490d04200c200e200d6b36020020012001280200200d6a360200200d2005470d010c050b4101210b41002005460d040b2005450d00200b101d0b2000410036020002402009450d002006210503400240200541046a280200450d002005280200101d0b2005410c6a2105200841746a22080d000b0b0240200a450d002006101d0b200241106a24000f0b200541011020000b200d200e102a000b200941016a210d02402009200a470d002007200d200d2007491b220aad420c7e2204422088a70d032004a7220c4100480d0302402009450d0020062008200c101e22060d010c050b200c101f2206450d040b200620086a2209200b360200200941046a2005ad2204422086200484370200200741026a21072008410c6a2108200d2109200d2003490d000b0b2000200a36020420002006360200200041086a200d360200200241106a24000f0b1021000b200c41041020000b102e000be8391b0c7f017e067f017e0b7f017e027f027e017f017e027f037e027f017e017f027e067f017e017f017e027f037e1a7f027e0d7f027e057f230041d0026b22022400024002402001450d00200220003602100c010b200241f8b3c2003602100b20022001360214200241f0006a200241106a1098020240024002400240024020022802782203450d00200241f0016a2802002104200241ec016a280200210520024180016a2802002106200241fc006a280200210720022802e8012108200241186a200241106a10a9022002280218450d01200241306a41086a2201200241186a41086a220928020036020020022002290318370330200241c0006a41086a200128020036020020022002290330370340200241013b015c20024200370254200241f0c0c100360250200241d0006a41086a210a2004450d0241e801210b2008200441e8016c6a210c41f000210d4202210e4117210f41a590c10021104100211141f8b3c200211241102113417f2114427f2115410321164102211741e401211841ecabc2002119410c211a41e000211b4107211c418801211d419001211e410d211f200241d0006a410d6a212042f4d2b59bc7ae98b830212141dc01212220024184016a21234201212442818080801021254109212642898080809001212741782128418390c1002129423c212a428080808070212b4225212c2008212d4100212e0c030b2002412c6a41013602002002411836025420024188aac3003602502002420137021c200241d8a9c3003602182002200241d0006a360228200241186a41e0a9c30010cf01000b20024184016a41013602002002411836025420024188aac30036025020024201370274200241d8a9c3003602702002200241d0006a36028001200241f0006a41e0a9c30010cf01000b410021010c010b410221010b037e024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b200241f0006a41086a200a290300370300200220022903503703700c200b412f411e204e204f410c6c6a41a07f4622501b214341c58ec00041b9acc20020501b21500c010b02400240202e0e06000103040506060b202d200d6a290300200e520d11202d2802880122010d4a202d29039001212f200241f0006a41086a22304200370300200242003703702010200f200241f0006a1001200920302903003703002002200229037037031802400240200241186a201320122011201110022014460d0020024200370370200241186a2013200241f0006a41082011100241016a41084d0d08200229037021310c010b420321310b2015203120317c223220322031541b2231500d09200241c0006a2133200228024421340c1c0b2044280200224e20466a2100204e2f0106223820477421014100214f024003402001450d01204b2000204610d0032237450d132001204c6a2101204f204d6a214f200020466a2100203720484a0d000b204f20486a21380b02402045450d00204520486a2145204e20382049746a204a6a21444101212e0c130b412f214341c58ec00021500b2002204336026420022050360260200242efcc99e3a6ae99b830370318200241086a200241d0006a200241186a200241e0006a109302200228020822430d08200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c1d0b2052205a205820596a220120012058491b6a22012052490d4320522059742200200120012000491b2253ad205b862231205c88a70d432031a72201205d480d4302402052450d0020542052205e742001101e22540d0b0c050b2001101f2254450d044103212e0c130b20542052205e746a2057360200205220596a21522058450d1c0240205620432f01064f0d0020432056205f746a20606a2157205620596a21562058205a6a215820532052460d080c090b41012101024020432f01042200204328020022432f0106490d00410121010340200120596a210120432f01042200204328020022432f01064f0d000b0b20432000205f746a20606a215720432000205e746a20616a28020021434100215620012059460d1a205920016b2101034020432802e4012143200120596a22010d000c1b0b0b20622069206720686a220120012067491b6a22012062490d4120622068742200200120012000491b2263ad206a862231206b88a70d412031a72201206c480d4102402062450d0020642062206d742001101e22640d0c0c040b2001101f2264450d034105212e0c150b20642062206d746a2066360200206220686a216202402067450d000240206520502f01064f0d0020502065206e6c6a206f6a2166206520686a2165206720696a216720632062460d0a0c0b0b41012101024020502f01042200205028020022502f0106490d00410121010340200120686a210120502f01042200205028020022502f01064f0d000b0b20502000206e6c6a206f6a216620502000206d746a20706a28020021504100216520012068460d18206820016b2101034020502802e4012150200120686a22010d000c190b0b206421372052413f4b0d2c0c1d0b41df88c0004133103a000b200141041020000b200141041020000b4190d1c200102c000b41e588c10041222043200228020c108802000b4102212e0c080b4103212e0c080b4103212e0c090b4104212e0c090b4105212e0c090b4105212e0c0a0b410021010c410b410121010c400b410221010c3f0b410221010c3e0b410221010c3d0b410221010c3c0b410221010c3b0b410221010c3a0b410221010c390b410221010c380b410221010c370b41002101034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e020001010b2033280200223641086a210020362f010622352016742101410021370240024003402001450d0120192000410810d0032238450d02200120286a2101203741016a2137200041086a2100203820144a0d000b203720146a21350b2034450d03203420146a2134203620352017746a20186a2133410021010c150b2036201b6a2037201a6c6a2200450d02200028020821012000280200210020024200370370200241f0006a20002001410820014108491b10ce031a2001201c4d0d03202f20318020022903702239520d05202d201d6a223a28020022010d42202d201e6a2903002132200241f0006a200241c0006a10aa020240024020022802704101470d002030350200213b2002280274213c4101213d20202d0000450d010c100b2030290300213e4200213b20304200370300200242003703702029201f200241f0006a100120092030290300370300200220022903703703180240200241186a201320122011201110022014460d0020024200370370200241186a2013200241f0006a41082011100241016a41084d0d0e2002290370213b0b20304200370300200242003703702010200f200241f0006a10012009203029030037030020022002290370370318024002400240200241186a201320122011201110022014460d0020024200370370200241186a2013200241f0006a41082011100241016a41084d0d112002290370213f2032203e202a7c580d020c010b4203213f2032203e202a7c580d010b2040202b83202c84213b4101213d418a92c100213c20202d0000450d010c100b4100213d2032203f203b7c223b5a0d0220202d00000d0f0b02400240203d450d0020022802502002280254200a28020010940220024200370254200241f0c0c100360250200220213703180c010b2002280250214120022021370318204141f0c0c100460d00200228025421420c140b2018101f2241450d0941002142204141003b010620414100360200204141086a200241f0006a202210ce031a20024100360254200220413602500c120b204141086a210020412f01062236201674210141002137024003402001450d01200241186a2000410810d0032238450d09200120286a2101203741016a2137200041086a2100203820144a0d000b203720146a21360b02402042450d00204220146a2142204120362017746a20186a2802002141410121010c140b20232021370200200241f0006a20136a200a360200200241f0006a201a6a20363602002030200241d0006a360200200220413602742002201136027020092011360200200220243703184101101f2101024002400240024002400240203d450d002001450d0f200141013a00002002202537021c200220013602182002203ba72201360260200241e0006a200241186a1062200228021c2237200928020022006b20014f0d01200020016a22382000490d4320374101742236203820382036491b22382011480d432037450d02200228021820372038101e22370d030c100b2001450d13200120113a00002002202537021c20022001360218200141012026101e2201450d142001203b3700012002202737021c200220013602180c040b200228021821370c020b2038101f2237450d0d0b2002203836021c200220373602180b2009200020016a360200203720006a203c200110ce031a0b200241e0006a41086a200928020036020020022002290318370360200241f0006a200241e0006a1095022020203d3a0000200241d0006a201a6a20113a0000203b2140203d0d060b203a2802004101460d410c420b203942808080807083421c842131419dacc20021430c010b203942808080807083422984213141f4abc20021430b2031a721500c010b41312150418c8ec00021430b2002205036026420022043360260200242e1eac98bb68edbb7f4003703182002200241d0006a200241186a200241e0006a109302200228020022430d0a200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c100b200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c0f0b41e588c1004122418789c100412d108802000b41e40141041020000b410141011020000b203841011020000b41df88c0004133103a000b41df88c0004133103a000b41e588c100412241b489c1004131108802000b410141011020000b410941011020000b41e588c100412220432002280204108802000b410121010c010b410121010c000b0b206720696a216702400240024020632062470d004104212e0c010b4105212e0c010b410221010c360b410221010c350b2058205a6a215802400240024020532052470d004102212e0c010b4103212e0c010b410221010c350b410221010c340b20022802402002280244200228024810940202402006450d00200641286c2150200321430340024020432d00002201450d00024020014101470d00204341086a280200450d01204341046a280200101d204341286a2143205041586a22500d020c030b204341106a280200450d002043410c6a280200101d0b204341286a2143205041586a22500d000b0b02402007450d002003101d0b02402004450d00200441e8016c215020084188016a214303402043103c204341e8016a2143205041987e6a22500d000b0b02402005450d002008101d0b4101101f2243450d05204320022d007c3a0000204341014102101e2251450d06205120022d007d3a0001200228027022502143024020022802742200450d002050214320002101034020432802e40121432001417f6a22010d000b2000210103402001417f6a22010d000b0b02400240024020022802782252450d002052417f6a213720432f0106450d01204341086a2138410121000c020b4100215341042154410421554100215220000d030c040b0240024020432f01042200204328020022432f01064f0d00410121010c010b410121010340200141016a210120432f01042200204328020022432f01064f0d000b0b204320004103746a41086a2138204320004102746a41e8016a28020021434100210020014101460d00410120016b2101034020432802e4012143200141016a22010d000b0b417f203741016a220120012037491b2253ad2231421e88a70d042031420286a72201417f4c0d04024002400240024002402001450d002001101f2254450d0d205420383602002037450d020c010b41042154410420383602002037450d010b200020432f01064f0d01200041016a2156204320004103746a41086a21570c020b410121520c020b0240024020432f01042200204328020022432f01064f0d00410121010c010b410121010340200141016a210120432f01042200204328020022432f01064f0d000b0b204320004103746a41086a2157204320004102746a41e8016a28020021434100215620014101460d00410120016b2101034020432802e4012143200141016a22010d000b0b2052417e6a215841012159417f215a4202215b4220215c4100215d4102215e4103215f4108216041e80121614101215220534101470d0b0c0a0b205421552002280270215020022802742200450d010b20002101034020502802e40121502001417f6a22010d000b03402000417f6a22000d000b0b024002400240200241f8006a2802002238450d002038417f6a213720502f0106450d01205041e0006a2162410121000c020b410021634104216441042137410021622052413f4d0d020c110b0240024020502f01042200205028020022502f01064f0d00410121010c010b410121010340200141016a210120502f01042200205028020022502f01064f0d000b0b20502000410c6c6a41e0006a2162205020004102746a41e8016a28020021504100210020014101460d00410120016b2101034020502802e4012150200141016a22010d000b0b417f203741016a220120012037491b2263ad2231421e88a70d012031420286a72201417f4c0d01024002400240024002402001450d002001101f2264450d0b206420623602002037450d020c010b41042164410420623602002037450d010b200020502f01064f0d01200041016a216520502000410c6c6a41e0006a21660c020b41012162206421372052413f4b0d110c020b0240024020502f01042200205028020022502f01064f0d00410121010c010b410121010340200141016a210120502f01042200205028020022502f01064f0d000b0b20502000410c6c6a41e0006a2166205020004102746a41e8016a28020021504100216520014101460d00410120016b2101034020502802e4012150200141016a22010d000b0b2038417e6a216741012168417f21694202216a4220216b4100216c4102216d410c216e41e000216f41e80121704101216220634101470d0a0c090b410121284101101f224f450d03204f20524102743a000020524102742250450d140c0f0b102e000b410141011020000b410241011020000b410141011020000b200141041020000b200141041020000b4102212e0c030b4103212e0c030b4104212e0c030b4105212e0c030b410221010c240b410221010c230b410221010c220b410221010c210b02402052418080014f0d00410221284102101f224f450d02204f20524102744101723b0000205241027422500d010c060b024020524180808080044f0d00410421284104101f224f450d03204f2052410274410272360000205241027422500d010c060b4101101f2243450d03204341033a000041052128204341014105101e224f450d04204f205236000120524102742250450d050b410020286b21432028211402400340205528020021010240202820436a41074b0d00201441086a22002014490d1520284101742252200020002052491b22004100480d15024002402028450d00204f20282000101e224f0d010c040b2000101f224f450d030b200021280b205541046a2155204f20146a2001290000370000204341786a2143201441086a21142050417c6a22500d000b2062413f4b0d070c060b200041011020000b410241011020000b410441011020000b410141011020000b410541011020000b202821142062413f4b0d010b410121504101101f2255450d08205520624102743a00004101210120620d010c020b02402062418080014f0d00410221504102101f2255450d07205520624102744101723b00000c010b024020624180808080044f0d00410421504104101f2255450d06205520624102744102723600000c010b4101101f2243450d04204341033a000041052150204341014105101e2255450d03205520623600010b20624102742152205021010340203728020022432802002138024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020432802082243413f4b0d0020502001470d01205041016a22012050490d2120504101742200200120012000491b22004100480d212050450d05205520502000101e22550d060c0f0b2043418080014f0d01205020016b41014b0d02200141026a22002001490d2020504101742262200020002062491b22004100480d202050450d0b205520502000101e22550d0c0c0f0b205021000c050b20434180808080044f0d01205020016b41034b0d05200141046a22002001490d1e20504101742262200020002062491b22004100480d1e024020500d002000101f2255450d100c070b205520502000101e22550d060c0f0b205021000c090b20502001470d05205041016a22012050490d1c20504101742200200120012000491b22004100480d1c0240024020500d002000101f2255450d100c010b205520502000101e2255450d0f0b205021010c060b2000101f2255450d090b205021010b205520016a20434102743a00002000200141016a22016b20434f0d060c0c0b205021000b205520016a20434102744102723600002000200141046a22016b2043490d0a0c040b205021000b205520016a41033a000002402000200141016a22506b41034b0d00205041046a22622050490d1620004101742204206220622004491b22624100480d16024002402000450d00205520002062101e22550d010c080b2062101f2255450d070b206221000b205520506a20433600002000200141056a22016b2043490d080c020b2000101f2255450d030b205520016a20434102744101723b00002000200141026a22016b2043490d060b200021500c060b200041011020000b200041011020000b206241011020000b200041011020000b200041011020000b200120436a22502001490d0c20004101742262205020502062491b22504100480d0c02402000450d00205520002050101e22550d010c040b2050101f2255450d030b203741046a2137205520016a2038204310ce031a200120436a21012052417c6a22520d000b0b024002400240202820146b20014f0d00201420016a22432014490d0c20284101742200204320432000491b22004100480d0c2028450d01204f20282000101e224f450d020c090b201420016a2143204f20146a2055200110ce031a2050450d0a0c090b2000101f224f0d070b200041011020000b205041011020000b410541011020000b410141011020000b410441011020000b410241011020000b410141011020000b20002128204f20146a2055200110ce031a2050450d010b2055101d0b02402063450d002064101d0b02402053450d002054101d0b02402043450d00204341026a22502043490d0120504104205041044b1b22014100480d01205141022001101e2251450d02205141026a204f204310ce031a2028450d040c030b204341026a2150205141026a204f204310ce031a20280d020c030b1021000b200141011020000b204f101d0b20022802702002280274200241f8006a280200109402200241d0026a24002050ad4220862051ad840f0b20014101470d010b202d280290012017460d010b202d200b6a222d200c470d010c030b200241c0006a2144200228024421454108214641032147417f21484102214941e401214a41bd8ec000214b4178214c4101214d0c010b4100212e0c020b4101212e0c020b410021010c020b410221010c010b410221010c000b0b960301037f230041d0006b22022400200241306a41086a220342003703002002420037033041fbb8c0004111200241306a1001200241206a41086a2003290300370300200220022903303703200240024002400240200241206a411041f8b3c200410041001002417f460d00200241c8006a4200370300200241306a41106a42003703002003420037030020024200370330200241206a4110200241306a4120410010022203417f460d022003411f4d0d02200241186a200241306a41186a290300370300200241106a200241306a41106a290300370300200241086a200241306a41086a29030037030020022002290330370300412021044120101f2203450d010c030b200241186a4200370300200241106a4200370300200241086a420037030020024200370300412021044120101f22030d020b200441011020000b41df88c0004133103a000b20032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241d0006a24002003ad42808080808004840bfa1405037f017e017f017e087f230041f0076b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c20024188066a200241086a10b40102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022903f8064203510d00200241106a20024188066a41e80110ce031a200241f8016a200241106a41e80110ce031a2002200241f8016a3602f00420024188066a200241f0046a10990220022802900621030240200228028c06450d00200228028806101d0b20024188066a200241f8016a41e80110ce031a200241f0046a20024188066a10870102400240024002400240024020022802f0044101470d0020022802f404210120022802f8042200411a460d0120004115470d024102210441f6012100200141d7c0c100460d0d200141d7c0c100411510d0030d020c0d0b200241e0036a200241f0046a41086a41900110ce031a02400240200241e0036a41086a410020022903e0034201511b2201450d002001450d004100210441032100200120031089010d012001108801210541012100200141206a410020011b220629030022072005540d014102210041022104200720054280027c560d01200520075a0d0541002108410021094100210a4100210b4104210c03404120101f2200450d0920002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002000412041c000101e2200450d0a200020053700200240200a200b470d00200a41016a220d200a490d232008200d200d2008491b220bad420c7e2207422088a70d232007a7220d4100480d230240200a450d00200c2009200d101e220c0d010c0d0b200d101f220c450d0c0b200c20096a220d2000360200200d41046a42c08080808005370200200841026a21082009410c6a2109200a41016a210a200542017c220520062903002207540d000c070b0b4176416c20011b2100410021040b20024190046a108c010c0c0b41002100200141d998c000460d0141002104200141d998c000411a10d003450d0b0b4100210441810121000c0a0b410021040c090b4104210c4100210a4100210b0b410c101f220f450d044120101f2200450d0520002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002000412041c000101e2201450d062003ad210520012007370020200f42c08080808005370204200f200136020020024190046a108c012002410036029006200242013703880641012104410121014101101f22000d080c130b2002418c026a41013602002002411836021420024190aac300360210200242013702fc01200241d8a9c3003602f8012002200241106a36028802200241f8016a41e0a9c30010cf01000b412041011020000b41c00041011020000b200d41041020000b410c41041020000b412041011020000b41c00041011020000b20024100360290062002420137038806024020044101460d0020044102470d024101101f2201450d0d2002410136028c0620024190066a22032003280200220941016a3602002002200136028806200120096a41023a0000200228028c0620032802002201470d04200141016a22032001490d1320014101742209200320032009491b22094100480d132001450d0820022802880620012009101e2203450d090c160b410121014101101f2200450d0b0b20024188066a41086a22032003280200220920016a3602002002200136028c062002200036028806200020096a20013a0000200228028c062200200328020022016b41084f0d01200141086a22032001490d1120004101742201200320032001491b22014100480d112000450d0420022802880620002001101e2200450d050c0f0b4101101f2201450d0b2002410136028c0620024190066a22032003280200220941016a3602002002200136028806200120096a41003a0000200228028c0620032802002201470d02200141016a22032001490d1020014101742209200320032009491b22094100480d102001450d0720022802880620012009101e2203450d080c0c0b20022802880621000c0e0b20022802880621030c120b20022802880621030c0a0b2001101f22000d0a0b200141011020000b2009101f22030d0d0b200941011020000b2009101f22030d040b200941011020000b200120011020000b410141011020000b410141011020000b2002200936028c06200220033602880620024190066a28020021010b20024190066a200141016a360200200320016a20003a00000c070b2002200136028c06200220003602880620024190066a28020021010b20024188066a41086a2209200141086a360200200020016a20053700002002200a3602f801200241f8016a20024188066a10620240024002400240200a450d00200c200a410c6c6a210e200c210303402003280200210d2002200341086a28020022013602f801200241f8016a20024188066a10620240024002400240200228028c062208200928020022006b20014f0d00200020016a22062000490d0920084101742200200620062000491b22004100480d092008450d0120022802880620082000101e22080d020c060b20022802880621080c020b2000101f2208450d040b2002200036028c062002200836028806200928020021000b2009200020016a360200200820006a200d200110ce031a2003410c6a2203200e470d000b0b200241013602f801200241f8016a20024188066a1062200f28020021082002200f28020822013602f801200241f8016a20024188066a1062024002400240200228028c062203200928020022006b20014f0d00200020016a22092000490d0620034101742200200920092000491b22004100480d062003450d0120022802880620032000101e2203450d020c040b20022802880621030c040b2000101f22030d020b200041011020000b200041011020000b2002200036028c06200220033602880620024190066a28020021000b20024188066a41086a2209200020016a360200200320006a2008200110ce031a024002400240200228028c062200200928020022016b41084f0d00200141086a22032001490d0320004101742201200320032001491b22014100480d032000450d0120022802880620002001101e2200450d020c040b20022802880621000c040b2001101f22000d020b200141011020000b1021000b2002200136028c06200220003602880620024190066a28020021010b20024188066a41086a2203200141086a360200200020016a427f37000020032802002103200228028806210920044101470d030240200a450d00200a410c6c2100200c210103400240200141046a280200450d002001280200101d0b2001410c6a2101200041746a22000d000b0b0240200b450d00200c101d0b0240200f41046a280200450d00200f280200101d0b200f101d0c030b2002200936028c06200220033602880620024190066a28020021010b20024190066a200141016a360200200320016a20003a00000b20024190066a280200210320022802880621090b200241f0076a24002003ad4220862009ad840b6201017f230041206b220224000240200141074d0d00200241206a240042010f0b200241146a41013602002002411836021c20024198aac30036021820024201370204200241d8a9c3003602002002200241186a360210200241e0a9c30010cf01000b8a0c07027f017e057f017e027f037e037f230041306b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c200241106a200241086a105b0240024002400240024002400240024020022802102203450d00200320022902142204422088a7220541286c6a21062004a72107200322012100024002400240024002400240034002400240024002400240200620006b419f014d0d00024020012d00004102470d00200141286a2100200141086a22082802004101460d050c070b200141286a2d00004102460d02200141d0006a2d00004102460d03200141f8006a2109200141a0016a2200210120092d00004102470d050c010b034020062001460d0720012d00002109200141286a2200210120094102470d000b0b200041606a22082802004101460d020c040b200141d0006a2100200141306a22082802004101460d010c030b200141f8006a2100200141d8006a22082802004101470d020b200021010c000b0b200828020421012008290310210a4108210b410021094100210c0240200828020c220641286c22004128490d0020004100480d032006ad42287e422088a74100470d032000101f220b450d092006210c0b2001200120006a460d01200641286c210641002109200b21000340200141086a2903002104200141106a290300210d200141186a290300210e2001290300210f200041206a200141206a290300370300200041186a200e370300200041106a200d370300200041086a20043703002000200f370300200041286a2100200941016a2109200141286a2101200641586a22060d000c020b0b4100210b0b20024100360218200242013703104101101f21060240024002400240200b450d002006450d08200242818080801037021420022006360210200641013a000020022009360228200241286a200241106a1062200241106a41086a221028020021002002280214210602402009450d00200b200941286c6a2111200b210103400240024002400240200620006b41204f0d00200041206a22092000490d0a20064101742208200920092008491b22124100480d0a2006450d01200228021020062012101e22080d020c0b0b200041206a2109200228021021080c020b2012101f2208450d090b2002201236021420022008360210201221060b20102009360200200820006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a29000037000020002001290000370000200141206a29030021040240024002400240200620096b41084f0d00200941086a22002009490d0a20064101742212200020002012491b22124100480d0a2006450d01200820062012101e22080d020c0c0b200941086a21000c020b2012101f2208450d0a0b2002201236021420022008360210201221060b20102000360200200820096a20043700002011200141286a2201470d000b0b200620006b41084f0d01200041086a22012000490d0420064101742209200120012009491b22014100480d042006450d02200228021020062001101e2206450d030c0b0b2006450d08200242818080801037021420022006360210200641003a0000428080808010210420050d0c0c0d0b200228021021060c0a0b2001101f22060d080b200141011020000b1021000b201241011020000b201241011020000b200241246a41013602002002411836022c200241a0aac30036022820024201370214200241d8a9c3003602102002200241286a360220200241106a41e0a9c30010cf01000b410141011020000b410141011020000b200041081020000b20022001360214200220063602100b200241106a41086a200041086a2201360200200620006a200a3700002001ad42208621040240200b450d00200c450d00200b101d0b2005450d010b200541286c2100200321010340024020012d00002209450d00024020094101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b02402007450d002003101d0b200241306a240020042006ad840b9f0c07027f017e047f027e027f037e047f230041306b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c200241106a200241086a105b02400240024002400240024002400240024020022802102203450d00200320022902142204422088a7220541286c6a21062004a72107200322012100024002400240024002400240034002400240024002400240200620006b419f014d0d00024020012d00004102470d00200141286a2100200141086a22082802004101470d050c070b200141286a2d00004102460d02200141d0006a2d00004102460d03200141f8006a2108200141a0016a2200210120082d00004102470d050c010b034020062001460d0720012d00002108200141286a2200210120084102470d000b0b200041606a22082802004101470d020c040b200141d0006a2100200141306a22082802004101470d010c030b200141f8006a2100200141d8006a22082802004101460d020b200021010c000b0b20082802042101200829031821092008290310210a4108210b410021064100210c0240200828020c220841286c22004128490d0020004100480d032008ad42287e422088a74100470d032000101f220b450d0a2008210c0b2001200120006a460d01200841286c210841002106200b21000340200141086a2903002104200141106a290300210d200141186a290300210e2001290300210f200041206a200141206a290300370300200041186a200e370300200041106a200d370300200041086a20043703002000200f370300200041286a2100200641016a2106200141286a2101200841586a22080d000c020b0b4100210b0b20024100360218200242013703104101101f21100240024002400240200b450d002010450d08200242818080801037021420022010360210201041013a0000201041014109101e2201450d09200242898080809001370214200220013602102001200a37000120022006360228200241286a200241106a1062200241106a41086a221028020021112002280214210802402006450d00200b200641286c6a2112200b210103400240024002400240200820116b41204f0d00201141206a22002011490d0a20084101742206200020002006491b22134100480d0a2008450d01200228021020082013101e22060d020c0b0b201141206a2100200228021021060c020b2013101f2206450d090b2002201336021420022006360210201321080b20102000360200200620116a221141186a200141186a290000370000201141106a200141106a290000370000201141086a200141086a29000037000020112001290000370000200141206a29030021040240200820006b41074b0d00200041086a22112000490d0720084101742213201120112013491b22114100480d07024002402008450d00200620082011101e22060d010c0b0b2011101f2206450d0a0b2002201136021420022006360210201121080b2010200041086a2211360200200620006a20043700002012200141286a2201470d000b0b200820116b41084f0d01201141086a22012011490d0420084101742200200120012000491b22014100480d042008450d02200228021020082001101e2210450d030c0c0b2010450d09410121062002410136021420022010360210201041003a000020050d0d0c0e0b200228021021100c0b0b2001101f22100d090b200141011020000b1021000b201341011020000b201141011020000b200241246a41013602002002411836022c200241a8aac30036022820024201370214200241d8a9c3003602102002200241286a360220200241106a41e0a9c30010cf01000b410141011020000b410941011020000b410141011020000b200041081020000b20022001360214200220103602100b201020116a2009370000201141086a21060240200c450d00200b101d0b2005450d010b200541286c2100200321010340024020012d00002208450d00024020084101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b02402007450d002003101d0b200241306a24002006ad4220862010ad840ba305020a7f017e230041206b220224002002410e360204200241988ec100360200200241106a41a68ec1002002108101410021030240024002400240200228021022042002280218220541f8b3c200410041001002417f460d002002410036020020042005200241044100100241016a41044d0d01200228020021030b02402002280214450d002004101d0b2002200310b30220024100360218200242013703102002280200210620022002280208220336020c2002410c6a200241106a106202400240024002402003450d002006200341286c6a2107200241106a41086a22082802002104200228021421092006210303400240024002400240200920046b41204f0d00200441206a22052004490d062009410174220a20052005200a491b220b4100480d062009450d0120022802102009200b101e220a0d020c070b200441206a21052002280210210a0c020b200b101f220a450d050b2002200b3602142002200a360210200b21090b20082005360200200a20046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a290300210c0240024002400240200920056b41084f0d00200541086a22042005490d062009410174220b20042004200b491b220b4100480d062009450d01200a2009200b101e220a0d020c080b200541086a21040c020b200b101f220a450d060b2002200b3602142002200a360210200b21090b20082004360200200a20056a200c3700002007200341286a2203470d000b2002280204450d060c050b200241186a28020021042002280210210a20022802040d040c050b1021000b200b41011020000b200b41011020000b41df88c0004133103a000b2006101d0b200241206a24002004ad422086200aad840bd60403017f017e0c7f230041d0006b22022400024002400240024002402001450d002001ad42287e2203422088a70d032003a722044100480d032004101f2205450d04200241086a2106200241306a41186a2107200241306a41106a2108200521044100210903402002410e360234200241988ec10036023020022009200241306a107e0240024002402002280200220a2006280200220b41f8b3c200410041001002417f470d00420021032007420037030020084200370300200241306a41086a420037030020024200370330200941016a210920022802040d010c020b2007420037030020084200370300200241306a41086a220c420037030020024200370330200a200b200241306a412041001002220d417f460d05200d4120490d05200241106a41186a220d2007290300370300200241106a41106a220e2008290300370300200241106a41086a220f200c2903003703002002200229033037031020024200370330200a200b200241306a41084120100241016a41084d0d05200229033021032007200d2903003703002008200e290300370300200c200f29030037030020022002290310370330200941016a21092002280204450d010b200a101d0b20042002290330370300200441186a2007290300370300200441106a2008290300370300200441086a200241306a41086a290300370300200441206a2003370300200441286a210420012009470d000b200121040c010b41002104410821050b200020043602082000200136020420002005360200200241d0006a24000f0b41df88c0004133103a000b1021000b200441081020000be90104027f017e017f017e230041206b22022400200241106a41086a220342003703002002420037031041a590c1004117200241106a1001200241086a20032903003703002002200229031037030002400240024002402002411041f8b3c200410041001002417f460d002002420037031020024110200241106a41084100100241016a41084d0d0220022903102104410821054108101f2203450d010c030b42032104410821054108101f22030d020b200541011020000b41df88c0004133103a000b2003427f200420047c220620062004541b370000200241206a24002003ad42808080808001840b8b0301097f230041206b22022400200210800120024100360218200242013703102002280200210320022002280208220436021c2002411c6a200241106a1062024002400240024002402004450d0020044105742105200241106a41086a280200210620022802102107200228021421082003210403400240024002400240200820066b41204f0d00200641206a22092006490d062008410174220a20092009200a491b220a4100480d062008450d0120072008200a101e22070d020c070b200641206a21090c020b200a101f2207450d050b200a21080b200720066a22062004290000370000200641186a200441186a290000370000200641106a200441106a290000370000200641086a200441086a29000037000020092106200441206a2104200541606a22050d000b200241186a200936020020022008360214200220073602102002280204450d040c030b200241186a28020021092002280210210720022802040d020c030b1021000b200a41011020000b2003101d0b200241206a24002009ad4220862007ad840baf0601097f230041106b2202240020024100360208200242013703002000280200210302400240024002404104101f2204450d0020024284808080c000370204200220043602002004200336000020002802042103200441044108101e2204450d012002428880808080013702042004200336000420022004360200200041086a28020021042002200041106a280200220336020c2002410c6a2002106202400240024002402003450d0020034105742105200241086a220628020021032002280204210703400240024002400240200720036b41204f0d00200341206a22082003490d0620074101742209200820082009491b220a4100480d062007450d0120022802002007200a101e22090d020c070b200341206a2108200228020021090c020b200a101f2209450d050b2002200a36020420022009360200200a21070b20062008360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002003200429000037000020082103200441206a2104200541606a22050d000b0b200041146a280200210420022000411c6a280200220336020c2002410c6a2002106202402003450d00200341057421054100200241086a220628020022036b21082002280204210703400240024002400240200720086a41204f0d00200341206a22092003490d062007410174220a20092009200a491b220a4100480d062007450d0120022802002007200a101e22090d020c080b200228020021090c020b200a101f2209450d060b2002200a36020420022009360200200a21070b2006200341206a220a360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a29000037000020032004290000370000200841606a2108200a2103200441206a2104200541606a22050d000b200128020020012802042009200a10032007450d070c060b200228020421042001280200200128020420022802002209200241086a280200100320040d050c060b1021000b200a41011020000b200a41011020000b410441011020000b410841011020000b2009101d0b200241106a24000bb00b03057f047e017f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012d00002203450d0020034101470d02200041003a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a29000037000020030d014101450d0f0c0e0b2002412b6a2001410c6a280000360000200041013a00002002200141046a29000037002320002002290020370001200041086a200241276a2900003700002003450d020b20034101460d0d20030d05200141086a280200450d0d200141046a280200101d200241c0006a24000f0b20034104470d0720022001410c6a28020022043602142002200141046a2802002205360210200241003a0020200241206a20052004410047220610ce031a20042006490d052002200420066b22033602142002200520066a22063602102004450d0720022d002022044102460d0220044101460d0120040d07200241003a0020200241206a20062003410047220410ce031a20032004490d082002200320046b22053602142002200620046a22063602102003450d0620022d00200d0641002103200241206a2005412020054120491b22046a41004100412020046b2004411f4b1b10cd031a200241206a2006200410ce031a2002200520046b3602142002200620046a3602102005411f4d0d062002411c6a41026a2206200241206a41026a22052d00003a0000200220022f00203b011c20022800232104200229002f210720022900372108200231003f21092002290027210a200520062d000022063a00002002410c6a41026a20063a0000200220022f011c22063b010c200220063b0120200a422088a72106200aa721050c030b41000d0a0c0b0b200241003a0020200241206a20062003410047220410ce031a20032004490d072002200320046b3602142002200620046a3602102003450d0520022d00200d05200241206a200241106a10b90220022802202204450d05200229022421072002410c6a41026a200241206a41026a2d00003a0000200220022f00203b010c2007422088a721062007a72105410121030c010b200241003a0020200241206a20062003410047220510ce031a20032005490d072002200320056b22043602142002200620056a22063602102003450d040240024020022d002022034101460d0020030d0620024200370320200241206a20062004410820044108491b220310ce031a2002200420036b3602142002200620036a360210200441074d0d0620022903202108200241206a200241106a10b80220022802202206450d0620022902242107410021050c010b20024200370320200241206a20062004410820044108491b220510ce031a2002200420056b22033602142002200620056a2206360210200441074d0d052002290320210820024200370320200241206a20062003410820034108491b220410ce031a2002200320046b3602142002200620046a360210200341074d0d0520022903202109200241206a200241106a10b80220022802202206450d0520022902242107410121050b410221032002410c6a41026a200241206a41026a2d00003a0000200220022f00203b010c0b200241206a41026a220b2002410c6a41026a2d00003a0000200220022f010c3b0120200020033a0000200041206a2009370000200041186a2008370000200041106a2007370000200041086a2006ad4220862005ad84370000200041046a2004360000200020022f01203b0001200041036a200b2d00003a00000b200141086a280200450d07200141046a280200101d0c070b20062004102a000b200241206a41026a2002411c6a41026a2d00003a0000200220022f001c3b01200b41cb8fc200411e103a000b20042003102a000b20042003102a000b20052003102a000b200141086a280200450d00200141046a280200101d200241c0006a24000f0b200241c0006a24000bd10504027f017e0f7f017e230041d0006b22022400200241086a200110b5010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b410021114100210e0c030b102e000b200541081020000b200241306a41186a2107200241306a41106a2108200241306a41086a2109200141046a210a4100210b4100210c4100210d2003210e0240034020074200370300200842003703002009420037030020024200370330200241306a2001280200220f200a28020022054120200541204922101b221110ce031a200a200520116b22053602002001200f20116a221136020020100d01200241106a41186a22102007290300370300200241106a41106a22122008290300370300200241106a41086a221320092903003703002002200229033037031020024200370330200241306a20112005410820054108491b220f10ce031a200a2005200f6b36020020012011200f6a360200200541074d0d01200d41016a211120022903302104200720102903003703002008201229030037030020092013290300370300200220022903103703300240200d200e470d00200b20112011200b491b220ead42287e2214422088a70d042014a722054100480d040240200d450d002006200c2005101e22060d010c060b2005101f2206450d050b2006200c6a22052002290330370300200541186a2007290300370300200541106a2008290300370300200541086a2009290300370300200541206a2004370300200b41026a210b200c41286a210c2011210d20112003490d000c020b0b200041003602000240200e450d002006101d0b200241d0006a24000f0b2000200e36020420002006360200200041086a2011360200200241d0006a24000f0b1021000b200541081020000bd80403027f017e0e7f230041d0006b22022400200241086a200110b50102400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210e0c030b102e000b200541011020000b200241306a41186a2107200241306a41106a2108200241306a41086a2109200141046a210a4100210b4100210c4100210d2003210e034020074200370300200842003703002009420037030020024200370330200241306a2001280200220f200a2802002205412020054120491b221010ce031a200a200520106b3602002001200f20106a3602002005411f4d0d02200d41016a2105200241106a41186a22102007290300370300200241106a41106a220f2008290300370300200241106a41086a22112009290300370300200220022903303703100240200d200e470d00200b20052005200b491b220ead4205862204422088a70d042004a722124100480d040240200d450d002006200c2012101e22060d010c060b2012101f2206450d050b2006200c6a220d2002290310370000200d41186a2010290300370000200d41106a200f290300370000200d41086a2011290300370000200b41026a210b200c41206a210c2005210d20052003490d000b0b2000200e36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200e450d002006101d0b200241d0006a24000f0b1021000b201241011020000b8303010a7f230041106b220224002002200110b5010240024002400240024002400240024002402002280200450d0020022802042203417f4c0d072003450d012003101f2204450d08200141046a2105410021064100210720032108034020052802002109200241003a000f2002410f6a2001280200220a2009410047220b10ce031a2009200b490d0520052009200b6b3602002001200a200b6a3602002009450d04200741016a210920022d000f210b024020072008470d002006200920092006491b22084100480d0702402007450d00200420072008101e22040d010c090b2008101f2204450d080b200420076a200b3a0000200641026a21062009210720092003490d000c030b0b20004100360200200241106a24000f0b4101210441002109410021080b2000200836020420002004360200200041086a2009360200200241106a24000f0b2000410036020002402008450d002004101d0b200241106a24000f0b200b2009102a000b1021000b200841011020000b102e000b200341011020000bdd0801067f230041f0006b22022400200241003a005020012802002001280204200241d0006a410120012802081002210320012001280208200341016a41014b22036a220436020802400240024002402003450d0020022d0050220341ef014b0d010c020b200041023a0000200241f0006a24000f0b024002400240024002400240200341847e6a220341034b0d0002400240024020030e0400040102000b200141046a2802002103200241003b0150200141086a2205410020012802002003200241d0006a41022004100222012001417f461b2201410220014102491b20052802006a360200200141014d0d0620022f0150220341ef014b0d08200041023a0000200241f0006a24000f0b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100222012001417f461b2201410420014104491b20052802006a360200200041023a0000200241f0006a24000f0b200241d0006a41186a4200370300200241d0006a41106a4200370300200241d0006a41086a42003703002002420037035041002105200141086a220341002001280200200141046a280200200241d0006a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d022002412e6a20022d00523a0000200241106a41086a200241df006a290000370300200241106a41106a200241e7006a290000370300200241106a41186a200241d0006a411f6a2d00003a0000200220022f01503b012c2002200229005737031020022800532103410121050c030b200041023a0000200241f0006a24000f0b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100222012001417f461b2201410420014104491b20052802006a360200200141034d0d03410121012002280250220341ffff034b0d05200041023a0000200241f0006a24000f0b0b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2204200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c2002200229031037033002402005450d002002410c6a41026a20012d00003a0000200241d0006a41086a2004290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010c040b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b410121010b200020022f010c3b0001200020013a0000200041046a2003360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a280200360200200241f0006a24000b8e0a01037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00004101470d00200041046a280200220241ffff034d0d01200141046a280200200141086a2802002200470d03200041016a22032000490d1820004101742204200320032004491b22044100480d182000450d09200128020020002004101e2203450d0a0c160b200141046a280200200141086a2802002202470d01200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d04200128020020022004101e2203450d050c130b200241ef014b0d02200141046a280200200141086a2802002200470d05200041016a22032000490d1620004101742204200320032004491b22044100480d162000450d09200128020020002004101e22030d0a0c0f0b200128020021030c120b200128020021030c130b200141046a280200200141086a2802002200470d03200041016a22032000490d1320004101742204200320032004491b22044100480d132000450d09200128020020002004101e22030d0a0c0d0b2004101f22030d0e0b200441011020000b200128020021030c050b200128020021030c070b2004101f22030d0c0b200441011020000b2004101f2203450d050b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b2004101f2203450d030b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a00000240024002400240200141046a2802002203200428020022006b41024f0d00200041026a22042000490d0b20034101742200200420042000491b22004100480d0b2003450d01200128020020032000101e22030d020c060b200128020021030c020b2000101f2203450d040b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b200441011020000b200441011020000b200041011020000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240024002400240200141046a2802002203200428020022026b41204f0d00200241206a22042002490d0720034101742202200420042002491b22024100480d072003450d01200128020020032002101e2203450d020c030b200128020021030c030b2002101f22030d010b200241011020000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a0000024002400240200141046a2802002203200428020022006b41044f0d00200041046a22042000490d0320034101742200200420042000491b22004100480d032003450d01200128020020032000101e2203450d020c040b200128020021030c040b2000101f22030d020b200041011020000b1021000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000b130020004105360204200041acaec3003602000b13002000410d3602042000418494c1003602000b13002000410836020420004180b1c3003602000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242033700000f0b410841011020000b130020004101360204200041e8b7c3003602000b13002000410f360204200041a297c1003602000b130020004102360204200041b4b8c3003602000b130020004101360204200041fcb9c3003602000b130020004109360204200041cd9ac1003602000b13002000410436020420004180bbc3003602000ba01e03077f017e017f230041d0026b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022044101460d0020044102470d16200341246a41026a200141076a2d00003a0000200341086a41086a200141186a290200370300200341086a410d6a2001411d6a290000370000200320012f00053b01242003200141106a290200370308200141086a28020021052001410c6a280200210620012d0004210720022d0001210820022d00002101200341b0016a41186a22042002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012001450d01410121040c020b2001280204210420022d0001210520022d00002101200341c8016a22082002411a6a290100370300200341c0016a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012001450d03410121080c040b200341cc026a41026a220920032d00b2013a0000200341a0026a41086a200341c3016a290000370300200341a0026a410d6a2004290000370000200320032f01b0013b01cc02200320032900bb013703a00241012104200841ff01714101470d0020032800b301210220032800b7012101200341c8006a41026a20092d00003a0000200341b0016a41086a200341a0026a41086a290300370300200341b0016a410d6a200341a0026a410d6a290000370000200320032f01cc023b0148200320032903a0023703b001410021040c010b41f1b4c0002102412a21010b20034190016a41026a2208200341c8006a41026a2d00003a0000200341286a41086a2209200341b0016a41086a290300370300200341286a41106a200341b0016a41106a290300370300200320032f01483b019001200320032903b00137032820040d11200341fb006a2009290300370000200341e8006a41186a200341356a290000370000200320032f0190013b01682003200136006f2003200236006b20032003290328370073200320082d00003a006a200341c8006a41086a220242003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2002290300370300200320032903483703b802200341b8026a411041f8b3c200410041001002417f460d03200341b0016a41186a4200370300200341b0016a41106a4200370300200341b8016a4200370300200342003703b001200341b8026a4110200341b0016a4120410010022202417f460d132002411f4d0d13200341ce026a220220032d00b2013a0000200341a0026a41086a2201200341c3016a2204290000370300200341a0026a410d6a2208200341c8016a2209290000370000200320032f01b0013b01cc02200320032900bb013703a00220032900b301210a200341286a41086a220b2001290300370300200341286a410d6a22012008290000370000200320022d00003a00b201200320032f01cc023b01b001200320032903a0023703282004200b290300370000200920012900003700002003200a3700b301200320032903283700bb010c040b200341cc026a41026a20032d00b2013a0000200341a0026a41086a200341c3016a290000370300200341a0026a410d6a22092008290000370000200320032f01b0013b01cc02200320032900bb013703a00241012108200541ff01714101470d0020032800b301210220032800b7012101200341e8006a41026a200341cc026a41026a2d00003a0000200341b0016a41086a200341a0026a41086a290300370300200341b0016a410d6a2009290000370000200320032f01cc023b0168200320032903a0023703b001410021080c010b41f1b4c0002102412a21010b200341e4006a41026a2209200341e8006a41026a2d00003a0000200341c8006a41086a2205200341b0016a41086a290300370300200341c8006a41106a200341b0016a41106a290300370300200320032f01683b0164200320032903b00137034820080d042003413b6a2005290300370000200341286a41186a200341d5006a290000370000200320032f01643b01282003200136002f2003200236002b20032003290348370033200320092d00003a002a200542003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2005290300370300200320032903483703b802200341b8026a411041f8b3c200410041001002417f460d02200341b0016a41186a4200370300200341b0016a41106a4200370300200341b8016a4200370300200342003703b001200341b8026a4110200341b0016a4120410010022202417f460d112002411f4d0d11200341ce026a220220032d00b2013a0000200341a0026a41086a2201200341c3016a2205290000370300200341a0026a410d6a2208200341c8016a2209290000370000200320032f01b0013b01cc02200320032900bb013703a00220032900b301210a200341e8006a41086a22062001290300370300200341e8006a410d6a22012008290000370000200320022d00003a00b201200320032f01cc023b01b001200320032903a00237036820052006290300370000200920012900003700002003200a3700b301200320032903683700bb010c030b200341b0016a41186a4200370300200341c0016a4200370300200341b8016a4200370300200342003703b0010b0240200341e8006a200341b0016a412010d003450d0041e79fc1002102413121010c0d0b200341b8026a41026a2202200341246a41026a2d00003a0000200341b0016a41086a2201200341086a41086a290300370300200341b0016a410d6a2204200341086a410d6a290000370000200320032f01243b01b802200320032903083703b001200741ff01714101470d04200341a0026a200541067610b00120032802a002210120032802a8022005413f7122024d0d05200341cc026a41026a200120024105746a220241026a2d00003a0000200341306a200241136a290000370300200341356a200241186a290000370000200320022f00003b01cc022003200229000b37032820022800072106200228000321054101210220032802a4020d060c070b200341b0016a41186a4200370300200341c0016a4200370300200341b8016a4200370300200342003703b0010b200341286a200341b0016a412010d003450d0141bd9fc1002102412221010b2004103c2004101d0c090b200341b0016a200441e00010ce031a41002102200341003b01682003200341b0016a200341e8006a108a0120032003280200453a00b2012003410c3b01b001200341b0016a108b012004101d0c070b200341cc026a41026a20022d00003a0000200341286a41086a2001290300370300200341286a410d6a2004290000370000200320032f01b8023b01cc02200320032903b0013703280c030b4100210220032802a402450d010b2001101d0b2002450d010b200341a0026a41026a200341cc026a41026a2d00003a0000200341b0016a41086a200341286a41086a290300370300200341b0016a410d6a200341286a410d6a290000370000200320032f01cc023b01a002200320032903283703b001410021010c010b4101210141d7c0c1002105411521060b200341e4006a41026a2204200341a0026a41026a2d00003a0000200341c8006a41086a2202200341b0016a41086a290300370300200341c8006a41106a200341b0016a41106a290300370300200320032f01a0023b0164200320032903b00137034802402001450d0020062101200521020c020b200341ac016a41026a20042d00003a000020034190016a41086a200229030037030020034190016a410d6a200341c8006a410d6a290000370000200320032f01643b01ac012003200329034837039001200242003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2002290300370300200320032903483703b8024100210202400240200341b8026a411041f8b3c200410041001002417f460d00200341c8016a4200370300200341b0016a41106a4200370300200341b8016a4200370300200342003703b001200341b8026a4110200341b0016a4120410010022202417f460d072002411f4d0d07200341cc026a41026a220120032d00b2013a0000200341a0026a41086a2204200341c3016a290000370300200341a0026a410d6a2209200341c8016a290000370000200320032f01b0013b01cc02200320032900bb013703a00220032800b301210220032800b7012108200341c8006a41026a20012d00003a0000200341b0016a41086a2004290300370300200341b0016a410d6a2009290000370000200320032f01cc023b0148200320032903a0023703b0010c010b200341ca006a41003a0000200341b0016a410d6a4200370000200341b8016a4200370300200341003b0148200342003703b001410021080b200341a0026a41026a2209200341c8006a41026a2d00003a0000200341286a41086a2207200341b0016a41086a2204290300370300200341286a410d6a220b200341b0016a410d6a2201290000370000200320032f01483b01a002200320032903b001370328200341b9016a200836000020012003290328370000200341c5016a2007290300370000200341ca016a200b2900003700002003418c023b01b001200320023600b501200320032f01a0023b01b201200320092d00003a00b401200341b0016a108b01200341286a41026a2208200341ac016a41026a2d00003a0000200420034190016a41086a290300370300200120034190016a410d6a290000370000200320032f01ac013b012820032003290390013703b001200341c8006a41086a220242003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2002290300370300200320032903483703b8024120101f2202450d06200220032f01283b00002002200636000720022005360003200220032903b00137000b200241026a20082d00003a0000200241136a2004290300370000200241186a2001290000370000200341b8026a41102002412010032002101d410021020b0b2000200136020420002002360200200341d0026a24000f0b200341c4016a41013602002003411836026c200341c0adc400360268200342013702b401200341c8adc4003602b0012003200341e8006a3602c001200341b0016a4198bfc30010cf01000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b412041011020000b9f3707027f027e017f027e257f0a7e027f230041d0046b2203240041f7b5c0002104024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710d00200241ff01714102470d00200341b0046a41086a22044200370300200342003703b00441838cc1004113200341b0046a1001200341a8016a41086a2004290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f470d0020044200370300200342003703b004418390c100410d200341b0046a1001200341b0036a41086a2004290300370300200320032903b0043703b003200341b0036a411041f8b3c200410041001002417f460d01200342003703d801024002400240200341b0036a4110200341d8016a41084100100241016a41084d0d0020032903d801500d04200341b0046a41086a22044200370300200342003703b004418390c100410d200341b0046a1001200341b0036a41086a22012004290300370300200320032903b0043703b003420021050240200341b0036a411041f8b3c200410041001002417f460d00200342003703d801200341b0036a4110200341d8016a41084100100241016a41084d0d0220032903d80121050b20044200370300200342003703b00441a590c1004117200341b0046a100120012004290300370300200320032903b0043703b00302400240200341b0036a411041f8b3c200410041001002417f460d00200342003703d801200341b0036a4110200341d8016a41084100100241016a41084d0d0420032903d80120057c2000560d010c060b420320057c2000580d050b41ecacc300102c000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41d4acc300102c000b200341b0046a41086a22044200370300200342003703b004418390c100410d200341b0046a1001200341b0036a41086a22012004290300370300200320032903b0043703b003200320003703d801200341b0036a4110200341d8016a41081003200341013a00d80120044200370300200342003703b00441838cc1004113200341b0046a100120012004290300370300200320032903b0043703b003200341b0036a4110200341d8016a4101100320044200370300200342003703b00441a590c1004117200341b0046a1001200341a8016a41086a2004290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f460d00200342003703b003200341a8016a4110200341b0036a41084100100241016a41084d0d0b20032903b00321050c010b420321050b200341b0046a41086a22014200370300200342003703b00441e58ac0004112200341b0046a1001200341b0036a41086a22022001290300370300200320032903b0043703b0034100210402400240200341b0036a411041f8b3c200410041001002417f460d00200342003703d801200341b0036a4110200341d8016a41084100100241016a41084d0d0c20032903d8012106410021070c010b410121070b20014200370300200342003703b00441e58ac0004112200341b0046a100120022001290300370300200320032903b0043703b003200320003703d801200341b0036a4110200341d8016a410810032006500d0020070d00427f200520057c220820082005541b22054200510d192000200580220020062005802205580d1a2000200542017c2206510d0042002109200341b0046a41086a22044200370300200342003703b00441aaa8c1004112200341b0046a1001200341b0036a41086a2004290300370300200320032903b0043703b00302400240200341b0036a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0036a3602a802200341d8016a200341a8026a105e20032802d801220a450d1f20032902dc0121090c010b4101210a0b024020002005427f857ca7220b450d002009422088a7220c200b4d0d002006a7210d200341d9036a210e200341b0036a41096a210f200341a8026a4104722110200341d8016a41286a2111200341d8016a41206a2112200341d8016a41246a2113200341e8036a2114200341b0036a412c6a2115410021160340200341b8016a41186a200a2016200d6a200c704105746a220441186a290000370300200341b8016a41106a200441106a290000370300200341b8016a41086a200441086a290000370300200320042900003703b801200341d8016a200341b8016a10c90202402012280200223a450d00200341a8026a41086a201141086a290300370300200341a8026a41106a201141106a290300370300200341a8026a41186a201141186a290300370300200341a8026a41206a201141206a280200360200200320112903003703a80220132802002139200341d0026a41186a2217201041186a290000370300200341d0026a41106a2218201041106a290000370300200341d0026a41086a2219201041086a290000370300200320102900003703d002200341b0046a41086a221a4200370300200342003703b00441e2d6c1004115200341b0046a1001200341a8016a41086a221b201a290300370300200320032903b0043703a8010240024002400240200341a8016a411041f8b3c200410041001002417f470d0041014100200341d0026a10630d020c010b200342103702b4042003200341a8016a3602b004200341b0036a200341b0046a105e20032802b0032204450d1620032802b40321012004200341b0036a41086a280200200341d0026a1063210202402001450d002004101d0b20020d010b4112101f2204450d16200441106a41002f0087d74122013b0000200441086a41002900ffd6412200370000200441002900f7d6412205370000200441124132101e2204450d17200420032903d0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300200342003703b00420044132200341b0046a1001201b201a290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f460d00200341003602b003200341a8016a4110200341b0036a41044100100241016a41044d0d1220032802b003211c2004101d4112101f22040d010c1a0b4100211c2004101d4112101f2204450d190b200441106a20013b0000200441086a200037000020042005370000200441124132101e2204450d19200420032903d0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300200342003703b00420044132200341b0046a1001201b201a290300370300200320032903b0043703a8012003201c41016a221d3602b003200341a8016a4110200341b0036a410410032004101d201a4200370300200342003703b0044189d7c1004119200341b0046a1001201b201a290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f460d00200341003602b003200341a8016a4110200341b0036a41044100100241016a41044d0d1320032802b003211e0c010b4100211e0b200341f0026a41186a22042017290300370300200341f0026a41106a22012018290300370300200341f0026a41086a22022019290300370300200320032903d0023703f00242002108201a4200370300200342003703b004418cb9c000410d200341b0046a1001201b201a290300370300200320032903b0043703a8010240200341a8016a411041f8b3c200410041001002417f460d00200342003703b003200341a8016a4110200341b0036a41084100100241016a41084d0d0e20032903b00321080b20034190036a41186a221f200429030037030020034190036a41106a2220200129030037030020034190036a41086a22212002290300370300200320032903f00237039003201a4200370300200342003703b00441a2d7c1004117200341b0046a1001201b201a290300370300200320032903b0043703a80102400240024002400240024002400240200341a8016a411041f8b3c200410041001002417f460d00200342103702a4042003200341a8016a3602a004200341a0016a200341a0046a10d50120032802a001450d1020032802a4012222ad42307e2200422088a70d1b2000a72204417f4c0d1b2004450d012004101f2223450d282022450d030c020b200341b0046a41186a2204201f290300370300200341b0046a41106a2201202029030037030041082123200341b0046a41086a220220034190036a41086a29030037030020032003290390033703b004200341b0036a41186a2004290300370300200341b0036a41106a2001290300370300200341b0036a41086a2002290300370300200320032903b0043703b0034100212b420021060c040b410821232022450d010b200341a0046a41086a222428020021254100212620032802a404212720032802a004212841002129410021042022212a0340200341b0036a41186a22024200370300200341b0036a41106a22074200370300200341b0036a41086a222b4200370300200342003703b0032024410020282027200341b0036a41202025100222012001417f461b220141202001412049222c1b20256a2201360200202c0d0d200341b0046a41186a222d2002290300370300200341b0046a41106a222e2007290300370300201a202b290300370300200320032903b0033703b004200342003703b0032024410020282027200341b0036a41082001100222252025417f461b2225410820254108491b20016a2201360200202541074d0d0d20032903b0032100200341003602b0032024410020282027200341b0036a41042001100222252025417f461b222c4104202c4104491b20016a2225360200202c41034d0d0d200441016a210120032802b003212c2002202d2903003703002007202e290300370300202b201a290300370300200320032903b0043703b00302402004202a470d002026200120012026491b222aad42307e2205422088a70d0d2005a7222d4100480d0d02402004450d0020232029202d101e22230d010c140b202d101f2223450d130b202320296a22042000370300200441206a2002290300370300200441186a2007290300370300200441106a202b290300370300200441086a20032903b003370300200441286a202c360200202641026a2126202941306a21292001210420012022490d000b20230d010c0d0b410021014100212a2023450d0c0b200341b0046a41186a2229201f290300370300200341b0046a41106a22242020290300370300201a202129030037030020032003290390033703b00402402001ad422086202aad842206422088a7222b4120490d0041302104202b41306c21072023ad42208621054201210020232102034002402002290300202320046a2201290300580d002001ad4220862000842105200121020b200042017c21002007200441306a2204470d000b2002450d20200542ffffffff0f580d20200341b0036a41186a22012029290300370300200341b0036a41106a22022024290300370300200341b0036a41086a2207201a290300370300200320032903b0043703b003202b2005a722044d0d252023200441306c6a22042008370300200441206a2001290300370300200441186a2002290300370300200441106a2007290300370300200420032903b003370308200441013602280c030b200341b0036a41186a2029290300370300200341b0036a41106a2024290300370300200341b0036a41086a201a290300370300200320032903b0043703b0032006a7202b470d010b202b4101742204202b41016a220120012004491bad220042307e2205422088a70d082005a722044100480d0802400240202b450d002023202b41306c2004101e22230d010c210b2004101f2223450d200b2006422088a7212b200021060b2023202b41306c6a22042008370300200441206a200341b0036a41186a290300370300200441186a200341b0036a41106a290300370300200441106a200341b0036a41086a290300370300200420032903b00337030820044101360228200642ffffffff0f83202b41016aad4220868421060b201a4200370300200342003703b00441a2d7c1004117200341b0046a1001201b201a290300370300200320032903b0043703a801200341b0036a41086a22244100360200200342013703b00320032006422088a722043602b004200341b0046a200341b0036a1062024002402004450d00200441306c21254158202428020022046b212b2004412c6a210420032802b403210220232101034002400240024002402002202b6a41286a41204f0d00200441546a222941206a22072029490d0d20024101742229200720072029491b22294100480d0d2002450d0120032802b00320022029101e22070d020c100b20032802b00321070c020b2029101f2207450d0e0b200320293602b403200320073602b003202921020b2024200441746a2226360200200720046a2229416c6a200141206a290000370000202941646a200141186a2900003700002029415c6a200141106a290000370000202941546a200141086a2900003700002001290300210002400240024002402002202b6a222941086a20294f0d00202641086a22292026490d0d20024101742226202920292026491b22294100480d0d2002450d01200720022029101e22070d020c110b200221290c020b2029101f2207450d0f0b200320293602b403200320073602b0030b20242004417c6a2202360200200720046a41746a2000370000200141286a280200212602400240024002402029202b6a41034b0d00200241046a22272002490d0d20294101742202202720272002491b22024100480d0d2029450d01200720292002101e22070d020c120b202921020c020b2002101f2207450d100b200320023602b403200320073602b0030b200141306a210120242004360200200720046a417c6a2026360000202b41546a212b2004412c6a2104202541506a22250d000c020b0b20032802b403210220032802b00321070b200341a8016a411020072024280200100302402002450d002007101d0b02402006a7450d002023101d0b4112101f2204450d1a200441106a41002f00ddc5413b0000200441086a41002900d5c541370000200441002900cdc541370000200441124132101e2204450d1b200420032903d0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300200342003703b00420044132200341b0046a1001201b201a290300370300200320032903b0043703a8010240024002400240024002400240200341a8016a411041f8b3c200410041001002417f460d00200342103702b4032003200341a8016a3602b00320034198016a200341b0036a10d501200328029801450d1b200328029c01210120034180016a200341b0036a10ca02200328028001450d1b2004101d410a2104200141094d0d01201d410a201e6a4d0d030c020b2004101d410321010b201d20012204201e6a4d0d010b200341b0036a200341d0026a10cb022024290300210020032903b00321050240200341b0036a41246a2207280200450d00200341b0036a41206a280200101d0b201a4200370300200342003703b00441ccd7c1004114200341b0046a1001201b201a290300370300200320032903b0043703a801200341a8016a411041f8b3c200410041001002417f460d01200341003602b003200341a8016a4110200341b0036a41044100100241016a41044d0d1620033502b00321060c020b200341b0046a41186a2017290300370300200341b0046a41106a2018290300370300201a2019290300370300200320032903d0023703b004410121040c020b42c0843d21060b200341c0006a200542002006420010d203200341d0006a4289f48bdcc4002003290340428094ebdc038020032903484200521b4200200410d303200341d0006a41086a290300210620032903502108200341b0036a200341d0026a10cb02200341e0006a200341d0026a20032903b003222f20052008200441ff004b2005200854200020065420002006511b7222041b2230202f203054202429030022312000200620041b22325420312032511b22041b2208200341b0036a41106a29030022332033200856200341b0036a41186a29030022342031203220041b22065620342006511b22041b22352006203420041b223610ef01200341e0006a41086a29030021002003290360210502402003290370223720357d223820087c2208200341e0006a41186a29030020367d2037203554ad7d20067c2008203854ad7c223584500d00202f20337d2236203120347d202f203354ad7d223184500d00200341b0036a41286a2802002201450d00200341b0036a41206a2802002204200141306c6a21020340200341106a2004290300200441086a2903002008203510d20320032003290310200341106a41086a2903002036203110d103200341206a200441106a2003290300200341086a29030010ef01427f2000200341206a41086a2903007c200520032903207c22062005542201ad7c22052001200520005420052000511b22011b2100427f200620011b2105200441306a22042002470d000b0b2005200010f30102402007280200450d00200341b0036a41206a280200101d0b200341d0026a10e401201a4200370300200342003703b00441e0d7c1004115200341b0046a1001201b201a290300370300200320032903b0043703a801200341a8016a411041f8b3c20041001003200341003a00b003201a4200370300200342003703b00441e9a4c1004119200341b0046a1001201b201a290300370300200320032903b0043703a801200341a8016a4110200341b0036a41011003200341b0046a41186a2017290300370300200341b0046a41106a2018290300370300201a2019290300370300200320032903d0023703b004410221040b20142032370300200341b0036a41306a2030370300202420043a0000200f20032903b004370000200e20032f0090033b00002015201c360200200f41086a201a290300370000200f41106a200341b0046a41106a290300370000200f41186a200341b0046a41186a290300370000200e41026a20034190036a41026a2d00003a0000200341043a00b003200341b0036a108b0120390d010c020b2039450d010b203a101d0b201641016a2216200b470d000b0b410021042009a7450d00200a101d0b200341d0046a240020040f0b1021000b202a450d002023101d0b41df88c0004133103a000b202941011020000b202941011020000b200241011020000b202d41081020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b102e000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b413241011020000b411241011020000b413241011020000b411241011020000b413241011020000b41b9d7c1004113103a000b200441081020000b41a8d1c200102c000b41c0d1c200102c000b200441081020000b4188eac3002004202b104b000b41df88c0004133103a000bc80401077f230041a0016b22022400024002400240410e101f2203450d00200341066a41002900e5c541370000200341002900dfc5413700002003410e412e101e2203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241d0006a41086a22014200370300200242003703502003412e200241d0006a1001200241306a41086a20012903003703002002200229035037033002400240200241306a411041f8b3c200410041001002417f460d00200242103702442002200241306a360240200241d0006a200241c0006a10fc0220022802702201450d0420002002290350370300200041186a200241d0006a41186a290300370300200041106a200241d0006a41106a290300370300200041086a200241d0006a41086a290300370300200241086a2204200241d0006a412c6a290200370300200241106a2205200241d0006a41346a290200370300200241186a2206200241d0006a413c6a290200370300200241206a2207200241d0006a41c4006a290200370300200241286a2208200241d0006a41cc006a2802003602002002200229027437030020002001360220200020022903003702242000412c6a2004290300370200200041346a20052903003702002000413c6a2006290300370200200041c4006a2007290300370200200041cc006a20082802003602000c010b200041003602200b2003101d200241a0016a24000f0b410e41011020000b412e41011020000b41df88c0004133103a000bcc0603047f037e037f230041206b22022400200241003a001020012802002001280204200241106a410120012802081002210320012001280208200341016a41014b22036a22043602080240024002402003450d000240024002400240024020022d0010220541037122034102460d0020034101460d0120030d022005410276ad21060c030b20024100360210200220053a0010200141086a220341002001280200200141046a280200200241106a41017241032004100222012001417f461b22014103200141034922011b20032802006a36020020010d042002280210410276ad21060c020b200241003b0110200220053a00102001280200200141046a280200200241106a4101724101200410022103200141086a22012001280200200341016a220141014b6a36020020014102490d0320022f0110410276ad21060c010b0240024020054102762203410c460d0020034104460d0120030d03200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100222012001417f461b22014104200141044922011b20052802006a36020020010d04200235021021060c020b420021072002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100222012001417f461b22014110200141104922011b20032802006a36020020010d04200241106a41086a290300210820022903102106420121070c050b4200210720024200370310200141086a220341002001280200200141046a280200200241106a41082004100222012001417f461b22014108200141084922011b20032802006a36020020010d03200229031021060b42002108420121070c030b200341046a220941104b0d00200141046a210a200141086a21054200210642002108410021030340200241003a00102001280200200a280200200241106a410120041002210420052005280200200441016a41014b220b6a2204360200200b450d01200220023100104200200341037441f8007110d303200241086a29030020088421082002290300200684210642012107200341016a220341ff01712009490d000c030b0b420021070b0b2000200637030820002007370300200041106a2008370300200241206a24000be60806037f047e017f017e0a7f037e230041b0016b220224000240024002400240024002400240024002400240410f101f2203450d00200341076a41002900e9d841370000200341002900e2d8413700002003410f412f101e2204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a29000037000020024190016a41086a2201420037030020024200370390012004412f20024190016a1001200241d0006a41086a200129030037030020022002290390013703500240024002400240200241d0006a411041f8b3c200410041001002417f460d00200242103702642002200241d0006a360260200241386a200241e0006a10ca022002290338a7450d0b200241386a41106a290300210520022903402106200241206a200241e0006a10ca022002290320a7450d0b200241306a290300210720022903282108200241186a200241e0006a10d5012002280218450d0b200228021c2209ad42307e220a422088a70d03200aa72201417f4c0d032001450d012001101f220b450d062009450d020c070b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000c080b4108210b20090d050b4100210f4200210a200b450d080c050b102e000b410f41011020000b412f41011020000b200141081020000b20024190016a41186a210320024190016a41106a210c4200210a4100210d4100210e410021012009210f034020034200370300200c420037030020024190016a41086a221042003703002002420037039001200241e0006a41086a22112011280200221141002002280260200228026420024190016a41202011100222112011417f461b2211412020114120491b6a3602002011411f4d0d03200241f0006a41186a22122003290300370300200241f0006a41106a2213200c290300370300200241f0006a41086a2214201029030037030020022002290390013703702002200241e0006a10ca022002290300a7450d03200141016a2111200241106a29030021152002290308211620032012290300370300200c201329030037030020102014290300370300200220022903703703900102402001200f470d00200d20112011200d491b220fad42307e2217422088a70d062017a722124100480d0602402001450d00200b200e2012101e220b0d010c080b2012101f220b450d070b200b200e6a2201201537030820012016370300200141286a2003290300370300200141206a200c290300370300200141186a2010290300370300200141106a200229039001370300200a4280808080107c210a200d41026a210d200e41306a210e2011210120112009490d000b200b450d030b200020083703102000200537030820002006370300200041246a200a200fad843702002000200b360220200041186a20073703000b2004101d200241b0016a24000f0b200f450d00200b101d0b41df88c0004133103a000b1021000b201241081020000bdc81010d097f017e077f037e017f017e017f017e357f017e237f017e047f230041f0026b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a220541044b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e050005020301000b200141046a2802002106200241096a2800002105200241056a280000210720022d0001210820022d00002109200341306a41086a220a200241156a290000370300200341306a410d6a220b2002411a6a2900003700002003200241046a2d00003a00d2012003200241026a2f01003b01d00120032002410d6a2900003703302009450d09410121090c0a0b20022d000120022d0000720d02200141086a290300210c20034180026a41086a22024200370300200342003703800241bca0c100411a20034180026a1001200341b0016a41086a200229030037030020032003290380023703b0012003200c370330200341b0016a4110200341306a410810030c4f0b200341206a200141196a290000370300200341186a200141116a290000370300200341086a41086a200141096a29000037030020032001290001370308200241096a2800002105200241056a280000210720022d0001210d20022d0000210e200341306a41086a220f200241156a290000370300200341306a410d6a22102002411a6a2900003700002003200241046a2d00003a00d2012003200241026a2f01003b01d00120032002410d6a290000370330200e450d03410121020c040b20022d000120022d000072450d050b41c9b4c00021074128210520044101470d4e200141046a2802002202103c2002101d0c4e0b200141216a2d00002111200341f0016a200141196a290000370300200341e8016a200141116a290000370300200341d8016a41086a200141096a290000370300200320012900013703d801200241096a2800002105200241056a280000210720022d0001210d20022d0000210e200341306a41086a220f200241156a290000370300200341306a410d6a22122002411a6a2900003700002003200241046a2d00003a00d2012003200241026a2f01003b01d00120032002410d6a290000370330200e450d07410121020c080b200341cc016a41026a20032d00d2013a0000200341b0016a41086a200f290300370300200341b0016a410d6a2010290000370000200320032f01d0013b01cc01200320032903303703b00141012102200d41ff01714101470d00200341a8026a41026a200341cc016a41026a2d00003a0000200341306a41086a200341b0016a41086a290300370300200341306a410d6a200341b0016a410d6a290000370000200320032f01cc013b01a802200320032903b001370330410021020c010b412a210541f1b4c00021070b2003412c6a41026a220e200341a8026a41026a2d00003a000020034180026a41086a220d200341306a41086a29030037030020034180026a41106a200341306a41106a290300370300200320032f01a8023b012c200320032903303703800220020d1c200341a3016a200d290300370000200341a8016a2003418d026a290000370000200320032f012c3b01900120032005360097012003200736009301200320032903800237009b012003200e2d00003a00920120034190016a10cd02450d07411c101f2202450d25200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2202450d262002200329030837001c200241346a200341086a41186a2903003700002002412c6a200341086a41106a290300370000200241246a200341086a41086a29030037000020034180026a41086a2205420037030020034200370380022002413c20034180026a1001200341a8026a41086a200529030037030020032003290380023703a802200341a8026a411041f8b3c20041004100100221052002101d2005417f460d0b200341306a200341086a10ce0220032802382213450d1041002102200329023c2214422088a72205450d11024020054101460d004100210203402005410176220720026a220e20022013200e4105746a20034190016a412010d0034101481b2102200520076b220541014b0d000b0b201320024105746a20034190016a412010d0032205450d162005411f7620026a21020c110b200141086a290300210c20034180026a41086a22024200370300200342003703800241c7a2c100411b20034180026a1001200341b0016a41086a200229030037030020032003290380023703b0012003200c370330200341b0016a4110200341306a410810030c470b200341cc016a41026a20032d00d2013a0000200341b0016a41086a200a290300370300200341b0016a410d6a200b290000370000200320032f01d0013b01cc01200320032903303703b00141012109200841ff01714101470d00200341a8026a41026a200341cc016a41026a2d00003a0000200341306a41086a200341b0016a41086a290300370300200341306a410d6a200341b0016a410d6a290000370000200320032f01cc013b01a802200320032903b001370330410021090c010b41f1b4c0002107412a21050b2003412c6a41026a2208200341a8026a41026a2d00003a000020034180026a41086a2202200341306a41086a29030037030020034180026a41106a200341306a41106a290300370300200320032f01a8023b012c200320032903303703800220090d43200341e3026a2002290300370000200341e8026a20034180026a410d6a290000370000200320032f012c3b01d002200320053600d702200320073600d30220032003290380023700db02200320082d00003a00d202200242003703002003420037038002418cb9c000410d20034180026a1001200341b0016a41086a200229030037030020032003290380023703b001420021150240200341b0016a411041f8b3c200410041001002417f460d0020034200370330200341b0016a4110200341306a41084100100241016a41084d0d1d200329033021150b20034180026a41086a22024200370300200342003703800241bca0c100411a20034180026a1001200341b0016a41086a200229030037030020032003290380023703b001200341b0016a411041f8b3c200410041001002417f460d0520034200370330200341b0016a4110200341306a41084100100241016a41084d0d1d200329033021160c060b200341cc016a41026a20032d00d2013a0000200341b0016a41086a200f290300370300200341b0016a410d6a2012290000370000200320032f01d0013b01cc01200320032903303703b00141012102200d41ff01714101470d00200341d0026a41026a200341cc016a41026a2d00003a0000200341306a41086a200341b0016a41086a290300370300200341306a410d6a200341b0016a410d6a290000370000200320032f01cc013b01d002200320032903b001370330410021020c010b41f1b4c0002107412a21050b2003412c6a41026a220e200341d0026a41026a2d00003a000020034180026a41086a220d200341306a41086a29030037030020034180026a41106a200341306a41106a290300370300200320032f01d0023b012c200320032903303703800220020d15200341bb026a200d290300370000200341a8026a41186a22022003418d026a290000370000200320032f012c3b01a802200320053600af02200320073600ab0220032003290380023700b3022003200e2d00003a00aa02200341a8026a10cd02450d01200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200341d8006a200341a8026a41086a290300370300200341e0006a200341a8026a41106a290300370300200341e8006a2002290300370300200320032903d801370330200320032903a802370350411b101f2202450d20200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d212002200329033037001b200241336a200341306a41186a2903003700002002412b6a200341306a41106a290300370000200241236a200341306a41086a2903003700002002413b41f600101e2202450d222002200341d0006a220529000037003b200241d3006a200541186a290000370000200241cb006a200541106a290000370000200241c3006a200541086a29000037000020034180026a41086a220542003703002003420037038002200241db0020034180026a1001200341b0016a41086a200529030037030020032003290380023703b001410221050240200341b0016a411041f8b3c200410041001002417f460d00200341003a008002200341b0016a411020034180026a41014100100241016a41014d0d2920032d00800221050b2002101d200541ff01714102470d14200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200320032903d801370330411c101f2202450d2a200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2202450d2b2002200329033037001c200241346a200341c8006a2903003700002002412c6a200341306a41106a290300370000200241246a200341306a41086a29030037000020034180026a41086a2205420037030020034200370380022002413c20034180026a1001200341b0016a41086a200529030037030020032003290380023703b001200341b0016a411041f8b3c200410041001002417f460d0b200342103702d4022003200341b0016a3602d00220034180026a200341d0026a105e2003280280022217450d2e20034188026a280200210720032802840221050c0c0b41fca1c1002107412b210520044101460d410c420b41a4a1c1002107412e210520044101460d400c410b420321160b410821094200211820034180026a41086a22024200370300200342003703800241dfd9c000411520034180026a1001200341b0016a41086a200229030037030020032003290380023703b0010240200341b0016a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a40120032802302209450d1a200329023421180b201620157c211520092018422088a7220841286c6a2107200921020340200720026b419f014d0d022002200341d0026a460d032002200341d0026a412010d003450d03200241286a2205200341d0026a460d042005200341d0026a412010d003450d04200241d0006a2205200341d0026a460d042005200341d0026a412010d003450d04200241f8006a2205200341d0026a460d04200241a0016a21022005200341d0026a412010d0030d000c040b0b41a7a2c10021074120210520044101460d3d0c3e0b4102210520072002460d022009200841286c6a21070340200341d0026a2002460d012002200341d0026a412010d003450d012007200241286a2202470d000c030b0b200221050b200541206a29030020155621050b2005410247200571210202402018a7450d002009101d0b024002402002450d0020034100360238200342013703302006200341306a10b201200328023421082003280238210a20032802302109200341306a41186a22024200370300200341306a41106a22054200370300200341306a41086a22074200370300200342003703302009200a200341306a1000200341d8016a41186a220a2002290300370300200341d8016a41106a220b2005290300370300200341d8016a41086a22192007290300370300200320032903303703d80102402008450d002009101d0b2002200a2903003703002005200b29030037030020072019290300370300200320032903d8013703304118101f2202450d1c200241106a41002900ec9e41370000200241086a41002900e49e41370000200241002900dc9e41370000200241184138101e2202450d1d20022003290330370018200241306a200341306a41186a290300370000200241286a200341306a41106a290300370000200241206a200341306a41086a29030037000020034180026a41086a2205420037030020034200370380022002413820034180026a1001200341a8026a41086a200529030037030020032003290380023703a802200341a8026a411041f8b3c20041004100100221052002101d2005417f460d0141949bc2002107411f21050c390b41d6a0c1002107412021050c380b200341306a200341d8016a10ce02024020032802382202450d00200328023c2105200329033021164200211820034180026a41086a220742003703002003420037038002418cb9c000410d20034180026a1001200341b0016a41086a200729030037030020032003290380023703b0010240200341b0016a411041f8b3c200410041001002417f460d00200342003703a802200341b0016a4110200341a8026a41084100100241016a41084d0d1520032903a80221180b02402005450d002002101d0b201820165a0d0041f6a0c1002107411221050c380b4108210820034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b00141002109200341b0016a411041f8b3c200410041001002417f460d07200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a10120032802302208450d272003200329023422183702940120032008360290012018422088a721092018a721020c080b4100210241012113420021140b200341306a41186a20034190016a41186a290300370300200341306a41106a20034190016a41106a290300370300200341306a41086a20034190016a41086a290300370300200320032903900137033020022014422088a722054b0d1e20052014a7470d28200541016a22072005490d2b2005410174220e20072007200e491bad2214420586221a422088a70d2b201aa722074100480d2b2005450d02201320054105742007101e2213450d030c280b4100210541012117410021070b2002101d20034180026a41186a220e200341a8026a41186a29030037030020034180026a41106a220d200341a8026a41106a29030037030020034180026a41086a220f200341a8026a41086a290300370300200320032903a80237038002024020052007470d00200541016a22022005490d2a20054101742212200220022012491b2220ad420586220c422088a70d2a200ca722024100480d2a2005450d06201720054105742002101e22170d070c230b200521200c060b2007101f22130d250b200741011020000b41d2a1c1002107412a21052014a7450d052013101d20044101460d320c330b20034100360298012003420837039001410021020b20034180026a41186a2205200341d8016a41186a29030037030020034180026a41106a2207200341d8016a41106a29030037030020034180026a41086a220a200341d8016a41086a290300370300200320032903d8013703800220022009470d20200941016a22022009490d242009410174220b20022002200b491b2202ad42287e2218422088a70d242018a7220b4100480d242009450d042008200941286c200b101e2208450d050c1f0b2002101f2217450d1c0b201720074105746a2202200329038002370000200241186a200e290300370000200241106a200d290300370000200241086a200f290300370000411c101f2202450d18200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2247450d192047200329033037001c204741346a200341306a41186a2903003700002047412c6a200341306a41106a290300370000204741246a200341306a41086a29030037000020034180026a41086a2202420037030020034200370380022047413c20034180026a1001200341b0016a41086a200229030037030020032003290380023703b001200341003602880220034201370380022003200741016a22023602d002200341d0026a20034180026a1062024002402002450d00200741057441206a210f410020034180026a41086a28020022056b210e2003280280022112200328028402210d2017210203400240200d200e6a411f4b0d00200541206a22072005490d26200d4101742210200720072010491b22074100480d2602400240200d450d002012200d2007101e22120d010c0d0b2007101f2212450d0c0b2007210d0b201220056a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200e41606a210e200541206a2105200241206a2102200f41606a220f0d000b20034188026a20053602002003200d3602840220032012360280020c010b20034188026a2802002105200328028402210d20032802800221120b200341b0016a41102012200510030240200d450d002012101d0b2047101d2020450d002017101d0b200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200341d8006a200341a8026a41086a290300370300200341e0006a200341a8026a41106a290300370300200341e8006a200341a8026a41186a290300370300200320032903d801370330200320032903a802370350200320113a00d002411b101f2202450d10200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d112002200329033037001b200241336a200341306a41186a2903003700002002412b6a200341306a41106a290300370000200241236a200341306a41086a2903003700002002413b41f600101e2202450d122002200341d0006a220529000037003b200241d3006a200541186a290000370000200241cb006a200541106a290000370000200241c3006a200541086a29000037000020034180026a41086a220542003703002003420037038002200241db0020034180026a1001200341b0016a41086a200529030037030020032003290380023703b001200341b0016a4110200341d0026a410110032002101d410021070b20044101470d2d0c2c0b200b101f22080d1a0b200b41081020000b200341c4006a4101360200200341183602ac02200341c0adc4003602a80220034201370234200341c8adc4003602302003200341a8026a360240200341306a41a8bfc30010cf01000b41df88c0004133103a000b41df88c0004133103a000b200741011020000b41df88c0004133103a000b41df88c0004133103a000b411c41011020000b413c41011020000b411b41011020000b413b41011020000b41f60041011020000b411841011020000b413841011020000b411b41011020000b413b41011020000b41f60041011020000b41df88c0004133103a000b41c8aec400102c000b411c41011020000b413c41011020000b411c41011020000b413c41011020000b41df88c0004133103a000b200241011020000b41df88c0004133103a000b200320023602940120032008360290010b2008200941286c6a220220153703002002200329038002370308200241206a2005290300370300200241186a2007290300370300200241106a200a29030037030020034190016a41086a200941016a220a3602000240200a41144b0d0041022129200941016a4102490d034128212a2008200941286c6a41d0006a212b417f212c410a212d410b212e410f212f412021302003413d6a2131411b2132410821334113213441182135411021364103213741502138417821394148213a4170213b4140213c4168213d41b87f213e4160213f41b07f21404158214141012142410121020c020b02400240200a4101762244ad42287e220c422088a70d00200ca72202417f4c0d0041082112024002402002450d002002101f2245450d03204521460c010b41082145410821460b41582148200841586a2149200841d0006a214a200841887f6a214b4104214c4100214d417f214e4101214f420321504220210c4103215141022152417d215341282154412021474118212041102117417e2155417421564164215741b07f215841092159410a215a410b215b410f215c2003413d6a215d411b215e4113215f41502160417821614148216241702163414021644168216541b87f21664160216741002168410021694104216a200a216b410221020c030b102e000b200241081020000b201320024105746a220741206a2007200520026b41057410cf031a200741186a200341306a41186a290300370000200741106a200341306a41106a290300370000200741086a200341306a41086a2903003700002007200329033037000020034180026a41086a220242003703002003420037038002418cb9c000410d20034180026a1001200341b0016a41086a2207200229030037030020032003290380023703b0014200211a0240024002400240200341b0016a411041f8b3c200410041001002417f460d0020034200370330200341b0016a4110200341306a41084100100241016a41084d0d012003290330211a0b20024200370300200342003703800241c7a2c100411b20034180026a10012007200229030037030020032003290380023703b00102400240200341b0016a411041f8b3c200410041001002417f460d0020034200370330200341b0016a4110200341306a41084100100241016a41084d0d032003290330211841012107411c210e411c101f2202450d010c040b42e807211841012107411c210e411c101f22020d030b200e20071020000b41df88c0004133103a000b41df88c0004133103a000b200241186a410028008c9f41360000200241106a41002900849f41370000200241086a41002900fc9e41370000200241002900f49e4137000002400240024002402002200e413c101e221b450d00201b200329030837001c201b41346a200341086a41186a290300370000201b412c6a200341086a41106a290300370000201b41246a200341086a41086a29030037000020034180026a41086a220242003703002003420037038002201b413c20034180026a1001200341b0016a41086a200229030037030020032003290380023703b00120034100360238200342013703304108101f2202450d0120022018201a7c370000200342888080808001370234200320023602302003200520076a22023602a802200341a8026a200341306a10620240024002402002450d00200541057441206a210f4100200341306a41086a28020022056b210e200328023021102003280234210d2013210203400240200d200e6a411f4b0d00200541206a22072005490d0b200d4101742211200720072011491b22074100480d0b02400240200d450d002010200d2007101e22100d010c060b2007101f2210450d050b2007210d0b201020056a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200e41606a210e200541206a2105200241206a2102200f41606a220f0d000b200341386a20053602002003200d360234200320103602300c010b200341386a28020021052003280234210d200328023021100b2014a72102200341b0016a41102010200510030240200d450d002010101d0b201b101d02402002450d002013101d0b4108211c20034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b0014100211d0240024002400240200341b0016a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a1012003280230221c450d072003280234211d4128210e200341386a280200220f41286c220d0d010c020b4100210f4128210e410041286c220d450d010b200341306a41086a2102410021070340200341306a41206a201c20076a220541206a290300370300200341306a41186a200541186a290300370300200341306a41106a200541106a2903003703002002200541086a29030037030020032005290300370330200341d0026a41186a200241186a290000370300200341d0026a41106a200241106a290000370300200341d0026a41086a200241086a290000370300200320022900003703d002200341d0026a200341086a412010d0030d02200d2007200e6a2207470d000b0b4100211e20034100360238200342083703304108211f201d450d11201c101d0c110b200341a8026a41206a2202200341306a41206a290300370300200341a8026a41186a220e200341306a41186a290300370300200341a8026a41106a220d200341306a41106a290300370300200341a8026a41086a2210200341306a41086a290300370300200320032903303703a80220034180026a41206a2211200229030037030020034180026a41186a2202200e29030037030020034180026a41106a220e200d29030037030020034180026a41086a220d2010290300370300200320032903a80237038002200341d8016a41206a22102011290300370300200341d8016a41186a22112002290300370300200341d8016a41106a2202200e290300370300200341d8016a41086a220e200d29030037030020032003290380023703d8014128101f221f450d04201f20032903d801370300201f41206a2010290300370300201f41186a2011290300370300201f41106a2002290300370300201f41086a200e2903003703000240200f41286c41586a2007460d00200541286a212141282113201c200f41286c6a221b41586a212241082111200341306a41086a210e41012123412021104118210f4110210d4228211a4220211441002124410121254101211e410021020c060b410121254101211e0c0f0b200741011020000b413c41011020000b410841011020000b41df88c0004133103a000b412841081020000b0240034002400240024002400240024002400240024002400240024002400240024002400240024020020e03000102020b2021210202400340200341306a20106a2205200220106a290300370300200341306a200f6a22072002200f6a290300370300200341306a200d6a220b2002200d6a290300370300200e200220116a29030037030020032002290300370330200341d8016a200f6a200e200f6a290000370300200341d8016a200d6a200e200d6a290000370300200341d8016a20116a200e20116a2900003703002003200e2900003703d801200341d8016a200341086a201010d0030d01201b200220136a2202470d000c1e0b0b200341a8026a20106a22212005290300370300200341a8026a200f6a22192007290300370300200341a8026a200d6a2226200b290300370300200341a8026a20116a2227200e290300370300200320032903303703a80220034180026a20106a2228202129030037030020034180026a200f6a2221201929030037030020034180026a200d6a2219202629030037030020034180026a20116a22262027290300370300200320032903a802370380022005202829030037030020072021290300370300200b2019290300370300200e202629030037030020032003290380023703300240201e2025470d00202520236a221e2025490d1520252023742221201e201e2021491b221ead201a7e2218201488a70d152018a722212024480d1502402025450d00201f202520136c2021101e221f0d010c080b2021101f221f450d070b200220136a2121201f202520136c6a22192003290330370300201920106a20052903003703002019200f6a20072903003703002019200d6a200b290300370300201920116a200e290300370300202520236a212520222002470d070c1c0b200a20092202202c6a2209490d010240200a20096b220b2029490d0020082002202a6c6a220729030020082009202a6c6a220529030022155a0d00200320052f01083b01d00120032005202d6a2d00003a00d2012005202e6a28000021272005202f6a28000021282031200520306a2202290000370000200341306a20336a2243200520326a290000370300200520346a29000021182002200720306a290300370300200520356a200720356a290300370300200520366a200720366a2903003703002003201837033020052007290300370300200520336a200720336a290300370300410121020240200b2037490d00200529035020155a0d0041032119202b210202400340200220386a200220396a2903003703002002203a6a2002203b6a2903003703002002203c6a2002203d6a2903003703002002203e6a2002203f6a290300370300200220406a200220416a220729030037030020192226200b4f0d01202620426a2119200229030021182002202a6a210220182015540d000b0b2026202c6a21020b2007201537030020052002202a6c6a220220032f01d0013b010820032d00d20121052002202f6a20283600002002202e6a20273600002002202d6a20053a0000200220306a2031290000370000200220326a2043290300370000200220346a20032903303700000b202b20416a212b20090d070c120b206b216c4100216b4101216d206c204e6a2227450d0702400240024002400240024002402008202720546c6a2903002008206c20546c22196a20586a29030022185a0d00204b20196a210203402027204f460d022027204e6a2127201820022903002215542105200220486a21022015211820050d000c030b0b206c20556a210b204b20196a21054100216b410021020340200b2002460d052002204f6a21022018200529030022155a2107200520486a21052015211820070d000b206c20026b204e6a21272002204f6a226d20594d0d030c020b410021270b206c2027490d05206c200a4b0d070240206c20276b226d204f762207450d002008202720546c6a2102204920196a21050340200341306a20476a220b200220476a2219290300370300200341306a20206a2226200220206a2228290300370300200341306a20176a2243200220176a226e290300370300200341306a20126a226f200220126a227029030037030020032002290300370330200520126a22712903002118200520176a22722903002115200520206a22732903002116200529030021742019200520476a227529030037030020282016370300206e201537030020702018370300200220743703002075200b29030037030020732026290300370300207220432903003703002071206f29030037030020052003290330370300200220546a2102200520486a21052007204e6a22070d000b0b206d20594d0d010b2027216b20692068460d0e0c0f0b2027450d01206c200a4b0d04204a202720546c6a2176410021770c0f0b206c216d20692068460d090c0a0b2027216b20692068460d0a410221020c0e0b2009200a102a000b2027206c102a000b206c2027417f6a226b490d0d0b206c200a102b000b202141081020000b410021020c090b410121020c080b410021020c060b410121020c050b410221020c040b410121020c030b410121020c020b410221020c010b410321020b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b20692068470d10410121020c160b2068204f6a22022068490d192068204f742205200220022005491b2269ad2050862218200c88a70d192018a72202204d480d1902402068450d00206a20682051742002101e226a0d110c020b2002101f226a0d110c010b206a20682051746a2202206d3602042002206b3602002068204f6a2278216820782052490d02410121770c130b200241041020000b0240024020770e020001010b206c2027204e6a226b490d150240206c206b6b226d2052490d002008202720546c6a22072903002008206b20546c6a220529030022155a0d00200320052f01083b01d00120032005205a6a2d00003a00d2012005205b6a28000021262005205c6a2800002128205d200520476a2202290000370000200341306a20126a22432005205e6a2900003703002005205f6a29000021182002200720476a290300370300200520206a200720206a290300370300200520176a200720176a2903003703002003201837033020052007290300370300200520126a200720126a290300370300410121020240206d2051490d00200529035020155a0d004103210b2076210202400340200220606a200220616a290300370300200220626a200220636a290300370300200220646a200220656a290300370300200220666a200220676a290300370300200220586a200220486a2207290300370300200b2219206d4f0d012019204f6a210b20022903002118200220546a210220182015540d000b0b2019204e6a21020b200720153703002005200220546c6a220220032f01d0013b010820032d00d20121052002205c6a20283600002002205b6a20263600002002205a6a20053a0000200220476a205d2900003700002002205e6a20432903003700002002205f6a20032903303700000b206b450d0c207620486a2176206b2127206d205a490d0a410021020c130b0240024002400240206a20782243204e6a22782051746a2202280200450d00206a20432051746a221920566a280200220b200228020422054d0d0041022168204341024d0d04206a204320536a22022051746a28020422072005200b6a4d0d0141032168204341034d0d04201920576a2802002007200b6a4d0d010c050b20432051490d0120022802042105206a204320536a22022051746a28020421070b20072005490d010b204320556a21020b20432002204f6a22724d0d03204320024d0d04206a20022051746a226f2802042273206f2802006a2202206a20722051746a22702802002271490d052002200a4b0d06206f204c6a21752008207120546c6a22282070280204226e20546c22056a2168200220546c210702400240024002400240200220716b2219206e6b2202206e4f0d0020452068200220546c220510ce031a204620056a210b206e204f480d012002204f480d01204920076a21072068210203402007200220486a2268200b20486a2219201929030020682903005422261b2205290300370300200720476a200520476a290300370300200720206a200520206a290300370300200720176a200520176a290300370300200720126a200520126a290300370300200b201920261b210b20282068200220261b22024f0d04200720486a2107204621052046200b490d000c050b0b20452028200510ce031a204620056a210b206e204f480d012019206e4c0d01200820076a212620462105202821020340200220682005206829030020052903005422191b2207290300370300200220476a200720476a290300370300200220206a200720206a290300370300200220176a200720176a290300370300200220126a200720126a2903003703002005200520546a20191b2105200220546a2102206820546a206820191b226820264f0d04200b20054b0d000c040b0b206821020c010b202821020b204621050b20022005200b20056b220720072054706b10ce031a20752073206e6a360200206f20713602002070207020126a2072204e7320436a20517410cf031a207821682078204f4b0d0a0b206b0d060c010b20432168206b0d060b02402069450d00206a101d0b2044450d122045101d0c120b4188bfc30020722043104b000b4188bfc30020022043104b000b20712002102a000b2002200a102b000b410221020c0b0b410221020c0a0b410021770c050b410121770c050b410021020c060b410221020c050b410221020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b206b206c102a000b20034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b0012003200341b0016a3602302003411036023420034190016a200341306a10a201200341a8026a41186a200341d8016a41186a290300370300200341a8026a41106a200341d8016a41106a290300370300200341a8026a41086a200341d8016a41086a290300370300200320032903d8013703a802200341306a200641e00010ce031a4118101f2202450d01200241106a41002900ec9e41370000200241086a41002900e49e41370000200241002900dc9e41370000200241184138101e2202450d02200220032903a802370018200241306a200341a8026a41186a290300370000200241286a200341a8026a41106a290300370000200241206a200341a8026a41086a29030037000020034180026a41086a2201420037030020034200370380022002413820034180026a1001200341b0016a41086a200129030037030020032003290380023703b00120034100360288022003420137038002200341306a20034180026a10b2012003280284022101200341b0016a41102003280280022205200328028802100302402001450d002005101d0b2002101d200341306a103c200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200320032903d8013703304120101f2202450d03200220032903d002370000200241186a200341d0026a41186a290300370000200241106a200341d0026a41106a290300370000200241086a200341d0026a41086a290300370000411c101f2201450d04200141186a41002800a0a141360000200141106a4100290098a141370000200141086a4100290090a14137000020014100290088a1413700002001411c413c101e2201450d052001200329033037001c200141346a200341c8006a2903003700002001412c6a200341c0006a290300370000200141246a200341306a41086a29030037000020034180026a41086a2205420037030020034200370380022001413c20034180026a1001200341b0016a41086a200529030037030020032003290380023703b001200341003602b002200342013703a802200341013602800220034180026a200341a8026a106202400240024020032802ac02220d20032802b00222076b41204f0d00200741206a22052007490d03200d410174220e20052005200e491b220e4100480d03200d450d0120032802a802200d200e101e2205450d020c090b20032802a80221050c090b200e101f22050d070b200e41011020000b1021000b411841011020000b413841011020000b412041011020000b411c41011020000b413c41011020000b2003200e3602ac02200320053602a802200e210d0b200520076a220e2002290000370000200e41186a200241186a290000370000200e41106a200241106a290000370000200e41086a200241086a290000370000200341b0016a41102005200741206a10030240200d450d002005101d0b2001101d2002101d200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200341d8006a200341d0026a41086a290300370300200341e0006a200341d0026a41106a290300370300200341e8006a200341d0026a41186a290300370300200320032903d801370330200320032903d002370350200341013a00a802024002400240411b101f2202450d00200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d012002200329033037001b200241336a200341306a41186a2903003700002002412b6a200341306a41106a290300370000200241236a200341306a41086a2903003700002002413b41f600101e2202450d022002200341306a41206a220129000037003b200241d3006a200141186a290000370000200241cb006a200141106a290000370000200241c3006a200141086a29000037000020034180026a41086a220142003703002003420037038002200241db0020034180026a1001200341b0016a41086a200129030037030020032003290380023703b001200341b0016a4110200341a8026a410110032002101d0240200328029401450d00200328029001101d0b2006101d410021070c080b411b41011020000b413b41011020000b41f60041011020000b0240201d450d00201c101d0b200320253602382003201e3602342003201f3602300b20034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b001200341103602ac022003200341b0016a3602a802200341306a200341a8026a10a2010240201e450d00201f101d0b200341306a41186a200341086a41186a290300370300200341306a41106a200341086a41106a290300370300200341306a41086a200341086a41086a2903003703002003200329030837033002400240024002400240411c101f2202450d00200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2202450d012002200329033037001c200241346a200341306a41186a22052903003700002002412c6a200341306a41106a2207290300370000200241246a200341306a41086a220e29030037000020034180026a41086a220d420037030020034200370380022002413c20034180026a1001200341a8026a41086a200d29030037030020032003290380023703a802200341a8026a411010092002101d2005200341086a41186a2903003703002007200341086a41106a290300370300200e200341086a41086a290300370300200320032903083703304118101f2202450d02200241106a41002900ec9e41370000200241086a41002900e49e41370000200241002900dc9e41370000200241184138101e2202450d0320022003290330370018200241306a200341c8006a290300370000200241286a200341306a41106a290300370000200241206a200341306a41086a2903003700004200210c20034180026a41086a2205420037030020034200370380022002413820034180026a1001200341a8026a41086a200529030037030020032003290380023703a802200341a8026a411010092002101d20054200370300200342003703800241dfd9c000411520034180026a1001200341b0016a41086a200529030037030020032003290380023703b001024002400240024002400240200341b0016a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a40120032802302217450d0a2003290234220c422088a722020d010c020b410821174200422088a72202450d010b200241286c210e200341d0006a210720172105034020072005290000370000200341306a41186a220d200341086a41186a290300370300200341306a41106a220f200341086a41106a290300370300200341306a41086a2212200341086a41086a290300370300200741086a2210200541086a290000370000200741106a2211200541106a290000370000200741186a2247200541186a29000037000020032003290308370330411b101f2202450d02200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d032002200329033037001b200241336a200d2903003700002002412b6a200f290300370000200241236a20122903003700002002413b41f600101e2202450d04200541286a21052002200729000037003b200241d3006a2047290000370000200241cb006a2011290000370000200241c3006a201029000037000020034180026a41086a220d42003703002003420037038002200241db0020034180026a1001200341a8026a41086a200d29030037030020032003290380023703a802200341a8026a411010092002101d200e41586a220e0d000b0b200ca7450d092017101d0c090b411b41011020000b413b41011020000b41f60041011020000b411c41011020000b413c41011020000b411841011020000b413841011020000b41df88c0004133103a000b2006103c2006101d0c020b4100210720044101470d010b200141046a2802002202103c2002101d0b2000200536020420002007360200200341f0026a24000b8b0303027f017e057f230041306b220124004108210242002103200141206a41086a220442003703002001420037032041dfd9c0004115200141206a1001200141086a200429030037030020012001290320370300024002402001411041f8b3c200410041001002417f460d002001421037021420012001360210200141206a200141106a10a40120012802202202450d01200129022421030b20022003422088a7220541286c6a210620022104024002400340200620046b419f014d0d014101210720042000460d0220042000412010d003450d02200441286a22082000460d0220082000412010d003450d02200441d0006a22082000460d0220082000412010d003450d02200441f8006a22082000460d02200441a0016a210420082000412010d0030d000c020b0b024020062004460d002002200541286c6a210803404101210720002004460d0220042000412010d003450d022008200441286a2204470d000b0b410021070b02402003a7450d002002101d0b200141306a240020070f0b41df88c0004133103a000b990302027f017e230041306b2202240002400240411c101f2203450d00200341186a410028008c9f41360000200341106a41002900849f41370000200341086a41002900fc9e41370000200341002900f49e413700002003411c413c101e2203450d012003200129000037001c200341346a200141186a2900003700002003412c6a200141106a290000370000200341246a200141086a290000370000200241206a41086a22014200370300200242003703202003413c200241206a1001200241086a2001290300370300200220022903203703000240024002402002411041f8b3c200410041001002417f460d002002200236021020024110360214200242003703202002410020024110200241206a41084100100222012001417f461b2201410820014108491b360218200141074d0d0220022903202104200241206a200241106a105e20022802202201450d022000200229022437020c20002001360208200020043703000c010b200041003602080b2003101d200241306a24000f0b41df88c0004133103a000b411c41011020000b413c41011020000b130020004102360204200041b8bfc3003602000b130020004104360204200041c1a4c1003602000b130020004101360204200041d8c0c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120101f2206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b412041011020000b3802017f017e230041106b220324002003200210eb01200329030021042000200341086a29030037030820002004370300200341106a24000b870101027f230041106b22062400024002402003450d0020032802082107200328020021032006410036020c20032007200420052006410c6a10132104200628020c2203417f460d012000200336020420002004360200200041086a2003360200200641106a24000f0b20004100360200200641106a24000f0b20004100360200200641106a24000b962707057f017e0b7f037e087f017e0a7f23004180036b22022400200241286a4200370300200242003703202002420037031820012802082103200128020021040240024020012802042205450d002005210620042101034020012802800921012006417f6a22060d000b0340200420042f01064102746a4180096a28020021042005417f6a22050d000c020b0b200421010b200241306a411c6a20042f0106360200200241306a41186a4100360200200241306a41146a2004360200200220033602502002410036024020024200370338200220013602342002410036023020024198016a200241306a10d60202400240024002400240024002400240024002400240024002400240024020022903b80122074202520d00200241306a103b0c010b200241e0026a4101722108200241dd016a2109200241c8016a210a20024198016a41286a210b200241d0016a210c20024198016a41c0006a210d200241dc016a210e20024198016a41206a210f20024198016a411c6a211020024198016a41146a2111200241e0026a410c6a21120340200241f8006a41186a220420024198016a41186a2220290300370300200241f8006a41106a220520024198016a41106a221c290300370300200241f8006a41086a220620024198016a41086a221b290300370300200241d8006a41086a2203200941086a290000370300200241d8006a41106a221d200941106a290000370300200241d8006a41186a2221200941186a290000370300200220022903980137037820022009290000370358200a2903002113200b2903002114200c290300211e200d2802002122200e2d0000210120024180026a41186a2216200429030037030020024180026a41106a2217200529030037030020024180026a41086a221820062903003703002002200229037837038002200241a0026a41186a22232021290300370300200241a0026a41106a2221201d290300370300200241a0026a41086a221d2003290300370300200220022903583703a002024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020074201520d0020024198016a20024180026a2014201310ec0120202d0000210420022002290318200241186a41086a2205290300200241186a41106a2206290300200229039801201b290300201c29030010de012006200241106a29030037030020052002290308370300200220022903003703182004450d00201ea72104201e422088a72201450d01410020016b220521062004210103402001280290022101200641016a22060d000b0340200420042f01064102746a4190026a2802002104200541016a22050d000c030b0b024002400240024020220d00200141ff01714102470d00201ea72104201e422088a72201450d01410020016b220521062004210103402001280290022101200641016a22060d000b0340200420042f01064102746a4190026a2802002104200541016a22050d000c030b0b4116101f2204450d0b2004410e6a41002900aaf3412213370000200441086a41002900a4f34122143700002004410029009cf3412215370000200441164136101e2204450d0c20042002290380023700162004412e6a2016290300370000200441266a20172903003700002004411e6a2018290300370000200241d0026a41086a22194200370300200242003703d00220044136200241d0026a1001200241c0026a41086a221a2019290300370300200220022903d0023703c002200241c0026a411041f8b3c20041004100100221052004101d2005417f460d0220024198016a20024180026a1033201b2802002205450d0d201c280200210620024198016a410c6a280200211f2002290398012107200141ff01714102470d090c190b200421010b200f4100360200201020042f01063602002020410036020020112004360200201c4100360200201b42003703002002200136029c01200241003602980120024198016a10320c1b0b4200210720194200370300200242003703d00241c9f2c1004117200241d0026a1001201a2019290300370300200220022903d0023703c0020240200241c0026a411041f8b3c200410041001002417f460d002002420037039801200241c0026a411020024198016a41084100100241016a41084d0d0820022903980121070b20194200370300200242003703d00241c9f2c1004117200241d0026a1001201a2019290300370300200220022903d0023703c0022002200737039801200241c0026a411020024198016a410810034120101f2204450d0b2004200229038002370000200441186a2016290300370000200441106a2017290300370000200441086a20182903003700002004412041c000101e2204450d0c2004200742017c37002020204200370300201c4200370300201b420037030020024200370398012004412820024198016a1000200241e0026a41186a22062020290300370300200241e0026a41106a2203201c290300370300200241e0026a41086a2224201b29030037030020022002290398013703e0024120101f2205450d0d200520022903e002370000200541186a22252006290300370000200541106a22262003290300370000200541086a222720242903003700002004101d4116101f2204450d0e2004410e6a2013370000200441086a201437000020042015370000200441164136101e2204450d0f20042002290380023700162004412e6a2016290300370000200441266a20172903003700002004411e6a201829030037000020194200370300200242003703d00220044136200241d0026a1001201a2019290300370300200220022903d0023703c002201b41003602002002420137039801200241203602e002200241e0026a20024198016a1062200228029c012206201b28020022246b41204f0d02202441206a22032024490d232006410174221f20032003201f491b221f4100480d232006450d032002280298012006201f101e22030d040c100b200421010b200f2022360200201020042f01063602002020410036020020112004360200201c4100360200201b42003703002002200136029c01200241003602980120024198016a10320c180b20022802980121030c020b201f101f2203450d0c0b2002201f36029c012002200336029801201f21060b201b202441206a221f360200200320246a222841086a2027290000370000202841106a2026290000370000202841186a20252900003700002028200529000037000002400240024002402006201f6b41084f0d00201f41086a2224201f490d2120064101742228202420242028491b22284100480d212006450d01200320062028101e22030d020c0f0b202441286a21240c020b2028101f2203450d0d0b2002202836029c012002200336029801202821060b2003201f6a4200370000200241c0026a411020032024100302402006450d002003101d0b2004101d4120211f4200210741202106200141ff01714102460d100b200241e0026a41186a22042023290300370300200241e0026a41106a22032021290300370300200241e0026a41086a2221201d290300370300200220022903a0023703e002024020014101710d004113101f2204450d0c2004410f6a41002800d5f341360000200441086a41002900cef341370000200441002900c6f341370000200441134133101e2204450d0d20042002290380023700132004412b6a2016290300370000200441236a20172903003700002004411b6a201829030037000020194200370300200242003703d00220044133200241d0026a1001201a2019290300370300200220022903d0023703c002200241c0026a411010092004101d201ea72104201e422088a722010d110c120b20202004290300370300201c2003290300370300201b2021290300370300200220022903e002370398014113101f2204450d0d2004410f6a41002800d5f341360000200441086a41002900cef341370000200441002900c6f341370000200441134133101e2204450d0e20042002290380023700132004412b6a2016290300370000200441236a20172903003700002004411b6a201829030037000020194200370300200242003703d00220044133200241d0026a1001201a2019290300370300200220022903d0023703c002200241c0026a411020024198016a412010032004101d201ea72104201e422088a722010d100c110b41df88c0004133103a000b411641011020000b413641011020000b4190b3c400102c000b412041011020000b41c00041011020000b412041011020000b411641011020000b413641011020000b201f41011020000b202841011020000b411341011020000b413341011020000b411341011020000b413341011020000b201ea72104201e422088a72201450d010b410020016b2203211d2004210103402001280290022101201d41016a221d0d000b0340200420042f01064102746a4190026a2802002104200341016a22030d000c020b0b200421010b20042f01062103200f2022360200201020033602002020410036020020112004360200201c4100360200201b42003703002002200136029c012002410036029801200241e0026a20024198016a10d7022007211e024020022802e0022204450d000340200241e0026a41146a2802002120200241e0026a41106a28020021212012280200211d20022802e402212202400240024002400240200520062004200241e0026a41086a280200220141f8b3c200410041001014417f460d00200241003a00e0022005200620042001200241e0026a41014100101441016a222441014b221c450d0e02400240024020022d00e002222341037122034102470d00200241003602e002200220233a00e002200520062004200120084103201c101441016a4104490d1141044103202441014b1b211c20022802e00241027622030d010c020b024020034101470d00200241003b01e002200220233a00e002200520062004200120084101201c101441016a22034102490d11201c200341014b6a211c20022f01e0024102762203450d020c010b02402003450d00202341034b0d11200241003602e0022005200620042001200241e0026a4104201c101441016a41044d0d1120022802e0022203417f4c0d1241054104202441014b1b211c20030d010c020b20234102762203450d010b200310792223450d0d20034100200520062004200120232003201c1014221c201c417f461b221c201c20034b1b2003470d0e2023101d201e2003ad7d211e201d0d030c020b200520062004200141014100201c10141a0b201d0d010b2005200620042001101520220d010c020b2005200120042001201d20201016201e2020ad7c211e02402021450d00201d101d0b2022450d010b2004101d0b200241e0026a20024198016a10d70220022802e00222040d000b0b20024198016a103202400240201e2007510d004116101f2204450d0c2004410e6a2013370000200441086a201437000020042015370000200441164136101e2204450d0d20042002290380023700162004412e6a2016290300370000200441266a20172903003700002004411e6a201829030037000020194200370300200242003703d00220044136200241d0026a1001201a2019290300370300200220022903d0023703c002201b41003602002002420137039801200220063602e002200241e0026a20024198016a10620240024002400240200228029c012203201b280200221c6b20064f0d00201c20066a2201201c490d0f2003410174221d20012001201d491b221d4100480d0f2003450d012002280298012003201d101e22010d020c120b20022802980121010c020b201d101f2201450d100b2002201d36029c012002200136029801201d21030b201b201c20066a221d3602002001201c6a2005200610ce031a02400240024002402003201d6b41074b0d00201d41086a2206201d490d0f2003410174221c20062006201c491b22064100480d0f2003450d01200120032006101e22010d020c130b200321060c020b2006101f2201450d110b2002200636029c0120022001360298010b2001201d6a201e370000200241c0026a41102001201d41086a100302402006450d002001101d0b2004101d201f0d010c020b201f450d010b2005101d0b20024198016a200241306a10d602200f29030022074202520d000b4200211e20022903182107200241306a103b024020074200510d00200241d0026a41086a22044200370300200242003703d00241aeb9c0004116200241d0026a1001200241c0026a41086a22012004290300370300200220022903d0023703c002200241c0026a411041f8b3c200410041001002417f460d02200242003703a0012002420037039801200241c0026a411020024198016a4110410010022205417f460d0d2005410f4d0d0d200241a0016a2903002107200229039801211e0c030b200241206a290300200241286a2903008450450d0d0b200241206a10f50120024180036a24000f0b420021070b200241186a41086a2903002113200241186a41106a290300211420044200370300200242003703d00241aeb9c0004116200241d0026a100120012004290300370300200220022903d0023703c00220024200200720147d201e201354ad7d2214201e20137d2213201e56201420075620142007511b22041b3703a00120024200201320041b37039801200241c0026a411020024198016a4110100320024180036a24000f0b200341011020000b2023101d0b41df88c0004133103a000b102e000b1021000b411641011020000b413641011020000b201d41011020000b200641011020000b41df88c0004133103a000b41ecc4c300102c000b950603087f017e017f230041d0016b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341c8006c6a41e8026a41c80010ce031a2001410c6a200341016a360200200141086a2004360200200141046a2005360200200241e8006a41186a2006290300370300200241e8006a41106a2008290300370300200241e8006a41086a200929030037030020022002290300370368200241e8006a41206a200241206a41c80010ce031a2000200241e8006a41e80010ce031a200241d0016a24000f0b20004202370320200241d0016a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210a0c010b2004ad210a0b2005101d200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210a0c010b2004ad210a0b2003101d200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641c8006c6a41e8026a41c80010ce031a200520064102746a4184096a2802002103024020074101460d00410120076b210503402003280280092103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241e8006a41186a2008290300370300200241e8006a41106a2009290300370300200241e8006a41086a200b29030037030020022002290300370368200241e8006a41206a200241206a41c80010ce031a2000200241e8006a41e80010ce031a200241d0016a24000beb0503077f017e017f230041c0006b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241086a41086a220620052003410c6c6a220741106a2802003602002002200741086a290200370308200241186a41086a220820074194016a2802003602002007418c016a29020021092001410c6a200341016a360200200141086a2004360200200141046a200536020020022009370318200241286a41086a220320062802003602002002413c6a200828020036020020002002290308220937020020022002290318370234200041086a2003290300370200200041106a200241286a41106a29030037020020022009370328200241c0006a24000f0b20004100360200200241c0006a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad8421090c010b2004ad2109410021030b2005101d2009a72104024002402009422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad8421090c010b2004ad2109410021050b2003101d2009a72104200521032009422088a7220620052f01064f0d000b0b200241086a41086a220820052006410c6c6a220341106a2802003602002002200341086a290200370308200241186a41086a220a20034194016a28020036020020022003418c016a290200370318200520064102746a4194026a2802002103024020074101460d00410120076b210503402003280290022103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241286a41086a220320082802003602002002413c6a200a28020036020020002002290308220937020020022002290318370234200041086a2003290300370200200041106a200241286a41106a29030037020020022009370328200241c0006a24000be30301047f230041d0006b22032400024002404113101f2204450d002004410f6a41002800d5f341360000200441086a41002900cef341370000200441002900c6f341370000200441134133101e2204450d01200420022900003700132004412b6a200241186a290000370000200441236a200241106a2900003700002004411b6a200241086a290000370000200341306a41086a220242003703002003420037033020044133200341306a1001200341206a41086a200229030037030020032003290330370320024002400240200341206a411041f8b3c200410041001002417f460d00200341306a41186a4200370300200341306a41106a4200370300200341386a420037030020034200370330200341206a4110200341306a4120410010022202417f460d022002411f4d0d02200341186a2202200341306a41186a290300370300200341106a2205200341306a41106a290300370300200341086a2206200341306a41086a29030037030020032003290330370300200041013a000020002003290300370001200041096a2006290300370000200041116a2005290300370000200041196a20022903003700000c010b200041003a00000b2004101d200341d0006a24000f0b41df88c0004133103a000b411341011020000b413341011020000bc80202097f027e230041106b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220841086a210920082f0106220741057421044100210a0240024003402004450d0120022009412010d003220b450d02200441606a2104200a41016a210a200941206a2109200b417f4a0d000b200a417f6a21070b2006450d022006417f6a2106200820074102746a4180096a21040c010b0b200841e8026a200a41c8006c6a2204450d002004280200450d00200441106a290300210c200441086a290300210d0c010b200320012802102002200141146a280200280214110100200341086a290300210c200128020021052003290300210d0b20012005417f6a3602002000200c3703082000200d370300200341106a24000f0b103f000b13002000410336020420004184c5c3003602000b130020004107360204200041e1acc1003602000b130020004108360204200041c0c6c3003602000b130020004105360204200041d8cdc3003602000b130020004108360204200041d3b5c1003602000b130020004108360204200041b4d1c3003602000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242013700000f0b410841011020000bd60904067f027e027f027e230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200141002001280200200128020420024180016a41202001280208100222062006417f461b2206412020064120491b20012802086a220736020802400240024002402006411f4d0d00200241e0006a41186a22062003290300370300200241e0006a41106a22032004290300370300200241e0006a41086a220420052903003703002002200229038001370360200241c0006a41186a22052006290300370300200241c0006a41106a22062003290300370300200241c0006a41086a2203200429030037030020022002290360370340200241186a2005290300370300200241106a2006290300370300200241086a20032903003703002002200229034037030020024200370388012002420037038001200141086a220341002001280200200141046a220428020020024180016a41102007100222062006417f461b2206411020064110491b20032802006a22033602002006410f4d0d0120024180016a41086a22072903002108200229038001210920024180016a41186a220a420037030020024180016a41106a220b4200370300200742003703002002420037038001200141086a220541002001280200200428020020024180016a41202003100222062006417f461b2206412020064120491b20052802006a22033602002006411f4d0d02200241e0006a41186a2206200a290300370300200241e0006a41106a2204200b290300370300200241e0006a41086a220a20072903003703002002200229038001370360200241c0006a41186a22072006290300370300200241c0006a41106a22062004290300370300200241c0006a41086a2204200a29030037030020022002290360370340200241206a41186a2007290300370300200241206a41106a2006290300370300200241206a41086a20042903003703002002200229034037032020024200370388012002420037038001200541002001280200200141046a28020020024180016a41102003100222012001417f461b2201411020014110491b20052802006a3602002001410f4d0d0320024180016a41086a2201290300210c200229038001210d20024180016a41186a2206200241186a29030037030020024180016a41106a2203200241106a2903003703002001200241086a290300370300200241e0006a41086a2204200241206a41086a290300370300200241e0006a41106a2205200241206a41106a290300370300200241e0006a41186a2207200241206a41186a290300370300200220022903003703800120022002290320370360200041206a200c370300200041186a200d370300200041106a200837030020002009370308200041286a200229038001370300200041306a2001290300370300200041386a2003290300370300200041c0006a2006290300370300200041c8006a2002290360370300200041d0006a2004290300370300200041d8006a2005290300370300200041e0006a200729030037030020004201370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000b822404027f027e087f037e230041b0056b2203240002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441044b0d00024002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141306a2903002105200141286a2903002106200341346a41026a200141076a2d00003a000020034190026a41086a200141186a29020037030020034190026a410d6a2001411d6a290000370000200320012f00053b01342003200141106a29020037039002200141086a28020021072001410c6a280200210820012d00042109200241096a2800002104200241056a280000210a20022d0001210b20022d00002101200341f0026a41026a220c200241046a2d00003a0000200341c0006a41086a220d200241156a290000370300200341c0006a410d6a220e2002411a6a2900003700002003200241026a2f01003b01f00220032002410d6a2900003703402001450d05410121010c060b41c190c200210a41c000210420022d0000450d20200241046a2802004104490d20200128020421044112101f2201450d10200141106a41002f00eaa8413b0000200141086a41002900e2a841370000200141002900daa841370000200141124124101e2201450d1120012004360012200341a0056a41086a22024200370300200342003703a00520014116200341a0056a1001200341c0006a41086a2002290300370300200320032903a005370340200341c0006a411041f8b3c20041004100100221022001101d2002417f460d0a200341a0056a41086a22014200370300200342003703a00541bcbcc1004112200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b00441002101200341b0046a411041f8b3c200410041001002417f460d0c200342103702b4012003200341b0046a3602b001200341c0006a200341b0016a10aa0120032802402202450d17200320032902442206370244200320023602402006a72006422088a72201460d0d0c190b20022d000120022d0000720d02200141186a2903002106200141106a2903002105200141086a2802002104200141206a290300210f20012802042102200341a0056a41086a22014200370300200342003703a0054191bdc1004115200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0044104101f2201450d1320012002360000200341b0046a41102001410410032001101d200341a0056a41086a22014200370300200342003703a00541f5bcc100411c200341a0056a1001200341b0046a41086a22022001290300370300200320032903a0053703b0042003200637034820032005370340200341b0046a4110200341c0006a4110100320014200370300200342003703a00541a8bcc1004114200341a0056a100120022001290300370300200320032903a0053703b0042003200f370340200341b0046a4110200341c0006a4108100320014200370300200342003703a00541cebcc100410d200341a0056a100120022001290300370300200320032903a0053703b0044104101f2201450d1420012004360000200341b0046a41102001410410032001101d0c190b41c190c200210a41c000210420022d0000450d1e200241046a2802004102490d1e200128020421024112101f2201450d10200141106a41002f00eaa8413b0000200141086a41002900e2a841370000200141002900daa841370000200141124124101e2201450d1120012002360012200341a0056a41086a22024200370300200342003703a00520014116200341a0056a1001200341b0046a41086a2002290300370300200320032903a0053703b004200341b0046a411041f8b3c200410041001002417f460d07200342103702a4052003200341b0046a3602a005200341c0006a200341a0056a10e10220032903404201520d1420032802482102200341c0046a200341cc006a41dc0010ce031a200341b0046a41101009200341d0036a200341c0046a41dc0010ce031a200341f0026a200341d0036a41dc0010ce031a2001101d20034190026a200341f0026a41dc0010ce031a200320023602b001200341b0016a41047220034190026a41dc0010ce031a200341206a200341d0016a20032903c001200341c8016a29030010f2012003290320200341286a29030010f3010c180b20022d000120022d000072450d040b41c9b4c000210a412821040c1c0b200341a0056a41026a200c2d00003a0000200341d0036a41086a200d290300370300200341d0036a410d6a200e290000370000200320032f01f0023b01a005200320032903403703d00341012101200b41ff01714101470d00200341f0026a41026a200341a0056a41026a2d00003a0000200341c0006a41086a200341d0036a41086a290300370300200341c0006a410d6a200341d0036a410d6a290000370000200320032f01a0053b01f002200320032903d003370340410021010c010b41f1b4c000210a412a21040b200341b0046a41026a2202200341f0026a41026a2d00003a0000200341c0046a41086a220b200341c0006a41086a220c290300370300200341c0046a41106a200341c0006a41106a290300370300200320032f01f0023b01b004200320032903403703c00420010d19200341c3016a200b290300370000200341c8016a200341c0046a410d6a290000370000200320032f01b0043b01b001200320043600b7012003200a3600b301200320032903c0043700bb01200320022d00003a00b2012002200341346a41026a2d00003a0000200c20034190026a41086a290300370300200341c0006a410d6a220120034190026a410d6a290000370000200320032f01343b01b0042003200329039002370340200941ff01714101470d01200341a0056a200741067610b00120032802a005210220032802a8052007413f7122014d0d042003419c056a41026a200220014105746a220141026a2d00003a0000200341d8036a200141136a290000370300200341dd036a200141186a290000370000200320012f00003b019c052003200129000b3703d00320012800072108200128000321074101210120032802a405450d150c140b200141086a2903002106200141106a2903002105200341a0056a41086a22014200370300200342003703a00541cea8c100410c200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0042003200537034820032006370340200341b0046a4110200341c0006a411010030c120b2003419c056a41026a200341b0046a41026a2d00003a0000200341d0036a41086a200341c0006a41086a290300370300200341d0036a410d6a2001290000370000200320032f01b0043b019c05200320032903403703d0030c140b200341d0036a200341c0046a41dc0010ce031a2001101d0b41bcbdc100210a411921040c150b4100210120032802a4050d0f0c100b2003410036024820034204370340410421020b200141016a220a2001490d0120014101742207200a200a2007491b220aad4202862206422088a70d012006a722074100480d01024002402001450d00200220014102742007101e2202450d010c0c0b2007101f22020d0b0b200741041020000b200341d4006a4101360200200341183602b401200341c0adc4003602b00120034201370244200341c8adc4003602402003200341b0016a360250200341c0006a4194d9c30010cf01000b1021000b411241011020000b412441011020000b411241011020000b412441011020000b410441011020000b410441011020000b41df88c0004133103a000b41df88c0004133103a000b2003200a36024420032002360240200341c8006a28020021010b200341c8006a200141016a360200200220014102746a2004360200200341c0006a10ab012003280244450d002002101d0b4100210a0c040b2002101d0b20010d004101210141d7c0c1002107411521080c010b200341a0056a41026a2003419c056a41026a2d00003a0000200341c0006a41086a200341d0036a41086a290300370300200341c0006a410d6a200341d0036a410d6a290000370000200320032f019c053b01a005200320032903d003370340410021010b2003413c6a41026a2202200341a0056a41026a2d00003a0000200341c0046a41086a2204200341c0006a41086a290300370300200341c0046a41106a200341c0006a41106a290300370300200320032f01a0053b013c200320032903403703c00402402001450d00200821042007210a0c020b200341386a41026a20022d00003a0000200341f0026a41086a2004290300370300200341f0026a410d6a200341c0046a410d6a290000370000200320032f013c3b0138200320032903c0043703f002200341a0056a41086a22014200370300200342003703a00541f5bcc100411c200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b004024002400240024002400240024002400240200341b0046a411041f8b3c200410041001002417f460d002003420037034820034200370340200341b0046a4110200341c0006a4110410010022201417f460d022001410f4d0d02200341c8006a290300210f200329034021100c010b420021104200210f0b200341a0056a41086a22014200370300200342003703a0054191bdc1004115200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b004024002400240200341b0046a411041f8b3c200410041001002417f460d0020034100360240200341b0046a4110200341c0006a41044100100241016a41044d0d02200335024021110c010b420021110b200341086a200642002011420010d203200341186a200341b0016a201042edeb82bdef9804200329030842c0843d8020032903104200521b22112011201054200f420052200f501b22011b2210200f420020011b220f10cc0102402003280218450d0041dbbcc100210a411a21040c0a0b200341a0056a41086a22014200370300200342003703a00541a6bdc1004116200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b004410021020240200341b0046a411041f8b3c200410041001002417f460d0020034100360240200341b0046a4110200341c0006a41044100100241016a41044d0d03200328024021020b200341a0056a41086a22014200370300200342003703a00541a6bdc1004116200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0042003200241016a360240200341b0046a4110200341c0006a41041003200341c0006a41186a200341b0016a41186a290300370300200341c0006a41106a200341b0016a41106a290300370300200341c0006a41086a200341b0016a41086a290300370300200341c0046a41086a200341f0026a41086a290300370300200341c0046a410d6a200341f0026a410d6a290000370000200320032903b001370340200320032f01383b01d00320032003413a6a2d00003a00d203200320032903f0023703c0044112101f2201450d03200141106a41002f00eaa8413b0000200141086a41002900e2a841370000200141002900daa841370000200141124124101e2204450d0420042002360012200341a0056a41086a22014200370300200342003703a00520044116200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0044120101f2201450d0520012003290340370000200141186a200341c0006a41186a290300370000200141106a200341c0006a41106a290300370000200141086a200341c0006a41086a2903003700002001412041c000101e2201450d0620012006370020200141286a2005370000200141c000418001101e2201450d0720012010370050200120032f01d0033b00302001200836003720012007360033200120032903c00437003b200141d8006a200f370000200141326a20032d00d2033a0000200141c3006a200341c0046a41086a290300370000200141c8006a200341cd046a290000370000200341b0046a4110200141e00010032001101d2004101d200341cc006a20023602004100210a200341c0006a41086a41003a00002003410a3a0040200341c0006a108b010c080b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b412441011020000b412041011020000b41c00041011020000b41800141011020000b0b200020043602042000200a360200200341b0056a24000bcf0202027f017e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d01200441012001108b02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d6b6c2004102200220006a41800120006b108c02210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d6b6c2004102200220006a41800120006b108c02210020024180016a240020000f0b2000418001102a000b2000418001102a000b130020004100360204200041f8b3c2003602000b130020004107360204200041ebc1c1003602000b130020004102360204200041f0dac3003602000b7301017f02400240410f101f2202450d00200241076a41002900b4bf41370000200241002900adbf413700002002410f411e101e2202450d012002200036000f20024113200110e8022002101d0240200141046a280200450d002001280200101d0b0f0b410f41011020000b411e41011020000bb30301057f230041306b22032400200341206a41086a220442003703002003420037032020002001200341206a1001200341086a41086a20042903003703002003200329032037030820034100360228200342013703202002280200210020032002280208220236021c2003411c6a200341206a106202400240024002402002450d002002410574210520042802002102200328022021062003280224210103400240024002400240200120026b41204f0d00200241206a22042002490d0720014101742207200420042007491b22074100480d072001450d01200620012007101e22060d020c080b200241206a21040c020b2007101f2206450d060b200721010b200620026a22022000290000370000200241186a200041186a290000370000200241106a200041106a290000370000200241086a200041086a29000037000020042102200041206a2100200541606a22050d000b200341286a200436020020032001360224200320063602200c010b2004280200210420032802242101200328022021060b200341086a411020062004100302402001450d002006101d0b200341306a24000f0b1021000b200741011020000bc20602027f047e230041e0006b22032400200341386a41086a220442003703002003420037033841f1f2c1004116200341386a1001200341d0006a41086a20042903003703002003200329033837035002400240024002400240200341d0006a411041f8b3c200410041001002417f460d0020034200370338200341d0006a4110200341386a41084100100241016a41084d0d02200329033821050c010b42c0843d21050b42002106200341386a41086a220442003703002003420037033841e0f2c1004111200341386a1001200341d0006a41086a2004290300370300200320032903383703500240200341d0006a411041f8b3c200410041001002417f460d0020034200370338200341d0006a4110200341386a41084100100241016a41084d0d02200329033821060b0240200520067d20025a0d00200041ebbec10036020420004101360200200041086a411b360200200341e0006a24000f0b42002105200341386a41086a220442003703002003420037033841d9f3c1004111200341386a1001200341d0006a41086a20042903003703002003200329033837035002400240200341d0006a411041f8b3c200410041001002417f460d002003420037034020034200370338200341d0006a4110200341386a4110410010022204417f460d042004410f4d0d04200341c0006a2903002105200329033821060c010b420121060b200341186a200542002002420010d203200341286a200242002006420010d203200341086a420042002006420010d20302402003290310200329032084420052200341286a41086a2903002207200329030820032903187c7c220820075472450d0020004186bfc10036020420004101360200200041086a4127360200200341e0006a24000f0b200341386a200120032903282008410810f001024020032802384101470d002000200329023c37020420004101360200200341e0006a24000f0b20032903402107200041306a200341386a41106a290300370300200041286a2007370300200041206a2005370300200041186a2006370300200041106a2002370300200041086a200237030020004100360200200341e0006a24000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000bff0603037f047e037f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042002290038370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a0013703004112101f2204450d01200441106a41002f00ddc5413b0000200441086a41002900d5c541370000200441002900cdc541370000200441124132101e2204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41086a220a4200370300200242003703a00120044132200241a0016a100120024180016a41086a200a290300370300200220022903a0013703800120024180016a411041f8b3c200410041001002417f460d032002421037029401200220024180016a36029001200241a0016a20024190016a10eb0220022d00b8014102460d04200241a0016a41086a290300210820022802b001210a20022903a0012105200241206a200241b9016a41c70010ce031a200241a0016a200241206a41c10010ce031a200241206a200241a0016a41c10010ce031a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2008370300200041286a2005370300200041386a200a360200200020093a0027200042013703002004101d200324000f0b20004200370300200324000f0b411241011020000b413241011020000b41a49ac20041d700103a000b41df88c0004133103a000bf10a03027f027e077f230041e0016b22022400200241186a200110d501024002402002280218450d00200228021c21032002200110ca022002290300a7450d00200241106a29030021042002290308210541002106200241003a00c00120012802002001280204200241c0016a410120012802081002210720012001280208200741016a41014b22076a22083602082007450d01024020022d00c0012207450d0020074101470d02200241c0016a41186a22094200370300200241c0016a41106a220a4200370300200241c0016a41086a220b4200370300200242003703c001200141086a220641002001280200200141046a280200200241c0016a41202008100222072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d02200241a0016a41186a22072009290300370300200241a0016a41106a2206200a290300370300200241a0016a41086a2209200b290300370300200220022903c0013703a00120024180016a41186a220a200729030037030020024180016a41106a2207200629030037030020024180016a41086a22062009290300370300200220022903a00137038001200241e0006a41186a200a290300370300200241e0006a41106a2007290300370300200241e0006a41086a20062903003703002002200229038001370360410121060b200241c0006a41186a200241e0006a41186a290300370300200241c0006a41106a200241e0006a41106a290300370300200241c0006a41086a200241e0006a41086a2903003703002002200229036037034041002109200241003a00c0012001280200200141046a280200200241c0016a4101200810022107200141086a22082008280200200741016a41014b22076a22083602002007450d01024020022d00c0012207450d0020074101470d02200241c0016a41186a22094200370300200241c0016a41106a220a4200370300200241c0016a41086a220b4200370300200242003703c001200141086a220741002001280200200141046a280200200241c0016a41202008100222012001417f461b2201412020014120491b20072802006a3602002001411f4d0d02200241a0016a41186a22012009290300370300200241a0016a41106a2207200a290300370300200241a0016a41086a2208200b290300370300200220022903c0013703a00120024180016a41186a2209200129030037030020024180016a41106a2201200729030037030020024180016a41086a22072008290300370300200220022903a00137038001200241e0006a41186a2009290300370300200241e0006a41106a2001290300370300200241e0006a41086a20072903003703002002200229038001370360410121090b200241c0016a41186a2201200241e0006a41186a290300370300200241c0016a41106a2207200241e0006a41106a290300370300200241c0016a41086a2208200241e0006a41086a290300370300200220022903603703c001200241206a41186a220a200241c0006a41186a290300370300200241206a41106a220b200241c0006a41106a290300370300200241206a41086a220c200241c0006a41086a290300370300200220022903403703202000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290320370019200041216a200c290300370000200041296a200b290300370000200041316a200a2903003700002000413a6a20022903c001370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a200241a4016a2f01003b0100200041da006a20022801a001360100200241e0016a24000f0b200041023a0018200241e0016a24000f0b200041023a0018200241e0016a24000b960201017f024002400240024002400240024020004180104f0d00200041037641f8ffffff01714190b4c4006a21010c010b02402000418080044f0d00200041067641606a220141e0074f0d02200141a8b6c4006a2d0000220141c9004b0d0320014103744190c2c2006a21010c010b2000410c7641706a22014180024f0d0320014188bec4006a2d00004106742000410676413f7172220141ff034b0d04200141e0c6c2006a2d0000220141364b0d05200141037441e0cac2006a21010b200129030042012000413f71ad86834200520f0b4188c0c400200141e007104b000b4198c0c400200141ca00104b000b41a8c0c4002001418002104b000b41b8c0c4002001418004104b000b41c8c0c40020014137104b000b2701017f2000280200220128020020012802042000280204280200200028020828020010ee02000bd60801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b21074180022108024003400240200820014f0d00200020086a2c000041bf7f4a0d020b2008417f6a21064100210520084101460d02200720086a21092006210820094101470d000c020b0b41002105200821060b200420063602142004200036021020044100410520051b36021c200441f8b3c20041d8b6c20020051b360218024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b20042002360220024002402002450d0020022001460d00200141016a210903400240200220014f0d00200020026a2c000041404e0d020b2002417f6a210820024101460d0220092002462106200821022006450d000c020b0b200221080b20082001460d02410121064100210502400240200020086a22092c000022024100480d002004200241ff0171360224200441286a21020c010b200020016a220621010240200941016a2006460d00200941026a2101200941016a2d0000413f7121050b2002411f712109024002400240200241ff017141e001490d004100210020062107024020012006460d00200141016a210720012d0000413f7121000b20002005410674722101200241ff017141f001490d0141002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d060c020b200520094106747221010c010b20012009410c747221010b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441ec006a4118360200200441e4006a4118360200200441c8006a41146a4121360200200441d4006a4122360200200441306a41146a4105360200200420023602582004410236024c20044205370234200441a8b3c4003602302004200441186a3602682004200441106a3602602004200441246a3602502004200441206a3602482004200441c8006a360240200441306a41d0b3c40010cf01000b20042002200320081b360228200441c8006a41146a4118360200200441d4006a4118360200200441306a41146a41033602002004410236024c20044203370234200441b8b2c4003602302004200441186a3602582004200441106a3602502004200441286a3602482004200441c8006a360240200441306a41d0b2c40010cf01000b200441e4006a4118360200200441c8006a41146a4118360200200441d4006a4102360200200441306a41146a41043602002004410236024c20044204370234200441e0b2c4003602302004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a3602482004200441c8006a360240200441306a4180b3c40010cf01000b4190b3c400102c000b8008010b7f200028021021030240024002400240024002400240024002400240200028020822044101470d0020030d010c020b2003450d070b02402002450d00200120026a2105200041146a280200417f732106410021072001210320012108024002400340200341016a21090240024020032c0000220a4100480d00200a41ff0171210a20092103200641016a22060d010c030b02400240024020092005460d0020092d0000413f71210b200341026a22032109200a411f71210c200a41ff0171220a41e001490d010c020b4100210b20052103200a411f71210c200a41ff0171220a41e0014f0d010b200b200c41067472210a20092103200641016a22060d010c030b02400240024020032005460d00200341016a2209210d20032d0000413f71200b41067472210b200a41f001490d010c020b2005210d4100200b41067472210b200a41f0014f0d010b200b200c410c7472210a20092103200641016a22060d010c030b02400240200d2005460d00200d41016a2103200d2d0000413f71210a0c010b4100210a200921030b200b410674200c411274418080f0007172200a72220a418080c400460d03200641016a2206450d020b200720086b20036a21072003210820052003470d000c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b2004450d020c010b410021022004450d010b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200220096b2000410c6a28020022064f0d014100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a2109410020002d0030220320034103461b2203410371450d0220034102460d03410021080c040b2000280218200120022000411c6a28020028020c1100000f0b2000280218200120022000411c6a28020028020c1100000f0b20092108410021090c010b200941016a4101762108200941017621090b417f2103200041046a210a200041186a21062000411c6a210702400340200341016a220320094f0d012006280200200a2802002007280200280210110600450d000b41010f0b200041046a280200210941012103200041186a220a280200200120022000411c6a220628020028020c1100000d01200a280200210a417f2103200628020041106a210602400340200341016a220320084f0d01200a20092006280200110600450d000b41010f0b41000f0b2000280218200120022000411c6a28020028020c11000021030b20030b4e01017f230041206b22002400200041146a41013602002000411836021c200041c0adc40036021820004201370204200041c8adc4003602002000200041186a360210200041b0dac30010cf01000bb70503047f027e037f230041106b22022400200241003a000820012802002001280204200241086a410120012802081002210320012001280208200341016a41014b22046a22033602080240024002402004450d0002400240024020022d0008220541037122044102460d0020044101460d0120040d022005410276ad2106420121070c050b20024100360208200220053a0008200141086a220441002001280200200141046a280200200241086a41017241032003100222012001417f461b22014103200141034922011b20042802006a36020020010d022002280208410276ad2106420121070c040b200241003b0108200220053a00082001280200200141046a280200200241086a4101724101200310022103200141086a22012001280200200341016a220141014b6a36020020014102490d0120022f0108410276ad2106420121070c030b02400240200541027622044104460d0020040d01200141046a280200210420024100360208200141086a2205410020012802002004200241086a41042003100222012001417f461b22014104200141044922011b20052802006a36020020010d0220023502082106420121070c040b4200210720024200370308200141086a220441002001280200200141046a280200200241086a41082003100222012001417f461b22014108200141084922011b20042802006a36020020010d0220022903082106420121070c030b200441046a220841084b0d0042002106200141046a2109200141086a2105410021040340200241003a000820012802002009280200200241086a410120031002210320052005280200200341016a41014b220a6a2203360200200a450d0120023100082004410374413871ad86200684210642012107200441016a220441ff01712008490d000c030b0b420021070b0b2000200637030820002007370300200241106a24000bd00605057f017e017f027e037f230041306b22022400200241003a0020200241206a2001280200220320012802042204410047220510ce031a0240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d000240024020022d0020220341037122044102460d00024020044101460d0020040d022003410276ad21070c080b200241003a0020200241206a20052006410047220410ce031a20062004490d06200141046a200620046b3602002001200520046a3602002006450d0220022d002041087420037241fcff0371410276ad21070c070b200241003a001e200241003b011c2002411c6a200520064103200641034922081b220410ce031a200141046a200620046b3602002001200520046a36020020080d0120022f011c20022d001e41107472410874200372410276ad21070c060b0240024020034102762204410c460d00024020044104460d0020040d0220024100360220200241206a200520064104200641044922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d03200235022021070c080b4200210a20024200370320200241206a200520064108200641084922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d03200229032021070c070b4200210a2002420037032820024200370320200241206a200520064110200641104922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d02200241286a2903002109200229032021074201210a0c070b200441046a220b41104b0d00200141046a210c200241106a210d4200210742002109410021030340200241003a0020200241206a20052006410047220410ce031a20062004490d04200c200620046b22083602002001200520046a22053602002006450d01200241086a20023100204200200341037441f8007110d303200d2903002009842109200229030820078421074201210a20082106200341016a22042103200441ff0171200b490d000c070b0b4200210a0b0c040b20052004102a000b20042006102a000b20042006102a000b420021094201210a0b200020073703082000200a370300200041106a2009370300200241306a24000b970a03017f027e057f230041e0006b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d00200141046a280200200141086a2802002200470d01200041016a22052000490d1120004101742206200520052006491b22064100480d112000450d05200128020020002006101e2205450d060c190b20034280800154410020051b450d01200141046a2802002205200141086a28020022006b41024f0d02200041026a22062000490d1020054101742200200620062000491b22004100480d102005450d08200128020020052000101e2205450d090c160b200128020021050c180b200342808080800454410020051b450d01200141046a2802002205200141086a28020022006b41044f0d04200041046a22062000490d0e20054101742200200620062000491b22004100480d0e2005450d08200128020020052000101e22050d090c120b200128020021050c140b411020047920037942c0007c20044200521ba74103766b22074104490d0e200141046a280200200141086a2802002206470d03200641016a22052006490d0c20064101742208200520052008491b22054100480d0c2006450d09200128020020062005101e22080d0a0c110b2006101f22050d130b200641011020000b200128020021050c050b200128020021080c070b2000101f22050d0d0b200041011020000b2000101f2205450d090b20012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a7410274410272360000200241e0006a24000f0b2005101f2208450d070b20012008360200200141046a2005360200200141086a28020021060b200141086a2205200641016a360200200820066a200741027441736a3a0000200029030021032002200041086a290300220437030820022003370300200141046a210803400240024002400240200828020020052802002200470d00200041016a22062000490d0520004101742209200620062009491b22094100480d052000450d01200128020020002009101e22060d020c060b200128020021060c020b2009101f2206450d040b2001200636020020082009360200200528020021000b2005200041016a360200200620006a2003a73a000020034208882004423886842103200442088821042007417f6a22070d000b2002200337030020022004370308200320048450450d03200241e0006a24000f0b1021000b200941011020000b41e8dcc300102c000b20022002360240200241e0c2c100360244200241c8006a41146a4100360200200241286a41146a411c360200200241346a4123360200200241106a41146a4103360200200241f8b3c2003602582002420137024c200241d8dac3003602482002412336022c20024203370214200241e0b0c4003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a4180ddc30010cf01000b200041011020000b200541011020000b20012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b0000200241e0006a24000f0b20012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a0000200241e0006a24000b8c0605027f027e017f027e027f230041a0016b22022400200028020021000240024002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0120054290ce005441002004501b0d0241272100200241186a21060340200241106a200520044290ce00420010d1032002200229031022072006290300220842f0b17f427f10d203200241206a20006a2203417c6a200520022903007ca7220941e4006e220a41017441aab4c2006a2f00003b00002003417e6a200a419c7f6c20096a41017441aab4c2006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000b2007a7220341e3004a0d030c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d032001410141d6b6c2004102200241206a20006a41800120006b108c022100200241a0016a240020000f0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d032001410141d6b6c2004102200241206a20006a41800120006b108c022100200241a0016a240020000f0b412721002005a7220341e3004c0d030b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441aab4c2006a2f00003b0000200941094a0d030c040b2000418001102a000b2000418001102a000b2003220941094c0d010b200241206a2000417e6a22006a200941017441aab4c2006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141f8b3c2004100200241206a20006a412720006b108c022100200241a0016a240020000bf40a040c7f027e027f077e23004190036b22022400200241086a2001280200200128020428020c1103000240024020022903084201520d00200241e4016a41046a2103200241a0026a41106a2104200241a0016a4101722105200241086a41086a2106200241a0026a41206a2107200241c4026a21082002419c026a21090340200241f8016a41186a220a200641186a290000370300200241f8016a41106a220b200641106a290000370300200241f8016a41086a220c200641086a290000370300200220062900003703f801200241a0016a200241f8016a10f60202400240024020022d00a0014101470d00200241f0026a41186a200541186a290000370300200241f0026a41106a200541106a290000370300200241f0026a41086a200541086a290000370300200220052900003703f002200241a0026a200241f0026a10c9022007280200220d450d01200241a0026a41086a290300210e20022903a002210f2008280200450d02200d101d0c020b200741003602000b4200210f4200210e0b20034200370200200341086a4200370200200241f0026a41186a220d200a290300370300200241f0026a41106a220a200b290300370300200241f0026a41086a2210200c290300370300200220022903f8013703f002200241a0026a41086a22114200370300200b200241e4016a41106a280200360200200c200241e4016a41086a290200370300200420022903f002370300200441086a2010290300370300200441106a200a290300370300200441186a200d290300370300200242003703a002200220022902e4013703f801427f2112024002400240200e42ffffffff0f560d00200f422088200e422086842212500d010b200241d0016a41106a200b280200360200200241d0016a41086a200c290300370300200241a0016a41086a2011290300370300200241a0016a41106a2004290300370300200241a0016a41186a200241a0026a41186a290300370300200241a0016a41206a2007290300370300200241a0016a41286a200241a0026a41286a290300370300200220022903f8013703d001200220022903a0023703a0012002200928000036009b01200220022800990236029801420021134100210b200f2114200e21150c010b4102210b2016210f2017210e201821120b20024180016a41106a200241d0016a41106a28020036020020024180016a41086a200241d0016a41086a290300370300200241d0006a41086a200241a0016a41086a290300370300200241d0006a41106a200241a0016a41106a290300370300200241d0006a41186a200241a0016a41186a290300370300200241d0006a41206a200241a0016a41206a290300370300200241d0006a41286a200241a0016a41286a290300370300200220022903d00137038001200220022903a0013703502002200228009b0136004b2002200228029801360248200b4102470d02200241086a2001280200200141046a28020028020c110300200f2116200e21172012211820022903084201510d000b0b200041023a00800120024190036a24000f0b200020143703102000200f370300200020123703402000410036022820004208370320200020022903800137022c20002002290350370350200041186a20153703002000200e370308200041c8006a2013370300200041346a20024180016a41086a2903003702002000413c6a20024180016a41106a280200360200200041d8006a200241d0006a41086a290300370300200041e0006a200241d0006a41106a290300370300200041e8006a200241d0006a41186a290300370300200041f0006a200241f0006a290300370300200041f8006a200241f8006a2903003703002000200b3a008001200020022802483600810120004184016a200228004b36000020024190036a24000bd10301047f230041d0006b2202240002400240410e101f2203450d00200341066a41002900b3c541370000200341002900adc5413700002003410e412e101e2203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241306a41086a22014200370300200242003703302003412e200241306a1001200241206a41086a200129030037030020022002290330370320024002400240200241206a411041f8b3c200410041001002417f460d00200241306a41186a4200370300200241306a41106a42003703002001420037030020024200370330200241206a4110200241306a4120410010022201417f460d022001411f4d0d02200241186a2201200241306a41186a290300370300200241106a2204200241306a41106a290300370300200241086a2205200241306a41086a29030037030020022002290330370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b2003101d200241d0006a24000f0b41df88c0004133103a000b410e41011020000b412e41011020000b860100024002400240024002400240200041ff017122004101460d0020004102470d014101101f2200450d03200041023a00000c020b4101101f2200450d03200041013a00000c010b4101101f2200450d03200041003a00000b200128020020012802042000410110032000101d0f0b410141011020000b410141011020000b410141011020000bb20201027f230041106b22022400200241003602082002420137030002404120101f2203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a200210f3022002200041106a36020c2002410c6a200210f302200028022021032002200041286a280200220036020c2002410c6a2002106202402000450d002003200041186c6a210003402002200336020c2002410c6a200210f302200341106a200210b1012000200341186a2203470d000b0b200228020421032001280200200128020420022802002200200241086a280200100302402003450d002000101d0b200241106a24000f0b412041011020000bfa0801067f230041106b220224002002410036020820024201370300200041106a200210622002200036020c2002410c6a200210f30220022802042103200228020821040240024002400240024002400240024002400240024002400240024002400240024020002d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22034100480d0c2004450d03200228020020042003101e2205450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22034100480d0b2004450d04200228020020042003101e2205450d050c060b200228020021050c080b200228020021050c050b2003101f22050d050b200341011020000b2003101f22050d010b200341011020000b20022003360204200220053602000b200241086a200441016a2206360200200520046a41003a00000c020b20022003360204200220053602000b200241086a2206200441016a360200200520046a41013a00000240024002400240024020022802042203200628020022046b41204f0d00200441206a22062004490d0620034101742207200620062007491b22074100480d062003450d01200520032007101e2205450d020c030b200441206a21060c030b2007101f22050d010b200741011020000b2002200736020420022005360200200721030b200241086a2006360200200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a2900003700002004200041196a2900003700000b024002400240024002400240024002400240200041396a2d00004101470d0020032006470d08200341016a22042003490d0920034101742207200420042007491b22044100480d092003450d01200520032004101e2205450d020c070b20032006470d05200341016a22002003490d0820034101742204200020002004491b22004100480d082003450d02200520032000101e2205450d030c040b2004101f22050d050b200441011020000b2000101f22050d010b200041011020000b20022000360204200220053602000b200241086a2200200641016a360200200520066a41003a0000200228020421042001280200200128020420022802002203200028020010032004450d060c050b20022004360204200220053602000b200241086a2203200641016a360200200520066a41013a000002400240024020022802042205200328020022046b41204f0d00200441206a22032004490d0320054101742206200320032006491b22064100480d032005450d01200228020020052006101e2203450d020c040b200228020021030c040b2006101f22030d020b200641011020000b1021000b2002200636020420022003360200200621050b200241086a200441206a2206360200200320046a220441086a200041c2006a290000370000200441106a200041ca006a290000370000200441186a200041d2006a29000037000020042000413a6a290000370000200128020020012802042003200610032005450d010b2003101d0b200241106a24000b13002000410f360204200041dcdec3003602000b130020004107360204200041dbd6c1003602000bb50707057f047e017f017e037f047e017f230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200141002001280200200128020420024180016a41202001280208100222062006417f461b2206412020064120491b20012802086a3602080240024002400240024002400240024002400240024002402006411f4d0d00200241e0006a41186a2003290300370300200241e0006a41106a2004290300370300200241e0006a41086a20052903003703002002200229038001370360200241c8006a200110ca022002290348a7450d01200241c8006a41106a290300210720022903502108200241306a200110ca022002290330a7450d02200241c0006a29030021092002290338210a200241286a200110d5012002280228450d09200228022c220bad42187e220c422088a70d05200ca72206417f4c0d052006450d032006101f220d450d06200b450d040c070b20004100360220200241a0016a24000f0b20004100360220200241a0016a24000f0b20004100360220200241a0016a24000f0b4108210d200b0d030b4100210f4200210c0c030b102e000b200641081020000b4200210c200241106a41106a210e410021054100210441002103200b210f02400340200241106a200110ca022002290310a7450d01200e2903002110200229031821112002200110f1022002290300a7450d01200341016a21062002290308211202402003200f470d002005200620062005491b220fad42187e2213422088a70d052013a722144100480d0502402003450d00200d20042014101e220d0d010c070b2014101f220d450d060b200d20046a2203201037030820032011370300200341106a2012370300200c4280808080107c210c200541026a2105200441186a2104200621032006200b490d000c020b0b200f450d01200d101d0c010b200d450d0020024180016a41186a2201200241e0006a41186a29030037030020024180016a41106a2206200241e0006a41106a29030037030020024180016a41086a2203200241e0006a41086a2903003703002002200229036037038001200041186a20093703002000200a37031020002007370308200020083703002000200c200fad843702242000200d3602202000412c6a200229038001370200200041346a20032903003702002000413c6a2006290300370200200041c4006a2001290300370200200241a0016a24000f0b20004100360220200241a0016a24000f0b1021000b201441081020000b13002000411836020420004198eac3003602000bf30301087f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a10f3022002200336023c2002413c6a200241306a10f3022002280220210320022004280200220436023c2002413c6a200241306a10620240024002402004450d00200441306c2105200241306a41086a21060340024002400240024020022802342207200628020022046b41204f0d00200441206a22082004490d0620074101742209200820082009491b22094100480d062007450d01200228023020072009101e22070d020c070b200441206a2108200228023021070c020b2009101f2207450d050b20022009360234200220073602300b20062008360200200720046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a2900003700002004200341106a2900003700002002200336023c2002413c6a200241306a10f302200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a2802003602000240200241246a280200450d00200241206a280200101d0b200241c0006a24000f0b1021000b200941011020000b7101017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a10622002200241086a36022c2002412c6a200241206a10f302200041086a200228022836020020002002290320370200200241306a24000b3301017f02404108101f2202450d0020004288808080800137020420002002360200200242e8073700000f0b410841011020000b3401017f02404104101f2202450d0020004284808080c00037020420002002360200200241c0843d3600000f0b410441011020000b3201017f02404104101f2202450d0020004284808080c000370204200020023602002002413c3600000f0b410441011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241043600000f0b410441011020000beb0504017f037e057f017e230041b0016b22032400200241106a290300210420024188016a290300210520022903082106200228020021072003200241186a41f00010ce0321022001280200210820024190016a41186a2209200241e8006a29030037030020024190016a41106a220a200241e0006a29030037030020024190016a41086a220b200241d8006a290300370300200220022903503703900102400240024041d000101f2201450d00200142003703002001410036022420012007360220200141003a0048200141186a4200370300200141106a4200370300200141086a42003703002001200241d0006a2203290300370328200141306a200341086a290300370300200141386a200341106a290300370300200141c0006a200341186a290300370300200241f0006a41086a200b290300370300200241f0006a41106a200a290300370300200241f0006a41186a200929030037030020022002290390013703700240024002400240200841046a28020020082802082203470d00200341016a22072003490d0320034101742209200720072009491b2209ad42d0007e220c422088a70d03200ca7220a4100480d032003450d012008280200200341d0006c200a101e2207450d020c050b200828020021070c050b200a101f22070d030b200a41081020000b1021000b41d00041081020000b20082007360200200841046a2009360200200841086a28020021030b2007200341d0006c6a220342003703102003420037030820032006422088200442208684427f2004428080808010541b370300200320013602202003200229037037022c200341186a4200370300200341246a428180808010370200200341c4006a200241f0006a41186a2903003702002003413c6a200241f0006a41106a290300370200200341346a200241f0006a41086a290300370200200841086a2201200128020041016a3602002000200437030820002006370300200041106a200241f00010ce031a2000200537038001200241b0016a24000b0900200042003702000bc50603037f047e037f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370358200220063703502002200737034820022008370340200141246a2d00002109200241a0016a41176a22042002290058370000200241a0016a41106a220a2002290051370300200241a0016a41086a220b2002290049370300200220022900413703a00102400240024002402008a741ff01714101470d00200241106a41176a2004290000370000200241106a41106a200a290300370300200241106a41086a200b290300370300200220022903a0013703104112101f2204450d01200441106a41002f00cbc5413b0000200441086a41002900c3c541370000200441002900bbc541370000200441124132101e2204450d0220042002290310370012200420093a0031200441296a200241106a41176a220a290000370000200441226a200241106a41106a2903003700002004411a6a200241106a41086a290300370000200241a0016a41086a220b4200370300200242003703a00120044132200241a0016a1001200241c0006a41086a200b290300370300200220022903a001370340200241a0016a200241c0006a105d20022d00ac014102460d03200241c0006a200241a0016a41d00010ce031a200241306a41086a220b200241c0006a41086a28020036020020022002290340370330200241a0016a200241cc006a41c20010ce031a200141046a220141206a200241e1016a2d00003a0000200141186a200241d9016a290000370000200141106a200241d1016a290000370000200141086a200241a0016a41296a290000370000200120022900c10137000020002002290310370000200041086a200241106a41086a290300370000200041106a200241106a41106a290300370000200041176a200a290000370000200020093a001f200041286a200b280200360200200020022903303702202004101d200324000f0b20004100360220200324000f0b411241011020000b413241011020000b41a49ac20041d700103a000be10c04037f017e1b7f027e230041f0026b2204240002400240410d101f2205450d00200541056a41002900e1ee41370000200541002900dcee413700002005410d412d101e2205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41086a22064200370300200442003703a0022005412d200441a0026a1001200441e0016a41086a2006290300370300200420042903a0023703e001024002400240024002400240200441e0016a411041f8b3c200410041001002417f460d00200441003a00a002200441e0016a4110200441a0026a41014100100241016a41014d0d0520042d00a002220641034f0d052005101d20064101460d0320064102470d01200441a0026a200110f60220042d00a0024101470d02200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a2002200310ee0120043502384201852102200441386a41106a2903002103200441386a41086a29030021070c040b2005101d0b200441f8006a200110f60220042d00784101470d00200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2208290000370300200420042900793703a001200441a0026a200441a0016a10c902200441c0016a41186a22092005290000370300200441c0016a41106a220a2006290000370300200441c0016a41086a220b2008290000370300200420042900793703c00120042802c002220c450d00200441e0016a41186a220d2009290300370300200441e0016a41106a220e200a290300370300200441e0016a41086a220f200b290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2208200441a0026a41106a2209290300370300200441e0016a41386a2210200441a0026a41186a2211290300370300200441086a41086a2212200441cc026a2213290200370300200441086a41106a2214200441d4026a2215290200370300200441086a41186a2216200441dc026a2217290200370300200441086a41206a2218200441e4026a2219290200370300200441086a41286a221a200441ec026a221b280200360200200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221c2010290300370300200441386a41306a221d2008290300370300200441386a41286a221e2005290300370300200441386a41206a221f200429038002370300200441386a41186a2220200d290300370300200441386a41106a2221200e290300370300200441386a41086a2222200f290300370300200420042903e0013703382010201c2903003703002008201d2903003703002005201e290300370300200441e0016a41206a221c201f290300370300200d2020290300370300200e2021290300370300200f2022290300370300200420042903383703e001200441f8006a41186a2020290300370300200441f8006a41106a2021290300370300200441f8006a41086a202229030037030020042004290338370378201120102903003703002009200829030037030020062005290300370300200441c4026a2205200429030837020020132012290300370200201520142903003702002017201629030037020020192018290300370200201b201a2802003602002004200c3602c0022004201c2903003703a00220092009290300220720027c22233703002011201129030020037c2023200754ad7c37030020062903002107200420042903a002222320027c22243703a0022006200720037c2024202354ad7c370300200441c0016a20012002200310ee0120043502c0012102200a2903002103200b2903002107200441f8006a200441a0026a10880302402005280200450d00200441a0026a41206a280200101d0b200242018521020c020b420021020c010b200441a0026a20012002200310ee0120043502a0024201852102200441b0026a2903002103200441a8026a29030021070b2000200737030820002002370300200041106a2003370300200441f0026a24000f0b41df88c0004133103a000b410d41011020000b412d41011020000b9b0201027f230041306b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410f10d00102400240410e101f2203450d00200341066a41002900e5c541370000200341002900dfc5413700002003410e412e101e2203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241206a41086a22004200370300200242003703202003412e200241206a1001200241106a41086a200029030037030020022002290320370310200241103602242002200241106a3602202001200241206a10f8022003101d200241306a24000f0b410e41011020000b412e41011020000b02000bec0301087f23004180016b22032400200341c0006a200110ea020240024020032903404201520d002002417f732104200341c0006a41086a21020340200341086a41306a2205200241306a290300370300200341086a41286a2206200241286a290300370300200341086a41206a2207200241206a290300370300200341086a41186a2208200241186a290300370300200341086a41106a2209200241106a290300370300200341086a41086a220a200241086a29030037030020032002290300370308200341c0006a41306a2005290300370300200341c0006a41286a2006290300370300200341c0006a41206a2007290300370300200341c0006a41186a2008290300370300200341c0006a41106a20092903003703002002200a29030037030020032003290308370340200441016a2204450d02200341c0006a200110ea0220032903404201510d000b0b2000420037030020034180016a24000f0b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a29030037030020034180016a24000b92db0109037f027e067f047e027f027e037f017e127f230041f0046b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410e4b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0f00090607030a0c080f050d02040b01000b200141306a2903002106200141286a290300210720012d00012108200341d0026a41026a200141076a2d00003a0000200341c0046a41086a200141186a290200370300200341c0046a410d6a2001411d6a2900003700002003200141056a2f00003b01d0022003200141106a2902003703c004200141046a2d00002109200141086a280200210a2001410c6a280200210b20022d0001210c20022d00002105200341e0036a41186a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d1c410121040c1d0b200141086a2802002109200141046a280200210820022d000120022d000072450d0e4100210a2009450d0c2008101d20012d000021040c0c0b4101210a20022d000120022d0000720d0b200141046a2802002102200341e0046a41086a22054200370300200342003703e00441faedc1004116200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200320023602e003200341d0036a4110200341e0036a410410030c8a010b200141106a2903002106200141086a2903002107200141186a280200210d20022d0001210a20022d00002105200341e0036a41186a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d0d410121040c0e0b4101210a20022d000120022d0000720d0920012d00012104200341e0046a41086a22054200370300200342003703e00441e0d7c1004115200341e0046a1001200341d0036a41086a220a2005290300370300200320032903e0043703d00341002102200341d0036a411041f8b3c20041001003200320043a00e00320054200370300200342003703e00441e9a4c1004119200341e0046a1001200a2005290300370300200320032903e0043703d0034101210a200341d0036a4110200341e0036a410110034101210c20012d00002204410f4d0da3010ca4010b4101210a20022d000120022d0000720d08200141086a2903002106200341e0046a41086a22024200370300200342003703e00441e0edc100411a200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200320063703e003200341d0036a4110200341e0036a410810030c87010b200141106a2903002106200141086a290300210e20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d0d410121040c0e0b20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d0f410121040c100b20012d0001210d20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d11410121040c120b200141106a2903002106200141086a290300210720022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d16410121040c170b2001410c6a280200210a200141086a280200210b200141046a280200210d20022d0001210c20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d18410121040c190b4101210a20022d000120022d0000720d02200141046a2802002102200341e0046a41086a22054200370300200342003703e0044189d7c1004119200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200320023602e003200341d0036a4110200341e0036a410410030c81010b20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d19410121040c1a0b4101210a20022d000120022d000072450d1b0b41c9b4c000210241282105200441ff01712204410f4b0d23410120047441beff01710d9b0120044106460d242004410f470d23200a450d9b01200141086a280200450d9b01200141046a280200101d0c9b010b20034190016a41026a200141076a2d00003a0000200341206a41086a200141186a290200370300200341206a410d6a2001411d6a2900003700002003200141056a2f00003b0190012003200141106a290200370320200141046a2d00002109200141086a280200210d2001410c6a280200210b20022d0001210a20022d00002105200341e0036a41186a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d1a410121040c1b0b2001410c6a2802002102200341e0046a41086a22054200370300200342003703e00441e2d6c1004115200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200341003602e803200342013703e003200320023602e001200341e0016a200341e0036a10622002450d262002410574210c200341e0036a41086a280200210520032802e003210d20032802e403210a2008210203400240024002400240200a20056b41204f0d00200541206a22042005490d9401200a410174220b20042004200b491b220b4100480d9401200a450d01200d200a200b101e220d0d020c490b200541206a21040c020b200b101f220d450d470b200b210a0b200d20056a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a29000037000020042105200241206a2102200c41606a220c0d000b200341e8036a20043602002003200a3602e4032003200d3602e0030c270b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d8401200341d3046a200c290300370000200341c0046a41186a200341bd036a290000370000200320032f0194013b01c004200320053600c704200320023600c304200320032903b0033700cb042003200a2d00003a00c204200341e0036a200341c0046a10c9022003280280042202450d1b200341b0036a41086a220a200341e0036a41346a290200370300200341b0036a41106a2204200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703b003200341ac046a280200210b200341e0036a41286a2802002109200341e0036a410c6a350200210f200341e0036a41186a290300210e20032802e003210820032902e403211020032903f00321112003280284042105200341c0006a41186a2212200c290300370300200341c0006a41106a220c2004290300370300200341c0006a41086a2213200a290300370300200320032903b003370340200341e0016a41186a200e370300200341e0016a410c6a200f3e0200200341e0016a41286a200936020020034184026a2005360200200341e0016a41346a2013290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a2012290300370200200320113703f001200320103702e4012003200236028002200320083602e0012003200b3602ac022003200329034037028c02200d410a4d0d2202402005450d002002101d0b41f8f0c1002102411b21050c84010b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d8101200341ab016a200c29030037000020034198016a41186a200341bd036a290000370000200320032f0194013b0198012003200536009f012003200236009b01200320032903b0033700a3012003200a2d00003a009a01200341e0036a20034198016a10c9022003280280042205450d18200341b0036a41086a2204200341e0036a41346a290200370300200341b0036a41106a220a200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a29020037030020032003418c046a2902003703b003200341ac046a280200210d200341e0036a41286a280200210b200341e0036a410c6a3502002110200341e0036a41186a290300210720032802e003210920032902e403211120032903f003210f2003280284042102200341c0006a41186a2208200c290300370300200341c0006a41106a220c200a290300370300200341c0006a41086a220a2004290300370300200320032903b003370340200341e0016a41186a2007370300200341e0016a410c6a20103e0200200341e0016a41286a200b36020020034184026a2002360200200341e0016a41346a200a290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a20082903003702002003200f3703f001200320113702e4012003200536028002200320093602e0012003200d3602ac022003200329034037028c02200f200e200f200e54200720065420072006511b22051b220e2007200620051b220684500d6b200341e0016a41106a200f200e7d370300200341f8016a200720067d200f200e54ad7d370300200341e0046a41086a22024200370300200342003703e00441c4b9c000411b200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d0030240200341d0036a411041f8b3c200410041001002417f460d00200342003703e803200342003703e003200341d0036a4110200341e0036a4110410010022202417f460d472002410f4d0d47200341f0016a2202290300220f20032903e0035a200341f8016a22052903002207200341e8036a29030022105a20072010511b0d002005420037030020024200370300200720067c200f200e7c220e200f54ad7c21060b200341e0046a41086a22024200370300200342003703e00441ceedc1004112200341e0046a1001200341d0036a41086a22052002290300370300200320032903e0043703d003420021070240200341d0036a411041f8b3c200410041001002417f460d00200342003703e003200341d0036a4110200341e0036a41084100100241016a41084d0d4120032903e00321070b20024200370300200342003703e00441e1f0c1004117200341e0046a100120052002290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d29200342003703e003200341d0036a4110200341e0036a41084100100241016a41084d0d4120032903e003210f0c2a0b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341c0006a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b0140200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b20034194016a41026a220a200341c0006a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01403b019401200320032903e0033703b00320040d7e200341f3016a200c290300370000200341e0016a41186a200341bd036a290000370000200320032f0194013b01e001200320053600e701200320023600e301200320032903b0033700eb012003200a2d00003a00e201200341e0036a200341e0016a10c902200328028004220c450d15200341b0036a41086a220220034194046a290200370300200341b0036a41106a22052003419c046a290200370300200341b0036a41186a2204200341a4046a29020037030020032003418c046a2902003703b003200341e0036a41186a290300211420034188046a280200210d200341ec036a350200210620032903f0032115200328028404210920033502e003210f20032902e403210720034190036a41186a200429030037030020034190036a41106a200529030037030020034190036a41086a2002290300370300200320032903b0033703900342002110200341e0046a41086a22024200370300200342003703e00441ceedc1004112200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d0030240200341d0036a411041f8b3c200410041001002417f460d00200342003703e003200341d0036a4110200341e0036a41084100100241016a41084d0d3d20032903e00321100b200642208620074220888421062007422086200f8421070240200d41186c2202450d00200c20026a210a200241686a2105200c21020340200241086a290300210e2002290300210f2010200241106a2903002211540d2342002006200e7d2007200f54ad7d220e2007200f7d220f200756200e200656200e2006511b22041b21064200200f20041b2107200541686a2105200241186a2202200a470d000b0b410821044100210d2009450d23200c101d4100210b0c2d0b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d7b200341d3006a200c290300370000200341c0006a41186a200341b0036a410d6a290000370000200320032f0194013b01402003200536004720032002360043200320032903b00337004b2003200a2d00003a0042200341e0036a200341c0006a10c9022003280280042205450d12200341b0036a41086a220220034194046a290200370300200341b0036a41106a22042003419c046a290200370300200341b0036a41186a220a200341a4046a29020037030020032003418c046a2902003703b003200328028404210c200341e0016a41186a200a290300370300200341e0016a41106a2004290300370300200341e0016a41086a2002290300370300200320032903b0033703e001410d101f2202450d3e200241056a41002900e1ee41370000200241002900dcee413700002002410d412d101e2202450d3f200220032903e00137000d200241256a200341f8016a2903003700002002411d6a200341e0016a41106a290300370000200241156a200341e0016a41086a290300370000200341e0046a41086a22044200370300200342003703e0042002412d200341e0046a1001200341d0036a41086a2004290300370300200320032903e0043703d003200341103602e4032003200341d0036a3602e003200d200341e0036a10f7022002101d200c450d702005101d0c700b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200c41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200341f0026a410d6a290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b200341d0036a41026a220c200341e0016a41026a2d00003a000020034190036a41086a220d200341e0036a41086a29030037030020034190036a41106a200341e0036a41106a290300370300200320032f01e0013b01d003200320032903e0033703900320040d78200341d3006a200d290300370000200341d8006a2003419d036a290000370000200320032f01d0033b01402003200536004720032002360043200320032903900337004b2003200c2d00003a0042410e101f2202450d39200241066a41002900b3c541370000200241002900adc5413700002002410e412e101e2202450d3a2002200329034037000e200241266a200341d8006a2903003700002002411e6a200341c0006a41106a290300370000200241166a200341c0006a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341e0036a41086a2005290300370300200320032903e0043703e003200341e0036a411041f8b3c20041004100100221052002101d2005417f460d1541b2f0c1002102411421050c780b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341c0006a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b0140200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b20034198016a41026a220a200341c0006a41026a2d00003a0000200341e0016a41086a220c200341e0036a41086a290300370300200341e0016a41106a200341e0036a41106a290300370300200320032f01403b019801200320032903e0033703e00120040d75200341d3046a200c290300370000200341d8046a200341e0016a410d6a290000370000200320032f0198013b01c004200320053600c704200320023600c304200320032903e0013700cb042003200a2d00003a00c204200341e0036a200341c0046a10f6024101210420032d00e0034101470d0a20034196016a20032d00e3033a0000200341b0036a41086a200341f4036a290200370300200341b0036a410d6a200341f9036a290000370000200320032f00e1033b0194012003200341ec036a2902003703b003200341e0036a41086a28020021054100210420032802e40321020c0b0b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a22092004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200c41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a2009290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220c200341e0016a41026a2d00003a0000200341b0036a41086a2209200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d7f200341d3046a2009290300370000200341c0046a41186a200341bd036a290000370000200320032f0194013b01c004200320053600c704200320023600c304200320032903b0033700cb042003200c2d00003a00c204200341e0036a200341c0046a10c9022003280280042208450d0e200341b0036a41086a2202200341e0036a41346a290200370300200341b0036a41106a2205200341e0036a413c6a290200370300200341b0036a41186a2204200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703b003200341ac046a280200210c200341e0036a41286a2802002109200341e0036a410c6a3502002106200341e0036a41186a290300210720032802e003211320032902e403210f20032903f003210e2003280284042112200341e0016a41186a22162004290300370300200341e0016a41106a22042005290300370300200341e0016a41086a22052002290300370300200320032903b0033703e001200341c0006a41186a2007370300200341c0006a410c6a20063e0200200341c0006a41286a2009360200200341c0006a41246a2012360200200341c0006a41346a2005290300370200200341c0006a413c6a2004290300370200200341c0006a41c4006a20162903003702002003200e3703502003200f37024420032008360260200320133602402003200c36028c01200320032903e00137026c200a450d14200d200a41246c22026a21172002450d18200341f0026a41026a2202200d41036a2d00003a0000200341e0036a41086a220c200d41146a290000370300200341e0036a410d6a2209200d41196a2900003700002003200d2f00013b01f0022003200d29000c3703e003200d41246a2104200d2d000022134102460d19200d2800082118200d2800042105200341e0046a41026a20022d00003a000020034198016a41086a200c29030037030020034198016a410d6a2009290000370000200320032f01f0023b01e004200320032903e0033703980120134101470d24200341b0036a200541067610b00120032802b003210c20032802b8032005413f7122024d0d26200341d0036a41026a200c20024105746a220241026a2d00003a0000200228000321052002280007211820022f000021092003419d036a200241186a29000037000020034198036a200241136a290000370300200320093b01d0032003200229000b370390034101210220032802b403450d740c730b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d6f200341ab016a200c29030037000020034198016a41186a200341bd036a290000370000200320032f0194013b0198012003200536009f012003200236009b01200320032903b0033700a3012003200a2d00003a009a01200341e0036a20034198016a10c9022003280280042202450d06200341b0036a41086a2204200341e0036a41346a290200370300200341b0036a41106a220a200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703b003200341ac046a280200210d200341e0036a41286a280200210b200341e0036a410c6a3502002106200341e0036a41186a290300210720032802e003210920032902e403210f20032903f003210e2003280284042105200341c0006a41186a2208200c290300370300200341c0006a41106a220c200a290300370300200341c0006a41086a220a2004290300370300200320032903b003370340200341e0016a41186a2007370300200341e0016a410c6a20063e0200200341e0016a41286a200b36020020034184026a2005360200200341e0016a41346a200a290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a20082903003702002003200e3703f0012003200f3702e4012003200236028002200320093602e0012003200d3602ac022003200329034037028c02200341e0016a412c6a220410e401200410e5012005450d642002101d0c640b200141086a2903002106200341e0046a41086a22024200370300200342003703e00441e1f0c1004117200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200320063703e003200341d0036a4110200341e0036a410810030c630b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341c0006a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200341f0026a410d6a290000370000200320032f01e0043b0140200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034198016a41026a220a200341c0006a41026a2d00003a0000200341e0016a41086a220c200341e0036a41086a290300370300200341e0016a41106a200341e0036a41106a290300370300200320032f01403b019801200320032903e0033703e00120040d6b200341c3026a200c290300370000200341c8026a200341e0016a410d6a290000370000200320032f0198013b01b002200320053600b702200320023600b302200320032903e0013700bb022003200a2d00003a00b202200341e0036a200341b0026a10f6024101210420032d00e0034101470d03200341d2036a20032d00e3033a000020034190036a41086a200341f4036a29020037030020034190036a410d6a200341f9036a290000370000200320032f00e1033b01d0032003200341ec036a29020037039003200341e0036a41086a28020021054100210420032802e40321020c040b410b210541c6f0c10021020b200341d0036a41026a220a20034194016a41026a2d00003a000020034190036a41086a220c200341b0036a41086a29030037030020034190036a41106a200341b0036a41106a290300370300200320032f0194013b01d003200320032903b0033703900320040d69200341ab016a200c29030037000020034198016a41186a2003419d036a290000370000200320032f01d0033b0198012003200536009f012003200236009b0120032003290390033700a3012003200a2d00003a009a01200341e0036a20034198016a10c9022003280280042205450d00200341b0036a41086a2204200341e0036a41346a290200370300200341b0036a41106a220a200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a29020037030020032003418c046a2902003703b003200341ac046a280200210d200341e0036a41286a280200210b200341e0036a410c6a350200210f200341e0036a41186a290300211020032802e003210920032902e403210e20032903f00321112003280284042102200341c0006a41186a2208200c290300370300200341c0006a41106a220c200a290300370300200341c0006a41086a220a2004290300370300200320032903b003370340200341e0016a41186a2010370300200341e0016a410c6a200f3e0200200341e0016a41286a200b36020020034184026a22042002360200200341e0016a41346a200a290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a2008290300370200200320113703f0012003200e3702e4012003200536028002200320093602e0012003200d3602ac022003200329034037028c02200341106a200341c0046a10eb0102402003290310220f20032903e00122147d2215200f56200341106a41086a290300220e200341e0016a41086a29030022197d200f201454ad7d220f200e56200f200e511b0d00200341e0016a41106a200720152015200756200f200656200f2006511b22021b220720117c220e370300200341f8016a2006200f20021b220620107c200e200754ad7c3703002003200720147c220f3703e0012003200620197c200f200754ad7c3703e80120034198016a200341e0016a108803200428020021020b2002450d5e20034180026a280200101d0c5e0b41d1f0c1002102411021050c680b410b210541c6f0c10021020b20034198016a41026a220a200341d0036a41026a2d00003a0000200341e0016a41086a220c20034190036a41086a290300370300200341e0016a41106a20034190036a41106a290300370300200320032f01d0033b01980120032003290390033703e00120040d66200341e3026a200c290300370000200341e8026a200341e0016a410d6a290000370000200320032f0198013b01d002200320053600d702200320023600d302200320032903e0013700db022003200a2d00003a00d202200341e0046a41026a20034190016a41026a2d00003a000020034198016a41086a200341206a41086a29030037030020034198016a410d6a2202200341206a410d6a290000370000200320032f0190013b01e0042003200329032037039801200941ff01714101470d07200341e0036a200d41067610b00120032802e003210520032802e803200d413f7122024d0d10200341d0036a41026a200520024105746a220241026a2d00003a00002002280003210d2002280007210b20022f000021042003419d036a200241186a29000037000020034198036a200241136a290000370300200320043b01d0032003200229000b370390034101210220032802e403450d560c550b200141086a280200450d77200141046a280200101d0c770b200141086a280200450d76200141046a280200101d0c760b4110210541d1f0c10021024100210c4101210a200b0d710c720b200341e0046a41026a2202200341d0026a41026a2d00003a000020034198016a41086a200341c0046a41086a29030037030020034198016a410d6a2205200341c0046a410d6a290000370000200320032f01d0023b01e004200320032903c00437039801200941ff01714101470d06200341e0036a200a41067610b00120032802e003210520032802e803200a413f7122024d0d0e200341d0036a41026a200520024105746a220241026a2d00003a00002002280003210a2002280007210b20022f000021042003419d036a200241186a29000037000020034198036a200241136a290000370300200320043b01d0032003200229000b370390034101210220032802e403450d4e0c4d0b200341e0016a412c6a220510e501200320063703b803200320073703b0032003200d3602c0034112101f2202450d27200241106a41002f00ddc5413b0000200241086a41002900d5c541370000200241002900cdc541370000200241124132101e2202450d28200220052900003700122002412a6a200541186a290000370000200241226a200541106a2900003700002002411a6a200541086a290000370000200341e0046a41086a220a4200370300200342003703e00420024132200341e0046a1001200341d0036a41086a200a290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d0c200342103702442003200341d0036a360240200341e0036a200341c0006a10eb0220032d00f803220a4102460d2b200341a8036a20034191046a290000370300200341a0036a20034189046a29000037030020034190036a41086a20034181046a2900003703002003413c6a41026a2003419c046a2d00003a0000200341b0026a41086a200341ad046a290000370300200341bd026a200341b2046a290000370000200320032900f9033703900320032003419a046a2f01003b013c2003200341a5046a2900003703b00220034199046a2d0000210d2003419d046a280000210b200341a1046a28000021090c420b200341e8036a280200210420032802e403210a20032802e003210d0b200341d0036a4110200d200410030240200a450d00200d101d0b4101210c02402009450d002008101d0b4100210a0c660b200341d0036a41026a200341e0046a41026a2d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a2002290000370000200320032f01e0043b01d0032003200329039801370390030c4f0b41b2f2c100210241172105410121042012450d690c680b4118101f2204450d252004200f370300200420113703102004200e3703082005450d09200241186a2105200c200d41186c6a41686a21124101210d4101210b03402005210202400340200241086a290300210e2002290300210f2010200241106a2903002211540d0142002006200e7d2007200f54ad7d220e2007200f7d220f200756200e200656200e2006511b22051b21064200200f20051b2107200241186a2202200a470d000c0d0b0b0240200b200d470d00200d41016a2205200d490d66200d410174220b20052005200b491b220bad42187e2219422088a70d662019a722054100480d660240200d450d002004200d41186c2005101e22040d010c270b2005101f2204450d260b200241186a21052004200d41186c6a2208200e3703082008200f37030020082011370310200d41016a210d20122002470d000c0b0b0b200341d0036a41026a20022d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a2005290000370000200320032f01e0043b01d0032003200329039801370390030c480b4100210b0c090b201721040b4100210c4101210241002113410021054100450d5c0c5d0b42e807210f0b024020034188026a280200220220034184026a280200470d00200241016a22052002490d5f20024101742204200520052004491b2204ad42187e2210422088a70d5f2010a7220a4100480d5f2002450d0720034180026a280200200241186c200a101e2205450d080c3f0b20034180026a28020021050c3f0b4100210220032802e4030d440c450b200341e0046a41086a220a4200370300200342003703e00441c8d8c100411a200341e0046a1001200341d0036a41086a220c200a290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d07200341f8036a4200370300200341e0036a41106a4200370300200341e0036a41086a4200370300200342003703e003200341d0036a4110200341e0036a412041001002220a417f460d1f200a411f4d0d1f200341e0046a41026a220d20032d00e2033a0000200341f0026a41086a220a200341f3036a290000370300200341f0026a410d6a220c200341f8036a290000370000200320032f01e0033b01e004200320032900eb033703f00220032800e303210b20032800e703210920034190016a41026a2208200d2d00003a0000200341d0026a41086a220d200a290300370300200341d0026a410d6a2212200c290000370000200320032f01e0043b019001200320032903f0023703d00220034194016a41026a20082d00003a0000200a200d290300370300200c2012290000370000200320032f0190013b019401200320032903d0023703f0024112101f220a450d20200a41106a41002f00ddc5413b0000200a41086a41002900d5c541370000200a41002900cdc541370000200a41124132101e220a450d21200a20032f0194013b0012200a2009360019200a200b360015200a20032903f00237001d200a41146a20034194016a41026a2d00003a0000200a41256a200341f0026a41086a290300370000200a412a6a200341fd026a290000370000200341e0046a41086a220c4200370300200342003703e004200a4132200341e0046a1001200341d0036a41086a200c290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d222003421037029c012003200341d0036a36029801200341e0036a20034198016a10eb0220032d00f803220c4102460d23200341e0036a41086a290300210620032802f003210d20032903e0032107200341c0006a200341f9036a41c70010ce031a20034198016a200341c0006a41c10010ce031a2003200c3a00e003200341e0036a41017220034198016a41c10010ce031a200341dc006a20034182046a410020032d0081044101461b3602002003200637034820032007370340200320053602582003200d360250200341e0046a41086a220c4200370300200342003703e004200a4132200341e0046a1001200341d0036a41086a200c290300370300200320032903e0043703d003200341003602a0012003420137039801200341d0006a20034198016a10622003200341c0006a360220200341206a20034198016a10f302200328029c01210c20032802a001210d20032802582213450d09200c200d470d0a200d41016a220c200d490d5c200d4101742208200c200c2008491b220c4100480d5c200d450d0c200328029801200d200c101e2208450d0d0c270b4100210220032802e4030d3e0c3f0b4101210d4101210b0b2009450d00200c101d0b200341e0036a41186a201437030020034188046a200d36020020034184046a2202200b360200200341a4046a20034190036a41186a2903003702002003419c046a200341a0036a29030037020020034194046a20034198036a290300370200200320153703f003200320073703e003200320032903900337028c042003200436028004200320063703e803200341e0016a200341e0036a1088032002280200450d4520034180046a280200101d0c450b200a101f22050d370b200a41081020000b200341d0036a41026a200341e0046a41026a2d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a20034198016a410d6a290000370000200320032f01e0043b01d0032003200329039801370390030c500b200a4200370300200342003703e00441c8d8c100411a200341e0046a1001200c200a290300370300200320032903e0043703d0034120101f220a450d1c200a2005290000370000200a41186a200541186a290000370000200a41106a200541106a290000370000200a41086a200541086a290000370000200341d0036a4110200a41201003200a101d4100210d0c2c0b4100210220032802b4030d4c0c4d0b200c200d470d01200d41016a220c200d490d52200d4101742208200c200c2008491b220c4100480d52200d450d04200328029801200d200c101e2208450d050c1b0b20032802980121080c1d0b20032802980121080c1a0b200c101f22080d1a0b200c41011020000b200c101f22080d160b200c41011020000b200341f4036a4101360200200341183602e401200341c0adc4003602e001200342013702e403200341c8adc4003602e0032003200341e0016a3602f003200341e0036a41f882c40010cf01000b200b41011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b410e41011020000b412e41011020000b410d41011020000b412d41011020000b41df88c0004133103a000b411241011020000b413241011020000b200541081020000b411841081020000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b413241011020000b4193f1c100419f01103a000b41df88c0004133103a000b412041011020000b2003200c36029c0120032008360298010b200341a0016a200d41016a22123602002008200d6a41003a0000200341dc006a280200220d0d020c030b2003200c36029c0120032008360298010b20034198016a41086a2216200d41016a3602002008200d6a41013a000002400240024002400240200328029c0122122016280200220d6b411f4b0d00200d41206a220c200d490d3820124101742218200c200c2018491b220c4100480d382012450d0120082012200c101e2208450d020c030b2012210c0c030b200c101f22080d010b200c41011020000b2003200c36029c0120032008360298010b2016200d41206a22123602002008200d6a220d41086a201341086a290000370000200d41106a201341106a290000370000200d41186a201341186a290000370000200d2013290000370000200341dc006a280200220d450d010b200c2012470d08200c41016a2213200c490d32200c4101742216201320132016491b22134100480d32200c450d012008200c2013101e2208450d020c070b200c2012470d05200c41016a220d200c490d31200c4101742213200d200d2013491b220d4100480d31200c450d022008200c200d101e2208450d030c040b2013101f22080d050b201341011020000b200d101f22080d010b200d41011020000b2003200d36029c0120032008360298010b200341a0016a220c201241016a360200200820126a41003a0000200c2802002113200328029c012108200328029801210c0c020b2003201336029c0120032008360298010b200341a0016a220c201241016a360200200820126a41013a000002400240024002400240200328029c012208200c28020022126b41204f0d00201241206a220c2012490d2e20084101742213200c200c2013491b22134100480d2e2008450d0120032802980120082013101e220c450d020c030b200328029801210c0c030b2013101f220c0d010b201341011020000b2003201336029c012003200c36029801201321080b20034198016a41086a201241206a2213360200200c20126a221241086a200d41086a290000370000201241106a200d41106a290000370000201241186a200d41186a2900003700002012200d2900003700000b200341d0036a4110200c2013100302402008450d00200c101d0b200a101d200341e0046a41086a220a4200370300200342003703e00441c8d8c100411a200341e0046a1001200341d0036a41086a200a290300370300200320032903e0043703d0034120101f220a450d02200a2005290000370000200a41186a200541186a290000370000200a41106a200541106a290000370000200a41086a200541086a290000370000200341d0036a4110200a41201003200a101d2003413c6a41026a20034194016a41026a2d00003a0000200341b0026a41086a200341f0026a41086a290300370300200341b0026a410d6a200341f0026a410d6a290000370000200320032f0194013b013c200320032903f0023703b0024101210d0b4100210a0b200341e0036a41186a20034190036a41186a290300370300200341e0036a41106a20034190036a41106a290300370300200341e0036a41086a20034190036a41086a290300370300200341d0026a41026a2003413c6a41026a2d00003a0000200341c0006a41086a200341b0026a41086a290300370300200341c0006a410d6a200341b0026a410d6a29000037000020032003290390033703e003200320032f013c3b01d002200320032903b002370340200341e0046a41086a22054200370300200342003703e00420024132200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200341003602a0012003420137039801200420034198016a10622003200341b0036a3602f002200341f0026a20034198016a10f302200328029c01210520032802a00121040240024002400240024002400240200a4101470d0020052004470d01200441016a22052004490d2d2004410174220a20052005200a491b22054100480d2d2004450d0320032802980120042005101e220a450d040c0a0b20052004470d01200441016a22052004490d2c2004410174220a20052005200a491b22054100480d2c2004450d0420032802980120042005101e220a450d050c070b200328029801210a0c090b200328029801210a0c060b2005101f220a0d060b200541011020000b2005101f220a0d020b200541011020000b412041011020000b2003200536029c012003200a360298010b200341a0016a200441016a220c360200200a20046a41003a00000c020b2003200536029c012003200a360298010b20034198016a41086a2208200441016a360200200a20046a41013a000002400240024002400240200328029c01220c200828020022046b411f4b0d00200441206a22052004490d26200c4101742212200520052012491b22054100480d26200c450d01200a200c2005101e220a450d020c030b200c21050c030b2005101f220a0d010b200541011020000b2003200536029c012003200a360298010b2008200441206a220c360200200a20046a220441086a200341e0036a41086a290300370000200441106a200341e0036a41106a290300370000200441186a200341e0036a41186a290300370000200420032903e0033700000b0240024002400240024002400240024002400240200d41ff01714101470d002005200c470d08200541016a22042005490d2a2005410174220d20042004200d491b22044100480d2a2005450d01200a20052004101e220a450d020c070b2005200c470d05200541016a22042005490d292005410174220d20042004200d491b22044100480d292005450d02200a20052004101e220a450d030c040b2004101f220a0d050b200441011020000b2004101f220a0d010b200441011020000b2003200436029c012003200a360298010b200341a0016a2205200c41016a360200200a200c6a41003a00002005280200210c200328029c01210a20032802980121040c020b2003200436029c012003200a360298010b200341a0016a2205200c41016a360200200a200c6a41013a000002400240024002400240200328029c01220a200528020022056b41204f0d00200541206a22042005490d26200a410174220c20042004200c491b220c4100480d26200a450d01200328029801200a200c101e2204450d020c030b20032802980121040c030b200c101f22040d010b200c41011020000b2003200c36029c012003200436029801200c210a0b20034198016a41086a200541206a220c360200200341d0026a41026a2d0000210d20032f01d0022108200420056a220520093600072005200b360003200541026a200d3a0000200520083b0000200541186a200341cd006a290000370000200541136a200341c0006a41086a2903003700002005200329034037000b0b200341d0036a41102004200c10030240200a450d002004101d0b2002101d20034184026a280200450d0d20034180026a280200101d0c0d0b20034184026a200436020020034180026a200536020020034188026a28020021020b2005200241186c6a220220063703082002200e3703002002200f20077c37031020034188026a2202200228020041016a36020020034198016a200341e0016a10880320034184026a28020021020b2002450d0a20034180026a280200101d0c0a0b2005101d0b20020d004101210241d7c0c100210a4115210b0c010b20034198016a41026a200341d0036a41026a2d00003a0000200341e0036a41086a20034190036a41086a290300370300200341e0036a410d6a20034190036a410d6a290000370000200320032f01d0033b01980120032003290390033703e003410021020b20034194016a41026a220520034198016a41026a2d00003a0000200341b0036a41086a2204200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f0198013b019401200320032903e0033703b00302402002450d00200b2105200a21020c120b200341f3016a2004290300370000200341f8016a200341bd036a290000370000200320032f0194013b01e0012003200b3600e7012003200a3600e301200320032903b0033700eb01200320052d00003a00e2010240024002400240024002400240410e101f2202450d00200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d01200220032903e00137000e200241266a200341e0016a41186a22042903003700002002411e6a200341e0016a41106a220a290300370000200241166a200341e0016a41086a220c290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341e0036a41086a220d2005290300370300200320032903e0043703e003200341e0036a411041f8b3c20041004100100221052002101d2005417f470d0b200341e0036a41186a2004290300370300200341e0036a41106a200a290300370300200d200c290300370300200320032903e0013703e003410e101f2202450d02200241066a41002900b3c541370000200241002900adc5413700002002410e412e101e2202450d032002200329034037000e200241266a200341c0006a41186a2903003700002002411e6a200341c0006a41106a290300370000200241166a200341c0006a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d0034120101f2205450d04200520032903e003370000200541186a200341e0036a41186a290300370000200541106a200341e0036a41106a290300370000200541086a200341e0036a41086a290300370000200341d0036a41102005412010032005101d2002101d410d101f2202450d05200241056a41002900e1ee41370000200241002900dcee413700002002410d412d101e2202450d062002200329034037000d200241256a200341c0006a41186a22052903003700002002411d6a200341c0006a41106a2204290300370000200241156a200341c0006a41086a220a290300370000200341e0046a41086a220c4200370300200342003703e0042002412d200341e0046a1001200341d0036a41086a200c290300370300200320032903e0043703d003200341103602e4032003200341d0036a3602e0032008200341e0036a10f7022002101d2003200341c0006a10eb01200341086a290300210f2003290300210e20034188046a4100360200200341e0036a41186a200f2006200e200754200f200654200f2006511b22021b2206370300200341a4046a20052903003702002003419c046a200429030037020020034194046a200a29030037020020034208370380042003200e200720021b22073703f003200320063703e803200320073703e0032003200329034037028c04200341e0016a200341e0036a10880320034184046a280200450d0d20034180046a280200101d0c0d0b410e41011020000b412e41011020000b410e41011020000b412e41011020000b412041011020000b410d41011020000b412d41011020000b2005101d0b20020d004101210241d7c0c100210d4115210b0c010b200341e0016a41026a200341d0036a41026a2d00003a0000200341e0036a41086a20034190036a41086a290300370300200341e0036a410d6a20034190036a410d6a290000370000200320032f01d0033b01e00120032003290390033703e003410021020b20034194016a41026a2205200341e0016a41026a2d00003a0000200341b0036a41086a2204200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00302402002450d004101210a4101210c200b2105200d210220012d00002204410f4d0d1e0c1f0b20034183036a200429030037000020034188036a200341bd036a290000370000200320032f0194013b01f0022003200b3600f7022003200d3600f302200320032903b0033700fb02200320052d00003a00f202410e101f2202450d03200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d04200220032903f00237000e200241266a20034188036a2903003700002002411e6a200341f0026a41106a290300370000200241166a200341f0026a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341e0036a41086a2005290300370300200320032903e0043703e003200341e0036a411041f8b3c20041004100100221052002101d2005417f470d00200341f0026a200341d0026a412010d003450d02410e101f2202450d05200241066a41002900b3c541370000200241002900adc5413700002002410e412e101e2202450d06200220032903b00237000e200241266a200341b0026a41186a2903003700002002411e6a200341b0026a41106a290300370000200241166a200341b0026a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d0034120101f2205450d07200520032903f002370000200541186a200341f0026a41186a290300370000200541106a200341f0026a41106a290300370000200541086a200341f0026a41086a290300370000200341d0036a41102005412010032005101d2002101d410e101f2202450d0841002105200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d09200220032903d00237000e200241266a200341d0026a41186a2903003700002002411e6a200341d0026a41106a290300370000200241166a200341d0026a41086a290300370000200341e0046a41086a22044200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2004290300370300200320032903e0043703d0030240200341d0036a411041f8b3c200410041001002417f460d00200342103702e4042003200341d0036a3602e004200341e0036a200341e0046a10fc022003280280042205450d0b200341c0046a41186a200341e0036a41186a290300370300200341c0046a41106a200341e0036a41106a290300370300200341c0046a41086a200341e0036a41086a290300370300200341e0016a41086a2003418c046a290200370300200341e0016a41106a20034194046a290200370300200341e0016a41186a2003419c046a29020037030020034180026a200341a4046a29020037030020034188026a200341ac046a280200360200200320032903e0033703c00420032003290284043703e001200341d0036a411010090b200341b0036a41186a200341c0046a41186a290300370300200341b0036a41106a200341c0046a41106a290300370300200341b0036a41086a200341c0046a41086a290300370300200341c0006a41086a200341e0016a41086a290300370300200341c0006a41106a200341e0016a41106a290300370300200341c0006a41186a200341e0016a41186a290300370300200341c0006a41206a2204200341e0016a41206a290300370300200341c0006a41286a220a200341e0016a41286a280200360200200320032903c0043703b003200320032903e0013703402005450d0120034190036a41186a220c200341b0036a41186a29030037030020034190036a41106a220d200341b0036a41106a29030037030020034190036a41086a220b200341b0036a41086a29030037030020034198016a41086a2209200341c0006a41086a29030037030020034198016a41106a2208200341c0006a41106a29030037030020034198016a41186a2212200341c0006a41186a29030037030020034198016a41206a2213200429030037030020034198016a41286a2204200a280200360200200320032903b0033703900320032003290340370398012002101d200341e0036a41186a200c290300370300200341e0036a41106a200d290300370300200341e0036a41086a200b29030037030020034184046a2003290398013702002003418c046a200929030037020020034194046a20082903003702002003419c046a2012290300370200200341a4046a2013290300370200200341ac046a2004280200360200200320053602800420032003290390033703e003410e101f2202450d0b200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d0c200220032903f00237000e200241266a20034188036a2903003700002002411e6a200341f0026a41106a290300370000200241166a200341f0026a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200341103602e4012003200341d0036a3602e001200341e0036a200341e0016a10f8022002101d20034184046a280200450d0220034180046a280200101d0c020b4199f0c1002102411921050c0c0b2002101d0b410021024101210a4101210c0c190b410e41011020000b412e41011020000b410e41011020000b412e41011020000b412041011020000b410e41011020000b412e41011020000b41df88c0004133103a000b410e41011020000b412e41011020000b4101210a4101210c20012d00002204410f4d0d0f0c100b200c101d0b20020d0041d7c0c100210c41012102410021134100210541d7c0c1000d020c010b200341d0026a41026a220c200341d0036a41026a2d00003a0000200341e0016a41086a220920034190036a41086a290300370300200341e0016a410d6a221320034190036a410d6a290000370000200320032f01d0033b01d00220032003290390033703e00102400240024002404120101f2202450d00200220032f01d0023b00002002201836000720022005360003200220032903e00137000b200241026a200c2d00003a0000200241136a2009290300370000200241186a20132900003700000240024020172004460d00200341f0026a41026a2205200d41276a2d00003a0000200341e0036a41086a220c200d41386a290000370300200341e0036a410d6a2209200d413d6a2900003700002003200d2f00253b01f0022003200d2900303703e003200d41c8006a2104200d41246a2d000022134102470d014100210c410121134101210541000d070c060b201721044100210c410121134101210541000d060c050b200d28002c211b200d2800282116200341e0046a41026a20052d00003a000020034198016a41086a200c29030037030020034198016a410d6a2009290000370000200320032f01f0023b01e004200320032903e003370398010240024020134101470d00200341b0036a201641067610b00120032802b003210c20032802b8032016413f7122054d0d01200341d0036a41026a200c20054105746a220541026a2d00003a0000200528000321162005280007211b20052f000021092003419d036a200541186a29000037000020034198036a200541136a290000370300200320093b01d0032003200529000b370390034101210520032802b403450d040c030b200341d0036a41026a200341e0046a41026a2d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a20034198016a410d6a290000370000200320032f01e0043b01d0032003200329039801370390030c040b410021052018211b20032802b4030d010c020b412041011020000b200c101d0b20050d0041d7c0c100210c410121134101210541d7c0c1000d020c010b200341d0026a41026a221c200341d0036a41026a221d2d00003a0000200341e0016a41086a221e20034190036a41086a221f290300370300200341e0016a410d6a222020034190036a410d6a2221290000370000200320032f01d0033b01d00220032003290390033703e001200a41246c41b87f6a2122200341eb036a211a200341e7036a2123200341e3036a21244102212541202118410221134100210941012105024002400240024003402023201b36000020242016360000201a20032903e001370000200341e0036a41026a201c2d00003a0000201a41086a201e290300370000201a410d6a2020290000370000200320032f01d0023b01e00302402013417f6a2005470d002025201320132025491b2205ad4205862206422088a70d0a2006a7220c4100480d0a20022018200c101e2202450d050b200220186a220c20032901e003370000200c41186a200341e0036a41186a290100370000200c41106a200341e0036a41106a290100370000200c41086a200341e0036a41086a2226290100370000200941f803460d02024020222009460d00200341f0026a41026a2227200d20096a220c41cb006a2d00003a00002026200c41dc006a290000370300200341e0036a410d6a2228200c41e1006a2900003700002003200c41c9006a2f00003b01f0022003200c41d4006a2900003703e003200c41c8006a2d000022294102460d02200c41d0006a280000212a200c41cc006a2800002116200341e0046a41026a222b20272d00003a000020034198016a41086a2227202629030037030020034198016a410d6a22262028290000370000200320032f01f0023b01e004200320032903e003370398010240024020294101470d00200341b0036a201641067610b0012016413f7121264100212720032802b00321280240200341b0036a41086a28020020264d0d00201d202820264105746a222641026a2d00003a0000202628000321162026280007211b20262f000021272021202641186a290000370000201f202641136a290000370300200320273b01d0032003202629000b37039003410121270b024020032802b403450d002028101d0b20270d010c060b201d202b2d00003a0000201f202729030037030020212026290000370000200320032f01e0043b01d003200320032903980137039003202a211b0b200441246a2104201c201d2d00003a0000201e201f29030037030020202021290000370000200320032f01d0033b01d00220032003290390033703e001202541026a2125201841206a2118201341016a2113200941246a21090c010b0b201721044100210c41000d050c040b200c41ec006a21040b4100210c41000d030c020b200c41ec006a210441d7c0c100210c41d7c0c1000d020c010b200c41011020000b410021160c010b4101211602402005450d002002101d0b200c2102411521050b200341c0006a412c6a2109200d200a41246c6a210c02400340200c2004460d0120042d0000210a200441246a2104200a4102470d000b0b0240200b450d00200d101d0b02402016450d004100210420120d050c060b200910e40120032013360228200320053602242003200236022002400240024002400240024002400240024002404112101f2202450d00200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e2208450d01200820092900003700122008412a6a200941186a290000370000200841226a200941106a2900003700002008411a6a200941086a290000370000200341e0046a41086a22024200370300200342003703e00420084132200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200341e0016a200341d0036a105d0240024002400240024020032d00ec0122024102470d00200341e0046a41086a22024200370300200342003703e00441adeec100411a200341e0046a1001200341d0036a41086a22052002290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d01200341f8036a4200370300200341e0036a41106a4200370300200341e0036a41086a4200370300200342003703e003200341d0036a4110200341e0036a4120410010022202417f460d072002411f4d0d07200341e0046a41026a220220032d00e2033a0000200341f0026a41086a2205200341f3036a290000370300200341f0026a410d6a2204200341f8036a290000370000200320032f01e0033b01e004200320032900eb033703f00220032800e303211320032800e703211620034190016a41026a220a20022d00003a0000200341d0026a41086a22022005290300370300200341d0026a410d6a22052004290000370000200320032f01e0043b019001200320032903f0023703d00220034194016a41026a200a2d00003a0000200341b0036a41086a2002290300370300200341b0036a410d6a2005290000370000200320032f0190013b019401200320032903d0023703b0034112101f2202450d08200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e2212450d09201220032f0194013b00122012201636001920122013360015201220032903b00337001d201241146a20034194016a41026a2d00003a0000201241256a200341b0036a41086a2903003700002012412a6a200341bd036a290000370000200341e0046a41086a22024200370300200342003703e00420124132200341e0046a1001200341d0036a41086a22052002290300370300200320032903e0043703d003200341e0036a200341d0036a105d20032d00ec034102460d0a20032802e403211720032802e003211820032802e803210420034198016a200341ec036a41c20010ce031a200341e0036a20034198016a41c20010ce031a20032d008104211a20024200370300200342003703e00420124132200341e0046a100120052002290300370300200320032903e0043703d0032003420137039801200341003602a001200320043602f002200341f0026a20034198016a106220032802a00121052004450d022004410574210b410020056b2104200328029c01210a2018210203400240024002400240200a20046a41204f0d00200541206a220c2005490d15200a410174220d200c200c200d491b220d4100480d15200a450d01200328029801200a200d101e220c0d020c090b200328029801210c0c020b200d101f220c450d070b2003200d36029c012003200c36029801200d210a0b20034198016a41086a200541206a220d360200200c20056a220541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a29000037000020052002290000370000200441606a2104200d2105200241206a2102200b41606a220b0d000c040b0b20034190036a41086a200341f5016a290000370300200341a0036a200341fd016a29000037030020034190036a41186a20034185026a2900003703002003413c6a41026a20034190026a2d00003a00002003200341e0016a410d6a2900003703900320032003418e026a2f01003b013c2003418d026a2d0000210520034191026a280000211320034195026a280000211620032802e401210420032802e001210a200341b0026a410d6a200341a6026a290000370000200341b0026a41086a200341a1026a290000370300200320034199026a2900003703b0022004450d0d200a101d0c0d0b20024200370300200342003703e00441adeec100411a200341e0046a100120052002290300370300200320032903e0043703d0034120101f2202450d0920022009290000370000200241186a200941186a290000370000200241106a200941106a290000370000200241086a200941086a290000370000200341d0036a41102002412010032002101d41002105410021020c0c0b2005210d0b024002400240200328029c01200d470d00200d41016a2202200d490d0f200d4101742205200220022005491b22054100480d0f200d450d01200328029801200d2005101e2202450d020c0b0b20032802980121020c0b0b2005101f22020d090b200541011020000b200d41011020000b411241011020000b413241011020000b41df88c0004133103a000b411241011020000b413241011020000b4193f1c100419f01103a000b412041011020000b2003200536029c0120032002360298010b20034198016a41086a220a200d41016a3602002002200d6a41013a000002400240024002400240200328029c01220c200a28020022046b411f4b0d00200441206a22052004490d07200c410174220d20052005200d491b22054100480d07200c450d012002200c2005101e2202450d020c030b200c21050c030b2005101f22020d010b200541011020000b2003200536029c0120032002360298010b200a200441206a220d360200200220046a220a41086a200941086a290000370000200a41106a200941106a290000370000200a41186a200941186a290000370000200a200929000037000002400240024002400240024002400240024002400240024020034182046a4100201a4101461b220a450d002005200d470d01200541016a220c2005490d0e2005410174220b200c200c200b491b220c4100480d0e2005450d0320022005200c101e2202450d040c090b2005200d470d01200541016a220a2005490d0d2005410174220c200a200a200c491b220b4100480d0d2005450d0420022005200b101e2202450d050c060b2005210c0c080b2005210b0c050b200c101f22020d050b200c41011020000b200b101f22020d010b200b41011020000b2003200b36029c0120032002360298010b200341a0016a200441216a22043602002002200d6a41003a00000c020b2003200c36029c0120032002360298010b20034198016a41086a221a200441216a22053602002002200d6a41013a000002400240024002400240200c20056b411f4b0d00200541206a220d2005490d08200c410174220b200d200d200b491b220b4100480d08200c450d012002200c200b101e2202450d020c030b200c210b0c030b200b101f22020d010b200b41011020000b2003200b36029c0120032002360298010b201a200441c1006a2204360200200220056a220541086a200a41086a290000370000200541106a200a41106a290000370000200541186a200a41186a2900003700002005200a2900003700000b200341d0036a41102002200410030240200b450d002002101d0b02402017450d002018101d0b2012101d200341e0046a41086a22024200370300200342003703e00441adeec100411a200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d0034120101f2202450d0420022009290000370000200241186a200941186a290000370000200241106a200941106a290000370000200241086a200941086a290000370000200341d0036a41102002412010032002101d2003413c6a41026a20034194016a41026a2d00003a0000200341b0026a41086a200341b0036a41086a290300370300200341b0026a410d6a200341b0036a410d6a290000370000200320032f0194013b013c200320032903b0033703b00241012105410021020b20034185046a20053a00002003418d046a201636000020034189046a2013360000200341e0036a410d6a20034190036a41086a290300370000200341f5036a20034190036a41106a290300370000200341fd036a20034190036a41186a29030037000020034186046a20032f013c3b010020034188046a2003413e6a2d00003a000020034191046a20032903b00237000020034199046a200341b0026a41086a2903003700002003419e046a200341b0026a410d6a290000370000200320023a00e40320032003290390033700e5032003200341206a3602e003200341e0046a41086a22024200370300200342003703e00420084132200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200341003602e801200342013703e001200328022021022003200341206a41086a28020022053602980120034198016a200341e0016a106202402005450d002005410574210d4100200341e0016a41086a28020022056b210a20032802e001210b20032802e401210c03400240200c200a6a411f4b0d00200541206a22042005490d04200c4101742209200420042009491b22044100480d0402400240200c450d00200b200c2004101e220b0d010c070b2004101f220b450d060b2004210c0b200b20056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200a41606a210a200541206a2105200241206a2102200d41606a220d0d000b200341e8016a20053602002003200c3602e4012003200b3602e0010b200341e0036a410472200341e0016a10ca0120032802e4012102200341d0036a411020032802e0012205200341e0016a41086a280200100302402002450d002005101d0b2008101d02402003280224450d002003280220101d0b0240200341e4006a280200450d00200341e0006a280200101d0b4100210c4101210a0b4100210220012d00002204410f4d0d080c090b1021000b200441011020000b412041011020000b2008101d0b20040d004100210c4101210a20012d00002204410f4d0d030c040b4100210c4101210a200b450d010b200d101d20012d00002204410f4d0d010c020b20012d00002204410f4b0d010b410120047441beff01710d01024020044106460d002004410f470d01200a450d02200141086a280200450d02200141046a280200101d0c020b200c450d01200141086a280200450d01200141046a280200101d0c010b200141086a280200450d00200141046a280200101d0b2000200536020420002002360200200341f0046a24000b130020004102360204200041c8afc4003602000b130020004100360204200041f8b3c2003602000b130020004101360204200041a4d9c3003602000b13002000410336020420004188f4c2003602000b130020004101360204200041d4c1c3003602000b13002000410336020420004190ddc3003602000b13002000410936020420004194d9c2003602000b130020004104360204200041b08cc3003602000b130020004102360204200041e8aac3003602000b130020004105360204200041cca4c4003602000b13002000410136020420004180acc3003602000b13002000410536020420004198c2c3003602000b130020004108360204200041e8f5c1003602000b130020004111360204200041c894c4003602000b130020004104360204200041e08fc4003602000b130020004106360204200041d08cc4003602000b130020004102360204200041b4adc3003602000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242003700000f0b410841011020000bd40101017f024002400240024002404104101f2202450d002002410036000020024104410c101e2202450d01200242013700042002410c4118101e2202450d022002420137000c200241184130101e2202450d03200242013700242002420137001c200242013700142002413041e000101e2202450d042002428080848080023700442002420137003c200242013700342002420137002c200042e0808080c009370204200020023602000f0b410441011020000b410c41011020000b411841011020000b413041011020000b41e00041011020000b3401017f02404108101f2202450d0020004288808080800137020420002002360200200242c0843d3700000f0b410841011020000b3301017f02404104101f2202450d0020004284808080c00037020420002002360200200241e4003600000f0b410441011020000b3301017f02404108101f2202450d0020004288808080800137020420002002360200200242af013700000f0b410841011020000b3301017f02404108101f2202450d002000428880808080013702042000200236020020024287013700000f0b410841011020000b3901017f02404110101f2202450d002002420037000820024215370000200042908080808002370204200020023602000f0b411041011020000bb50806047f017e017f017e017f077e230041106b22022400200241003602082001410020012802002001280204200241086a41042001280208100222032003417f461b2203410420034104491b20012802086a220436020802400240200341034d0d00200228020821054200210620024200370308200141086a220741002001280200200141046a280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d01200229030821084200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210a4200210620024200370308200141086a2207410020012802002009280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210b4200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210c4200210620024200370308200141086a2207410020012802002009280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210d4200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210e4200210620024200370308200141086a2207410020012802002009280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210f4200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d01200229030821102009280200210320024100360208200141086a2207410020012802002003200241086a41042004100222032003417f461b2203410420034104491b20072802006a2204360200200341034d0d0120022802082109200141046a2802002103200241003602082007410020012802002003200241086a41042004100222012001417f461b2201410420014104491b20072802006a360200200141034d0d01200041d0006a2002280208360200200041cc006a2009360200200041c8006a2005360200200041c0006a2010370300200041386a200f370300200041306a200e370300200041286a200d370300200041206a200c370300200041186a200b370300200041106a200a37030020002008370308420121060c010b420021060b20002006370300200241106a24000be80102037f017e230041206b22012400200141106a41086a220242003703002001420037031041e0f2c1004111200141106a1001200141086a220320022903003703002001200129031037030042002104024002402001411041f8b3c200410041001002417f460d002001420037031020014110200141106a41084100100241016a41084d0d01200129031021040b200242003703002001420037031041e0f2c1004111200141106a100120032002290300370300200120012903103703002001200420007c37031020014110200141106a41081003200141206a24000f0b41df88c0004133103a000be94902107f037e23004190046b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022044101460d0020044102470d11200141216a2d00002105200141246a2802002106200341306a200141196a290000370300200341286a200141116a290000370300200341186a41086a200141096a29000037030020032001290001370318200241096a2800002107200241056a280000210820022d0001210920022d0000210a20034180046a41026a200241046a2d00003a0000200341b0026a41086a220b200241156a290000370300200341b0026a410d6a220c2002411a6a2900003700002003200241026a2f01003b01800420032002410d6a2900003703b002200a450d01410121020c020b200141086a2802002104200141046a2802002106200241096a2800002107200241056a280000210820022d0001210a20022d0000210120034180046a41026a2209200241046a2d00003a0000200341b0026a41086a220b200241156a290000370300200341b0026a410d6a220c2002411a6a2900003700002003200241026a2f01003b01800420032002410d6a2900003703b0022001450d03410121020c040b200341c0006a41026a220a20034180046a41026a2d00003a0000200341d0016a41086a200b290300370300200341d0016a410d6a200c290000370000200320032f0180043b0140200320032903b0023703d00141012102200941ff01714101470d00200341f0006a41026a200a2d00003a0000200341b0026a41086a200341d0016a41086a290300370300200341b0026a410d6a200341d0016a410d6a290000370000200320032f01403b0170200320032903d0013703b002410021020c010b41f1b4c0002108412a21070b2003413c6a41026a220a200341f0006a41026a2d00003a0000200341a0036a41086a2209200341b0026a41086a290300370300200341a0036a41106a200341b0026a41106a290300370300200320032f01703b013c200320032903b0023703a00320020d23200341e3006a2009290300370000200341e8006a200341ad036a290000370000200320032f013c3b01502003200736005720032008360053200320032903a00337005b2003200a2d00003a0052200341d0006a10cd02450d034115101f2202450d0e2002410d6a410029008b9c42370000200241086a41002900869c42370000200241002900fe9b42370000200241154135101e2202450d0f200220032903183700152002412d6a200341306a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a29030037000020034180046a41086a2207420037030020034200370380042002413520034180046a1001200341c0006a41086a20072903003703002003200329038004370340200341c0006a411041f8b3c200410041001002417f460d062003200341c0006a3602d001200341103602d401200341003602b00220034100200341c0006a4110200341b0026a41044100100222072007417f461b22074104200741044922081b22073602d80120080d1320032802b002210d200341003602b002200341d8016a4100200341c0006a4110200341b0026a41042007100222082008417f461b2208410420084104491b20076a360200200841034d0d1320032802b002210e200341a0036a200341d0016a105e20032802a003220f450d13200341a0036a41086a280200210920032802a4032110200341b0026a200341d0016a105e20032802b0022211450d12200341b0026a41086a280200210b20032802b40221122002101d2006200d470d08200f20094105746a210a200f2102410021080340200a20026b41ff004d0d0b200341d0006a2002460d0c20082002200341d0006a412010d00322074100476a21082007450d0c200241206a2207200341d0006a460d0c20082007200341d0006a412010d00322074100476a21082007450d0c200241c0006a2207200341d0006a460d0c20082007200341d0006a412010d00322074100476a21082007450d0c200241e0006a2207200341d0006a460d0c20024180016a210220082007200341d0006a412010d00322074100476a210820070d000c0c0b0b200341c0006a41026a20092d00003a0000200341d0016a41086a200b290300370300200341d0016a410d6a200c290000370000200320032f0180043b0140200320032903b0023703d00141012102200a41ff01714101470d00200341d0006a41026a200341c0006a41026a2d00003a0000200341b0026a41086a200341d0016a41086a290300370300200341b0026a410d6a200341d0016a410d6a290000370000200320032f01403b0150200320032903d0013703b002410021020c010b41f1b4c0002108412a21070b2003413c6a41026a2201200341d0006a41026a2d00003a0000200341a0036a41086a220a200341b0026a41086a290300370300200341a0036a41106a200341b0026a41106a290300370300200320032f01503b013c200320032903b0023703a00320020d0220034183016a200a290300370000200341f0006a41186a200341ad036a290000370000200320032f013c3b01702003200736007720032008360073200320032903a00337007b200320012d00003a0072200341f0006a10cd02450d01200341003602b802200342013703b0022004200341b0026a10b20120032802b402210820032802b802210a20032802b0022107200341b0026a41186a22094200370300200341b0026a41106a22024200370300200341b0026a41086a22014200370300200342003703b0022007200a200341b0026a1000200341d0016a41186a2009290300370300200341d0016a41106a220a2002290300370300200341d0016a41086a22092001290300370300200320032903b0023703d00102402008450d002007101d0b200341b0026a41186a200341d0016a41186a2903003703002002200a29030037030020012009290300370300200320032903d0013703b0024119101f2202450d0d200241186a41002d00939b423a0000200241106a410029008b9b42370000200241086a41002900839b42370000200241002900fb9a42370000200241194139101e2202450d0e200220032903b002370019200241316a200341c8026a290300370000200241296a200341b0026a41106a290300370000200241216a200341b0026a41086a29030037000020034180046a41086a2201420037030020034200370380042002413920034180046a1001200341a0036a41086a200129030037030020032003290380043703a003200341a0036a411041f8b3c20041004100100221012002101d2001417f460d0441949bc2002108411f21070c020b41939cc20021084114210720044101460d200c210b41b39bc2002108411721070b2004103c2004101d0c1f0b2002101d41a79cc20021084113210720044101460d1d0c1e0b200641014b0d01200341b0026a200441e00010ce031a200341013a00a003200341013602a403200341086a200341b0026a200341a0036a108a01200341d5026a2003280208453a0000200341c5026a200341e0016a290300370000200341cd026a200341e8016a290300370000200341083a00b002200341bd026a200341d0016a41086a290300370000200341043a00b402200320032903d0013700b502200341b0026a108b010c110b41ba9cc2002108411021072010450d190c180b20034180046a41086a22024200370300200342003703800441ca9bc200411c20034180046a1001200341c0006a41086a200229030037030020032003290380043703404100210f0240200341c0006a411041f8b3c200410041001002417f460d00200341003602b002200341c0006a4110200341b0026a41044100100241016a41044d0d0b20032802b002210f0b20034180046a41086a22024200370300200342003703800441ca9bc200411c20034180046a1001200341c0006a41086a2002290300370300200320032903800437034002400240200341c0006a411041f8b3c200410041001002417f460d00200341003602b002200341c0006a4110200341b0026a41044100100241016a41044d0d0d20032802b00241016a21010c010b410121010b20034180046a41086a22024200370300200342003703800441ca9bc200411c20034180046a1001200341c0006a41086a220720022903003703002003200329038004370340200320013602b002200341c0006a4110200341b0026a4104100320024200370300200342003703800441e69bc200411820034180046a10012007200229030037030020032003290380043703404100210202400240200341c0006a411041f8b3c200410041001002417f460d00200342103702a4032003200341c0006a3602a003200341b0026a200341a0036a105e20032802b0022205450d0e200341b0026a41086a2201280200210720032802b4022102200341b0026a41186a200341d0016a41186a290300370300200341b0026a41106a200341d0016a41106a2903003703002001200341d0016a41086a290300370300200320032903d0013703b002200341b0026a21012002211120072002460d010c100b200341b0026a41186a200341d0016a41186a290300370300200341b0026a41106a200341d0016a41106a290300370300200341b0026a41086a200341d0016a41086a290300370300200320032903d0013703b00241012105200341b0026a21010b200241016a22072002490d1020024101742208200720072008491b2211ad4205862213422088a70d102013a722084100480d10024002402002450d0020022107200520024105742008101e2205450d010c100b200221072008101f22050d0f0b200841011020000b2002200a460d01200f20094105746a210a0340200341d0006a2002460d0120082002200341d0006a412010d00322074100476a21082007450d0141002106200a200241206a2202470d000c0d0b0b410121060c0b0b410021060c0a0b200341c4026a4101360200200341183602a403200341c0adc4003602a003200342013702b402200341c8adc4003602b0022003200341a0036a3602c002200341b0026a41d0adc40010cf01000b411541011020000b413541011020000b411941011020000b413941011020000b2010450d00200f101d0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b2011200b4105746a210c2011210241002107024002400240024002400240024002400240024002400240024002400240024002400340200c20026b41ff004d0d01200341d0006a2002460d0220072002200341d0006a412010d003220a4100476a2107200a450d02200241206a220a200341d0006a460d022007200a200341d0006a412010d003220a4100476a2107200a450d02200241c0006a220a200341d0006a460d022007200a200341d0006a412010d003220a4100476a2107200a450d02200241e0006a220a200341d0006a460d0220024180016a21022007200a200341d0006a412010d003220a4100476a2107200a0d000c020b0b2002200c460d022011200b4105746a210c0340200341d0006a2002460d0120072002200341d0006a412010d003220a4100476a2107200a450d014100210a200c200241206a2202470d000c020b0b4101210a0b200541ff0171450d010c020b4100210a200541ff01710d010b200a0d01200341b0026a41186a2207200341d0006a41186a290300370300200341b0026a41106a220a200341d0006a41106a290300370300200341b0026a41086a220c200341d0006a41086a290300370300200320032903503703b00202402012200b470d00200b41016a2202200b490d0f200b4101742212200220022012491b2212ad4205862213422088a70d0f2013a722024100480d0f02400240200b450d002011200b4105742002101e2211450d010c020b2002101f22110d010b200241011020000b2011200b4105746a220220032903b002370000200241186a2007290300370000200241106a200a290300370000200241086a200c290300370000200b41016a210b2006450d030240200920084d0d00200f2009417f6a22094105746a220229000021132002290008211420022900102115200f20084105746a220741186a200241186a2900003700002007201537001020072014370008200720133700000c040b4198adc40020082009104b000b20060d00200341b0026a41186a2208200341d0006a41186a290300370300200341b0026a41106a220c200341d0006a41106a290300370300200341b0026a41086a2206200341d0006a41086a290300370300200320032903503703b00220102009470d01200941016a22022009490d0d20094101742210200220022010491b2210ad4205862213422088a70d0d2013a722024100480d0d024002402009450d00200f20094105742002101e220f450d010c030b2002101f220f0d020b200241011020000b41ca9cc20021084116210720100d130c140b200f20094105746a220220032903b002370000200241186a2008290300370000200241106a200c290300370000200241086a2006290300370000200941016a2109200a450d00200b20074d0d012011200b417f6a220b4105746a220229000021132002290008211420022900102115201120074105746a220741186a200241186a2900003700002007201537001020072014370008200720133700000b200341d5026a2003290318370000200341b0026a41156a200341d0006a41106a290300370000200341cd026a200341d0006a41186a290300370000200341e5026a200341186a41106a290300370000200341ed026a200341186a41186a290300370000200341083a00b002200341bd026a200341d0006a41086a290300370000200341dd026a200341186a41086a290300370000200341013a00b402200320032903503700b502200341fc026a200b360200200341f8026a2009360200200341f5026a20053a0000200341b0026a108b0120034180046a41086a22024200370300200342003703800441dfd9c000411520034180046a1001200341b0026a41086a200229030037030020032003290380043703b002410021020240024002400240200341b0026a411041f8b3c200410041001002417f460d00200342103702d4012003200341b0026a3602d001200341a0036a200341d0016a10a40120032802a0032207450d0120032902a4032213422088a721022013a7450d002007101d0b02402009200e4f22080d0041002002200b6b2207200720024b1b200e490d00200341cc026a200b360200200341c8026a2012360200200341c0026a2009360200200341bc026a2010360200200320113602c4022003200f3602b8022003200e3602b4022003200d3602b0024115101f2202450d022002410d6a410029008b9c42370000200241086a41002900869c42370000200241002900fe9b42370000200241154135101e2202450d03200220032903183700152002412d6a200341306a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a29030037000020034180046a41086a2207420037030020034200370380042002413520034180046a1001200341c0006a41086a20072903003703002003200329038004370340200341103602a4032003200341c0006a3602a003200341b0026a200341a0036a10b6022002101d2010450d0b0c0a0b024002402008450d00200341c5026a200341186a41106a290300370000200341cd026a200341186a41186a290300370000200341083a00b002200341bd026a200341186a41086a290300370000200341023a00b402200320032903183700b502200341b0026a108b014119101f2202450d06200241186a41002d00939b423a0000200241106a410029008b9b42370000200241086a41002900839b42370000200241002900fb9a42370000200241194139101e2202450d0720022003290318370019200241316a200341306a290300370000200241296a200341186a41106a290300370000200241216a200341186a41086a29030037000020034180046a41086a2207420037030020034200370380042002413920034180046a1001200341c0006a41086a20072903003703002003200329038004370340410f21070240200341c0006a411041f8b3c200410041001002417f460d0020034210370284042003200341c0006a36028004200341b0026a20034180046a10a30120032802b0022207410f460d09200341a0036a200341b0026a41047241dc0010ce031a200341c0006a411010090b200341d0016a200341a0036a41dc0010ce031a2007410f470d012002101d411521074115101f22020d090c0a0b200341c5026a200341286a290300370000200341cd026a200341306a290300370000200341083a00b002200341bd026a200341186a41086a290300370000200341033a00b402200320032903183700b502200341b0026a108b01411521074115101f2202450d090c080b200341f0006a200341d0016a41dc0010ce031a2002101d200320073602b002200341b0026a410472200341f0006a41dc0010ce031a200341013a00a0032003200e3602a403200341106a200341b0026a200341a0036a108a01200341d5026a2003280210453a0000200341c5026a200341286a290300370000200341cd026a200341306a290300370000200341083a00b002200341bd026a200341186a41086a290300370000200341043a00b402200320032903183700b502200341b0026a108b01411521074115101f22020d070c080b41df88c0004133103a000b411541011020000b413541011020000b4198adc4002007200b104b000b411941011020000b413941011020000b41df88c0004133103a000b2002410d6a410029008b9c42370000200241086a41002900869c42370000200241002900fe9b4237000002400240200220074135101e2202450d00200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a2903003700004200211320034180046a41086a2207420037030020034200370380042002413520034180046a1001200341a0036a41086a200729030037030020032003290380043703a003200341a0036a411010092002101d20074200370300200342003703800441e69bc200411820034180046a1001200341c0006a41086a2007290300370300200320032903800437034002400240200341c0006a411041f8b3c200410041001002417f460d00200342103702a4032003200341c0006a3602a003200341b0026a200341a0036a105e20032802b0022205450d0320032902b40221130c010b410121050b4100210c02400240024002402013422088a7220a450d00410021094100210c410021070240034002400240200c450d00200520074105746a21022005200720096a4105746a210803402007200a4f0d06200341186a2002460d022002200341186a412010d003450d02200920076a220b200a4f0d0720082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200241206a2102200841206a2108200a200741016a2207470d000c050b0b200520074105746a210203402007200a4f0d05200341186a2002460d012002200341186a412010d003450d01200241206a2102200a200741016a2207470d000c030b0b2009417f6a2109200c41016a210c200741016a2207200a470d000c020b0b4100210c0b20034180046a41086a22024200370300200342003703800441e69bc200411820034180046a1001200341c0006a41086a20022903003703002003200329038004370340200341003602b802200342013703b0022003200a200c6b22023602a003200341a0036a200341b0026a1062024002402002450d00200a410574200c4105746b210b4100200341b0026a41086a28020022076b210a20032802b002210c20032802b402210920052102034002402009200a6a411f4b0d00200741206a22082007490d0e20094101742206200820082006491b22084100480d0e024002402009450d00200c20092008101e220c0d010c080b2008101f220c450d070b200821090b200c20076a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200a41606a210a200741206a2107200241206a2102200b41606a220b0d000b200341b8026a2007360200200320093602b4022003200c3602b0020c010b200341b0026a41086a280200210720032802b402210920032802b002210c0b200341c0006a4110200c2007100302402009450d00200c101d0b02402013a7450d002005101d0b20100d060c070b41c8aac3002007200a104b000b41d8aac300200b200a104b000b200841011020000b413541011020000b41df88c0004133103a000b200741011020000b200f101d0b02402012450d002011101d0b4100210820044101470d0d0c0c0b2005200741057422086a22022001290000370000200241186a200141186a290000370000200241106a200141106a290000370000200241086a200141086a29000037000020034180046a41086a22024200370300200342003703800441e69bc200411820034180046a1001200341c0006a41086a20022903003703002003200329038004370340200341003602b802200342013703b0022003200741016a22023602a003200341a0036a200341b0026a1062024002402002450d00200841206a21094100200341b0026a41086a28020022016b210820032802b002210b20032802b402210a2005210203400240200a20086a411f4b0d00200141206a22072001490d05200a410174220c20072007200c491b22074100480d0502400240200a450d00200b200a2007101e220b0d010c080b2007101f220b450d070b2007210a0b200b20016a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200841606a2108200141206a2101200241206a2102200941606a22090d000b200341b8026a20013602002003200a3602b4022003200b3602b0020c010b200341b0026a41086a280200210120032802b402210a20032802b002210b0b200341c0006a4110200b200110030240200a450d00200b101d0b02402011450d002005101d0b200341a0036a41186a200341d0016a41186a290300370300200341a0036a41106a200341d0016a41106a290300370300200341a0036a41086a200341d0016a41086a290300370300200320032903d0013703a003200341b0026a200441e00010ce031a4119101f2202450d03200241186a41002d00939b423a0000200241106a410029008b9b42370000200241086a41002900839b42370000200241002900fb9a42370000200241194139101e2202450d04200220032903a003370019200241316a200341a0036a41186a2201290300370000200241296a200341a0036a41106a2207290300370000200241216a200341a0036a41086a220829030037000020034180046a41086a220a420037030020034200370380042002413920034180046a1001200341c0006a41086a200a29030037030020032003290380043703402003410036025820034201370350200341b0026a200341d0006a10b2012003280254210a200341c0006a411020032802502209200328025810030240200a450d002009101d0b2002101d200341b0026a103c2001200341d0016a41186a2903003703002007200341d0016a41106a2903003703002008200341d0016a41086a290300370300200320032903d0013703a0034120101f2202450d0520022003290370370000200341cc026a4100360200200341bc026a428180808010370200200241186a200341f0006a41186a290300370000200241106a200341f0006a41106a290300370000200241086a200341f0006a41086a290300370000200342013702c402200320023602b802200320063602b4022003200f3602b0024115101f2201450d062001410d6a410029008b9c42370000200141086a41002900869c42370000200141002900fe9b42370000200141154135101e2201450d07200120032903a0033700152001412d6a200341a0036a41186a290300370000200141256a200341a0036a41106a2903003700002001411d6a200341a0036a41086a29030037000020034180046a41086a2207420037030020034200370380042001413520034180046a1001200341c0006a41086a20072903003703002003200329038004370340200341103602542003200341c0006a360250200341b0026a200341d0006a10b6022001101d2002101d200341b0026a410d6a200341f0006a41086a290300370000200341c5026a200341f0006a41106a290300370000200341b0026a411d6a200341f0006a41186a290300370000200341b0026a41256a20032903d001370000200341b0026a412d6a200341d0016a41086a290300370000200341b0026a41356a200341d0016a41106a290300370000200341ed026a200341d0016a41186a290300370000200341003a00b402200341083a00b002200320032903703700b502200341fc026a2006360200200341f8026a200f360200200341b0026a108b010b2004101d410021080c0b0b1021000b200741011020000b411941011020000b413941011020000b412041011020000b411541011020000b413541011020000b200f101d0b2012450d002011101d20044101470d020c010b20044101470d010b200141086a2802002202103c2002101d0b200020073602042000200836020020034190046a24000bdc0d08047f077e017f017e037f057e017f057e23004180016b22012400200141286a41086a220242003703002001420037032841878ec2004118200141286a1001200141086a41086a2002290300370300200120012903283703084100210341102104024002400240200141086a411041f8b3c200410041001002417f460d002001421037021c2001200141086a360218200141286a200141186a10a40320012903284201520d02200141386a2903002105200141c0006a2903002106200141c8006a2903002107200141d0006a2903002108200141d8006a2903002109200141e0006a290300210a200141e8006a290300210b200141f0006a2802002103200141f4006a280200210c200141f8006a28020021042001290330210d2001200141fc006a280200220e360274200120043602702001200c36026c200120033602682001200b3703602001200a37035820012009370350200120083703482001200737034020012006370338200120053703302001200d3703280c010b4201210b41808004210c4201210a42012109420121084201210742012106420121054201210d0b200141286a41086a220242003703002001420037032841c4b9c000411b200141286a1001200141086a41086a220f200229030037030020012001290328370308024002400240024002400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022210417f460d022010410f4d0d02200141306a2903002111200129032821120c010b42002112420021110b200242003703002001420037032841d48ec2004111200141286a1001200f200229030037030020012001290328370308024002400240200141086a411041f8b3c200410041001002417f460d0020014100360228200141086a4110200141286a41044100100241016a41044d0d022001280228210f0c010b41e400210f0b42002113200141286a41086a220242003703002001420037032841e58ec2004114200141286a1001200141086a41086a20022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022202417f460d042002410f4d0d04200141306a2903002113200129032821140c010b421521140b42002115200141286a41086a220242003703002001420037032841f98ec2004114200141286a1001200141086a41086a221020022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022216417f460d052016410f4d0d05200141306a2903002117200129032821180c010b42002118420021170b2002420037030020014200370328418d8fc2004114200141286a1001201020022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022202417f460d062002410f4d0d06200141306a2903002119200129032821150c010b420021190b200141286a41086a220242003703002001420037032841a18fc2004114200141286a1001200141086a41086a2002290300370300200120012903283703080240024002400240200141086a411041f8b3c200410041001002417f460d0020014200370328200141086a4110200141286a41084100100241016a41084d0d022001290328211a0c010b428701211a0b200141286a41086a220242003703002001420037032841b58fc2004116200141286a1001200141086a41086a20022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d0020014200370328200141086a4110200141286a41084100100241016a41084d0d032001290328211b0c010b42af01211b0b20002012370350200020153703800120002018370370200020143703602000200f3602a0012000200e36024c200020043602482000200c360244200020033602402000200b3703382000200a37033020002009370328200020083703202000200737031820002006370310200020053703082000200d3703002000201b370398012000201a37039001200041d8006a201137030020004188016a2019370300200041f8006a2017370300200041e8006a201337030020014180016a24000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b130020004102360204200041e8a7c4003602000b13002000410e360204200041a797c2003602000b130020004104360204200041b8a9c4003602000b02000b3101017f02404101101f2202450d00200042818080801037020420002002360200200241003a00000f0b410141011020000bd839030e7f017e017f230041c0006b220324002002280208220441586a2105200241106a2802002206412c6c210702400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024003402007450d01200741546a2107200541286a21082005412c6a2209210520082d00004104470d000b2006412c6c2107200441586a210503402007450d02200741546a2107200541286a21082005412c6a220a210520082d0000410b470d000b2006412c6c2107200441586a210503402007450d03200741546a2107200541286a21082005412c6a2204210520082d00004102470d000b200341106a20091044200328021420014d0d03200328021020014102746a2207450d03200341086a20041044200328020c200728020022074d0d04200328020820074104746a2207450d04200a41086a28020020014d0d05200a2802002109200341186a41086a420037030020034280808080c00037031820072d000d2108200341306a41026a220a2003412d6a41026a2d00003a0000200320032f002d3b01304110101f2207450d3f200341206a220b4101360200200341186a410c6a220528020021062003200736021c200720064104746a220741003a000c2007410036020820072008410447220c3602042007200c360200200720032f01303b000d2007410f6a200a2d00003a00002005200528020041016a3602004100210802402009200141186c6a22072802142205450d002007410c6a2106200741146a210a200341306a410472210d4100210841002107034002402003280218220920084d0d00200341306a200341186a410010b50320032802304101460d0920082003280218220920032802342d000c1b2108200a28020021050b200720054f0d3e02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006280200220120074104746a2d0000220541ab014b0d00024020050eac01141e0707071e13120c181915110e0d0b17160f1004040404040404040404040404040505050505050505050a1a06060606080000000000000000000008000000000000000000000000000000000000000000000303030101010101010101010101010101010303030101010101010101010101010101010303030303030301010101010101030303030303030101010101010102020202020202020202020202020202020202020202020202140b200341306a200341186a410210b60320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1f0c200b200341306a200341186a410210b60320032802300d272003280218220541016a22092005490d2820032009360218200741016a2207200a2802002205490d1e0c1f0b200341306a200341186a410110b60320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1d0c1e0b200341306a200341186a410110b60320032802300d2b2003280218220541016a22092005490d2c20032009360218200741016a2207200a2802002205490d1c0c1d0b200341306a200341186a410110b60320032802300d2c2003280218220541016a22092005490d2d20032009360218200741016a2207200a2802002205490d1b0c1c0b200341306a200341186a410210b6032003280230450d180c2f0b200941016a22052009490d2f20032005360218200741016a2207200a2802002205490d190c1a0b200120074104746a2d0001210e200341306a41026a2003412d6a41026a2d00003a0000200320032f002d3b0130200341246a2802002201200341206a280200470d01200141016a220f2001490d5b20014101742210200f200f2010491b2210ad4204862211422088a70d5b2011a722124100480d5b2001450d13200328021c20014104742012101e220f0d140c5c0b200341306a200341186a410110b60320032802300d2e2003280218220541016a22092005490d3020032009360218200741016a2207200a2802002205490d170c180b200328021c210f0c130b200941016a22052009490d3d20032005360218200741016a2207200a2802002205490d150c160b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d140c150b200341306a200341186a200120074104746a41046a28020010b50320032802304101460d2f200341306a200341186a2003280234280204220510b60320032802300d41200341306a200341186a410110b60320032802300d4a2003280218220920056a22052009490d4b20032005360218200741016a2207200a2802002205490d130c140b200341306a200341186a410210b60320032802300d34200341306a200341186a410110b60320032802300d3e2003280218220541016a22092005490d4820032009360218200741016a2207200a2802002205490d120c130b200341306a200341186a410110b6032003280230450d0f0c300b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d100c110b200341306a200341186a410110b6032003280230450d0d0c2f0b2003200410442003280204200120074104746a41046a28020022054d0d2b2003280200220920054104746a2201450d2b200341306a200341186a200920054104746a28020810b60320032802300d3b2003280218220520012d000d4104476a22092005490d4320032009360218200741016a2207200a2802002205490d0e0c0f0b200341306a200341186a200120074104746a41046a28020010b50320032802304101460d32200341306a200341186a200328023428020410b60320032802300d38200341246a2802002205417f6a220920054f0d41200920054b0d41200328021c20094104746a41013a000c200741016a2207200a2802002205490d0d0c0e0b200341246a22052802002209450d2420052009417f6a2209360200200328021c20094104746a22052d000c4102460d2420052802002109200320052802082205360218200520096a22092005490d3f20032009360218200741016a2207200a2802002205490d0c0c0d0b200341246a2802002205417f6a220920054f0d31200920054b0d31200328021c20094104746a41013a000c200741016a2207200a2802002205490d0b0c0c0b200341306a200120074104746a41046a280200200210b00320032802304101460d25200341306a200341186a2003280234220528020810b60320032802300d392003280218220920052d000d4104476a22052009490d3c20032005360218200741016a2207200a2802002205490d0a0c0b0b200341306a200341186a410110b60320032802300d2d2003280218220541016a22092005490d3920032009360218200741016a2207200a2802002205490d090c0a0b200341306a200341186a410110b6032003280230450d060c290b200341306a200341186a200120074104746a2209410c6a28020010b50320032802304101460d2120032802342802042101200941086a2802004102742105200941046a280200210903402005450d07200341306a200341186a200928020010b50320032802304101460d1b2005417c6a2105200941046a210920032802342802042001460d000c1c0b0b200341306a200341186a200c10b60320032802300d24200341246a2802002205417f6a220920054f0d30200920054b0d30200328021c20094104746a41013a000c200741016a2207200a2802002205490d060c070b200341306a200341186a410110b60320032802300d2e2003280218220541016a22092005490d3620032009360218200741016a2207200a2802002205490d050c060b2012101f220f450d480b200341206a20103602002003200f36021c200341246a28020021010b200f20014104746a220141003a000c2001200936020820012005410347200e41044722057136020420012005360200200120032f01303b000d2001410f6a200341326a2d00003a0000200341246a2205200528020041016a3602000b200741016a2207200a2802002205490d010c020b200341306a200341186a200110b60320032802300d39200341246a2802002205417f6a220920054f0d3a200920054b0d3a200328021c20094104746a41013a000c200741016a2207200a2802002205490d000b0b2000410036020020002008360204200b280200450d5c200328021c101d200341c0006a24000f0b4113101f2207450d382007410f6a41002800f4a642360000200741086a41002900eda642370000200741002900e5a642370000200041086a4293808080b0023702002000200736020420004101360200200341c0006a24000f0b410f101f2207450d38200741076a41002900ffa642370000200741002900f8a642370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b410f101f2207450d38200741076a410029008ea74237000020074100290087a742370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b4125101f2207450d392007411d6a41002900b3a742370000200741186a41002900aea742370000200741106a41002900a6a742370000200741086a410029009ea74237000020074100290096a742370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b4125101f2207450d392007411d6a41002900b3a742370000200741186a41002900aea742370000200741106a41002900a6a742370000200741086a410029009ea74237000020074100290096a742370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b4127101f2207450d3a2007411f6a41002900daa742370000200741186a41002900d3a742370000200741106a41002900cba742370000200741086a41002900c3a742370000200741002900bba742370000200041086a42a7808080f0043702002000200736020420004101360200200341c0006a24000f0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a280200450d550c540b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d530c540b410e101f2207450d3a200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d520c530b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d510c520b410e101f2207450d39200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d500c510b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4f0c500b410e101f2207450d38200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4e0c4f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4d0c4e0b410e101f2207450d37200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4c0c4d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4b0c4c0b410e101f2207450d36200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4a0c4b0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d490c4a0b4127101f2207450d352007411f6a41002900a6a842370000200741186a410029009fa842370000200741106a4100290097a842370000200741086a410029008fa84237000020074100290087a842370000200041086a42a7808080f0043702002000200736020420004101360200200341206a2802000d480c490b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d470c480b410e101f2207450d34200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d460c470b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d450c460b4117101f2207450d332007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d440c450b410e101f2207450d33200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d430c440b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d420c430b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d410c420b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d400c410b410e101f2207450d30200741066a41002900b4a842370000200741002900aea842370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d3f0c400b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3e0c3f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3d0c3e0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3c0c3d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3b0c3c0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3a0c3b0b410e101f2207450d2b200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d390c3a0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d380c390b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d370c380b4117101f2207450d292007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d360c370b410e101f2207450d29200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d350c360b410e101f2207450d29200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d340c350b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d330c340b4117101f2207450d282007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d320c330b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d310c320b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d300c310b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2f0c300b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2e0c2f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2d0c2e0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2c0c2d0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2b0c2c0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2a0c2b0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d290c2a0b4117101f2207450d232007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d280c290b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d270c280b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d260c270b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d250c260b410e101f2207450d22200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d240c250b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d230c240b4117101f2207450d212007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d220c230b411341011020000b410f41011020000b410f41011020000b41f0aec40020072005104b000b412541011020000b412541011020000b411041041020000b412741011020000b1021000b201241041020000b410e41011020000b410e41011020000b410e41011020000b410e41011020000b410e41011020000b412741011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b410e41011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b410e41011020000b411741011020000b200328021c101d0b200341c0006a24000b19002000200141186a280200360204200020012802103602000b1100200028020035020041012001108b020bba0a020b7f017e230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c21020240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a2008104420032802182107200328021c21020c010b410021070b2002410020071b21092006412c6c2102200441586a2105200741f8b3c20020071b210a0240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a200810442003280210210b2003280214210c0c010b4100210b0b2006412c6c2102200441586a2105200b41f8b3c200200b1b210d024002400240024002400240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210503402002450d09200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a2008104420032802082207200328020c41286c6a210803402008200722026b419f014d0d0320022d0018450d04200241c0006a2d0000450d05200241e8006a2d0000450d06200241a0016a210720024190016a2d00000d000b20024194016a210520010d060c090b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22050d080b200341cc006a41013602002003410236022c2003420237023c200341f8adc4003602382003200341206a3602282003200341286a360248200341d0006a200341386a10282003290254210e200328025021020c0a0b20022008460d042002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c060b0b2005410c6a210720010d030c060b2002411c6a2105200241286a210720010d020c050b200241c4006a2105200241d0006a210720010d010c040b200241ec006a2105200241f8006a21072001450d030b02400240024003402001417f6a2101024002400240024003402008200722026b419f014d0d0120022d0018450d02200241c0006a2d0000450d03200241e8006a2d0000450d04200241a0016a210720024190016a2d00000d000b20010d040c070b20022008460d072002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c090b0b2005410c6a210720010d030c090b200241286a210720010d020c030b200241d0006a210720010d010c030b200241f8006a210720010d000b2003200241ec006a2802002202360224200920024b0d060c070b20032002411c6a2802002202360224200920024b0d050c060b2003200241c4006a2802002202360224200920024b0d040c050b200320024194016a2802002202360224200920024b0d030c040b41b4a2c20041dd00103a000b41f2a1c20041c200103a000b200320052802002202360224200920024d0d010b200a20024104746a2202450d002000410036020020002002360204200341e0006a24000f0b200341dc006a4102360200200341cc006a4102360200200341023602542003420337023c20034188aec4003602382003200341206a3602582003200341246a3602502003200341d0006a360248200341286a200341386a1028200329022c210e200328022821020b2000200236020420004101360200200041086a200e370200200341e0006a24000b0e00200035020041012001108b020bf50303047f017e017f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441386a2802002105200441346a2802002106200141016a2101200441c4006a2802004102460d030c010b0240024020002802002201450d0020003301044220862003ad842107410121040c010b2003ad210741002104410021010b2000101d2007a72103024002402007422088a7220620012f01064f0d00200121050c010b03400240024020012802002205450d00200441016a210420013301044220862003ad8421070c010b2003ad2107410021050b2001101d2007a72103200521012007422088a7220620052f01064f0d000b0b200520064102746a4198036a2802002100200520064105746a220141c4006a2802002108200141386a2802002105200141346a2802002106024020044101460d00410120046b210103402000280294032100200141016a22010d000b0b4100210120084102460d020b2002417f6a210202402005450d002006101d0b20020d000b0b0240200041f0c0c100460d00200028020021012000101d2001450d00200128020021052001101d2005450d00024020052802002201450d0003402005101d2001210520012802002200210120000d000b0b2005101d0b0bcb0a03037f017e027f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002202417e6a2203412e4b0d0020030e2f061e220000141f18001d0a00000d0c1c26190b151b232111102728041a09080f24162503130520070201172a29120e060b200020023a00000f0b200020012d00013a00012000412b3a00000f0b200041046a200141046a2902003702002000412a3a00000f0b200041046a200141046a290200370200200041253a00000f0b200041046a200141046a2902003702002000411d3a00000f0b200041046a200141046a290200370200200041273a00000f0b200020012d00013a0001200041023a00000f0b200041046a200141046a290200370200200041293a00000f0b200041046a200141046a290200370200200041203a00000f0b200041046a200141046a2902003702002000411f3a00000f0b200020012d00013a0001200041046a200141046a2802003602002000410c3a00000f0b200041046a200141046a290200370200200041143a00000f0b200041046a200141046a280200360200200041103a00000f0b200041046a200141046a2802003602002000410f3a00000f0b200041086a200141086a290300370300200041303a00000f0b200041046a200141046a290200370200200041213a00000f0b200041046a200141046a2902003702002000411a3a00000f0b200041046a200141046a290200370200200041193a00000f0b200041046a200141046a2802003602002000412f3a00000f0b200041046a200141046a290200370200200041263a00000f0b200041046a200141046a280200360200200041073a00000f0b200041046a200141046a290200370200200041153a00000f0b200041046a200141046a290200370200200041233a00000f0b200020012d00013a00012000412c3a00000f0b200141086a2802002204ad2205421e88a70d142005420286a72203417f4c0d14200141046a28020021022003450d122003101f22060d13200341041020000b200041046a200141046a280200360200200041133a00000f0b200041046a200141046a2902003702002000411e3a00000f0b200041046a200141046a290200370200200041163a00000f0b200041046a200141046a280200360200200041113a00000f0b200041046a200141046a2802003602002000410b3a00000f0b200020012d00013a0001200041033a00000f0b200041046a200141046a280200360200200041083a00000f0b200041046a200141046a290200370200200041283a00000f0b200041046a200141046a290200370200200041183a00000f0b200020012d00013a0001200041043a00000f0b200041046a200141046a290200370200200041173a00000f0b200041046a200141046a290200370200200041223a00000f0b200041046a200141046a290200370200200041243a00000f0b200041046a200141046a280200360200200041123a00000f0b200041046a200141046a2902003702002000411b3a00000f0b200041046a200141046a2902003702002000411c3a00000f0b200041086a200141086a2903003703002000412e3a00000f0b200041046a200141046a2802003602002000412d3a00000f0b410421060b02402004450d002004410274210720062103034020032002280200360200200341046a2103200241046a21022007417c6a22070d000b0b200041086a2004360200200041046a20063602002000410c6a2001410c6a280200360200200041093a00000f0b102e000b9e0302067f017e230041106b2202240002400240024002400240024002400240200041046a2802002203200028020822046b20012802042205200128020022066b41047622074f0d00200420076a22062004490d0320034101742204200620062004491b2206ad4204862208422088a70d032008a722044100480d032003450d01200028020020034104742004101e2207450d020c040b2000280200210720062005460d040c050b2004101f22070d020b200441081020000b1021000b20002007360200200041046a2006360200200041086a280200210420012802002206200141046a280200470d010b200241ac013a00000c010b2001200641106a3602002002200610b30320022d000041ac01460d00200441016a2103200720044104746a2106024003402003210420062002290300370300200641086a200241086a29030037030020012802002203200141046a280200460d012001200341106a3602002002200310b303200441016a2103200641106a210620022d000041ac01470d000c020b0b200241ac013a00000b200041086a2004360200200241106a24000ba00201027f02400240024002402001410c6a2802002203417f6a220420034d0d004116101f2201450d01200020013602042001410e6a41002900eba942370000200141086a41002900e5a942370000200141002900dda942370000200041086a4296808080e002370200200041013602000f0b0240200420026b220220044d0d00411b101f2201450d0220002001360204200141176a410028008aaa42360000200141106a4100290083aa42370000200141086a41002900fba942370000200141002900f3a942370000200041086a429b808080b003370200200041013602000f0b200320024d0d022000200141046a28020020024104746a360204200041003602000f0b411641011020000b411b41011020000b4180afc40020022003104b000bf60201037f230041106b22032400024002402002450d0020032001410010b50320032802004101470d01200020034104722202290200370200200041086a200241086a280200360200200341106a24000f0b20004100360200200341106a24000f0b02400240024002402001280200220420032802042205280208470d0020052d000c450d0120004100360200200341106a24000f0b0240200420026b220220044d0d00410f101f2202450d022000428f808080f00137020420002002360200200241076a41002900d5a942370000200241002900cea942370000200341106a24000f0b2000410036020020012002360200200341106a24000f0b4125101f2202450d01200042a5808080d004370204200020023602002002411d6a41002900c6a942370000200241186a41002900c1a942370000200241106a41002900b9a942370000200241086a41002900b1a942370000200241002900a9a942370000200341106a24000f0b410f41011020000b412541011020000b931001157f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024002400240024002400240024002400240024002400240024002400240024002400240024020042d00002200410d4b0d00024020000e0e000203040506070809140a0b0c0d000b200441086a280200450d13200441046a280200101d20022003470d140c150b0240200441086a280200450d00200441046a280200101d0b0240200441146a2802002200450d00200441186a280200450d002000101d0b200441246a280200450d12200441206a280200101d20022003470d130c140b0240200441086a280200450d00200441046a280200101d0b200441146a280200450d11200441106a280200101d20022003470d120c130b200441046a210502402004410c6a2802002201450d00200528020021002001410474210103400240200041046a280200450d002000280200101d0b200041106a2100200141706a22010d000b0b200441086a280200450d102005280200101d20022003470d110c120b200441046a210502402004410c6a2802002201450d0020052802002100200141286c210103400240200041046a280200450d002000280200101d0b0240200041106a280200450d002000410c6a280200101d0b200041286a2100200141586a22010d000b0b200441086a280200450d0f2005280200101d20022003470d100c110b200441086a280200450d0e200441046a280200101d20022003470d0f0c100b200441086a280200450d0d200441046a280200101d20022003470d0e0c0f0b200441086a280200450d0c200441046a280200101d20022003470d0d0c0e0b200441046a21062004410c6a2802002200450d0a2006280200220720004104746a2108410021000c050b200441046a210502402004410c6a2802002201450d0020052802002100200141146c210103400240200041046a280200450d002000280200101d0b200041146a21002001416c6a22010d000b0b200441086a280200450d0a2005280200101d20022003470d0b0c0c0b200441046a21092004410c6a2802002200450d072009280200220a2000411c6c6a210b410121000c030b200441046a210c2004410c6a2802002200450d05200c280200220d200041186c6a210e410221000c020b200441046a210f2004410c6a2802002200450d03200f28020022102000411c6c6a2111410321000c010b024002400240200441046a2d000022004102460d0020004101460d0120000d022004410c6a280200450d09200441086a280200101d20022003470d0a0c0b0b2004410c6a2112200441146a2802002200450d032012280200221320004104746a2114410421000c020b2004410c6a21150240200441146a2802002201450d00201528020021002001410c6c21010340024020002802002205450d00200041046a280200450d002005101d0b2000410c6a2100200141746a22010d000b0b200441106a280200450d072015280200101d20022003470d080c090b2004410c6a280200450d06200441086a280200101d0c060b0340024002400240024002400240024002400240024020000e050001020304040b024020072802082201450d0020072802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b200741106a21000240200741046a280200450d002007280200101d0b2000210720002008470d040c0e0b0240200a410c6a2802002201450d00200a2802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b0240200a41086a280200450d00200a41046a280200101d0b200a411c6a21000240200a41146a280200450d00200a280210101d0b2000210a2000200b470d040c0c0b0240200d41046a280200450d00200d280200101d0b0240200d41146a2802002201450d00200d28020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b200d41186a21000240200d41106a280200450d00200d410c6a280200101d0b2000210d2000200e470d040c0a0b02402010410c6a2802002201450d0020102802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b0240201041086a280200450d00201041046a280200101d0b2010411c6a21000240201041146a280200450d002010280210101d0b2000211020002011470d040c080b2013221541106a2113024020152802042200450d0002402015410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d002005101d0b2000410c6a2100200141746a22010d000b0b201541086a280200450d00201541046a280200101d0b20132014470d040c060b410021000c040b410121000c030b410221000c020b410321000c010b410421000c000b0b200441106a280200450d042012280200101d20022003470d050c060b200441086a280200450d03200f280200101d20022003470d040c050b200441086a280200450d02200c280200101d20022003470d030c040b200441086a280200450d012009280200101d20022003470d020c030b200441086a280200450d002006280200101d20022003470d010c020b20022003470d000b0b0be80701037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d05200228020020032005101e2204450d060c170b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1020044101742203200520052003491b22034100480d102004450d08200228020020042003101e2204450d090c140b200228020021040c160b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d08200228020020042003101e22040d090c0f0b200228020021040c120b200241046a280200200241086a2802002203470d03200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d09200228020020032005101e22040d0a0c0e0b2005101f22040d110b200541011020000b200228020021040c050b200228020021040c070b2003101f22040d0b0b200341011020000b2003101f2204450d060b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a2001410274410272360000200141037422010d0b0c0c0b2005101f2204450d040b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0420044101742203200520052003491b22034100480d042004450d01200228020020042003101e22040d020c070b200228020021040c020b2003101f2204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a200136000020014103742201450d090c080b1021000b200341011020000b200541011020000b200341011020000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b0000200141037422010d020c030b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a000020014103742201450d010b200020016a210103402000280200200041046a280200200210a202200041086a22002001470d000b0b0bd50101027f200028020421020240024020002802004101470d002000410c6a2802002200200110a1022000450d01200041186c2103200241146a21000340200041706a280200200041746a280200200110a2022000417c6a2802002000280200200110a202200041186a2100200341686a22030d000c020b0b200041086a2802002200200110a1022000450d00200041186c2103200241146a21000340200041706a280200200041746a280200200110a2022000417c6a2802002000280200200110a202200041186a2100200341686a22030d000b0b0bd90601037f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000022024101460d0020024102470d01200141046a280200200141086a2802002202470d03200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d07200128020020022004101e2203450d080c120b200141046a280200200141086a2802002202470d01200241016a22032002490d0e20024101742204200320032004491b22044100480d0e2002450d04200128020020022004101e2203450d050c0c0b200141046a280200200141086a2802002202470d02200241016a22032002490d0d20024101742204200320032004491b22044100480d0d2002450d07200128020020022004101e2203450d080c090b200128020021030c0b0b200128020021030c0f0b200128020021030c070b2004101f22030d070b200441011020000b2004101f22030d0a0b200441011020000b2004101f22030d010b200441011020000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a280200200110a2020f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041086a2802002000410c6a280200200110a202200041146a280200200041186a280200200110a202024002400240200141046a28020020042802002202470d00200241016a22032002490d0320024101742204200320032004491b22044100480d032002450d01200128020020022004101e2203450d020c040b200128020021030c040b2004101f22030d020b200441011020000b1021000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a200041016a2d00003a00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a0000200041086a2802002000410c6a280200200110a202200041146a280200200041186a280200200110a202200041206a280200200041246a280200200110a2022000412c6a280200200041306a280200200110a2020b2700200028020c200041106a280200100a200041146a3502001018200041186a350200101800000b080020002001100a0b0600200010190b06002000101a0b2801017f0240200210192203450d002003200020022001200120024b1b10ce031a2000101a0b20030b1c01017f0240200010192201450d0020014100200010cd031a0b20010b9a09010a7f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a360200200342808080808004370308200320003602204100210620034100360218200341003602102003200536023020032005360228024002400240024020022802082207450d0020022802002108200228020422092002410c6a2802002205200520094b1b220a450d01200020082802002008280204200128020c1100000d02200841086a2105200341386a2101200341346a210b200341306a210c41012106024003402001200741206a2d00003a00002003200741086a28020036020c20032007410c6a2802003602084100210202400240024002400240200741186a28020022004101460d00024020004102460d0020004103460d052007411c6a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a36020020002802044124470d04200028020028020021040c010b2007411c6a2802002200200b28020022044f0d02200c28020020004103746a22002802044124470d03200028020028020021040b410121020c020b0c010b41f0b3c40020002004104b000b200341086a410c6a2004360200200341086a41086a20023602004100210202400240024002400240200741106a28020022004101460d00024020004102460d0020004103460d05200741146a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a36020020002802044124470d04200028020028020021040c010b200741146a2802002200200b28020022044f0d02200c28020020004103746a22002802044124470d03200028020028020021040b410121020c020b0c010b41f0b3c40020002004104b000b200341086a41146a2004360200200341086a41106a200236020002400240024020072802004101470d00200741046a2802002202200b28020022044f0d02200c28020020024103746a21020c010b200341086a41206a22042802002202200341086a41246a280200460d032004200241086a3602000b2002280200200341086a200241046a2802001106000d052006200a4f0d04200541046a210220052802002104200541086a2105200741246a2107200641016a2106200341086a41186a28020020042002280200200341086a411c6a28020028020c110000450d010c050b0b4180b4c40020022004104b000b4190b3c400102c000b20022802002108200228020422092004200420094b1b220a450d00200020082802002008280204200128020c1100000d01200841086a2107200341206a2100200341246a21014101210603402005280200200341086a200541046a2802001106000d022006200a4f0d01200741046a210220072802002104200541086a2105200741086a2107200641016a2106200028020020042002280200200128020028020c110000450d000c020b0b200920064d0d01200341206a280200200820064103746a22072802002007280204200341246a28020028020c110000450d010b200341c0006a240041010f0b200341c0006a240041000b7701017f230041c0006b220024002000413336020c200041e3b0c200360208200041346a4125360200200041246a41023602002000411836022c20004202370214200041b8b1c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8b1c40010cf01000b1c00200128021841accfc20041052001411c6a28020028020c1100000b02000bba0101037f024002400240024002400240200028020022002802042203200028020822046b20024f0d00200420026a22052004490d0320034101742204200520052004491b22044100480d032003450d01200028020020032004101e2203450d020c040b200028020021030c040b2004101f22030d020b200441011020000b1021000b20002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a2001200210ce031a41000bba0401047f230041106b22022400200028020021000240024002400240024002400240024002400240024020014180014f0d00200028020822032000280204470d09200341016a22042003490d0520034101742205200420042005491b22044100480d052003450d01200028020020032004101e2203450d020c080b2002410036020c0240024020014180104f0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b024020002802042204200028020822036b20014f0d00200320016a22052003490d0520044101742203200520052003491b22034100480d052004450d03200028020020042003101e2204450d040c060b200028020021040c060b2004101f22030d060b200441011020000b2003101f22040d020b200341011020000b1021000b20002004360200200041046a2003360200200041086a28020021030b200041086a200320016a360200200420036a2002410c6a200110ce031a0c020b20002003360200200041046a2004360200200041086a28020021030b200028020020036a20013a0000200041086a2200200028020041016a3602000b200241106a240041000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41a0b1c400200241086a10c1032101200241206a240020010b0d0042ef81ecf9c6fdac889c7f0b5501017f0240024002402001418080c400460d0041012104200028021820012000411c6a2802002802101106000d010b2002450d012000280218200220032000411c6a28020028020c11000021040b20040f0b41000b7c01017f230041306b22022400200241146a411b3602002002411b36020c200220003602082002200041046a3602102001411c6a2802002100200128021821012002412c6a41023602002002420237021c200241e0b3c4003602182002200241086a36022820012000200241186a10c1032101200241306a240020010b820c03037f017e167f410121020240200128021841272001411c6a2802002802101106000d00410221020240024002400240024002400240024002402000280200220341776a2200411e4b0d0041f4002104024020000e1f09000202030202020202020202020202020202020202020202070202020207090b41ee0021040c030b200341dc00460d050b200310ec02450d02200341017267410276410773ad4280808080d0008421050c030b41f20021040b0c040b024002400240200341ffff034b0d0020034180fe0371410876210641d8b7c2002107410021084102210941b002210a41a8b8c200210b41a8b8c200210c417f210d4101210e200341ff0171210f410021020c010b0240200341ffff074b0d0020034180fe037141087621134193bdc20021144100211541022116419f01211741d5bdc200211841d5bdc2002119417f211a4101211b200341ff01712112410121020c010b200341ef83384b0d01200341e28b746a41e28d2c490d012003419fa8746a419f18490d01200341dee2746a410e490d01200341feffff0071419ef00a460d01200341a9b2756a4129490d01200341cb91756a410a4d0d01410121020c030b034002400240024002400240024002400240024002400240024020020e020001010b200720096a2110200820072d000122026a211102400240024020072d000022002006470d0020112008490d042011200a4f0d052008200b6a210003402002450d022002200d6a210220002d000021042000200e6a21002004200f470d000c100b0b200020064b0d0120112108201021072010200c470d090c010b20112108201021072010200c470d090b200341ffff0371210041d7bac20021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e4193bdc200460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f20024193bdc200470d000b0b41012102200f4101710d0e0c0c0b201420166a2110201520142d000122026a211102400240024020142d000022002013470d0020112015490d05201120174f0d06201520186a210003402002450d022002201a6a210220002d000021042000201b6a210020042012470d000c0f0b0b200020134b0d01201121152010211420102019470d0a0c010b201121152010211420102019470d0a0b200341ffff0371210041f3bec20021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41f0c1c200460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241f0c1c200470d000b0b41012102200f4101710d0d0c0b0b20082011102a000b201141af02102b000b20152011102a000b2011419e01102b000b4190b3c400102c000b4190b3c400102c000b410021020c030b410021020c020b410121020c010b410121020c000b0b200341017267410276410773ad4280808080d0008421050b410321020c010b0b200321040b200141186a210f2001411c6a210e02400340024002400240024002400240024020024101460d0041dc002100024020024102460d0020024103470d092005422088a741ff0171417f6a220241044b0d09024020020e050006040503000b200542ffffffff8f6083210541fd0021000c060b410121020c060b41002102200421000c050b200542ffffffff8f60834280808080c0008421050c030b200542ffffffff8f608342808080802084210541fb0021000c020b200542ffffffff8f608342808080803084210541f50021000c010b20042005a7220d410274411c7176410f712202413072200241d7006a2002410a491b21000240200d450d002005427f7c42ffffffff0f832005428080808070838421050c010b200542ffffffff8f60834280808080108421050b410321020b200f2802002000200e280200280210110600450d000b41010f0b200141186a28020041272001411c6a28020028021011060021020b20020b0e00200035020041012001108b020b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f02400240200120004f0d002002450d012001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000c020b0b2002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b4401037f024002402002450d00410021030340200020036a2d00002204200120036a2d00002205470d02200341016a22032002490d000b41000f0b41000f0b200420056b0b3e01017f230041106b2205240020052001200220032004410010d503200529030021012000200541086a29030037030820002001370300200541106a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080bb70502037f057e230041306b2206240002400240024002400240024002400240024002400240024002400240024020024200510d002003500d012004500d03200479a7200279a76b2207413f4b0d0241ff0020076b2108200741016a21070c0c0b200450450d012005450d0520034200510d0d20054200370308200520012003823703000c060b2004500d0c20014200510d032004427f7c2209200483500d07200479a7200279a76b2207413e4d0d090b2005450d012005200137030020052002370308420021010c070b2003427f7c2209200383500d044100200379a741c1006a200279a76b22076b21080c080b420021010c050b02402005450d0020054200370300200520022004823703080b200220048021010c040b20034200510d070b200120038021010c020b02402005450d0020054200370308200520092001833703000b20034201510d04200641206a2001200220037aa710d403200641286a2903002102200629032021010c040b02402005450d0020052001370300200520092002833703080b200220047a423f838821010b420021020c020b41ff0020076b2108200741016a21070b200620012002200841ff007110d303200641106a20012002200741ff007110d403200641086a2903002102200641106a41086a290300210a20062903002101200629031021094200210b0340200a4201862009423f8884220c200c427f8520047c20094201862002423f88842209427f85220c20037c200c54ad7c423f87220c2004837d2009200c200383220d54ad7d210a2009200d7d2109420020024201862001423f8884842102200b2001420186842101200c420183220c210b2007417f6a22070d000b02402005450d00200520093703002005200a3703080b20024201862001423f88842102200c20014201868421010b2000200137030020002002370308200641306a24000f0b00000b0bfec0040200418080c0000bb1cf02746f6f206d616e7920696e737472756374696f6e73547269656420746f20736872696e6b20746f2061206c617267657220636170616369747974686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f657865632e727372656163686564206d6178696d756d2064657074682c2063616e6e6f74206372656174656e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e746961746520666565636f6e747261637420616c7265616479206578697374736e6f7420656e6f7567682067617320746f20706179207472616e736665722066656572656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c2066656563616e2774206465636f6465207761736d20636f6465657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e61747572656d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72794f6e20656e74727920746f207468652066756e6374696f6e20606d6f64756c65602063616e277420626520604e6f6e65603b207165646d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163656d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e76616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706552657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e4d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c65646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6563616c6c2066756e6374696f6e2069736e2774206578706f727465646465706c6f792066756e6374696f6e2069736e2774206578706f727465646578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e66756e6374696f6e206861732061206e6f6e2d6578697374656e74207479706573746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c696420747970656465706c6f796d656d6f727976616c69646174696f6e206572726f72657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f7761736d2f6d6f642e72733a617574683a41757261204c61737454696d657374616d7054696d657374616d70204d656469616e54696d657374616d702055706461746554696d657374616d7020526563656e7448696e747346696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f55736572732f612f7372632f737562737472617465322f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e727346696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265722f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e73656e7375732f7372632f6c69622e7273000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f55736572732f612f7372632f737562737472617465322f73726d6c2f617572612f7372632f6c69622e727374696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c6f66666c726570304e6f20606f66666c696e655f7265706f72746020666f756e6420696e2074686520696e686572656e742064617461214765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e7420646174614175726120736c6f74206475726174696f6e2063616e6e6f74206265207a65726f2e2f55736572732f612f7372632f737562737472617465322f73726d6c2f617572612f7372632f6c69622e72734f6e6c79206f6e6520626c6f636b206d617920626520617574686f7265642070657220736c6f742e436f6e73656e737573204f726967696e616c417574686f7269746965736e6f74655f6f66666c696e6572656d61726b7365745f686561705f70616765737365745f636f64657365745f73746f726167656b696c6c5f73746f72616765204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e6b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b204e6f74652074686174207468652070726576696f757320626c6f636b27732076616c696461746f72206d697373656420697473206f70706f7274756e69747920746f2070726f706f7365206120626c6f636b2e6f66666c696e653c543a3a496e686572656e744f66666c696e655265706f727420617320496e686572656e744f66666c696e655265706f72743e3a3a496e686572656e74436f6e73656e7375734f726967696e616c417574686f7269746965735665633c543a3a53657373696f6e4b65793e53746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f55736572732f612f7372632f737562737472617465322f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e54696d657374616d7020496e697469616c697a656454696d657374616d70204f72646572656448696e747354696d657374616d702057696e646f7753697a65616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656454696d657374616d70205265706f72744c6174656e63797072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b20716564416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f207061792074686569722066656573626164207369676e617475726520696e2065787472696e7369635472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e66696e616c5f68696e742048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e68696e743a6865617070616765733a636f64655461626c6564537461727465645061737365644e6f7450617373656443616e63656c6c656444656c656761746564556e64656c6567617465645265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e64657844656d6f637261637920566f74696e67506572696f6444656d6f637261637920566f74654f6644656d6f63726163792050726f787944656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6644656d6f6372616379204465706f7369744f6644656d6f6372616379204c61756e6368506572696f6444656d6f6372616379205075626c696350726f707344656d6f6372616379205075626c696344656c617944656d6f6372616379204e65787454616c6c7944656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7343616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d0000000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72737365636f6e6470726f78795f766f746573746172745f7265666572656e64756d63616e63656c5f7265666572656e64756d63616e63656c5f7175657565647365745f70726f787972657369676e5f70726f787972656d6f76655f70726f787964656c6567617465756e64656c656761746520556e64656c656761746520766f74652e2044656c656761746520766f74652e746f6c6f636b5f706572696f64734c6f636b506572696f647320436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e77686963682052656d6f76652061207265666572656e64756d2e7265665f696e646578436f6d706163743c5265666572656e64756d496e6465783e2053746172742061207265666572656e64756d2e64656c617920566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b566f7465436f6d706163743c50726f70496e6465783e2050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e44656d6f63726163795075626c696350726f70436f756e745075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e4465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e294c61756e6368506572696f644d696e696d756d4465706f7369745075626c696344656c61794d61784c6f636b506572696f64735265666572656e64756d436f756e744e65787454616c6c795265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e566f74657273466f72566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e7449642950726f787944656c65676174696f6e7328543a3a4163636f756e7449642c204c6f636b506572696f6473292047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e64756d73207374617274656420736f206661722e20546865206d6178696d756d206e756d626572206f66206164646974696f6e616c206c6f636b20706572696f6473206120766f746572206d6179206f6666657220746f20737472656e677468656e20746865697220766f74652e204d756c7469706c6573206f6620605075626c696344656c6179602e205468652064656c6179206265666f726520656e6163746d656e7420666f7220616c6c207075626c6963207265666572656e64612e20546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e20486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2f55736572732f612f7372632f737562737472617465322f73726d6c2f64656d6f63726163792f7372632f6c69622e727344656d6f6372616379204d696e696d756d4465706f73697476616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7744656d6f6372616379205075626c696350726f70436f756e7463616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f77616c726561647920612070726f787977726f6e672070726f78796e6f742064656c65676174656444656d6f6372616379204d61784c6f636b506572696f6473766f74652068617320746f6f206772656174206120737472656e677468766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e53797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e736963734c656e626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e646578426c6f636b206e756d626572206d6179206e65766572206265207a65726f2f55736572732f612f7372632f737562737472617465322f73726d6c2f73797374656d2f7372632f6c69622e7273626164206f726967696e3a20657870656374656420746f20626520616e20696e686572656e74206f726967696e53797374656d2045787472696e736963446174614e65774163636f756e745265617065644163636f756e74205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e76657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e7453797374656d2044696765737453797374656d20506172656e744861736853797374656d2052616e646f6d5365656453797374656d204e756d62657253797374656d2045787472696e73696373526f6f7442616c616e63657320546f74616c49737375616e636542616c616e636573204578697374656e7469616c4465706f73697442616c616e636573205472616e73616374696f6e4261736546656542616c616e636573205472616e73616374696f6e4279746546656553797374656d20426c6f636b4861736853797374656d204576656e747353797374656d204163636f756e744e6f6e636542616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e636542616c616e636573204c6f636b7373657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a09090971656453797374656d4163636f756e744e6f6e6365543a3a496e64657845787472696e736963436f756e74416c6c45787472696e736963734c656e426c6f636b4861736845787472696e7369634461746152616e646f6d536565644e756d626572506172656e744861736845787472696e73696373526f6f74446967657374543a3a4469676573744576656e74735665633c4576656e745265636f72643c543a3a4576656e743e3e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e2052616e646f6d2073656564206f66207468652063757272656e7420626c6f636b2e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d6170732065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c206c656e67746820696e20627974657320666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e7472616e736665727365745f62616c616e636520536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e6365602920616e6420726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e66726565436f6d706163743c543a3a42616c616e63653e7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e42616c616e6365732056657374696e6742616c616e636573546f74616c49737375616e6365543a3a42616c616e63654578697374656e7469616c4465706f73697456657374696e6756657374696e675363686564756c653c543a3a42616c616e63653e4672656542616c616e6365526573657276656442616c616e63654c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e20416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e20546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e636f6465206973206e6f7420666f756e647072697374696e6520636f6465206973206e6f7420666f756e647468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f64656e6f7420656e6f75676820667265652066756e64732f55736572732f612f7372632f737562737472617465322f73726d6c2f62616c616e6365732f7372632f6c69622e727342616c616e636573204372656174696f6e46656542616c616e636573205472616e7366657246656564657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7462616c616e636520746f6f206c6f7720746f2073656e642076616c7565676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c756566696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e64566f746572526561706564426164526561706572536c617368656454616c6c795374617274656454616c6c7946696e616c697a656420412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e5665633c4163636f756e7449643e20412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c20726561706572647572696e6720657865637574696f6e2f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f7761736d2f72756e74696d652e7273436f756e63696c205265676973746572496e666f4f66436f756e63696c20416374697665436f756e63696c000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e7273707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a090909097165647365745f617070726f76616c7370726f78795f7365745f617070726f76616c73726561705f696e6163746976655f766f746572726574726163745f766f7465727375626d69745f63616e64696461637970726573656e745f77696e6e65727365745f646573697265645f736561747372656d6f76655f6d656d6265727365745f70726573656e746174696f6e5f6475726174696f6e7365745f7465726d5f6475726174696f6e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722e20412074616c6c792077696c6c2068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e20546869732069732065666665637469766520696d6d6564696174656c792e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e2829606020607369676e6564602073686f756c642068617665206174206c6561737463616e646964617465746f74616c436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473766f7465735665633c626f6f6c3e436f756e63696c43616e646964616379426f6e64566f74696e67426f6e6450726573656e74536c617368506572566f7465724361727279436f756e7450726573656e746174696f6e4475726174696f6e496e6163746976654772616365506572696f64566f7465496e6465785465726d4475726174696f6e446573697265645365617473416374697665436f756e63696c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e566f7465436f756e74417070726f76616c734f665265676973746572496e666f4f6628566f7465496e6465782c20753332294c6173744163746976654f66566f7465727343616e6469646174657343616e646964617465436f756e744e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e29536e617073686f7465645374616b65735665633c42616c616e63654f663c543e3e4c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e2047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e20546865207374616b6573206173207468657920776572652061742074686520706f696e7420746861742074686520766f746520656e6465642e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e205468652070726573656e742063616e646964617465206c6973742e205468652070726573656e7420766f746572206c6973742e20546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722c2072657370656374696e6720746865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e2054686520746f74616c206e756d626572206f6620766f746573207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206d616e7920766f746520696e6465786573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e436f756e63696c20566f74696e67506572696f64436f756e63696c20446573697265645365617473436f756e63696c204e65787446696e616c697a65436f756e63696c205465726d4475726174696f6e436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c20566f74657273436f756e63696c20536e617073686f7465645374616b6573436f756e63696c204361727279436f756e74436f756e63696c204c6561646572626f617264436f756e63696c2043616e64696461746573436f756e63696c2043616e646964617465436f756e74436f756e63696c20566f7465436f756e74436f756e63696c2043616e646964616379426f6e6466696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e00000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f2f55736572732f612f7372632f737562737472617465322f73726d6c2f636f756e63696c2f7372632f73656174732e72736e6f7420612070726f7879436f756e63696c204c6173744163746976654f6663616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665626164207265706f7274657220696e646578436f756e63696c20496e6163746976654772616365506572696f64436f756e63696c20566f74696e67426f6e646261642074617267657420696e64657863616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f74657272657472616374696f6e20696e64657820696e76616c696472657472616374696f6e20696e646578206d69736d617463686475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e64737374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f63616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e746c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647363616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c656374656470726573656e7465642063616e646964617465206d7573742062652063757272656e74436f756e63696c2050726573656e74536c617368506572566f7465726475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c436f756e63696c20417070726f76616c734f666e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520617070726f76616c20766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e646964617465735468657265206973206f6e6c79206f6e6520666174616c206572726f723b20716564496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473214e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f722142616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b696e697469616c697a655f626c6f636b6170706c795f65787472696e736963696e686572656e745f65787472696e73696373636865636b5f696e686572656e747376616c69646174655f7472616e73616374696f6e6f6666636861696e5f776f726b65726772616e6470615f70656e64696e675f6368616e67656772616e6470615f666f726365645f6368616e6765617373657274696f6e206661696c65643a20696e646578203c206c656e000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962616c6c6f632f7665632e727354696d657374616d702044696455706461746554616c6c7943616e63656c6174696f6e54616c6c795265666572656e64756d204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d20766f74652e204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d2063616e63656c6c6174696f6e20766f74652e4e6577417574686f726974696573204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c2853657373696f6e4b65792c20753634293e3a6772616e6470613a617574683a6c656e54696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f55736572732f612f7372632f737562737472617465322f73726d6c2f74696d657374616d702f7372632f6c69622e727354696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b54696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f7754696d657374616d7020426c6f636b506572696f6454696d657374616d70204d696e696d756d506572696f64436f756e63696c566f74696e6720436f756e63696c566f74654f662f55736572732f612f7372632f737562737472617465322f73726d6c2f7375646f2f7372632f6c69622e7273000000000000000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f636f756e63696c2f7372632f766f74696e672e727354696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e74206461746153756469644b65794368616e67656420546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e7665746f7365745f636f6f6c6f66665f706572696f647365745f766f74696e675f706572696f64626c6f636b7370726f706f73616c5f68617368426f783c543a3a50726f706f73616c3e436f756e63696c566f74696e67436f6f6c6f6666506572696f64566f74696e67506572696f64456e61637444656c6179506572696f645665633c28543a3a426c6f636b4e756d6265722c20543a3a48617368293e543a3a50726f706f73616c50726f706f73616c566f74657273436f756e63696c566f74654f6628543a3a486173682c20543a3a4163636f756e744964295665746f656450726f706f73616c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e29204e756d626572206f6620626c6f636b7320627920776869636820746f2064656c617920656e6163746d656e74206f66207375636365737366756c2c206e6f6e2d756e616e696d6f75732d636f756e63696c2d696e7374696761746564207265666572656e64756d2070726f706f73616c732e7265706f72745f6d69736265686176696f72205265706f727420736f6d65206d69736265686176696f722e5f7265706f72744772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c697479204e657874466f726365644772616e64706146696e616c69747950656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265722c20543a3a53657373696f6e4b65793e4e657874466f7263656473657420536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920606d696e696d756d5f706572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d704e6f77426c6f636b506572696f644d696e696d756d506572696f6444696455706461746520446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f20546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e204f6c642073746f72616765206974656d2070726f766964656420666f7220636f6d7061746962696c6974792e2052656d6f766520616674657220616c6c206e6574776f726b732075706772616465642e2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e436f756e63696c566f74696e672050726f706f73616c73436f756e63696c566f74696e672050726f706f73616c4f66436f756e63696c566f74696e67205665746f656450726f706f73616c436f756e63696c566f74696e6720456e61637444656c6179506572696f6447757275206d656469746174696f6e6f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f5375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b657952657475726e207479706573206c656e6774682073686f756c642062652030206f722031436f756e63696c566f74696e6720566f74696e67506572696f6470726f706f73657220776f756c64206e6f74206265206f6e20636f756e63696c70726f706f73616c206973207665746f6564436f756e63696c566f74696e672050726f706f73616c566f746572736f6e6c7920636f756e63696c6c6f7273206d617920766f7465206f6e20636f756e63696c2070726f706f73616c736120636f756e63696c6c6f72206d6179206e6f74207665746f20612070726f706f73616c2074776963656f6e6c7920636f756e63696c6c6f7273206d6179207665746f20636f756e63696c2070726f706f73616c7370726f706f73616c206d75737420657869737420746f206265207665746f6564436f756e63696c566f74696e6720436f6f6c6f6666506572696f642041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e5375646f4b65792054686520604163636f756e74496460206f6620746865207375646f206b65792e53657373696f6e20466f7263696e674e657753657373696f6e4e657753657373696f6e204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e426c6f636b4e756d6265725370656e64696e67417761726465644275726e74526f6c6c6f766572205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e53657373696f6e2043757272656e74496e64657853657373696f6e2053657373696f6e4c656e67746853657373696f6e2056616c696461746f727353657373696f6e204e6578744b6579466f72547265617375727920506f7454726561737572792050726f706f73616c73616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f7765642f55736572732f612f7372632f737562737472617465322f73726d6c2f73657373696f6e2f7372632f6c69622e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f74726561737572792f7372632f6c69622e7273636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f6163636f756e745f64622e72737365745f6b65797365745f6c656e677468666f7263655f6e65775f73657373696f6e20466f726365732061206e65772073657373696f6e2e205365742061206e65772073657373696f6e206c656e6774682e20576f6e2774206b69636b20696e20756e74696c20746865206e6578742073657373696f6e206368616e6765202861742063757272656e74206c656e677468292e2053657473207468652073657373696f6e206b6579206f6620605f76616c696461746f726020746f20605f6b6579602e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e6b6579543a3a53657373696f6e4b657953657373696f6e53657373696f6e4c656e67746843757272656e74496e64657843757272656e745374617274543a3a4d6f6d656e74466f7263696e674e657753657373696f6e4c6173744c656e6774684368616e67654e6578744b6579466f724e65787453657373696f6e4c656e67746820546865206e6578742073657373696f6e206c656e6774682e20546865206e657874206b657920666f72206120676976656e2076616c696461746f722e20426c6f636b206174207768696368207468652073657373696f6e206c656e677468206c617374206368616e6765642e204e65772073657373696f6e206973206265696e6720666f72636564206966207468697320656e747279206578697374733b20696e20776869636820636173652c2074686520626f6f6c65616e2076616c7565206973207768657468657220746865206e65772073657373696f6e2073686f756c6420626520636f6e736964657265642061206e6f726d616c20726f746174696f6e202872657761726461626c6529206f7220657863657074696f6e616c2028736c61736861626c65292e2054696d657374616d70207768656e2063757272656e742073657373696f6e20737461727465642e2043757272656e7420696e646578206f66207468652073657373696f6e2e2043757272656e74206c656e677468206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e70726f706f73655f7370656e647365745f706f74636f6e66696775726572656a6563745f70726f706f73616c617070726f76655f70726f706f73616c20417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e70726f706f73616c5f6964202852652d29636f6e6669677572652074686973206d6f64756c652e70726f706f73616c5f626f6e64436f6d706163743c5065726d696c6c3e70726f706f73616c5f626f6e645f6d696e696d756d7370656e645f706572696f646275726e20536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e6e65775f706f742050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e62656e6566696369617279547265617375727950726f706f73616c426f6e645065726d696c6c50726f706f73616c426f6e644d696e696d756d5370656e64506572696f644275726e506f7450726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e417070726f76616c735665633c50726f706f73616c496e6465783e2050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e2050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2050726f706f7274696f6e206f662066756e647320746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c61636520612070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f65736e27742e53657373696f6e204c6173744c656e6774684368616e676553657373696f6e2043757272656e74537461727453657373696f6e204e65787453657373696f6e4c656e67746800000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72735472656173757279205370656e64506572696f64547265617375727920417070726f76616c735472656173757279204275726e50726f706f73657227732062616c616e636520746f6f206c6f7754726561737572792050726f706f73616c426f6e644d696e696d756d54726561737572792050726f706f73616c426f6e6454726561737572792050726f706f73616c436f756e744e6f2070726f706f73616c206174207468617420696e6465784e65774163636f756e74496e6465782041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e646578626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d6974206279207072696365496e646963657320456e756d53657400000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f696e64696365732f7372632f6c69622e7273696e76616c6964206163636f756e7420696e646578000000000000000000000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b20716564496e64696365734e657874456e756d536574543a3a4163636f756e74496e646578456e756d5365742054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e496e6469636573204e657874456e756d5365740000000000000000000000000000000000000000005265776172644f66666c696e655761726e696e674f66666c696e65536c617368204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20676976656e2061206f66666c696e652d7761726e696e67202874686579277265207374696c6c2077697468696e207468656972206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e20416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67204c6564676572626f6e64626f6e645f6578747261756e626f6e6477697468647261775f756e626f6e64656476616c69646174656e6f6d696e6174656368696c6c7365745f70617965657365745f636f6e74726f6c6c65727365745f73657373696f6e735f7065725f6572617365745f626f6e64696e675f6475726174696f6e7365745f76616c696461746f725f636f756e74666f7263655f6e65775f6572617365745f6f66666c696e655f736c6173685f67726163657365745f696e76756c6e657261626c657320536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72735665633c543a3a4163636f756e7449643e2053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e6170706c795f726577617264732054686520696465616c206e756d626572206f662076616c696461746f72732e6e657720546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20657261732e2053657420746865206e756d626572206f662073657373696f6e7320696e20616e206572612e436f6d706163743c543a3a426c6f636b4e756d6265723e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e636f6e74726f6c6c657220546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f72207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c20626520746865206163636f756e74207468617420636f6e74726f6c732069742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e5374616b696e675374616b696e6720496e76756c6e657261626c65735374616b696e6720536c617368436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e6720526563656e746c794f66666c696e6576206973206e6f6e2d656d7074793b207165645374616b696e67204f66666c696e65536c6173685374616b696e6720466f7263696e674e65774572614c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656468656164206f66205374616b696e672056616c696461746f72735374616b696e67205374616b6572730000000000000000000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e727356616c696461746f72436f756e744d696e696d756d56616c696461746f72436f756e7453657373696f6e73506572457261543a3a426c6f636b4e756d62657253657373696f6e52657761726450657262696c6c4f66666c696e65536c6173684772616365426f6e64696e674475726174696f6e496e76756c6e657261626c6573426f6e6465644c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e506179656556616c696461746f72734e6f6d696e61746f72735374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e43757272656e74456c656374656443757272656e7445726143757272656e7453657373696f6e52657761726443757272656e744572615265776172644e65787453657373696f6e735065724572614c6173744572614c656e6774684368616e6765536c6f745374616b65536c617368436f756e74466f7263696e674e65774572612829526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202877686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e2057652061726520666f7263696e672061206e6577206572612e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e205468652073657373696f6e20696e6465782061742077686963682074686520657261206c656e677468206c617374206368616e6765642e20546865206e6578742076616c7565206f662073657373696f6e7320706572206572612e2054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e6420696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e20746865206073657373696f6e7360206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e20546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20626c6f636b732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e20546865206c656e677468206f662061207374616b696e672065726120696e2073657373696f6e732e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e2f55736572732f612f7372632f737562737472617465322f73726d6c2f7374616b696e672f7372632f6c69622e72735374616b696e672043757272656e7453657373696f6e5265776172645374616b696e672043757272656e744572615265776172645374616b696e67204c6173744572614c656e6774684368616e67655374616b696e672053657373696f6e735065724572615374616b696e672043757272656e74456c65637465645374616b696e6720536c6f745374616b655374616b696e672043757272656e744572615374616b696e67204e65787453657373696f6e735065724572615374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e7468656164206f66205374616b696e67204e6f6d696e61746f72735374616b696e672053657373696f6e5265776172645374616b696e6720506179656500000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000617474656d707420746f20646976696465206279207a65726f636f6e74726f6c6c657220616c726561647920706169726564737461736820616c726561647920626f6e6465646e6f7420612073746173686e6f74206120636f6e74726f6c6c65725374616b696e6720426f6e64696e674475726174696f6e756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d707479436f6e7472616374204163636f756e74436f756e746572436f6e7472616374204761735370656e74436f6e747261637420426c6f636b4761734c696d6974436f6e7472616374205072697374696e65436f6465436f6e7472616374204163636f756e74496e666f4f66436f6e747261637420436f646553746f72616765436f6e747261637420436f6465486173684f66436f6e7472616374204761735072696365436f6e7472616374205472616e73616374696f6e42617365466565436f6e7472616374205472616e73616374696f6e4279746546656573797374656d6175726174696d657374616d70636f6e73656e737573696e646963657362616c616e63657373657373696f6e7374616b696e6764656d6f6372616379636f756e63696c636f756e63696c5f766f74696e67636f756e63696c5f6d6f74696f6e7366696e616c6974795f747261636b65726772616e6470617472656173757279636f6e74726163747375646f5472616e73666572496e7374616e746961746564436f646553746f7265645363686564756c655570646174656444697370617463686564436f6e747261637420416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e5665633c75383e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e42616c616e63657570646174655f7363686564756c657075745f636f646563616c6c63726561746520437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d207468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2074686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20746865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792063726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e74436f6d706163743c42616c616e63654f663c543e3e6761735f6c696d6974436f6d706163743c543a3a4761733e636f64655f68617368436f6465486173683c543e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e646573743c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636576616c75652053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c653c543a3a4761733e5472616e7366657246656542616c616e63654f663c543e4372656174696f6e4665655472616e73616374696f6e426173654665655472616e73616374696f6e42797465466565436f6e747261637446656543616c6c42617365466565543a3a4761734372656174654261736546656547617350726963654d61784465707468426c6f636b4761734c696d69744761735370656e7443757272656e745363686564756c65436f6465486173684f66543a3a4163636f756e7449645072697374696e65436f6465436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c654163636f756e74436f756e7465727536344163636f756e74496e666f4f664163636f756e74496e666f20546865207375627472696520636f756e7465722041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f722074686520657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e20546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e20546865207072696365206f66206f6e6520756e6974206f66206761732e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e7375627374726174652d6e6f6465df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000dd718d5cc53262d4010000007801759919ee83e501000000446570726563617465642c20706c65617365207573652060417574686f726974696573417069602e2f55736572732f612f7372632f737562737472617465322f6e6f64652f72756e74696d652f7372632f6c69622e72734469676573744974656d206e6f7420657175616c2f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f6c69622e7273436f6e74726163742043757272656e745363686564756c656e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e74436f6e7472616374204d61784465707468436f6e747261637420436f6e7472616374466565436f6e7472616374204372656174696f6e466565436f6e7472616374205472616e73666572466565436f6e74726163742043616c6c42617365466565436f6e747261637420437265617465426173654665656e6f7420616c6c6f77656420746f206661696c20696e2072756e74696d652f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d332e322e302f7372632f636f6465632e7273626164206f726967696e3a20657870656374656420746f2062652061207468726573686f6c64206e756d626572206f6620636f756e63696c206d656d6265727350726f706f736564566f746564417070726f766564446973617070726f76656445786563757465642041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e48617368626f6f6c2041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e206173207533327320726573706563746976656c79292e4163636f756e7449647533322041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20753332292e50726f706f73616c496e64657800000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e727300000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f636f756e63696c2f7372632f6d6f74696f6e732e727370726f706f7365766f746570726f706f73616c543a3a48617368696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f76657468726573686f6c64436f6d706163743c7533323e426f783c3c542061732054726169743e3a3a50726f706f73616c3e436f756e63696c4d6f74696f6e7350726f706f73616c735665633c543a3a486173683e50726f706f73616c4f663c542061732054726169743e3a3a50726f706f73616c566f74696e672850726f706f73616c496e6465782c207533322c205665633c543a3a4163636f756e7449643e2c205665633c543a3a4163636f756e7449643e2950726f706f73616c436f756e742050726f706f73616c7320736f206661722e20566f74657320666f72206120676976656e2070726f706f73616c3a202872657175697265645f7965735f766f7465732c207965735f766f746572732c206e6f5f766f74657273292e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e205468652028686173686573206f662920746865206163746976652070726f706f73616c732e00000000002f55736572732f612f7372632f737562737472617465322f73726d6c2f7374616b696e672f7372632f70687261676d656e2e727370726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b20716564436f756e63696c4d6f74696f6e732050726f706f73616c4f666475706c69636174652070726f706f73616c73206e6f7420616c6c6f77656470726f706f736572206e6f74206f6e20636f756e63696c436f756e63696c4d6f74696f6e732050726f706f73616c436f756e74436f756e63696c4d6f74696f6e732050726f706f73616c73436f756e63696c4d6f74696f6e7320566f74696e67766f746572206e6f74206f6e20636f756e63696c70726f706f73616c206d7573742065786973746d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f726564696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e6578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d5f736565646578745f6e6f776578745f64697370617463685f63616c6c6578745f696e7075745f73697a656578745f696e7075745f636f70796578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e7466756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e647343616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a202f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a090909097165645369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e7667617300000000000000000000002f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e7273617373657274696f6e206661696c65643a20656e64203c3d206c656e617373657274696f6e206661696c65643a20696e646578203c3d206c656e6066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e644e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e46756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64737461636b206d757374206265206e6f6e2d656d707479737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e64000000002f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e7273747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e647300002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e7273547261696c696e6744617461556e6578706563746564456f66496e76616c696444617461492f4f204572726f723a20696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f55736572732f612f7372632f737562737472617465322f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e727361757261736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214175726120696e686572656e742064617461206e6f7420666f756e644578706c69636974207265706f7274696e67206e6f7420616c6c6f77656474696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e45787472696e7369635375636365737345787472696e7369634661696c656420416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e48617368206e6f7420657175616c000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f55736572732f612f7372632f737562737472617465322f636f72652f73722d7072696d6974697665732f7372632f6c69622e72730000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f55736572732f612f7372632f737562737472617465322f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e727352756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e67617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a206361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e72736120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f727372632f6c6962636f72652f726573756c742e727300000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f666d742f6d6f642e7273010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202020202020202020202020202020202020202020203030303030303030303030303030303040404040400000000000000000000000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e6465782069732030303031303230333034303530363037303830393130313131323133313431353136313731383139323032313232323332343235323632373238323933303331333233333334333533363337333833393430343134323433343434353436343734383439353035313532353335343535353635373538353936303631363236333634363536363637363836393730373137323733373437353736373737383739383038313832383338343835383638373838383939303931393239333934393539363937393839397372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d7372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f66206000000000000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e00010305050606030706080809110a1c0b190c140d120e160f0410031212130916011705180219031a071c021d011f1620032b062c022d0b2e01300331023202a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f1838586898b8c98a0a4a6a8a9acbabebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74759697c9ff2f5f262e2fa7afb7bfc7cfd7df9a409798308f1fffceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100856070207150d500443032d03010411060f0c3a041d250d064c206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082a0682ff1118082f112d032010210f808c048297190b158894052f053b07020e180980af31740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880ba3d35040a06380846080c06740b1e035a0459098083181c0a1609460a808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b0210011104120513111402150217021a021c051d0824016a036b02bc02d102d40cd509d602d702da01e005e802ee20f004f9040c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1c848509379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a2225c5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d03f71727b5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a80a64e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b5f2148080a80a65e22450b0a060d1338080a362c041080c03c64530c0181004808531d398107460a1d03474937030e080a0639070a8136198107839a66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b65450b2f101140021e97f20e82f3a50d811f51818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b87d580d7294b050a0402831144814b3c06010455051b3402810e2c04640c560a0d035c043d391d0d2c040907020e06809a83d50b0d030a06740c59270c0438080a0628081e520c046703290d0a06030d30600e85927372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21b003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000d0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c813000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d000000000000001e1f20000000000021002200232425000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027280000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000002b2c00002d0000000000000000000000000000000000000000000000000000000000002e2f300000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000000000320033000000000000000000000000000000000000000000000000000034350000353535360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff06fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db07000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f662060426f72726f774572726f72426f72726f774d75744572726f723a20204572726f720041b8cfc2000bb8f10115001000240000004c98100017000000400200000900000039001000340000006d0010003100000097000000030000002600000000000000010000002700000028000000290000002a0000002b00000018000000040000002c0000002d0000002e0000002f000000ae0410007c0000002a051000350000007a00000006000000ac05100031000000dd0510003800000079000000040000001506100023000000dd051000380000007a00000004000000879510002800000038061000310000001a010000010000007006100048000000eb0900000a000000c006100019000000e00610002c000000ed0000001e0000009f07100022000000c10710002c000000b300000003000000ed07100028000000c10710002c000000b90000000300000000000000394b1000120000000000000014dc10000100000000000000000000002cdc1000010000000000000000000000320810000c000000000000000caa100001000000000000000000000024aa10000100000000000000000000003e08100006000000000000002caa100001000000000000000000000044aa1000010000000000000000000000440810000e000000000000004caa100001000000000000000000000064aa10000100000000000000000000005208100008000000000000006caa100001000000000000000000000084aa10000100000000000000000000005a0810000b000000000000008caa1000010000000000000000000000a4aa1000010000000000000000000000650810000c00000000000000acaa1000010000000000000000000000c4aa10000100000000000000000000009409100007000000000000009b0910003d000000400910005400000000000000390910000700000000000000137b1000070000001e0910001b00000000000000190910000500000000000000c882100003000000da0810003f00000000000000e56410000300000000000000137b100007000000c80810001200000000000000b60810000500000000000000bb0810000d0000009b0810001b000000000000008f08100004000000000000009308100008000000710810001e00000000000000e1091000130000000000000000000000f40910001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100030ab10000000000000000000f899100000000000000000000000000026000000000000000100000030000000970c10001c0000002e0a1000310000006900000003000000730c1000240000002e0a1000310000007100000003000000210c1000380000002e0a100031000000ae0000002a000000f90b1000280000002e0a100031000000af00000032000000d10b1000280000002e0a100031000000b10000002c000000a50b10002c0000002e0a100031000000b00000004c000000860a1000320000002e0a100031000000e5000000030000005f0a1000270000002e0a100031000000ed00000004000000060a1000280000002e0a100031000000f300000003000000620b100043000000dd05100038000000b20000000400000000000000b30c10000a000000000000005cac100001000000000000000000000074ac1000020000000000000000000000150d100004000000000000003a65100017000000bd0c10003d000000fa0c10001b00000038061000310000001a010000010000000000000081881000080000000000000020ae1000020000000000000000000000f8991000000000000000000000000000280d1000060000000000000030ae1000030000000000000000000000f89910000000000000000000000000002e0d1000070000000000000048ae1000020000000000000000000000f8991000000000000000000000000000350d1000060000000000000058ae1000010000000000000000000000f89910000000000000000000000000003b0d1000090000000000000058ae1000010000000000000000000000f8991000000000000000000000000000440d1000090000000000000058ae1000010000000000000000000000f8991000000000000000000000000000a1881000080000000000000060ae1000020000000000000000000000f89910000000000000000000000000004d0d1000090000000000000078071100020000000000000000000000f8991000000000000000000000000000560d10000b000000000000001cd71000010000000000000000000000f899100000000000000000007d0d1000090000006f7c1000070000007d0d1000090000006f7c100007000000112c10000e000000610d10000f000000700d10000d000000610d10000f000000610d10000f000000ee88100004000000500f100039000000900f100048000000100200002d000000000f100048000000f10900000e000000000000003b8b10000700000000000000a8b01000020000000000000000000000d8b01000010000000000000000000000d80f10000600000000000000e0b01000010000000000000000000000d8b01000010000000000000000000000428b10000400000000000000f8b0100002000000000000000000000028b11000020000000000000000000000de0f10000a00000000000000f8b0100002000000000000000000000038b11000020000000000000000000000e80f1000100000000000000048b1100003000000000000000000000090b11000010000000000000000000000f80f1000110000000000000098b11000010000000000000000000000b0b11000010000000000000000000000091010000d00000000000000b8b11000020000000000000000000000e8b11000010000000000000000000000161010000900000000000000f0b1100001000000000000000000000008b210000100000000000000000000001f1010000c00000000000000f899100000000000000000000000000010b210000100000000000000000000002b1010000c00000000000000f0b1100001000000000000000000000018b2100001000000000000000000000037101000080000000000000020b2100002000000000000000000000050b210000100000000000000000000003f1010000a00000000000000f899100000000000000000000000000058b21000010000000000000000000000468b10000800000000000000f44910001000000000000000b88010000500000000000000b77e1000150000006d1210002800000000000000468b100008000000000000005b12100012000000000000003f1110000900000000000000481110001800000000000000428b1000040000000000000057121000040000000a1210004d000000db1110002f0000007911100062000000db1110002f00000000000000468b10000800000000000000f44910001000000000000000778b10000900000000000000700d10000d00000000000000741110000500000000000000f96c10000e0000006011100014000000000000003f111000090000000000000048111000180000002a11100015000000000000002111100004000000000000003a6510001700000000000000251110000500000000000000808b10000c000000f91010002800000000000000f41010000500000000000000818210000c000000ce10100026000000a810100026000000821010002600000000000000691010000200000000000000818210000c000000000000006b1010000c00000000000000771010000b0000005a1010000f0000004910100011000000000000009e1210000f00000000000000000000007d0d10000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100020b910000000000000000000a0b8100001000000000000000100000000000000ad1210000b0000000000000000000000b81210002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100058b910000000000000000000a8b8100001000000000000000100000000000000e31210000900000001000000000000007d0d10000900000000000000ec1210002100000000000000000000000000000000000000000000000000000000000000f8991000b0b810000000000000000000c0b81000010000000000000000000000000000000d1310000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100008b910000000000000000000c8b8100001000000000000000100000000000000191310000e0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000d0b810000000000000000000e0b8100001000000000000000100000000000000271310000b0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e8b810000000000000000000f8b8100001000000000000000100000000000000321310000e0000000000000000000000771010000b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070b91000000000000000000000b91000010000000000000001000000000000001e4a10000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100008b91000000000000000000080d3100001000000000000000100000000000000401310000f0000000000000000000000610d10000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100020b91000000000000000000018b91000010000000000000001000000000000004f131000090000000000000000000000610d10000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100020b91000000000000000000030b910000100000000000000010000000000000058131000100000000100000000000000610d10000f00000000000000681310002d00000000000000000000000000000000000000000000000000000000000000f899100098b91000000000000000000038b9100001000000000000000000000000000000951310000d0000000100000000000000f96c10000e00000000000000a21310002b00000000000000000000000000000000000000000000000000000000000000f899100040b91000000000000000000050b9100001000000000000000100000000000000cd131000090000000100000000000000610d10000f00000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f899100058b91000000000000000000068b9100001000000000000000100000000000000d6131000060000000100000000000000dc1310001f00000000000000571210000400000000000000000000000000000000000000000000000000000000000000f899100070b91000000000000000000080b9100003000000000000000100000000000000fb131000050000000100000000000000818210000c00000000000000818210000c00000000000000000000000000000000000000000000000000000000000000f899100098b910000000000000000000a8b9100001000000000000000000000000000000001410000b0000000101000000000000818210000c000000000000000b1410001b00000000000000000000000000000000000000000000000000000000000000f8991000b0b910000000000000000000c0b910000100000000000000010000009b1810003d0000007b18100020000000260000000000000001000000310000005a18100021000000211810003900000026000000000000000100000032000000d41710004d000000260000000000000001000000330000009f17100035000000291710007600000026000000000000000100000034000000db1610004e00000026000000000000000100000035000000a9161000320000007c1610002d000000260000000000000001000000360000004c1610003000000026000000000000000100000036000000231610002900000026000000000000000100000030000000e4141000750000005915100072000000cb1510005800000026000000000000000100000030000000761410006e0000002600000000000000010000003700000026141000500000008795100028000000d8181000310000005300000001000000d8181000310000005300000001000000ab1a10001e000000c91a10002e000000ad0100000300000000000000381b10000a0000000000000044ef10000200000000000000000000008cba1000010000000000000000000000421b10000d000000000000001cd7100001000000000000000000000094ba1000010000000000000000000000b17a100008000000000000009cba1000040000000000000000000000bcba10000100000000000000921b10001b0000007b1b100017000000d789100009000000d7891000090000006f7c1000070000006f7c1000070000004f1b10002c0000008795100028000000af9510003d000000370100000900000000000000f51d10000c0000000100000000000000818210000c00000000000000011e10000800000000000000000000000000000000000000000000000000000000000000f899100068bf1000000000000000000028bf100001000000000000000100000000000000091e10000e0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018c51000000000000000000030bf100001000000000000000000000000000000171e1000100000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018c51000000000000000000038bf100001000000000000000000000000000000271e1000090000000100000000000000f96c10000e000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000040bf100001000000000000000100000000000000301e10000d0000000100000000000000e08910000300000000000000137b10000700000000000000000000000000000000000000000000000000000000000000f899100048bf1000000000000000000058bf1000010000000000000001000000000000003d1e10000a00000000000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000060bf100001000000000000000100000000000000471e1000060000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100068bf1000000000000000000078bf1000010000000000000001000000000000004d1e10000a00000000000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000080bf100001000000000000000100000000000000571e10000e00000000000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000098bf100001000000000000000100000000000000651e10000600000000000000000000006b1e10000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0bf10000000000000000000b0bf100001000000000000000100000000000000741e10000600000000000000000000007a1e10001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8bf10000000000000000000c8bf1000010000000000000001000000ab2010001f0000007d2010002e0000002f2010004e000000092010002600000026000000000000000100000036000000bd1f10004c0000009b1f10002200000026000000000000000100000033000000591f1000420000003d1f10001c00000026000000000000000100000038000000f81e10004500000026000000000000000100000036000000bc1e10003c00000026000000000000000100000036000000941e10002800000000000000ca201000080000000000000028c0100002000000000000000000000058c01000080000000000000000000000d22010000b0000000000000098c01000030000000000000000000000e0c01000080000000000000000000000918010000400000000000000958010002300000000000000b8801000050000000000000038221000130000005322100036000000f8991000000000008922100042000000cb221000480000001323100045000000582310002d000000f8991000000000008523100046000000000000001132100003000000000000009580100023000000000000003422100004000000000000003822100013000000000000004b22100008000000000000003822100013000000dd20100025000000f899100000000000022110004000000042211000460000008821100049000000d121100036000000f899100000000000072210002d00000000000000e32310000d0000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000008c5100001000000000000000100000000000000fa231000120000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000010c5100001000000000000000100000000000000d48110000b0000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c510000000000000000000ec10110001000000000000000100000000000000eb8110000b0000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c510000000000000000000f410110001000000000000000100000000000000f6811000120000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c510000000000000000000fc1011000100000000000000010000000000000008821000120000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000014111100010000000000000001000000000000000c241000070000000100000000000000818210000c00000000000000132410001b00000000000000000000000000000000000000000000000000000000000000f899100018c51000000000000000000028c51000010000000000000000000000000000002e2410000b0000000100000000000000818210000c00000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000030c510000b000000000000000100000000000000392410000f0000000100000000000000818210000c00000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000098c510000b00000000000000010000000000000048241000050000000100000000000000818210000c000000000000004d2410002c00000000000000000000000000000000000000000000000000000000000000f8991000f0c51000000000000000000000c61000010000000000000001000000d729100026000000a229100035000000260000000000000001000000300000006c29100036000000f226100027000000f8991000000000001927100050000000692710005d000000c6271000550000001b2810004f0000006a28100051000000bb28100015000000f899100000000000d028100057000000272910004500000026000000000000000100000032000000a72410005d0000000425100027000000f8991000000000002b2510005b0000008625100049000000f899100000000000cf2510005d0000002c2610002d000000f8991000000000005926100053000000ac2610004600000026000000000000000100000036000000792410002e0000008795100028000000692a1000300000006901000001000000692a100030000000690100000100000000000000822b10000b0000000000000078071100020000000000000000000000e0c610000100000000000000000000008d2b100010000000000000001cd71000010000000000000000000000e8c610000100000000000000000000009d2b10000c0000000000000098071100010000000000000000000000f0c61000010000000000000000000000a92b10000e00000000000000f8c6100002000000000000000000000008c7100001000000000000006b2c1000150000005c2c10000f0000001f2c10003d000000112c10000e000000112c10000e000000b72b10005a0000008795100028000000902c1000390000005c00000008000000002d100019000000202d100048000000bb0100002d00000000000000d92f10000d00000000000000f8c8100002000000000000000000000028c91000020000000000000000000000e62f10001300000000000000f8c8100002000000000000000000000038c91000020000000000000000000000f92f1000130000000000000048c91000040000000000000000000000a8c910000500000000000000000000000c3010000d00000000000000d0c91000010000000000000000000000e8c91000010000000000000000000000193010001000000000000000f0c9100001000000000000000000000008ca1000030000000000000000000000293010000e0000000000000020ca100003000000000000000000000068ca100003000000000000000000000037301000110000000000000080ca100001000000000000000000000098ca1000030000000000000000000000483010000d00000000000000b0ca1000010000000000000000000000c8ca1000030000000000000000000000553010001900000000000000e0ca1000010000000000000000000000f8ca10000200000000000000000000006e3010001100000000000000e0ca100001000000000000000000000008cb10000200000000000000000000009736100005000000000000009c3610000900000000000000558b10000500000000000000c2331000120000003f361000580000002f36100010000000ca351000650000002f3610001000000000000000a13510000e00000000000000808b10000c00000000000000113210000300000000000000958010002300000000000000af3510000900000000000000808b10000c00000000000000b83510001200000000000000c2331000120000008534100058000000dd3410005c0000003935100028000000f899100000000000613510004000000000000000558b10000500000000000000808b10000c0000003a3410004b00000000000000363410000400000000000000808b10000c000000d43310001e000000f899100000000000f23310004400000000000000b43310000900000000000000958010002300000000000000bd3310000500000000000000b77e10001500000000000000558b10000500000000000000c233100012000000d4321000590000002d33100069000000963310001e00000000000000413110000500000000000000808b10000c00000014321000590000006d3210005a000000c73210000d000000000000001132100003000000000000009580100023000000463110005c000000a231100050000000f23110001f000000000000004131100005000000000000003a65100017000000eb30100056000000d3301000180000007f30100054000000d33010001800000000000000ac3610000d0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e8d210000000000000000000f8d2100001000000000000000100000000000000b93610000a0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100000d31000000000000000000010d3100001000000000000000100000000000000c3361000140000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d31000000000000000000028d3100001000000000000000100000000000000d73610000a0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100030d31000000000000000000040d3100001000000000000000100000000000000e1361000140000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070d31000000000000000000048d3100001000000000000000100000000000000f5361000130000000000000000000000083710000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100050d31000000000000000000060d31000020000000000000001000000000000001e4a10000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070d31000000000000000000080d3100001000000000000000100000000000000113710000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088d31000000000000000000098d31000010000000000000001000000000000001d3710000c0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d410000000000000000000a0d3100001000000000000000100000000000000293710000d0000000000000000000000363710002300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d410000000000000000000a8d310000400000000000000010000000000000059371000090000000000000000000000083710000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d410000000000000000000c8d3100001000000000000000100000000000000623710000b0000000100000000000000818210000c000000000000009c3610000900000000000000000000000000000000000000000000000000000000000000f899100040d410000000000000000000d0d31000020000000000000001000000000000006d3710000e0000000100000000000000818210000c000000000000007b3710001000000000000000000000000000000000000000000000000000000000000000f8991000f0d310000000000000000000e0d31000020000000000000000000000000000008b3710000c0000000100000000000000818210000c00000000000000083710000900000000000000000000000000000000000000000000000000000000000000f8991000f0d31000000000000000000000d410000100000000000000000000000000000097371000060000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d41000000000000000000008d41000010000000000000001000000000000009d3710000a0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d41000000000000000000010d4100001000000000000000100000000000000a73710000e0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d410000000000000000000f899100000000000000000000100000000000000b53710000c0000000000000000000000c13710002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028d41000000000000000000038d4100001000000000000000000000000000000e9371000100000000000000000000000f93710001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d41000000000000000000050d41000010000000000000001000000000000000a3810000b0000000000000000000000153810002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100058d41000000000000000000068d4100001000000000000000000000026000000000000000100000039000000dd3d100041000000260000000000000001000000320000009b3d1000420000002600000000000000010000003a000000583d1000430000002600000000000000010000003b0000000b3d10004d000000bc3c10004f0000002600000000000000010000003c000000403c100068000000a83c10001400000026000000000000000100000034000000123c10002e0000002600000000000000010000003d000000ec3b100026000000b23b10003a000000853a10005b000000e03a10005c0000003c3b10005c000000983b10001a000000443a100041000000d93910005b000000343a100010000000643910005f000000c3391000160000002600000000000000010000003000000024391000400000000c39100018000000f03810001c0000002600000000000000010000003500000026000000000000000100000031000000a838100048000000260000000000000001000000360000006e3810003a000000260000000000000001000000310000003638100038000000b03f100039000000202d100048000000100200002d000000603f100048000000eb0900000a000000603f100048000000f10900000e0000008795100028000000e93f100031000000ab00000001000000e93f100031000000ab00000001000000004510000d000000e54410001b000000948610002f000000f1000000010000000d451000100000001d4510000f0000002c451000130000003f4510000f0000004e45100014000000624510000f000000714510001600000087451000150000009c4510001d00000045921000130000009603000009000000c045100043000000860a000025000000c0451000430000008c0a00002c00000000000000164610001000000000000000c0d51000040000000000000000000000e0d51000020000000000000000000000264610000f00000000000000c0d51000040000000000000000000000f0d510000200000000000000ea88100004000000e089100003000000e089100003000000e089100003000000904610004000000068461000280000003546100033000000684610002800000000000000d04610000e000000000000002cd6100001000000000000000000000034d6100001000000000000000247100016000000de46100024000000294710002b0000005447100031000000f10000000400000085471000300000005447100031000000db00000004000000b54710004e0000005447100031000000dc000000040000008795100028000000574810002c0000008c000000010000008795100028000000d8481000320000003a00000001000000000000005749100005000000000000000cd7100001000000000000000000000014d710000100000000000000000000005c4910000a000000000000001cd7100001000000000000000000000024d710000100000000000000ee88100004000000a249100018000000d789100009000000664910003c000000000000003b8b1000070000000000000008d81000010000000000000000000000f8991000000000000000000000000000428b1000040000000000000020d81000020000000000000000000000f8991000000000000000000000000000ba491000040000000000000050d81000010000000000000000000000f8991000000000000000000000000000be491000120000000000000068d81000010000000000000000000000f8991000000000000000000000000000d0491000110000000000000068d81000010000000000000000000000f8991000000000000000000000000000468b10000800000000000000f44910001000000000000000468b100008000000000000004e8b10000700000000000000708b10000700000000000000ee8810000400000000000000e74910000d000000000000004e8b10000700000000000000e149100006000000000000003a6510001700000000000000114a10000d0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0db10000000000000000000f8991000000000000000000001000000000000001e4a10000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040df10000000000000000000f8991000000000000000000001000000000000002a4a1000100000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b0db10000000000000000000c0db100001000000000000000100000000000000b58b10000900000000000000000000003a4a10001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c8db10000000000000000000f899100000000000000000000100000000000000ca8b10000a00000001000000000000004e8b10000700000000000000584a10000b00000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000634a10000e00000001000000000000004e8b10000700000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f8991000c8db10000000000000000000f899100000000000000000000100000000000000714a10000d00000001000000000000007e4a10001700000000000000ee8810000400000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000954a10000e00000001000000000000004e8b10000700000000000000a34a10002300000000000000000000000000000000000000000000000000000000000000f8991000d8db10000000000000000000f89910000000000000000000000000002600000000000000010000003400000026000000000000000100000033000000c64a100073000000260000000000000001000000360000002600000000000000010000003100000000000000394b1000120000000000000014dc10000100000000000000000000002cdc1000010000000000000000000000644b10000700000000000000137b1000070000004b4b10001900000000000000b14b10000d0000000000000000000000be4b10003200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000f04b10000a0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000fa4b1000030000000000000028dd100001000000000000000000000040dd1000080000000000000000000000384d100003000000000000003b4d100012000000fd4b100016000000f899100000000000134c10005d000000704c10002f000000f8991000000000009f4c100063000000aba7100001000000024d10003600000000000000564d10000300000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100010df1000000000000000000020df100001000000000000000100000000000000594d10000b00000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028df1000000000000000000038df100001000000000000000000000000000000644d10000d00000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040df1000000000000000000050df100004000000000000000100000000000000714d1000090000000000000000000000ee8810000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070df1000000000000000000080df100001000000000000000100000026000000000000000100000033000000214f10002400000026000000000000000100000030000000d04e1000510000002600000000000000010000003e000000a74d10005a000000014e10005a0000005b4e100059000000b44e10001c000000260000000000000001000000300000007a4d10002d0000009048100048000000eb0900000a000000574810002c0000008c00000001000000d8481000320000003a0000000100000000000000ad7a1000040000000000000008d8100001000000000000000000000010e010000300000000000000000000005d551000070000000000000028e0100001000000000000000000000040e010000300000000000000f35110004e000000f899100000000000bf5110003400000000000000e564100003000000000000009580100023000000625110005d000000f899100000000000bf511000340000000000000045521000030000000000000000000000818210000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000bce010000000000000000000cce010000100000000000000010000002600000000000000010000003f000000485210002100000000000000825210000a0000000000000000e1100001000000000000000000000008e110000200000000000000035310000b0000008c52100055000000e15210002200000000000000818810000800000000000000f4e11000010000000000000000000000fce110000100000000000000000000000e531000080000000000000014ef100001000000000000000000000004e210000100000000000000000000001653100007000000000000000ce2100003000000000000000000000024e210000100000000000000000000001d531000050000000000000014ef10000100000000000000000000002ce2100001000000000000000000000022531000080000000000000014ef100001000000000000000000000034e2100001000000000000003c8a10000d000000f35310000e000000b95310003a0000003c8a10000d0000006f7c100007000000d789100009000000995310002000000076531000230000002a5310004c0000008795100028000000945410002f0000003b000000010000008795100028000000c3541000300000003800000001000000f35410003300000026551000370000008300000005000000000000005d551000070000000000000008e3100001000000000000000000000020e31000020000000000000000000000645510000a0000000000000070f4100001000000000000000000000030e310000100000000000000000000006e5510001100000000000000b8f4100001000000000000000000000038e31000010000000000000000000000515610000300000000000000545610000d000000f0551000580000004856100009000000955510005b0000007f5510001600000000000000926d10000a0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100054ec1000000000000000000060e6100001000000000000000100000000000000685610000d0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100068e61000000000000000000078e6100001000000000000000100000000000000755610000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088e61000000000000000000080e6100001000000000000000100000000000000815610000c00000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088e61000000000000000000098e610000100000000000000010000000000000096561000110000000000000000000000ee8810000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000a0e6100002000000000000000000000000000000a7561000100000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000b0e6100001000000000000000000000000000000b75610000a0000000100000000000000818210000c00000000000000545610000d00000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000b8e6100001000000000000000000000000000000c1561000110000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000d0e61000010000000000000000000000625810001f00000026000000000000000100000034000000435810001f000000255810001e00000026000000000000000100000033000000fd571000280000003f5710005e0000009d571000600000000f57100030000000eb5610002400000026000000000000000100000030000000d25610001900000000000000815810000d00000000000000b4e71000020000000000000000000000e4e710000300000000000000000000008e5810000700000000000000fce7100001000000000000000000000014e810000100000000000000000000009558100009000000000000001ce810000400000000000000000000007ce810000100000000000000000000009e5810000f0000000000000084e810000100000000000000000000009ce81000010000000000000000000000ad581000100000000000000084e81000010000000000000000000000a4e81000020000000000000000000000b88010000500000000000000b77e10001500000000000000c85a10000b0000000000000095801000230000001b5a10004b000000665a10004d000000b35a10001500000000000000145a10000700000000000000b77e100015000000e75910002d00000000000000a55910000d00000000000000b25910001000000000000000c25910001500000000000000b77e10001500000000000000d75910000c000000000000003a6510001700000000000000e35910000400000000000000b259100010000000895910001c000000000000007e5910000b000000000000005a8b1000160000003f5910003f000000bd58100057000000145910002b00000000000000db5a10000c0000000000000000000000e75a10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100024ec10000000000000000000d4eb100002000000000000000100000000000000ee5a1000130000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910000cec10000000000000000000e4eb100001000000000000000100000000000000015b10000b0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000eceb10000000000000000000fceb1000010000000000000001000000000000000c5b1000040000000000000000000000e75a10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100024ec1000000000000000000004ec100001000000000000000100000000000000105b1000030000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910000cec100000000000000000001cec1000010000000000000001000000000000002a8c10000d00000000000000000000003c8a10000d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100024ec1000000000000000000034ec100001000000000000000100000000000000b58b10000900000001000000000000003c8a10000d00000000000000135b10002400000000000000000000000000000000000000000000000000000000000000f89910003cec100000000000000000004cec100001000000000000000000000000000000375b1000090000000000000000000000405b10001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100054ec1000000000000000000064ec1000010000000000000001000000c35c100054000000175d100037000000715c100052000000260000000000000001000000400000004f5c1000220000000b5c10004400000026000000000000000100000032000000d85b10003300000026000000000000000100000035000000af5b10002900000026000000000000000100000030000000905b10001f00000026000000000000000100000036000000525b10003e000000a05d100039000000e05d100048000000100200002d000000945410002f0000003b00000001000000c354100030000000380000000100000000000000d55e10000f00000000000000d0ec1000020000000000000000000000e0ec10000400000000000000d7891000090000005f5f10000c000000e45e100022000000f899100000000000065f100041000000475f100018000000c05f100019000000e05f100048000000bb0100002d0000008795100028000000286010002f0000004800000001000000286010002f0000004800000001000000b560100036000000e9871000580000008d01000005000000786010003d000000e987100058000000940100000500000000000000f26010000b0000000000000000000000fd6010000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100038ee1000000000000000000048ee1000010000000000000001000000000000000c611000070000000100000000000000fd6010000f00000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f899100050ee1000000000000000000060ee100001000000000000000100000026000000000000000100000035000000296110001f000000260000000000000001000000360000001361100016000000b560100036000000e987100058000000b401000005000000e987100058000000bb010000050000000000000070611000060000000000000014ef10000100000000000000000000001cef1000010000000000000000000000766110000e0000000000000024ef100002000000000000000000000034ef1000020000000000000000000000846110000c0000000000000044ef100002000000000000000000000054ef100001000000000000006f7c1000070000007562100038000000d789100009000000e089100003000000db611000550000003062100045000000d7891000090000006f7c100007000000906110004b00000000000000ed6210000400000000000000f0f1100003000000000000000000000038f21000040000000000000000000000f16210000a0000000000000058f2100001000000000000000000000070f21000060000000000000000000000fb6210000600000000000000a0f21000010000000000000000000000b8f210000a0000000000000000000000016310001100000000000000f899100000000000000000000000000008f3100008000000000000000000000012631000080000000000000048f3100001000000000000000000000060f310000500000000000000000000001a631000080000000000000088f31000010000000000000000000000a0f31000050000000000000000000000226310000500000000000000f8991000000000000000000000000000c8f31000050000000000000000000000276310000900000000000000f0f3100001000000000000000000000008f41000050000000000000000000000306310000e0000000000000030f4100001000000000000000000000048f410000500000000000000000000003e631000140000000000000070f4100001000000000000000000000088f4100001000000000000000000000052631000140000000000000070f4100001000000000000000000000090f4100001000000000000000000000066631000130000000000000098f41000010000000000000000000000b0f41000010000000000000000000000796310000d00000000000000b8f41000010000000000000000000000d0f4100002000000000000000000000086631000170000000000000098f41000010000000000000000000000e0f410000100000000000000000000009d6310001100000000000000e8f4100001000000000000000000000000f510000100000000000000000000000b6610000a00000000000000958010002300000000000000b88010000500000000000000b77e100015000000000000006a66100005000000000000006f66100011000000986a100060000000f86a10001a000000f899100000000000126b100049000000000000008a6a10000e00000000000000b77e100015000000d06910005d0000002d6a100009000000f899100000000000366a100054000000f899100000000000b66510005500000000000000b88010000500000000000000b77e10001500000046681000550000009b68100040000000db6810004d000000f89910000000000028691000520000007a69100030000000f8991000000000001566100055000000f899100000000000aa69100026000000806710004b000000f899100000000000cb6710004d0000001868100013000000f8991000000000001566100055000000f8991000000000002b6810001b000000000000005f6710000500000000000000646710001c000000256710003a000000f8991000000000007f65100037000000f899100000000000156610005500000000000000f66610000700000000000000fd66100028000000b266100044000000f8991000000000007f65100037000000f89910000000000015661000550000008066100032000000f8991000000000007f65100037000000f8991000000000001566100055000000000000006a66100005000000000000006f66100011000000516510002e000000f8991000000000007f65100037000000f8991000000000001566100055000000000000000b6610000a000000000000009580100023000000516510002e000000f8991000000000007f65100037000000f899100000000000b66510005500000000000000e564100003000000000000003a651000170000001465100026000000e86410002c00000000000000e56410000300000000000000808b10000c000000c56410002000000000000000b86410000d00000000000000ee88100004000000206410004f0000006f64100049000000fc6310002400000000000000e16310000a00000000000000eb63100011000000ae63100033000000806c100048000000f10900000e00000000000000c86c10000e0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e0ff1000000000000000000078fe100001000000000000000100000000000000d66c1000150000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100080fe1000000000000000000090fe100001000000000000000100000000000000eb6c10000e0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000d8fe1000000000000000000098fe100001000000000000000100000000000000076d10000d0000000000000000000000146d10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0fe10000000000000000000b0fe100001000000000000000100000000000000846110000c0000000000000000000000146d10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8fe10000000000000000000c8fe1000010000000000000001000000000000001b6d1000110000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e0ff10000000000000000000d0fe1000010000000000000001000000000000002c6d10000f0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000d8fe10000000000000000000e8fe1000010000000000000001000000000000003b6d10000d0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000100011000000000000000000f0fe100002000000000000000100000000000000486d1000060000000100000000000000818210000c00000000000000818210000c00000000000000000000000000000000000000000000000000000000000000f8991000f8ff1000000000000000000000ff1000010000000000000000000000000000004e6d1000060000000100000000000000818210000c00000000000000546d10003900000000000000000000000000000000000000000000000000000000000000f8991000f8ff1000000000000000000008ff1000010000000000000000000000000000008d6d1000050000000100000000000000818210000c000000000000006f6610001100000000000000000000000000000000000000000000000000000000000000f899100010ff1000000000000000000020ff100001000000000000000100000000000000926d10000a0000000101000000000000818210000c00000000000000646710001c00000000000000000000000000000000000000000000000000000000000000f899100028ff1000000000000000000038ff1000010000000000000001000000000000009c6d10000a0000000101000000000000818210000c00000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f899100010001100000000000000000040ff100001000000000000000100000000000000a66d1000070000000100000000000000818210000c00000000000000ad6d10002400000000000000000000000000000000000000000000000000000000000000f899100048ff1000000000000000000058ff100004000000000000000100000000000000d16d10000e0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100010001100000000000000000078ff100001000000000000000100000000000000df6d10000a0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0ff1000000000000000000080ff100001000000000000000100000000000000e96d1000140000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8ff10000000000000000000b0fe100001000000000000000100000000000000fd6d1000100000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8ff1000000000000000000088ff1000020000000000000001000000000000000d6e1000120000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000f8ff1000000000000000000098ff1000010000000000000000000000000000001f6e1000130000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0ff10000000000000000000b0ff100001000000000000000100000000000000326e1000090000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8ff10000000000000000000c8ff1000030000000000000001000000000000003b6e10000a0000000100000000000000818210000c00000000000000e08910000300000000000000000000000000000000000000000000000000000000000000f8991000e0ff10000000000000000000f0ff100001000000000000000100000000000000456e10000d0000000000000000000000526e10000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000f8ff100000000000000000000800110001000000000000000000000000000000546e10000f0000000000000000000000636e10002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100010001100000000000000000020001100010000000000000001000000e97510002a000000260000000000000001000000410000009975100050000000707510002900000026000000000000000100000042000000287510004800000026000000000000000100000043000000d474100054000000867410004e00000026000000000000000100000034000000587410002e0000008473100069000000ed7310006b0000004473100040000000f37210005100000026000000000000000100000030000000ba72100039000000260000000000000001000000440000006972100051000000107210005900000026000000000000000100000045000000507110006c000000bc71100030000000f899100000000000ec71100024000000117110003f000000fa701000170000006d7010005a000000c770100033000000497010002400000026000000000000000100000033000000117010003800000026000000000000000100000032000000956f10004c000000f899100000000000e16f10003000000026000000000000000100000035000000216f10007400000026000000000000000100000030000000076f10001a000000260000000000000001000000360000008b6e10007c0000008795100028000000137610002f0000002c020000010000000078100019000000b077100048000000bb0100002d0000007077100039000000b077100048000000100200002d0000004600000028000000040000004700000048000000000000000000000049000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000806c100048000000eb0900000a000000137610002f0000002c0200000100000000000000207a100006000000000000004a00000000000000000000004b000000000000000000000002000000000000000000000000000000000000004c000000000000000000000000000000267a100004000000000000004d00000000000000020000000000000000000000000000000200000000000000000000000000000002000000000000000000000000000000000000002a7a100009000000000000004e00000000000000000000004f0000000000000000000000000000005000000000000000000000000200000000000000000000000000000000000000337a100009000000000000005100000000000000000000005200000000000000000000000000000053000000000000000000000002000000000000000000000000000000000000003c7a10000700000000000000540000000000000000000000550000000000000000000000000000005600000000000000000000000000000057000000000000000000000000000000437a10000800000000000000580000000000000000000000590000000000000000000000000000005a0000000000000000000000000000005b0000000000000000000000000000004b7a100007000000000000005c00000000000000000000005d0000000000000000000000000000005e0000000000000000000000000000005f000000000000000000000000000000527a10000700000000000000600000000000000000000000610000000000000000000000000000006200000000000000000000000000000063000000000000000000000000000000597a10000900000000000000640000000000000000000000650000000000000000000000000000006600000000000000000000000000000067000000000000000000000000000000627a10000700000000000000680000000000000000000000690000000000000000000000000000006a0000000000000000000000000000006b000000000000000000000000000000697a10000e000000000000006c00000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f000000000000000000000000000000777a10000f00000000000000700000000000000000000000710000000000000000000000000000007200000000000000000000000000000073000000000000000000000000000000867a100010000000000000004d0000000000000002000000000000000000000000000000000000007400000000000000000000000200000000000000000000000000000000000000967a100007000000000000007500000000000000000000007600000000000000000000000000000077000000000000000000000000000000780000000000000000000000000000009d7a100008000000000000007900000000000000000000007a0000000000000000000000000000007b0000000000000000000000000000007c000000000000000000000000000000a57a100008000000000000007d00000000000000000000007e0000000000000000000000000000007f00000000000000000000000000000080000000000000000000000000000000ad7a10000400000000000000810000000000000000000000820000000000000000000000000000008300000000000000000000000000000084000000000000000000000000000000b17a100008000000000000005807110003000000000000000000000070071100010000000000000000000000b97a10000c000000000000007807110002000000000000000000000088071100010000000000000000000000c57a10000a000000000000008813110001000000000000000000000090071100010000000000000000000000cf7a10000f0000000000000098071100010000000000000000000000a0071100010000000000000000000000de7a10000a00000000000000a8071100020000000000000000000000b8071100020000000000000000000000e87a10000800000000000000c8071100020000000000000000000000d80711000100000000000000d789100009000000d7891000090000006f7c1000070000001a7c100055000000d789100009000000d789100009000000e37b100037000000b57b10002e000000e089100003000000857b100030000000d789100009000000ee881000040000001a7b10004e000000687b10001d000000d789100009000000137b100007000000f07a10002300000000000000767c10000f0000000000000090081100010000000000000000000000a8081100030000000000000000000000857c10000800000000000000c0081100020000000000000000000000f00811000200000000000000000000008d7c100004000000000000000009110004000000000000000000000060091100070000000000000000000000917c1000060000000000000098091100040000000000000000000000f80911000a0000000000000000000000bc8110000800000000000000c4811000100000004c8110002d000000f899100000000000798110004300000000000000cc7e10000900000000000000d57e10000f00000000000000488110000400000000000000137b100007000000bd80100056000000138110003500000000000000918010000400000000000000958010002300000000000000b88010000500000000000000b77e10001500000000000000cc7e10000900000000000000d57e10000f00000000000000f87e10000400000000000000137b100007000000fc7e100042000000f8991000000000003e7f10004a000000887f10002c000000b47f100046000000fa7f1000520000004c8010004500000000000000ae7e10000900000000000000b77e10001500000000000000cc7e10000900000000000000d57e10000f00000000000000e47e10000900000000000000ed7e10000b00000000000000f87e10000400000000000000137b100007000000977c10006a000000f899100000000000017d100021000000f899100000000000227d100050000000727d100041000000b37d10005b0000000e7e100057000000657e10002a0000008f7e10001f00000000000000d48110000b0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000041111000000000000000000ec10110001000000000000000100000000000000eb8110000b0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000041111000000000000000000f410110001000000000000000100000000000000f6811000120000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000041111000000000000000000fc1011000100000000000000010000000000000008821000120000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100004111100000000000000000014111100010000000000000001000000000000001a8210000b0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910001c11110000000000000000002c11110001000000000000000100000000000000258210000b0000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910003411110000000000000000004411110001000000000000000100000000000000368210000d0000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910004c11110000000000000000005c1111000100000000000000010000000000000043821000080000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100064111100000000000000000074111100010000000000000001000000000000004b821000080000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910007c11110000000000000000008c11110001000000000000000100000000000000538210000d0000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000941111000000000000000000a41111000100000000000000010000000000000060821000080000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e41111000000000000000000ac11110001000000000000000100000000000000688210000f0000000000000000000000c48110001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b41111000000000000000000c411110001000000000000000100000000000000778210000a0000000100000000000000818210000c00000000000000ed7e10000b00000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000cc111100010000000000000000000000000000008d8210000c0000000100000000000000ed7e10000b00000000000000137b10000700000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000d411110001000000000000000000000000000000998210000b0000000100000000000000ed7e10000b00000000000000a48210001600000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000dc11110001000000000000000000000000000000ba8210000e0000000000000000000000c88210000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e41111000000000000000000f411110001000000000000000100000000000000cb8210000d0000000100000000000000818210000c00000000000000d88210000b00000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000cc111100010000000000000000000000d985100025000000b2851000270000007b8510003700000026000000000000000100000032000000388510004300000026000000000000000100000085000000088510003000000026000000000000000100000086000000d68410003200000026000000000000000100000087000000a88410002e0000002600000000000000010000003a0000008a8410001e000000260000000000000001000000880000005884100032000000260000000000000001000000890000001c8410003c000000fc831000200000002600000000000000010000008a000000d783100025000000ad8310002a0000005483100059000000f78210005d00000026000000000000000100000033000000e382100014000000260000000000000001000000300000006c86100028000000948610002f00000000010000040000008795100028000000d786100030000000e800000001000000d786100030000000e80000000100000000000000818810000800000000000000281311000400000000000000000000004813110001000000000000000000000089881000050000000000000050131100050000000000000000000000781311000200000000000000000000008e88100008000000000000008813110001000000000000000000000090131100010000000000000000000000968810000b000000000000008813110001000000000000000000000098131100010000000000000000000000a18810000800000000000000a0131100020000000000000000000000b01311000100000000000000d7891000090000003c8a10000d000000ea88100004000000e089100003000000e389100059000000d789100009000000ea88100004000000ee88100004000000e089100003000000e08910000300000058891000420000009a8910003d000000ea881000040000002789100031000000f288100035000000ea88100004000000ee88100004000000a988100041000000508a100019000000708a100048000000bb0100002d0000008795100028000000088b1000330000004200000001000000000000003b8b1000070000000000000040141100020000000000000000000000f8991000000000000000000000000000428b1000040000000000000070141100030000000000000000000000f8991000000000000000000000000000778b10000900000000000000808b10000c00000000000000468b100008000000000000008c8b10001b00000000000000468b100008000000000000004e8b10000700000000000000558b100005000000000000005a8b10001600000000000000708b10000700000000000000ee8810000400000000000000b58b1000090000000000000000000000be8b10000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910004816110000000000000000005816110001000000000000000100000000000000ca8b10000a00000001000000000000004e8b10000700000000000000d48b10001600000000000000000000000000000000000000000000000000000000000000f89910006816110000000000000000006016110001000000000000000000000000000000ea8b10000600000001000000000000004e8b10000700000000000000f08b10003a00000000000000000000000000000000000000000000000000000000000000f899100068161100000000000000000078161100010000000000000000000000000000002a8c10000d0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910008016110000000000000000009016110001000000000000000100000026000000000000000100000036000000c58c100026000000928c10003300000026000000000000000100000030000000498c10004900000026000000000000000100000035000000378c100012000000c08a100048000000f10900000e000000508a100019000000f08c100034000000df000000180000008a8e100023000000608e10002a000000088b1000330000004200000001000000909010006200000023010000170000006b90100025000000be91100012000000d09110000f000000919110000a0000009b91100014000000af9110000f000000f0911000550000008800000016000000589210001c00000045921000130000007704000009000000749210001e00000045921000130000006e030000090000004793100012000000599310000c0000004094100069000000c8000000110000001095100048000000eb0900000a0000007c9510000b0000008795100028000000af9510003d00000087000000090000008795100028000000af9510003d000000900000000900000000000000b09610001000000000000000f899100000000000000000000000000020181100010000000000000000000000c09610000f00000000000000f8991000000000000000000000000000281811000100000000000000e496100025000000cf9610001500000020971000190000004097100035000000140100002a0000008097100019000000a09710003d0000005500000022000000ff9710002d0000002c9810000c00000038981000030000003b981000110000004c98100017000000ea02000005000000b09810004600000063010000130000008b00000004000000040000008c0000008d0000008e000000f899100000000000a9a71000020000009698100015000000e503000005000000f899100020000000189a1000120000002600000000000000010000008f0000000a9b100006000000109b100022000000f29a1000180000006d09000005000000329b100016000000489b10000d000000f29a1000180000007309000005000000739b10000b0000007aa7100016000000559b1000010000005d9b100016000000da0700000900000058a710000e00000066a71000040000006aa7100010000000559b1000010000005d9b100016000000de0700000500000018a710002b00000043a71000150000005901000015000000739b10000b0000007e9b100026000000a49b100008000000ac9b100006000000559b1000010000005d9b100016000000eb07000005000000f899100000000000d69b100002000000c09b1000160000005404000011000000c09b1000160000004804000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f2010a110004a00000060a310000002000060a510003700000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b0200010202020203020202020402050602020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202070202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202f0a01000200000002700000019000000f0a01000200000002800000020000000f0a01000200000002a00000019000000f0a01000200000002b00000018000000f0a01000200000002c00000020000000f89910000000000043a71000150000000a0400000500000000f2b202046e616d6501e9b202d603000e6578745f626c616b65325f323536010c6578745f74776f785f31323802146578745f6765745f73746f726167655f696e746f030f6578745f7365745f73746f7261676504166578745f73616e64626f785f6d656d6f72795f6e6577051b6578745f73616e64626f785f6d656d6f72795f74656172646f776e06176578745f73616e64626f785f696e7374616e746961746507126578745f73616e64626f785f696e766f6b65081d6578745f73616e64626f785f696e7374616e63655f74656172646f776e09116578745f636c6561725f73746f726167650a0e6578745f7072696e745f757466380b126578745f737232353531395f7665726966790c126578745f656432353531395f7665726966790d106578745f73746f726167655f726f6f740e186578745f73746f726167655f6368616e6765735f726f6f740f166578745f6b696c6c5f6368696c645f73746f7261676510166578745f73616e64626f785f6d656d6f72795f67657411166578745f73616e64626f785f6d656d6f72795f736574120d6578745f7072696e745f686578131f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765141a6578745f6765745f6368696c645f73746f726167655f696e746f15176578745f636c6561725f6368696c645f73746f7261676516156578745f7365745f6368696c645f73746f7261676517236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74180d6578745f7072696e745f6e756d190a6578745f6d616c6c6f631a086578745f667265651b683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68303231373834323236636231343233301c6b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343166626563396365303634353835631d0e5f5f727573745f6465616c6c6f631e0e5f5f727573745f7265616c6c6f631f0c5f5f727573745f616c6c6f632008727573745f6f6f6d2134616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a6833616366383265303938633739353262227d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6861633164616637393865303539383533236f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6830643239336438356235303038613237246f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6831626464663939613338333164383761256c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6865623862313862343464343532613865266f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a683334343231663138386263626664353927443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68306232653038356334663161353834382825616c6c6f633a3a666d743a3a666f726d61743a3a686438386563373064393335303566663229793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68376330653864363138356161333232352a36636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a68313561663464353835383639653332612b34636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68613764306666373035313035366330352c29636f72653a3a70616e69636b696e673a3a70616e69633a3a68303466613939633333333766636237312d6b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343635313466306166363631316662342e48616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303034633365323561373234353331352f4c73726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a686536383336653639623663653239663930783c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64653a3a6831333638393631653833383439653730314b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a683634316366316432373163336162653932613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a683261656666643363326438316430613633453c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a6765743a3a6839656665633039353866393832396633343073726d6c5f636f6e74726163743a3a657865633a3a7472616e736665723a3a6866613034653962353765383630643161353873726d6c5f636f6e74726163743a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a6832613330343133343863346537653133365a3c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a683762343235343761613964653264316237763c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a683735663961393663666637386464613538693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a683139323030383132333337376235383439693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a68316132666430623935303138333234663a2e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a68376364373965633566376334346134373b613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68306664666266303865383932306134393c34636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68313539393136656134343138633031342e3131363d8c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a68363665386361666564623633633262353e4e73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a68663033353032333132633234666362383f2e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a68323061643266343235653637636431374030636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6831326261623832623132626539306631414573726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6834336462313937663038333961303033424173726d6c5f636f6e74726163743a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a6866356665373862633062626466666533436f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a683561613030656163346162616231326244467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a68636638373932656364313466663432614530636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68353265653430393034646230386438644648616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6864343535313934306562383633336666473c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a683162363330653433323531623464623248537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a683663373630643862353731303265323549a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a68633735613661336666633237616362644a3a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a68663136663266393332383066626139384b36636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68336234346536633365626435366533364c2d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a68353166653837313062383433326430624d613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68613935353838376436386665376461364e507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a68643736613865343261376432383739664f3c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a6862376530623961323733643230613231506b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a686231653864393062663939376531303551783c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683761613761336466393062613931363452713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683935383464346538303965303133353653713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68353866396237383561353130386435305482017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a73657269616c697a653a3a683332346565373038633731373864316455457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6833626138623634666430346661633238567c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68343036393565396138663232386130635727636f72653a3a7374723a3a66726f6d5f757466383a3a68633135336561323266613035343736375886017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a6863376138363163383064363831386166597a3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173682c4469676573744974656d3e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68313665353862613466623335646662655a5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68666264316237663330356533613936645b4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68343632373061313937333434386363315c3773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68336330333938393036636238646566325d3773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68376333623861346263396639633061385e4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68613966616165303836353533646562375fb20173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a6465636f64653a3a6839653136326139626137393730653738603773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838396430666234653566663237653566613773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a683633366365376237336339393065306262633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68653732393132396534313839623734386334636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a6838383665336534653433393436623365647b3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a68303431656636383133636430303034616587013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a68306235333765396639386333316531336687013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a68386239323665333438353962616663316780013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a68363531613536633566336263323062656882013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a68373231306535373336373666333462626982013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a68333461666537333031656533653432646a82013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a68633336343732643432366266663236306b83013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a68653466323934633563386438356161636c85013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a68323666613333323832626438353463376d84013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a68623430636566343933313837363236376e83013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a68353561306463633631663665636634396f8d013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a68383039646565346235396330356435627087013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d5f736565643a3a6839623662636134626164306130353232717f3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a68666465636466313134383634313237357289013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a68316636626437656533393566663734627386013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f73697a653a3a68386166633762633336346332386338327486013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f636f70793a3a68393166656638336438323739656632337588013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a68636136323365373962623234313634617688013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a68313734643139616263626231313638327789013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6832363638633038663464383266373736783273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a686162626266653666646163613461323579135f5f727573745f616c6c6f635f7a65726f65647aa7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a68326231646366636438333337383566667b4473726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a68373130613438356236313539636432647c673c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a68393361373337353638393938323431347d4473726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a53746f726167655665633a3a6974656d3a3a68666266656138653439303335316265317e463c753332206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a68643561393863633337613062326532647f89013c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d5265663c486173682c417574686f7269747949642c5365616c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a683732336430396466653838306534633480013973726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a617574686f7269746965733a3a686437393937646361363537383134376581014a3c5b75383b205f5d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a686633633264303833646330316337633182014773726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a736176655f6f726967696e616c5f617574686f7269746965733a3a683662666333326432303636646339363583013c73726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683633646631336262346437626236336184014173726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683838343738633162613537353130633085014673726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683838326263393930373164623062353086016f73726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a68333164363761356437353962353161348701c2013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c436f6e746578743e3e3a3a636865636b3a3a683164373634353263656363363934356488013873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6163636f756e745f6e6f6e63653a3a6866663338313237373762643066323064890188013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4d616b655061796d656e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f7061796d656e743a3a68333735646534383532333766376232628a01593c6e6f64655f72756e74696d653a3a43616c6c2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68613866303639373235366535363937318b013873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e743a3a68636332626339313464623430666431378c0130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68313539393136656134343138633031348d017f3c284b2c204c2c204d2c204e2c204f2c20502c20512c20522c20532c20542c20552c20562c20572c20582c20592c205a292061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68303466663435363631663366383463308e013673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a68396463396663613336303062646134318f016d3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a74616b653a3a68336536616238666365633866393235369001523c28522c2053292061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e4368616e67653c543e3e3a3a6f6e5f73657373696f6e5f6368616e67653a3a686131616330333134663639646162373091014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686164373363336365323935306364363592013873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a683566663633383833336639343132393593013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683263656466626165303136363661393894018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a683230366630363932626238346662326195013f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a683930343563623531383131356661313596013d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a683862366662626237663932306366333297014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683135353039356233333230333163636698018d013c73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68343835393438383366616236353630309901a1013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a68343138643834393936656535303633669a0186013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a68633933656433646439396134353430379b013573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a68356265663336396463353466306133669c013d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a68623066623437646262373231636332399d018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a68353461333561356664313262643235329e013673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a68653031343464316136323365633131659f0189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a6830346632363231383863383237353236a0012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6865643061656435396465626437313838a1014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866353636343864376339386635383033a2013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6834336639393636326434353337373130a3014e3c6e6f64655f72756e74696d653a3a43616c6c206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861663436646433656138356365363139a4014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6863653735316562366533663239323631a5013e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a6836623032613031353963656539613138a6016c3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6862316432613532333136346434336164a7014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838373237353637663736333033636134a8013b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6838323732396466633733613435643063a9016b3c73726d6c5f6772616e6470613a3a53746f72656450656e64696e674368616e67653c4e2c53657373696f6e4b65793e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834663635663364373639613465383366aa014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839616631653337643566303862316634ab016c3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6830353831353836343639386363363734ac01573c28292061732073726d6c5f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643c496d62616c616e63653e3e3a3a6f6e5f756e62616c616e6365643a3a6837383966356162393763386234613963ad01e7013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6863313336373666383234633738373334ae013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835346364643137396564626564323365af013573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a6834386266306666663437333035316264b0013473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a6834326566316661666138613832373631b101633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6836363439326635333737353530636462b201513c6e6f64655f72756e74696d653a3a43616c6c206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864373136393462343732353831383831b30130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6839613361306339386638353664626363b401b5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831356261356166383161373335613138b5015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832346330393739633831373936643133b601723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836326664616462353332613835353266b7014e3c6e6f64655f72756e74696d653a3a43616c6c206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831623962313965633766326633353366b8014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837396332633734366561646237383137b901493c73726d6c5f636f6e73656e7375733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6839373239663931646263376539306139ba01e8013c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c206938292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6835376531336239633135623562393336bb013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832306333653233323663643161633565bc014173726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832636437353937306633303164316433bd014673726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6834636635643537373666666465613862be016e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865613334613735353963613363666663bf01703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863646265633837323130656666633239c001ad013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6865623862633439343032323738613139c101493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6834323462376132666531646334356265c201443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830336232373937353034346238613035c301483c73726d6c5f636f6e74726163743a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837393335336438356435613831343934c401463c616c6c6f633a3a626f7865643a3a426f783c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6838386438336430353632353666383436c501443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830336232373937353034346238613035c6014e3c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6836353136333639666366306136323962c701473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831636664653264616566373562386434c801473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6862643436313637613065336263623164c9015e3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6864656662623833316264383363643762ca01b50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a6832306562643532626264633964653562cb013573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a6830636365666637356165336332343339cc018a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6862393465323366323863623831643634cd01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6834626330623666346562653536343434ce01323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6830633366323337373562356337376563cf012d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a6864346165346536313239323765393831d00189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6835633734396639373361633237306239d101aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6833326361623031393465353965616537d2013573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a696e697469616c697a653a3a6861393238386362393330313863646361d3014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830653134373961663764326533663264d4014d3c6e6f64655f72756e74696d653a3a4c6f67206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6864373331623263363162363730356462d5015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837346265646330383730393939353666d6017b6e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a6465636f64653a3a6839366230653135363863346465303538d70130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6864633866646436396335316364636166d8017e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6862333231666338636632643934663734d9013e73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6864386635613032633438306135336639da014373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a6832383133313961643133326131643632db014373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6831613230626263376431346535363066dc01693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835613661306463333538343231643039dd013373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6836643033343838623335616336653038de014473726d6c5f737570706f72743a3a7472616974733a3a5369676e6564496d62616c616e63653c422c503e3a3a6d657267653a3a6835386366366636336363373638303538df014173726d6c5f737570706f72743a3a7472616974733a3a496d62616c616e63653a3a6d617962655f73756273756d653a3a6832333462313364663733346165653161e0013d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6864613531373366386431393136323731e1013e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a6864303136383935623735383133663563e2013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a6861656433336466666630386462373963e3016d3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a74616b653a3a6866616466333439613930363736356464e401483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6830663764333330363531636432613064e501483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6830363132383636663366616332393439e6014273726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f6e616d653a3a6835386530643637343466616234393961e7014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a6863326163376264323035613435613139e8014773726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6863383937653938643438623334393966e9016f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744372656174696f6e4665653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837353363396261663137353436393830ea013473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a6833333233666331626135663333623731eb0185013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a6836353334306139363730663735666334ec018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a6836633136336436393538326663356536ed017f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a6864393738313639643866343430323533ee018e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a6835623861636564623266613033333965ef017e3c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173683a3a6863663836373962666133396137366437f00181013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6837303462323831373834633364363066f101483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6835666639616632646565363364336333f20191013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a6836623863376662303131663863393838f301573c28292061732073726d6c5f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643c496d62616c616e63653e3e3a3a6f6e5f756e62616c616e6365643a3a6830623839383963663932366331373130f4015f3c73726d6c5f62616c616e6365733a3a43616c6c3c542c493e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862303835646633613366353764643735f501653c73726d6c5f62616c616e6365733a3a696d62616c616e6365733a3a506f736974697665496d62616c616e63653c542c493e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6864353234613664353030623036653638f601453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864656235633237313961643566643735f7017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6834326439383833333363306334353135f80148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6838313735656261373465333866313235f9012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6866373633616431616364626565376131fa014173726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830666533333634346463313339306561fb014573726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6830623138666161343364656562356639fc014673726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832613536343336363966323861623438fd014b73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6834373130313239616163356537323136fe01733c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744c6561646572626f6172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838353362663566643962306263633931ff01713c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f7465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68663732396531666235303232643436648002743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563745465726d4475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686466633039653830643635656536653781027b3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374496e6163746976654772616365506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68383030663437356366653633656432358202723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744361727279436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683163646664316239323935333033386583027c3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637450726573656e74536c617368506572566f7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68353637643139373161643264623262358402753c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637443616e646964616379426f6e643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683730313432393037373835323966313985023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a686562623863343131323964643564313886024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686133313037363339333163316237303987023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a686132366561343533326231373163346288022e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a68633738393462653033333133663234308902303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68386361323931366261396231353938618a0249636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68623865633133616138306266343336628b022f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68633866633061633330666230666261668c0235636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68343935396261356235646261323136378d02483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68303934323930356435346335326262668e02633c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68396538626530373531353164323264638f024373726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a686464386531646336343934366462383190023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a686437643932326139393163313464663291023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a683738386562613133633036613562356292024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68336664323864366239616262363930339302477375627374726174655f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a68353266326233396365623830383966399402613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a683837346631333761373364336161323995024b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a686132336466636237343739383366353696020c436f72655f76657273696f6e970212436f72655f657865637574655f626c6f636b9802af0173725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a5f494d504c5f4445434f44455f464f525f426c6f636b3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c4865616465722c45787472696e7369633e3e3a3a6465636f64653a3a686436323935373633643839386664353299024173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a68636461373638353339316461383237619a026c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a68353734643032343837386337373065639b02443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68313537333163316639393731323431379c02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68376636353732323937396536356166399d0215436f72655f696e697469616c697a655f626c6f636b9e0210436f72655f617574686f7269746965739f02ea033c6e6f64655f72756e74696d653a3a52756e74696d65206173207375627374726174655f636c69656e743a3a72756e74696d655f6170693a3a72756e74696d655f6465636c5f666f725f436f72653a3a436f72653c73725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c7536342c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362c6e6f64655f72756e74696d653a3a4c6f673e2c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c3c73726d6c5f696e64696365733a3a4d6f64756c653c6e6f64655f72756e74696d653a3a52756e74696d653e2061732073725f7072696d6974697665733a3a7472616974733a3a5374617469634c6f6f6b75703e3a3a536f757263652c7536342c6e6f64655f72756e74696d653a3a43616c6c2c73725f7072696d6974697665733a3a416e795369676e61747572653e3e3e3e3a3a617574686f7269746965733a3a6838303033626131353731623761323739a002114d657461646174615f6d65746164617461a102603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864336166356331373438303332613533a202433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864616238363466366462306539396431a302623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6831306162633066353230373361633965a402623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865633865626432623763623633306263a502623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6838336435336365626363626530303232a6021c426c6f636b4275696c6465725f6170706c795f65787472696e736963a7021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636ba80220426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373a9025d3c7375627374726174655f696e686572656e74733a3a496e686572656e7444617461206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833653539646237303030313332316466aa023873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a6831613630653361666261643938633361ab024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861376230653362313263303530353035ac021c426c6f636b4275696c6465725f636865636b5f696e686572656e7473ad0218426c6f636b4275696c6465725f72616e646f6d5f73656564ae022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6eaf02214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572b002214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765b102204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765b2021e4772616e6470614170695f6772616e6470615f617574686f726974696573b302513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6863313734616331643238353830663939b40215417572614170695f736c6f745f6475726174696f6eb5021a417574686f7269746965734170695f617574686f726974696573b6023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830653533386166613664313761633336b70283023c6e6f64655f72756e74696d653a3a4c6f6720617320636f72653a3a636f6e766572743a3a46726f6d3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c7072696d69746976655f74797065733a3a483235362c3c7375627374726174655f7072696d6974697665733a3a656432353531393a3a5369676e61747572652061732073725f7072696d6974697665733a3a7472616974733a3a5665726966793e3a3a5369676e65722c7375627374726174655f7072696d6974697665733a3a656432353531393a3a5369676e61747572653e3e3e3a3a66726f6d3a3a6862333431313736326533653061653665b8024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832363463383630333534353863653832b9024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832613762376238656637343363386664ba024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864313737323730336136633061373338bb02723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832363966333130653832663064346434bc02753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6863626661633530356236343334633939bd024273726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861323161396662336337316435623433be024773726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6862393063386633303761656464663561bf024c73726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6864383231393832653466346134303262c002703c73726d6c5f74696d657374616d703a3a5f5f476574427974655374727563744d696e696d756d506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863376463303831616435396464646439c1023a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832353337653232383835343539323061c2023f73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6830653737376638343866653139373866c3024473726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830363530353361306232376333303235c4023c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6864643064393364303465313734643439c5024173726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838313535663930623261633963363964c6024673726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6834623963376263646563663165393465c702593c73726d6c5f7375646f3a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6839653437646665373165613162656638c8025e3c73726d6c5f74696d657374616d703a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6834363034653561366430353930626161c902e8023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63652c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3e3a3a6765743a3a6830303636326637346131363731343236ca025e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836363538656434616432373634303632cb023373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a6865623334333063393133303166633532cc02643c73726d6c5f636f756e63696c3a3a766f74696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6836366439636431393835353065386633cd024173726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a69735f636f756e63696c6c6f723a3a6835313734356662366630616566653962ce023b73726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a7665746f5f6f663a3a6832316561333231356464373031356236cf023773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6836663434313536373062663335613132d0023c73726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832353961613361386537303765396536d1024173726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836383562336265633833366561306636d202613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835393330643435346362333165653237d302773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6863636264376561326534663962356466d402773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6832326333653736326537356336383664d502723c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831323734306235396161613235656661d602723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6861393732356232353734663562303866d702723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6865323262646364623065613431316232d802743c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64653a3a6866346232643336386662336565366231d9027b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6838653730306565666337316639643737da023a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6839643634616537323931386535646330db023f73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6835636539303563336139386136656266dc024473726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830386562646632663134373032373839dd023b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835333136383464663961363665303530de024073726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832653935373463313734653439323732df024573726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836363638383231653130393432616265e0026d3c73726d6c5f74726561737572793a3a5f5f476574427974655374727563745370656e64506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832633632393837626436333163343935e102960173726d6c5f74726561737572793a3a5f494d504c5f4445434f44455f464f525f50726f706f73616c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f74726561737572793a3a50726f706f73616c3c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6832336161626137383062313937653134e2025d3c73726d6c5f74726561737572793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6834326236623361343737323639666135e302303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834623666613939336565363363333435e4023a73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6838383062346539346238633538313662e5023f73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6830363938636334313162306530613662e6024473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830313437356234333262623433333762e702483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6866663562663463616536646239633137e8026c3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6837376464383231383636636139323834e9022e73726d6c5f636f6e74726163743a3a6761733a3a6275795f6761733a3a6830643035343133373931333139353039ea02d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6831313030396136663362653765663734eb026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6831303733643437343662396136613334ec023d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a6831356633316530323266343132643538ed028001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a6864363134356462303933373037396266ee022e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a6839393563623332643064353935353865ef022c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6863336264343661346238313564373035f0025c3c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6864363138303439303437646438323464f1025d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839303362396232333538393463643063f2025e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832336636623133323165356663393331f302643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6834323164616166636164636135393865f402303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830316335396636666535376435303564f502673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6864633463396435346466383730353064f602ac013c73726d6c5f7374616b696e673a3a426f6e6465643c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6830626566656239656361663863643061f7023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6838623164626130663761633733653063f8023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6863313466613337646132353265303765f9023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6865373263643766376565633464343365fa023a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835336635396533616532376536623536fb023f73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6862633165336464316437663565623238fc02aa0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63652c426c6f636b4e756d6265723e3e3a3a6465636f64653a3a6832653232303132393866323262383863fd024473726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6832326536316437643165343431313334fe02683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832323634643935663335636331623838ff026b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68623065633463626465633865613335378003703c73726d6c5f7374616b696e673a3a5f5f47657442797465537472756374426f6e64696e674475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686135633133313731356638663931336181036d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683832616331383330343165656466346682036e3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637453657373696f6e5265776172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68356131633238636236353933306366658303763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683864316162376237316365656233353784036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6835626665666563306565666632633730850344636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a68306165633039666136363334363663358603f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683062623538633466653033666237646587033773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a683533336165323238333764666566656688033973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6866356633316661666236356633363839890330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68303331323363633864323730346161328a033e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a68656361343962303764646631303162368b035c3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68343431303237666233323462376233648c03406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a68303034656238323765376535633331388d0339636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a68313831306333396638633363316362388e03416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a68646434353231356261336437333331648f03426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a68383132346438613237333363343633339003416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a68623234323431623939343635633230349103416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a68663434386234353230356662653139669203436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a68653364373438366635643062633932339303416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c3a3a68653232336263353131656564313935649403486e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f766f74696e673a3a68616637633738346333663565613136339503496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f6d6f74696f6e733a3a68326534383838333862373038623535669603416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a68333363393933373338613533626635659703426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a683562366662326164316231306531663098034073726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683133613230376434353463653230303399034573726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68383261363361343365313331313534619a033b73726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68633936386638646363373839313731639b03426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e74726163743a3a68656635393366366432303632363832369c033e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a68643138323233373363623662373839669d03703c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744163636f756e74436f756e7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68616261623533313033653636373330649e03713c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68633832613637366666633739363233339f036f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374426c6f636b4761734c696d69743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866653066343930666435643039386530a0036a3c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744d617844657074683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832663066376632333230656537306337a1036f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374437265617465426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866623833306561336332326362353030a2036d3c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443616c6c426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861346461363331313962656539653065a3036d3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e74726163744665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866643638386264363535663063303931a403880173726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a6465636f64653a3a6861386637326234656235633362346361a503483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6837303265386236346165376565646437a603653c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6834636533653761393762323533356333a7033473726d6c5f636f6e74726163743a3a436f6e6669673c543e3a3a7072656c6f61643a3a6836346661656632313835303461376265a8034373726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6834393966366164646133376161663961a9034873726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6863383630376262353834613638313031aa034d73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6831356132323636666362323737333062ab0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830313434373961346534633736343566ac03703c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a5f5f47657442797465537472756374566f74696e673c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835666163306434653535366566633636ad0341707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6839613261366631323833636163366166ae03457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6865343938373330343461306462363538af03323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6864393661393531333532353061346236b0033f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6862663661323466373461373662366561b1034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6866373334643231306263306535306163b203613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6836383666323163626362616662656331b303593c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837316132663536333639646337303835b403533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6839653530393739346266613037323438b50346707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6836616266373966373361373332656265b6034b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6865333834663963313732323632366261b703463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6832366632653835396333323134373735b803423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6838313365363465636263346263653333b903623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865643465656533366136346462353631ba039c0173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f7261676546756e6374696f6e547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f7261676546756e6374696f6e547970653e3a3a656e636f64655f746f3a3a6837326333323035316235613561393937bb0311727573745f626567696e5f756e77696e64bc034473725f696f3a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6833616463386163666233393635663765bd030a5f5f72675f616c6c6f63be030c5f5f72675f6465616c6c6f63bf030c5f5f72675f7265616c6c6f63c003115f5f72675f616c6c6f635f7a65726f6564c10323636f72653a3a666d743a3a77726974653a3a6835373533323730386538656535653662c2032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6861653035386131346261313135353835c3033e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832633763376435666536393831336636c40330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6836643765616566373035313736376237c5033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6862666130393430636234636131663636c6033b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6863633966666234663633333765363136c7033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6863383432656231363666313035636634c803313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6834626338663232373330353834653263c90343636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a6835653566363261653930643737373762ca034a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832336564313662613434663138646432cb03323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6836333734393939616461643536393839cc0334636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a6838343038363330336236363939643335cd03066d656d736574ce03066d656d637079cf03076d656d6d6f7665d003066d656d636d70d103095f5f75646976746933d203085f5f6d756c746933d3033f636f6d70696c65725f6275696c74696e733a3a696e743a3a73686966743a3a727573745f693132385f73686c3a3a6863643939383262636633653062306538d4033f636f6d70696c65725f6275696c74696e733a3a696e743a3a73686966743a3a727573745f753132385f7368723a3a6837653838373665633035356166623362d5030c5f5f756469766d6f6474693400590970726f64756365727302086c616e677561676501045275737404323031380c70726f6365737365642d62790105727573746325312e33352e302d6e696768746c79202865333432386462376320323031392d30332d333129", - "0x53d1471b684c8a776c80353e5981c960": "0x00407a10f35a00000000000000000000", - "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", - "0x486c67c9e8930b1573c6958381ae437a": "0x2a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678", - "0xdade128e67a5ed110063f56a01ab6bbf": "0x0000000000000000", - "0xc1fdc3d212357bc2fa98f2a77b941f0c": "0x1060779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e1772b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c", - "0x3a6772616e6470613a617574683a00000000": "0xe29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed0100000000000000", - "0xcf9a75deea0508104cd993c82daf57d3": "0x8096980000000000", - "0x34de7fc8c73e4252b9e09a9e3bf602f8": "0x6400000000000000", - "0xfe7030fd433199728c516e4392091aa5": "0x0080c6a47e8d03000000000000000000", - "0x96f2cbaf8156f12db4af0b59d3e56f8f": "0x0010a5d4e80000000000000000000000", - "0x3a6772616e6470613a617574683a01000000": "0xe19b6b89729a41638e57dead9c993425287d386fa4963306b63f0187328434950100000000000000" - } - } -} diff --git a/node/cli/res/flaming-fir.json b/node/cli/res/flaming-fir.json new file mode 100644 index 0000000000000000000000000000000000000000..018593b150c59fdff38336052fe70257892ecd33 --- /dev/null +++ b/node/cli/res/flaming-fir.json @@ -0,0 +1,142 @@ +{ + "name": "Flaming Fir", + "id": "flaming-fir", + "properties": { + "tokenDecimals": 15, + "tokenSymbol": "FIR" + }, + "bootNodes": [ + "/ip4/35.246.224.91/tcp/30333/p2p/QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV", + "/ip4/35.246.224.91/tcp/30334/ws/p2p/QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV", + "/ip4/35.246.210.11/tcp/30333/p2p/QmWv9Ww7znzgLFyCzf21SR6tUKXrmHCZH9KhebeH4gyE9f", + "/ip4/35.246.210.11/tcp/30334/ws/p2p/QmWv9Ww7znzgLFyCzf21SR6tUKXrmHCZH9KhebeH4gyE9f", + "/ip4/35.198.110.45/tcp/30333/p2p/QmTtcYKJho9vFmqtMA548QBSmLbmwAkBSiEKK3kWKfb6bJ", + "/ip4/35.198.110.45/tcp/30334/ws/p2p/QmTtcYKJho9vFmqtMA548QBSmLbmwAkBSiEKK3kWKfb6bJ", + "/ip4/35.198.114.154/tcp/30333/p2p/QmQJmDorK9c8KjMF5PdWiH2WGUXyzJtgTeJ55S5gggdju6", + "/ip4/35.198.114.154/tcp/30334/ws/p2p/QmQJmDorK9c8KjMF5PdWiH2WGUXyzJtgTeJ55S5gggdju6" + ], + "telemetryEndpoints": [ + ["wss://telemetry.polkadot.io/submit/", 0] + ], + "protocolId": "fir", + "consensusEngine": null, + "genesis": { + "raw": { + "0x68c8d2f39c4605e65218c22c5664917047e4900c797b7dd33999d94213c75049": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0x579ab55d37b1220812be3c3df29d4858": "0x0000000000000000", + "0x75f6361fd25fec35714be80f2d9870af8c92e73cb6d299ba4774f5b0ad842275": "0x00", + "0x6e4ab2ac5a7cf9b1829eacc84a75bde0804be01fc31c9419ea72407f50a33384": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0x53d1471b684c8a776c80353e5981c960": "0x00407a10f35a00000000000000000000", + "0xcf9a75deea0508104cd993c82daf57d3": "0x8096980000000000", + "0x3a6772616e6470613a617574683a01000000": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f0100000000000000", + "0x0c41b62474c49057a4476d0b96853c6d44e9c86c5fa130b0da3831c5eef546a0": "0x00", + "0xccea67b51b4fa33ecbff70a8977ad91d9c60d620f3ab5ac9626dea15cde023b7": "0x0f0000c16ff286230f0000c16ff2862300", + "0x3a6772616e6470613a617574683a02000000": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce4400100000000000000", + "0x633daafcb669e97549c1b9d65660881016f969040bc16171709159437c31294a": "0x0f0000c16ff286230f0000c16ff2862300", + "0x717a2ee9c64ad3424e10e4461ec08296": "0x0000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000100000000000000000001001000000000", + "0x27b3872d47181b4a2dc15f0da43e7026": "0xe803000000000000", + "0xf4039aa8ae697861be900c58239e96f7": "0x0010a5d4e80000000000000000000000", + "0x154ebcb2c318b2e1c23e43e65aea27cd1348c4c5157502d7669a31c7635019cc": "0x9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526", + "0xb9b861cab4bbce870c811515bd5f33d7": "0x00", + "0x799192c17c5cc562d709af11ace92e6a": "0x00040000", + "0x3229a363ad5159bc2c48c9558128f00d2646f3a058cadf32077e9c9d9cca483f": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f", + "0x637414312dac3b280120bf15b4f66cee": "0x00000000", + "0xdd9b01f8462dc19488279cb351a6d861": "0x20a10700", + "0x3a636f6465": "0x0061736d0100000001b6022a60037f7f7f017f60037f7f7f0060047f7f7f7f0060057f7f7f7f7f0060027f7f017f60027f7f0060017f0060057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f0060047f7f7f7f017f60047f7f7e7f017f60017e0060017f017f60000060037f7e7f0060087f7f7f7f7f7f7f7f0060047f7f7f7f017e60017f017e60047f7f7e7e0060027e7e0060057f7f7f7e7e0060037f7e7e0060077f7e7e7e7e7e7e0060027f7e0060027e7f0060057f7e7f7f7e0060037f7f7e0060047f7e7e7e0060087f7f7e7e7f7f7f7f0060097f7f7f7e7e7f7f7f7f0060037e7f7f0060037e7f7f017f60057f7f7e7e7f0060067f7f7e7e7e7f0060027f7f017e60037f7e7f017f60087f7f7f7f7f7e7e7f0060057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f0002ef051c03656e760e6578745f626c616b65325f323536000103656e76146578745f6765745f73746f726167655f696e746f000703656e760c6578745f74776f785f313238000103656e760f6578745f7365745f73746f72616765000203656e76166578745f73616e64626f785f6d656d6f72795f6e6577000403656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000603656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000603656e76116578745f636c6561725f73746f72616765000503656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e76156578745f7365745f6368696c645f73746f72616765000a03656e76176578745f636c6561725f6368696c645f73746f72616765000203656e76126578745f737232353531395f766572696679000b03656e76126578745f656432353531395f766572696679000b03656e760e6578745f7072696e745f75746638000503656e76166578745f73616e64626f785f6d656d6f72795f676574000b03656e76166578745f73616e64626f785f6d656d6f72795f736574000b03656e76196578745f6765745f616c6c6f63617465645f73746f72616765000003656e76106578745f73746f726167655f726f6f74000603656e76186578745f73746f726167655f6368616e6765735f726f6f74000c03656e76166578745f6b696c6c5f6368696c645f73746f72616765000503656e760d6578745f7072696e745f686578000503656e76166578745f6368696c645f73746f726167655f726f6f74000003656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000203656e760d6578745f7072696e745f6e756d000d03656e760a6578745f6d616c6c6f63000e03656e76086578745f66726565000603f203f0030404010106000e050f0301100505040505050506010f050506060605050506050506050501040601020f0f04050103010106050505050105060105050505050500110202020202020202020202020202020202020202020202120e05010f0606060606060606060606060606060606050505050505050606060505050505050505060602051304010101010101010505141516171405051406011705050505050505050505050f01050301050401051418050606010f03010401050f0606061405190d06011a050505171b05050d050e031c061905050505051d050514150606040005050e0505050e051e041f20050601040406060f06050505060102042108020404051d060501060606050514220505060606050505230004050502052424050501242424050105050524242405052402242424242424052424050505050505060506060505050505050505020105050606060625050606060505050606060606061c05050505060606050406060605050505050505050d0626060504050204040105050504050e010501060606050505050606050606050505050505051405060101030203010101010102040404010201000404040001040101050501010404040404060405010506050e06000e0f04000404130b0204040e0404020600060404060004040000000027272828290407017001b101b10105030100120619037f01418080c0000b7f0041cd82c5000b7f0041cd82c5000b07be0415066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010a5f5f646174615f656e6403020c436f72655f76657273696f6e00ba0212436f72655f657865637574655f626c6f636b00bb0215436f72655f696e697469616c697a655f626c6f636b00bf0210436f72655f617574686f72697469657300c002114d657461646174615f6d6574616461746100c1021c426c6f636b4275696c6465725f6170706c795f65787472696e73696300c7021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00c80220426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300c9021c426c6f636b4275696c6465725f636865636b5f696e686572656e747300cc0218426c6f636b4275696c6465725f72616e646f6d5f7365656400ce022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e00cf02214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657200d002214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e676500d102204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500d2021e4772616e6470614170695f6772616e6470615f617574686f72697469657300d30215417572614170695f736c6f745f6475726174696f6e00d5021a417574686f7269746965734170695f617574686f72697469657300d60209c302010041010bb0012a9903478d028e025e5f606162636465666768696a6b6c6d6e6f7071727374758803b50287029e0299029c039d031cfc019d02d203c903ca03cb03d503d003f803ed03f403f503b303e202b102900292027a7bf402f502f3027c7d7e3536347fa502a602a1028001fd02fe02fc028101b003b203af038201ae02af02ad028301df02e002dd028401fa02fb02f9028501d901da01d8018601fb01ef02f002ee028701a903aa03a80388018a038b03890389018503860384038a018c0395028d0394029302e102a702e402b002e802e702e602e502e302f602870393039203910390038f038e03c501c601c901c801c301ca019703d201d301d501d401d001d601ab03b903b803b703b603b503b403bd038103ba03be03ff03dd03d103dc03e203de03df03e003ee03ef03f003f103fc03fb03fd03fe038004810482040aaeec37f0030b0020002802002001101d0bce7601027f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a220341aa014b0d00024020030eab010002030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b20012802184186bfc40041032001411c6a28020028020c11000021010cb1010b200128021841fbbec400410b2001411c6a28020028020c11000021010cb0010b200220012802184189bfc40041052001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4190bfc40010cf031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000caf010b2002200128021841a0bfc40041042001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4190bfc40010cf031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000cae010b2002200128021841a4bfc40041022001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4190bfc40010cf031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000cad010b200128021841a6bfc40041042001411c6a28020028020c11000021010cac010b200128021841aabfc40041032001411c6a28020028020c11000021010cab010b2002200128021841adbfc40041022001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450daa01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000caa010b2002200128021841c0bfc40041042001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca9010b2002200128021841c4bfc40041072001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41ccbfc40010cf03210120022000410c6a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca8010b200128021841dcbfc40041062001411c6a28020028020c11000021010ca7010b2002200128021841e2bfc40041042001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca6010b2002200128021841e6bfc400410c2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c4101210120022002410c6a41b0bfc40010cf0321032002200041016a36020c20032002410c6a41f4bfc40010cf031a20022d0008210020022802042203450da2010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca5010b20012802184184c0c40041042001411c6a28020028020c11000021010ca4010b20012802184188c0c40041062001411c6a28020028020c11000021010ca3010b20022001280218418ec0c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca2010b200220012802184196c0c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca1010b20022001280218419ec0c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca0010b2002200128021841a6c0c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9f010b2002200128021841afc0c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9e010b2002200128021841b8c0c40041072001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9d010b2002200128021841bfc0c40041072001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9c010b2002200128021841c6c0c40041072001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9b010b2002200128021841cdc0c40041072001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9a010b2002200128021841d4c0c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c99010b2002200128021841ddc0c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c98010b2002200128021841e6c0c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c97010b2002200128021841f0c0c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c96010b2002200128021841fac0c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9501200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c95010b200220012802184183c1c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c94010b20022001280218418cc1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c93010b200220012802184196c1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c92010b2002200128021841a0c1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c91010b2002200128021841aac1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c90010b2002200128021841b4c1c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8f010b2002200128021841bcc1c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8e010b2002200128021841c4c1c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8d010b2002200128021841ccc1c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8c010b2002200128021841d4c1c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8b010b2002200128021841ddc1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8a010b2002200128021841e7c1c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c89010b2002200128021841f0c1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c88010b2002200128021841fac1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c87010b200220012802184184c2c400410d2001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41f4bfc40010cf031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c86010b200220012802184191c2c400410a2001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41f4bfc40010cf031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c85010b20022001280218419bc2c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41a4c2c40010cf031a20022d0008210120022802042203450d8401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c84010b2002200128021841b4c2c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a41bcc2c40010cf031a20022d0008210120022802042203450d8301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c83010b2002200128021841ccc2c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c82010b2002200128021841d4c2c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a41dcc2c40010cf031a20022d0008210120022802042203450d8101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c81010b200128021841ecc2c40041062001411c6a28020028020c11000021010c80010b200128021841f2c2c40041052001411c6a28020028020c11000021010c7f0b200128021841f7c2c40041052001411c6a28020028020c11000021010c7e0b200128021841fcc2c40041062001411c6a28020028020c11000021010c7d0b20012802184182c3c40041062001411c6a28020028020c11000021010c7c0b20012802184188c3c40041062001411c6a28020028020c11000021010c7b0b2001280218418ec3c40041062001411c6a28020028020c11000021010c7a0b20012802184194c3c40041062001411c6a28020028020c11000021010c790b2001280218419ac3c40041062001411c6a28020028020c11000021010c780b200128021841a0c3c40041062001411c6a28020028020c11000021010c770b200128021841a6c3c40041062001411c6a28020028020c11000021010c760b200128021841acc3c40041062001411c6a28020028020c11000021010c750b200128021841b2c3c40041052001411c6a28020028020c11000021010c740b200128021841b7c3c40041052001411c6a28020028020c11000021010c730b200128021841bcc3c40041062001411c6a28020028020c11000021010c720b200128021841c2c3c40041062001411c6a28020028020c11000021010c710b200128021841c8c3c40041062001411c6a28020028020c11000021010c700b200128021841cec3c40041062001411c6a28020028020c11000021010c6f0b200128021841d4c3c40041062001411c6a28020028020c11000021010c6e0b200128021841dac3c40041062001411c6a28020028020c11000021010c6d0b200128021841e0c3c40041062001411c6a28020028020c11000021010c6c0b200128021841e6c3c40041062001411c6a28020028020c11000021010c6b0b200128021841ecc3c40041052001411c6a28020028020c11000021010c6a0b200128021841f1c3c40041052001411c6a28020028020c11000021010c690b200128021841f6c3c40041052001411c6a28020028020c11000021010c680b200128021841fbc3c40041052001411c6a28020028020c11000021010c670b20012802184180c4c40041052001411c6a28020028020c11000021010c660b20012802184185c4c40041052001411c6a28020028020c11000021010c650b2001280218418ac4c40041052001411c6a28020028020c11000021010c640b2001280218418fc4c40041052001411c6a28020028020c11000021010c630b20012802184194c4c40041052001411c6a28020028020c11000021010c620b20012802184199c4c40041052001411c6a28020028020c11000021010c610b2001280218419ec4c40041052001411c6a28020028020c11000021010c600b200128021841a3c4c40041052001411c6a28020028020c11000021010c5f0b200128021841a8c4c40041062001411c6a28020028020c11000021010c5e0b200128021841aec4c40041062001411c6a28020028020c11000021010c5d0b200128021841b4c4c40041092001411c6a28020028020c11000021010c5c0b200128021841bdc4c40041062001411c6a28020028020c11000021010c5b0b200128021841c3c4c40041062001411c6a28020028020c11000021010c5a0b200128021841c9c4c40041062001411c6a28020028020c11000021010c590b200128021841cfc4c40041072001411c6a28020028020c11000021010c580b200128021841d6c4c40041072001411c6a28020028020c11000021010c570b200128021841ddc4c40041072001411c6a28020028020c11000021010c560b200128021841e4c4c40041072001411c6a28020028020c11000021010c550b200128021841ebc4c40041062001411c6a28020028020c11000021010c540b200128021841f1c4c40041052001411c6a28020028020c11000021010c530b200128021841f6c4c40041062001411c6a28020028020c11000021010c520b200128021841fcc4c40041062001411c6a28020028020c11000021010c510b20012802184182c5c40041072001411c6a28020028020c11000021010c500b20012802184189c5c40041072001411c6a28020028020c11000021010c4f0b20012802184190c5c40041072001411c6a28020028020c11000021010c4e0b20012802184197c5c40041072001411c6a28020028020c11000021010c4d0b2001280218419ec5c40041062001411c6a28020028020c11000021010c4c0b200128021841a4c5c40041062001411c6a28020028020c11000021010c4b0b200128021841aac5c40041092001411c6a28020028020c11000021010c4a0b200128021841b3c5c40041062001411c6a28020028020c11000021010c490b200128021841b9c5c40041062001411c6a28020028020c11000021010c480b200128021841bfc5c40041062001411c6a28020028020c11000021010c470b200128021841c5c5c40041072001411c6a28020028020c11000021010c460b200128021841ccc5c40041072001411c6a28020028020c11000021010c450b200128021841d3c5c40041072001411c6a28020028020c11000021010c440b200128021841dac5c40041072001411c6a28020028020c11000021010c430b200128021841e1c5c40041062001411c6a28020028020c11000021010c420b200128021841e7c5c40041052001411c6a28020028020c11000021010c410b200128021841ecc5c40041062001411c6a28020028020c11000021010c400b200128021841f2c5c40041062001411c6a28020028020c11000021010c3f0b200128021841f8c5c40041072001411c6a28020028020c11000021010c3e0b200128021841ffc5c40041072001411c6a28020028020c11000021010c3d0b20012802184186c6c40041072001411c6a28020028020c11000021010c3c0b2001280218418dc6c40041072001411c6a28020028020c11000021010c3b0b20012802184194c6c40041062001411c6a28020028020c11000021010c3a0b2001280218419ac6c40041062001411c6a28020028020c11000021010c390b200128021841a0c6c40041072001411c6a28020028020c11000021010c380b200128021841a7c6c40041082001411c6a28020028020c11000021010c370b200128021841afc6c40041082001411c6a28020028020c11000021010c360b200128021841b7c6c400410a2001411c6a28020028020c11000021010c350b200128021841c1c6c40041072001411c6a28020028020c11000021010c340b200128021841c8c6c40041062001411c6a28020028020c11000021010c330b200128021841cec6c40041062001411c6a28020028020c11000021010c320b200128021841d4c6c40041062001411c6a28020028020c11000021010c310b200128021841dac6c40041062001411c6a28020028020c11000021010c300b200128021841e0c6c40041062001411c6a28020028020c11000021010c2f0b200128021841e6c6c40041062001411c6a28020028020c11000021010c2e0b200128021841ecc6c400410b2001411c6a28020028020c11000021010c2d0b200128021841f7c6c40041062001411c6a28020028020c11000021010c2c0b200128021841fdc6c40041062001411c6a28020028020c11000021010c2b0b20012802184183c7c40041072001411c6a28020028020c11000021010c2a0b2001280218418ac7c40041082001411c6a28020028020c11000021010c290b20012802184192c7c40041082001411c6a28020028020c11000021010c280b2001280218419ac7c400410a2001411c6a28020028020c11000021010c270b200128021841a4c7c40041072001411c6a28020028020c11000021010c260b200128021841abc7c40041062001411c6a28020028020c11000021010c250b200128021841b1c7c40041062001411c6a28020028020c11000021010c240b200128021841b7c7c40041062001411c6a28020028020c11000021010c230b200128021841bdc7c40041062001411c6a28020028020c11000021010c220b200128021841c3c7c40041062001411c6a28020028020c11000021010c210b200128021841c9c7c40041062001411c6a28020028020c11000021010c200b200128021841cfc7c400410b2001411c6a28020028020c11000021010c1f0b200128021841dac7c400410a2001411c6a28020028020c11000021010c1e0b200128021841e4c7c400410c2001411c6a28020028020c11000021010c1d0b200128021841f0c7c400410c2001411c6a28020028020c11000021010c1c0b200128021841fcc7c400410c2001411c6a28020028020c11000021010c1b0b20012802184188c8c400410c2001411c6a28020028020c11000021010c1a0b20012802184194c8c400410d2001411c6a28020028020c11000021010c190b200128021841a1c8c400410d2001411c6a28020028020c11000021010c180b200128021841aec8c400410c2001411c6a28020028020c11000021010c170b200128021841bac8c400410c2001411c6a28020028020c11000021010c160b200128021841c6c8c400410c2001411c6a28020028020c11000021010c150b200128021841d2c8c400410c2001411c6a28020028020c11000021010c140b200128021841dec8c400410e2001411c6a28020028020c11000021010c130b200128021841ecc8c400410e2001411c6a28020028020c11000021010c120b200128021841fac8c400410e2001411c6a28020028020c11000021010c110b20012802184188c9c400410e2001411c6a28020028020c11000021010c100b20012802184196c9c400410c2001411c6a28020028020c11000021010c0f0b200128021841a2c9c400410e2001411c6a28020028020c11000021010c0e0b200128021841b0c9c400410e2001411c6a28020028020c11000021010c0d0b200128021841bec9c400410e2001411c6a28020028020c11000021010c0c0b200128021841ccc9c400410e2001411c6a28020028020c11000021010c0b0b200128021841dac9c400410d2001411c6a28020028020c11000021010c0a0b200128021841e7c9c40041112001411c6a28020028020c11000021010c090b200128021841f8c9c40041112001411c6a28020028020c11000021010c080b20012802184189cac40041112001411c6a28020028020c11000021010c070b2001280218419acac40041112001411c6a28020028020c11000021010c060b200021010c050b200021010c040b200021010c030b200021010c020b200021010c010b200021010b200241106a2400200141ff01714100470bc404020d7f017e230041c0006b22032400200128020022042001280208220541047422066a2107200128020421080240024002400240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d0340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b013020012d0000220e41ac01460d022003410c6a41026a220f200b2d00003a0000200320032f01303b010c200141046a2902002110200341306a410c6a2001410c6a280200360200200920032f010c3b0000200941026a200f2d00003a00002003200e3a003020032010370234200341206a200341306a2002101f2003200c2900003703102003200d29000037001720032d0020220e411a470d052006200a41106a220a470d000c040b0b200422012007470d010c020b200141106a22012007460d010b03400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a28020010200b200141106a22012007470d000b0b02402008450d00200410200b2000411a3a00000c010b200020032903103700012000200e3a0000200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d002001417c6a28020010200b200141106a2101200a41106a2007470d000b0b2008450d0020041020200341c0006a24000f0b200341c0006a24000bd0ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610212205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610212205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810212209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810212206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610212205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810212209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810212209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810212209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610212205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810212209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610212205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910212206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610212205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510212208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610212205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810212209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910212206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610212205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610212205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610212205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610212208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510212208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610212205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610212205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610212205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610212205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610212205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510212208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910212206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610212205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510212208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610212205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610212205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610212205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610212205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610212205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610212205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810212209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610212205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810212209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610212205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610212205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610212205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610212205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610212205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610212205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610212205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610212205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610212205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610212205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610212205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610212205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610212205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810212209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810212209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610212205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610212205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610212205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810212209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810212209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610212205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610212205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610212205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610212205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610212205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610212205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610212205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610212205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810212209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610212205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610212205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610212205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610212205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610212205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610212205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610212205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910212206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610212205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610212205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610212205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610212205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610212205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610212205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610212205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510212208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810212209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610212205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610212205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610212205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610212205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610212205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610212205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610212205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610212205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610212205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610212205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610212205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610212205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610212205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610212205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610212205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610212205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610212205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610212205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610212205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610212205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610212205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610212205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610212205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610212205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610212205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610212205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610212205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610212205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610212205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810212209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810212205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910212206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610212205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610212205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610212205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610212205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610212205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610212205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610212205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610212205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610212205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610212205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610212205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610212205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610212205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610212205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610212205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610212205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610212205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610212205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610212205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810212209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810212209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610212205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610212205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610212205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910212206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610212205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610212205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610212205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810212209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610212205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610212205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610212205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610212205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610212205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610212205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610212205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610212205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510212208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610212205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610212205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810212209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610212205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610212205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810212209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810212209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610212205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110212206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810212209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610212205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810212209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510212208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610212205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510212208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610212205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102222050db4050b200641011023000b2008102222090dad050b200841011023000b2008102222060da9050b200841011023000b2006102222050da5050b200641011023000b2008102222090da1050b200841011023000b2008102222090d9a050b200841011023000b2008102222090d96050b200841011023000b2006102222050d92050b200641011023000b2008102222090d8e050b200841011023000b2006102222050d8a050b200641011023000b2009102222060d86050b200941011023000b2006102222050d82050b200641011023000b2005102222080dfe040b200541011023000b2006102222050dfa040b200641011023000b2008102222090df6040b200841011023000b2009102222060df2040b200941011023000b2006102222050dee040b200641011023000b2006102222050dea040b200641011023000b2006102222050de6040b200641011023000b2006102222080de2040b200641011023000b2005102222080dde040b200541011023000b2006102222050dda040b200641011023000b2006102222050dd6040b200641011023000b2006102222050dd2040b200641011023000b2006102222050dce040b200641011023000b2006102222050dca040b200641011023000b2005102222080dc6040b200541011023000b2009102222060dc2040b200941011023000b2006102222050dbe040b200641011023000b2005102222080dba040b200541011023000b2006102222050db6040b200641011023000b2006102222050db2040b200641011023000b2006102222050dae040b200641011023000b2006102222050daa040b200641011023000b2006102222050da6040b200641011023000b2006102222050da2040b200641011023000b2006102222050dee040b200641011023000b2008102222090d9c040b200841011023000b2006102222050d98040b200641011023000b2008102222090d94040b200841011023000b2006102222050d90040b200641011023000b2006102222050d8c040b200641011023000b2006102222050d88040b200641011023000b2006102222050d84040b200641011023000b2006102222050d80040b200641011023000b2006102222050dfc030b200641011023000b2006102222050df8030b200641011023000b2006102222050df4030b200641011023000b2006102222050df0030b200641011023000b2006102222050dec030b200641011023000b2006102222050de8030b200641011023000b2006102222050de4030b200641011023000b2006102222050de0030b200641011023000b2008102222090ddc030b200841011023000b2008102222090dd8030b200841011023000b2006102222050dd4030b200641011023000b2006102222050dd0030b200641011023000b2006102222050dcc030b200641011023000b2008102222090dc8030b200841011023000b2008102222090dc4030b200841011023000b2006102222050dc0030b200641011023000b2006102222050dbc030b200641011023000b2006102222050db8030b200641011023000b2006102222050db4030b200641011023000b2006102222050db0030b200641011023000b2006102222050dac030b200641011023000b2006102222050da8030b200641011023000b2006102222050da4030b200641011023000b2008102222090da0030b200841011023000b2006102222050d9c030b200641011023000b2006102222050d98030b200641011023000b2006102222050d94030b200641011023000b2006102222050d90030b200641011023000b2006102222050d8c030b200641011023000b2006102222050d88030b200641011023000b2006102222050d84030b200641011023000b2009102222060d80030b200941011023000b2006102222050dfc020b200641011023000b2006102222050df8020b200641011023000b2006102222050df4020b200641011023000b2006102222050df0020b200641011023000b2006102222050dec020b200641011023000b2006102222050de8020b200641011023000b2006102222050de4020b200641011023000b2005102222080de0020b200541011023000b2008102222090ddc020b200841011023000b2006102222050dd8020b200641011023000b2006102222050dd3020b200641011023000b2006102222050dcf020b200641011023000b2006102222050dcb020b200641011023000b2006102222050dc7020b200641011023000b2006102222050dc3020b200641011023000b2006102222050dbf020b200641011023000b2006102222050dbb020b200641011023000b2006102222050db7020b200641011023000b2006102222050db3020b200641011023000b2006102222050daf020b200641011023000b2006102222050dab020b200641011023000b2006102222050da7020b200641011023000b2006102222050da3020b200641011023000b2006102222050d9f020b200641011023000b2006102222050d9b020b200641011023000b2006102222050d97020b200641011023000b2006102222050d93020b200641011023000b2006102222050d8f020b200641011023000b2006102222050d8b020b200641011023000b2006102222050d87020b200641011023000b2006102222050d83020b200641011023000b2006102222050dff010b200641011023000b2006102222050dfb010b200641011023000b2006102222050df7010b200641011023000b2006102222050df3010b200641011023000b2006102222050def010b200641011023000b2006102222050deb010b200641011023000b2006102222050de7010b200641011023000b2008102222090de3010b200841011023000b2008102222050ddf010b200841011023000b2009102222060ddb010b200941011023000b2006102222050dd7010b200641011023000b2006102222050dd3010b200641011023000b2006102222050dcf010b200641011023000b2006102222050dcb010b200641011023000b2006102222050dc7010b200641011023000b2006102222050dc3010b200641011023000b2006102222050dbf010b200641011023000b2006102222050dbb010b200641011023000b2006102222050db7010b200641011023000b2006102222050db3010b200641011023000b2006102222050daf010b200641011023000b2006102222050dab010b200641011023000b2006102222050da7010b200641011023000b2006102222050da3010b200641011023000b2006102222050d9f010b200641011023000b2006102222050d9b010b200641011023000b2006102222050d97010b200641011023000b2006102222050d93010b200641011023000b2006102222050d8f010b200641011023000b2008102222090d8b010b200841011023000b2008102222090d87010b200841011023000b2006102222050d83010b200641011023000b2006102222050d7f0b200641011023000b2006102222050d7b0b200641011023000b2009102222060d770b200941011023000b2006102222050d730b200641011023000b2006102222050d6f0b200641011023000b2006102222050d6b0b200641011023000b2008102222090d670b200841011023000b2006102222050d630b200641011023000b2006102222050d5f0b200641011023000b2006102222050d5b0b200641011023000b2006102222050d570b200641011023000b2006102222050d530b200641011023000b2006102222050d4f0b200641011023000b2006102222050d4b0b200641011023000b2006102222050d470b200641011023000b2005102222080d430b200541011023000b2006102222050d3f0b200641011023000b2006102222050d3b0b200641011023000b2008102222090d370b200841011023000b2006102222050d330b200641011023000b2006102222050d2f0b200641011023000b2008102222090d2b0b200841011023000b2008102222090d270b200841011023000b2006102222050d230b200641011023000b2001102222060d1f0b200141011023000b2008102222090d1b0b200841011023000b2006102222050d170b200641011023000b2008102222090d130b200841011023000b2005102222080d0f0b200541011023000b2006102222050d0b0b200641011023000b2005102222080d070b200541011023000b2006102222050d030b200641011023000b1024000b1024000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d41011023000b200941011023000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210250240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102122050d020c060b200928020021050c020b200810222205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10200b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1020200341106a24000f0b200841011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410212205450d020c030b200528020021050c030b2004102222050d010b200441011023000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a0000200320062002102620032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a2002102720032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001020200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d41011023000b200941011023000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b200941011023000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102122080d020c050b200b28020021080c020b200710222208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610212205450d020c040b200b28020021050c040b2006102222050d020b200641011023000b200741011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102122090d020c060b200728020021090c020b200d10222209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102122060d020c070b200728020021060c020b200910222206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b1024000b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410212205450d020c030b200528020021050c030b2004102222050d010b200441011023000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102122090d020c060b200728020021090c020b200d10222209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102122050d020c070b200728020021050c020b200910222205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b1024000b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010200b200341106a24000b0700200010e9030b0b0020002001200210ea030b0700200010e8030b0e0041d8d1c400412210e70300000b0a00419cd3c400102f000bc60301067f2004410c6a2105200441086a2106200441046a210702400240024003400240024002400240200628020020052802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120072802002008200a102122090d020c070b200728020021090c020b200a10222209450d050b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b024020022003460d002004410c6a2105200441086a2106200441046a210703402002280200210103400240024002400240200628020020052802002208470d00200841016a22092008490d072008410174220a20092009200a491b220a4100480d072008450d0120072802002008200a102122090d020c080b200728020021090c020b200a10222209450d060b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b200241046a22022003470d000b0b2000411a3a00000f0b1024000b200a41011023000b200a41011023000bd40301077f200141c000712103200141ff00712104024002400240024002400240200141077522050d002003450d010b2002410c6a2106200241086a2107200241046a2108034002402005417f470d00200341ff01710d020b0240024002400240200728020020062802002209470d00200941016a22032009490d0620094101742204200320032004491b22044100480d062009450d01200828020020092004102122030d020c070b200828020021030c020b200410222203450d050b2007200436020020082003360200200628020021090b2006200941016a360200200320096a200141807f723a0000200541c000712103200541ff007121042005210120054107752209210520090d002009210520030d000b0b024002400240200241086a2802002002410c6a2802002205470d00200541016a22092005490d0320054101742206200920092006491b22064100480d032005450d01200241046a2802002005200610212209450d020c050b200241046a28020021090c050b2006102222090d030b200641011023000b1024000b200441011023000b200241086a2006360200200241046a20093602002002410c6a28020021050b2002410c6a200541016a360200200920056a20043a00002000411a3a00000bd40301077f2001a7220341c000712104200341ff00712105024002400240024002400240200142078722014200520d002004450d010b2002410c6a2106200241086a2107200241046a2108034002402001427f520d00200441ff01710d020b0240024002400240200728020020062802002204470d00200441016a22052004490d0620044101742209200520052009491b22094100480d062004450d01200828020020042009102122050d020c070b200828020021050c020b200910222205450d050b2007200936020020082005360200200628020021040b2006200441016a360200200520046a200341807f723a00002001a7220341c000712104200341ff00712105200142078722014200520d0020040d000b0b024002400240200241086a2802002002410c6a2802002204470d00200441016a22032004490d0320044101742206200320032006491b22064100480d032004450d01200241046a2802002004200610212203450d020c050b200241046a28020021030c050b2006102222030d030b200641011023000b1024000b200941011023000b200241086a2006360200200241046a20033602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000bd403020a7f017e230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a2001102920022802184101460d01200220032900003703082002200429000037000f200241186a41086a2d0000210a2002200229000f37001f20022002290308370318024020072008470d00200741016a220b2007490d032005200b200b2005491b2208ad420486220c422088a70d03200ca7220b4100480d0302402007450d0020092006200b102122090d010c050b200b10222209450d040b200920066a220b200a3a0000200b41086a200229001f370000200b41016a2002290318370000200541026a2105200641106a2106200741016a2107200a41ff01714106470d000b20002009360204200041003602002000410c6a2007360200200041086a2008360200200241306a24000f0b2000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a28020010200b200741106a2107200641706a22060d000b0b02402008450d00200910200b200241306a24000f0b1024000b200b41081023000bc4bd0103087f017e037f230041e0006b22022400024020012802082203200128020c2204470d00200241013a0038200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241386a3602282002200241286a360258200241086a200241c8006a102b200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d000021072001410c6a220820053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070ec001b504b50400840124b504aa01aa01aa01aa01aa01a801a501a701a101200b11aa01aa01aa01aa01aa01aa01aa01aa01a60103aa01aa01aa01aa0112189801511aaa01aa01aa0121520533069f0186016f238f019e01a40132080d8801379b01a20104013841714970548b010209441476783f8101752226778701070c252c1016920194011f96019a01a3015ba0011599015e1b5a0f9c019d011d900174720a0e42452813950119602f91018e01890129173497013a27644b5565624a7d407b2e8a0185012b8c0193011c463e2d8d016e3b1e7c5f487982012a3130363d6d5c6c80017f3583014e4f7e7366617a695d39533c674c436a4d6b5768634756505859b5040b20032005470dae01200241013a0037200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241376a3602282002200241286a360258200241386a200241c8006a102b200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cb0020b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db30220046741686a41ff017141034b0db302410d21010cb2010b200320056b41084f0da801200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b2002290318210a200041106a2002280220360200200041086a200a37020020004281808080d000370300200241e0006a24000f0b410e21070ca5010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de8012001450da70320032001490da803200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb1010b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb2010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb3010b413d21070ca1010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db00220046741686a41ff017141034b0db002410d21010cb3010b413121070c9f010b41d70021070c9e010b410021014100210903402001411f4b0db20120032005460de9012005417f460da8032003200541016a2207490da903200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dea010b410b21070ca8040b413e21070c9c010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dac0220046741686a41ff017141034b0dac02410d21010cb1010b41d80021070c9a010b41d00021070c99010b41c10021070c98010b410021014100210903402001411f4b0daf0120032005460de7012005417f460da6032003200541016a2204490da703200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b024020014120490d00410d210120076741686a41ff017141034d0de8010b20032004470dbf02200241013a0038200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241386a3602282002200241286a360258200241086a200241c8006a102b200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b410021014100210903402001411f4b0daf0120032005460de8012005417f460da7032003200541016a2207490da803200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de9010b410f21070ca1040b41dc0021070c95010b413321070c94010b41cb0021070c93010b41c20021070c92010b41e50021070c91010b410021014100210903402001411f4b0daa0120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411021070c9b040b41de0021070c8f010b410021014100210903402001411f4b0da90120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411321070c99040b41ce0021070c8d010b41f90021070c8c010b41d30021070c8b010b41800121070c8a010b41c50021070c89010b410a21070c88010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d990220046741686a41ff017141034b0d9902410d21010ca3010b413921070c86010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d980220046741686a41ff017141034b0d9802410d21010ca3010b20032005470d8701200241013a0037200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241376a3602282002200241286a360258200241386a200241c8006a102b200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090c88020b413f21070c83010b413a21070c82010b41e90021070c81010b41db0021070c80010b41e40021070c7f0b41860121070c7e0b41f60021070c7d0b41c00021070c7c0b41fc0021070c7b0b41f30021070c7a0b41e00021070c790b41880121070c780b41870121070c770b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c96010b410120036b2107200441026a2101410021054100210903402005411f4b0d9701200720016a4102460dd3012001450d920320032001490d9303200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c97010b41e60021070c740b41900121070c730b41890121070c720b410120036b2107200441026a2101410021054100210903402005411f4b0d9501200720016a4102460dd1012001450d900320032001490d9103200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c95010b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c96010b419b0121070c6f0b41e80021070c6e0b41ff0021070c6d0b419d0121070c6c0b418a0121070c6b0b41fb0021070c6a0b413621070c690b41f10021070c680b410120036b2107200441026a2101410021054100210903402005411f4b0d8f01200720016a4102460dcb012001450d8a0320032001490d8b03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dff0120046741686a41ff017141034b0dff01410d21010c8f010b41d90021070c660b41a00121070c650b413221070c640b41da0021070c630b41fa0021070c620b41a70121070c610b41830121070c600b20032005470d63200241013a0038200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241386a3602282002200241286a360258200241086a200241c8006a102b200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41ef0021070c5e0b41eb0021070c5d0b419f0121070c5c0b41a20121070c5b0b41920121070c5a0b41930121070c590b41a90121070c580b410021014100210903402001411f4b0d810120032005460dbd012005417f460dfc022003200541016a2207490dfd02200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dbe010b411221070ce2030b410120036b2107200441026a2101410021054100210903402005411f4b0d8101200720016a4102460dbe012001450dfd0220032001490dfe02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490def0120046741686a41ff017141034b0def01410d21010c81010b419c0121070c550b4200210a410021010340410e21072001413f4b0dff0120032005460dbe012005417f460dfd022003200541016a2209490dfe02200620056a2d0000210420082009360200200441ff0071220bad2001413f71ad86200a84210a200141076a210120092105200441187441187522094100480d000b200941c0007121052001413f4b0dee012005450dee01200a427f2001413f71ad8684210a412e21070cde030b41ec0021070c530b41a80121070c520b41a40121070c510b41aa0121070c500b41ab0121070c4f0b41cf0021070c4e0b41c90021070c4d0b418c0121070c4c0b419a0121070c4b0b41cd0021070c4a0b41820121070c490b41df0021070c480b41970121070c470b41ee0021070c460b41a60121070c450b41ea0021070c440b41ed0021070c430b41960121070c420b419e0121070c410b41a50121070c400b41990121070c3f0b41a10121070c3e0b41a30121070c3d0b418d0121070c3c0b418b0121070c3b0b41fe0021070c3a0b410120036b2107200441026a2101410021054100210903402005411f4b0d66200720016a4102460da4012001450de40220032001490de502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dd40120046741686a41ff017141034b0dd401410d21010c660b41002101410021090340410d210b2001411f4b0dc00320032005460da5012005417f460de5022003200541016a2204490de602200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a210120042105200741187441187522044100480d000b200441c0007121052001411f4b0dd4012005450dd4012009417f2001411f7174722109412d21070cc3030b20032005470d3c200241013a0038200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241386a3602282002200241286a360258200241086a200241c8006a102b200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41d60021070c360b41950121070c350b41d50021070c340b413821070c330b413421070c320b413b21070c310b413521070c300b41840121070c2f0b41980121070c2e0b41f20021070c2d0b41810121070c2c0b41f00021070c2b0b41940121070c2a0b418f0121070c290b418e0121070c280b413721070c270b41850121070c260b41910121070c250b20032005470d2b200241013a0037200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241376a3602282002200241286a360258200241386a200241c8006a102b200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cae010b41f50021070c230b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbf0120046741686a41ff017141034b0dbf01410d21010c510b413c21070c210b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbe0120046741686a41ff017141034b0dbe01410d21010c510b41e30021070c1f0b41f40021070c1e0b200320056b41044f0d25200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20004281808080d000370300200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b41f70021070c1c0b41fd0021070c1b0b41e20021070c1a0b410120036b2107200441026a2101410021054100210903402005411f4b0d4c200720016a4102460d8b012001450dcc0220032001490dcd02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db80120046741686a41ff017141034b0db801410d21010c4c0b41d40021070c180b41e10021070c170b41c30021070c160b41f80021070c150b41c40021070c140b41dd0021070c130b41c60021070c120b41e70021070c110b410021014100210903402001411f4b0d4520032005460d84012005417f460dc5022003200541016a2207490dc602200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d85010b411121070c9b030b41cc0021070c0f0b41c70021070c0e0b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dad0120046741686a41ff017141034b0dad01410d21010c430b41d10021070c0c0b41d20021070c0b0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c420b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c430b41ca0021070c080b200241c8006a2001102c41042109200228024822064101470d10200041013602002000200241c8006a41047222012902003702042000410c6a200141086a290200370200200241e0006a24000f0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da90120046741686a41ff017141034b0da901410d21010c420b41c80021070c050b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da80120046741686a41ff017141034b0da801410d21010c420b410021014100210903402001411f4b0d4320032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410721070c8e030b410d21070c020b410021014100210903402001411f4b0d4220032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410821070c8c030b410621070b0c89030b2000410b3a000420004101360200200041056a20073a0000200241e0006a24000f0b200441096a2101200541784f0df00220032001490df102200620056a290000210a20082001360200413021070c87030b200441026a21092005417f460df10220032009490df202200620056a2c00002101200820093602004100210b20014100480d7f200141017441807f71200172220141ff0171220541847e6a220941034b0da101024020090e0400f301f101f201000b4103210b410421070c88030b200441026a21012005417f460df20220032001490df302200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21012005417f460df30220032001490df402200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21092005417f460df40220032009490df502200620056a2c00002101200820093602004100210b20014100480d8001200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f301f101f201000b4103210b410221070c85030b200441026a21092005417f460df50220032009490df602200620056a2c00002101200820093602004100210b20014100480d8101200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f501f301f401000b4103210b410321070c84030b200441056a21012005417c4f0df60220032001490df702200620056a280000210920082001360200412f21070c82030b200241d0006a280200210b200228024c2103200241d4006a2802002205450d81012005410274220c4102752207ad420286220a422088a70de802200aa722044100480de802200410222209450df70220054102742104200c417c6a210c410021050340200920056a200320056a2802003602002004200541046a2205470d000b200c41027641016a210d200b450dff020cfe020b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010c370b410f21010b0c370b410f21010c380b410f21010c390b410f21010c3a0b410f21010c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010c3c0b410f21010b0c3c0b410f21010b0c3d0b410f21010b0c3e0b410f21010b0c3e0b410f21010b0c3e0b410f21010c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010c400b410f21010c410b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0038200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241386a3602282002200241286a360258200241186a200241c8006a102b200228022021012002290318210a410521070c410b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b4105210b0c9a020b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b411821090b2002200229011e37010e200220022903183703080c81020b412c21074100210b0c86020b412b21074100210b0c85020b411821090b2002200229011e37010e200220022903183703080cfc010b411821090b2002200229011e37010e200220022903183703080cf9010b410021074100210d200b0dfc010cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3a2001417f460db8012003200141016a2207490db901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3b0b200bad210a412821070cfe010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3b2001417f460db9012003200141016a2207490dba01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3c0b200bad210a412721070cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3c2001417f460dba012003200141016a2207490dbb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3d0b200bad210a411621070cfc010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3d2001417f460dbb012003200141016a2207490dbc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3e0b200bad210a411821070cfb010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3e2001417f460dbc012003200141016a2207490dbd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3f0b200bad210a412121070cfa010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3f2001417f460dbd012003200141016a2207490dbe01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d400b200bad210a412221070cf9010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d402001417f460dbe012003200141016a2207490dbf01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d410b200bad210a411421070cf8010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d412001417f460dbf012003200141016a2207490dc001200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d420b200bad210a411c21070cf7010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d422001417f460dc0012003200141016a2207490dc101200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b41202107024020054120490d00410d210120046741686a41ff01714104490d430b200bad210a0cf6010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d432001417f460dc1012003200141016a2207490dc201200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d440b200bad210a411721070cf5010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d442001417f460dc2012003200141016a2207490dc301200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d450b200bad210a412421070cf4010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d452001417f460dc3012003200141016a2207490dc401200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d460b200bad210a412921070cf3010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d462001417f460dc4012003200141016a2207490dc501200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d470b200bad210a412a21070cf2010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411521070cf1010b200141c000490d0e2005450d0e200b41ff00470d0f0c110b2001417f6a2101410021054100210b03402005411f4b0d2220032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411b21070cef010b20014120490d102005450d102004417f7341ff00716741686a41ff01714105490dea010c110b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411a21070ced010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d482001417f460dc6012003200141016a2207490dc701200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d490b200bad210a412321070cec010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d492001417f460dc7012003200141016a2207490dc801200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4a0b200bad210a411d21070ceb010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4a2001417f460dc8012003200141016a2207490dc901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4b0b200bad210a412521070cea010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4b2001417f460dc9012003200141016a2207490dca01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4c0b200bad210a411e21070ce9010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4c2001417f460dca012003200141016a2207490dcb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4d0b200bad210a411921070ce8010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4d2001417f460dcb012003200141016a2207490dcc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4e0b200bad210a412621070ce7010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4e2001417f460dcc012003200141016a2207490dcd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4f0b200bad210a411f21070ce6010b41062109200541c001470de0014104210b410421070ce6010b41062109200541c001470dde014104210b410221070ce5010b41062109200541c001470ddc014104210b410321070ce4010b200441016a21012004417f460dd90120032001490dda01200620046a2d00002105200820013602002005450d54200041163a000420004101360200200041056a20053a0000200241e0006a24000f0b200141c000490d022009450d020b0b200020022f00083b0005200020073a000420004101360200200041106a2001360200200041086a200a370200200041076a2002410a6a2d00003a0000200241e0006a24000f0b412e21070cdd010b200441ff01716741686a41ff017141044b0d0020014120490d002005450dd9010b412d21070cdc010b410f21010c170b410f21010c180b410f21010c190b410f21010c1a0b410f21010c1b0b410f21010c1c0b410f21010c1d0b410f21010c1e0b410f21010c1f0b410f21010c200b410f21010c210b410f21010c220b410f21010c230b410f21010c240b410f21010c250b410f21010c260b410f21010c270b410f21010c280b410f21010c290b410f21010c2a0b410f21010c2b0b410f21010c2c0b410f21010c2d0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b4101210b0b410421070c96010b4102210b410421070c95010b4101210b0b410221070c93010b4102210b410221070c92010b4101210b0b410321070c90010b4102210b410321070c8f010b410c21074100210b0c8e010b417f2005102d000b20052003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f200541016a102d000b200541016a2003102e000b417f200541016a102d000b200541016a2003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f200541016a102d000b200541016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b1024000b20052001102d000b20012003102e000b417f2009102d000b20092003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2009102d000b20092003102e000b417f2009102d000b20092003102e000b20052001102d000b20012003102e000b200441041023000b417f2001102d000b20012003102e000b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b2000200b36020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200310200b024020022d004c4105470d002006450d00200241d4006a280200450d00200241d0006a28020010200b0240024002402007200d470d002007210d0c010b2007200d490d010240200d450d0020092007410274200d4102742205102122090d01200541041023000b4100210d02402007450d00200910200b410421090b410021052001410c6a210b200141086a210c410021070240024002400240024003402005411f4b0d01200c2802002206200b2802002203460d02200341016a21042003417f460d0420062004490d05200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d210120036741686a41ff01714104490d030b2007ad422086200dad84210a410921070c070b410f21010c010b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200d41ffffffff0371450d0620091020200241e0006a24000f0b417f2004102d000b20042006102e000b419880c000102f000b0b0b20004100360200200041106a200a3703002000410c6a2009360200200041096a200b3a0000200041086a20073a00000b200241e0006a24000b6b000240024020002d000022004101460d0020004102470d01200128021841edcac400410b2001411c6a28020028020c1100000f0b200128021841e0cac400410d2001411c6a28020028020c1100000f0b200128021841d4cac400410c2001411c6a28020028020c1100000b810301067f230041306b22022400200128020021030240024002400240024002400240200128020422044103742205450d00200341046a2106410021070340200628020020076a2107200641086a2106200541786a22050d000b200141146a280200450d010c020b41002107200141146a2802000d010b200721060c010b2004450d02024002402007410f4b0d002003280204450d010b200720076a220620074f0d010b4101210541002106200241086a21070c010b2006417f4c0d02200241086a210702402006450d002006102222050d01200641011023000b41012105410021060b200241003602102002200636020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a290200370300200220012902003703180240200241146a41ecd3c400200241186a10d3030d0020002007290200370200200041086a200741086a280200360200200241306a24000f0b10ec03000b41dcd3c4004100410010b501000b1031000bbb07030d7f017e017f230041c0006b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0920072009490d0a200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d032001410c6a2107200141086a210a4100210b4104210c4100210d0340200d220e41016a210d410021034100210403402003411f4b0d07200a280200220520072802002208460d08200841016a21092008417f460d0c20052009490d0d200128020020086a2d0000210820072009360200200841ff00712003411f71742004722104200341076a21032008418001710d000b024020034120490d0020086741686a41ff01714104490d090b0240200b200e470d00200b4101742203200b41016a220820082003491b2203ad420286220f422088a70d0e200fa722084100480d0e02400240200b450d00200c200b41027420081021220c0d010c110b20081022220c450d100b2003210b0b20044108762110200c200e4102746a2004360200200d2006490d000c050b0b410f21030c010b200241013a000f2002413c6a4101360200200241013602142002420137022c200241f8cac40036022820022002410f6a3602102002200241106a360238200241186a200241286a102b410521030b200241086a2208200241186a41086a280200360200200220022902183703002000200336020420004101360200200041086a2002290300370200200041106a20082802003602000c0c0b4104210c4100210b4100210d0b2000200c360204200041003602002000410c6a200d360200200041086a200b360200200241c0006a24000f0b410f21030c080b200241013a00002002413c6a4101360200200241013602142002420137022c200241f8cac400360228200220023602102002200241106a360238200241186a200241286a102b20022802202104200228021c21092002280218210841002110410521030c070b410d21030c060b417f2009102d000b20092007102e000b417f2009102d000b20092005102e000b1024000b200841041023000b20004101360200200041106a20043602002000410c6a2009360200200041086a200836020020002010410874200372360204200b450d00200c1020200241c0006a24000f0b200241c0006a24000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241b4dac4003602082002200241046a360228200220023602202002200241206a360218200241086a41c4dac4001048000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241d4d9c4003602082002200241046a360228200220023602202002200241206a360218200241086a41e4d9c4001048000b6802017f037e230041306b22012400200029020821022000290210210320002902002104200141146a410036020020012004370318200141c8d7c400360210200142013702042001200141186a36020020012003370328200120023703202001200141206a1048000bd0ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610212205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610212205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810212209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810212206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610212205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810212209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810212209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810212209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610212205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810212209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610212205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910212206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610212205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510212208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610212205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810212209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910212206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610212205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610212205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610212205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610212208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510212208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610212205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610212205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610212205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610212205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610212205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510212208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910212206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610212205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510212208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610212205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610212205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610212205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610212205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610212205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610212205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810212209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610212205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810212209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610212205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610212205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610212205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610212205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610212205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610212205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610212205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610212205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610212205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610212205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610212205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610212205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610212205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810212209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810212209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610212205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610212205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610212205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810212209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810212209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610212205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610212205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610212205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610212205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610212205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610212205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610212205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610212205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810212209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610212205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610212205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610212205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610212205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610212205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610212205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610212205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910212206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610212205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610212205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610212205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610212205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610212205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610212205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610212205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510212208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810212209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610212205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610212205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610212205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610212205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610212205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610212205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610212205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610212205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610212205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610212205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610212205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610212205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610212205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610212205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610212205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610212205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610212205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610212205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610212205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610212205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610212205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610212205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610212205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610212205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610212205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610212205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610212205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610212205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610212205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810212209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810212205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910212206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610212205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610212205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610212205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610212205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610212205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610212205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610212205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610212205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610212205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610212205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610212205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610212205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610212205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610212205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610212205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610212205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610212205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610212205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610212205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810212209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810212209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610212205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610212205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610212205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910212206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610212205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610212205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610212205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810212209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610212205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610212205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610212205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610212205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610212205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610212205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610212205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610212205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510212208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610212205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610212205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810212209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610212205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610212205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810212209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810212209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610212205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110212206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810212209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610212205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810212209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510212208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610212205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510212208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610212205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102222050db4050b200641011023000b2008102222090dad050b200841011023000b2008102222060da9050b200841011023000b2006102222050da5050b200641011023000b2008102222090da1050b200841011023000b2008102222090d9a050b200841011023000b2008102222090d96050b200841011023000b2006102222050d92050b200641011023000b2008102222090d8e050b200841011023000b2006102222050d8a050b200641011023000b2009102222060d86050b200941011023000b2006102222050d82050b200641011023000b2005102222080dfe040b200541011023000b2006102222050dfa040b200641011023000b2008102222090df6040b200841011023000b2009102222060df2040b200941011023000b2006102222050dee040b200641011023000b2006102222050dea040b200641011023000b2006102222050de6040b200641011023000b2006102222080de2040b200641011023000b2005102222080dde040b200541011023000b2006102222050dda040b200641011023000b2006102222050dd6040b200641011023000b2006102222050dd2040b200641011023000b2006102222050dce040b200641011023000b2006102222050dca040b200641011023000b2005102222080dc6040b200541011023000b2009102222060dc2040b200941011023000b2006102222050dbe040b200641011023000b2005102222080dba040b200541011023000b2006102222050db6040b200641011023000b2006102222050db2040b200641011023000b2006102222050dae040b200641011023000b2006102222050daa040b200641011023000b2006102222050da6040b200641011023000b2006102222050da2040b200641011023000b2006102222050dee040b200641011023000b2008102222090d9c040b200841011023000b2006102222050d98040b200641011023000b2008102222090d94040b200841011023000b2006102222050d90040b200641011023000b2006102222050d8c040b200641011023000b2006102222050d88040b200641011023000b2006102222050d84040b200641011023000b2006102222050d80040b200641011023000b2006102222050dfc030b200641011023000b2006102222050df8030b200641011023000b2006102222050df4030b200641011023000b2006102222050df0030b200641011023000b2006102222050dec030b200641011023000b2006102222050de8030b200641011023000b2006102222050de4030b200641011023000b2006102222050de0030b200641011023000b2008102222090ddc030b200841011023000b2008102222090dd8030b200841011023000b2006102222050dd4030b200641011023000b2006102222050dd0030b200641011023000b2006102222050dcc030b200641011023000b2008102222090dc8030b200841011023000b2008102222090dc4030b200841011023000b2006102222050dc0030b200641011023000b2006102222050dbc030b200641011023000b2006102222050db8030b200641011023000b2006102222050db4030b200641011023000b2006102222050db0030b200641011023000b2006102222050dac030b200641011023000b2006102222050da8030b200641011023000b2006102222050da4030b200641011023000b2008102222090da0030b200841011023000b2006102222050d9c030b200641011023000b2006102222050d98030b200641011023000b2006102222050d94030b200641011023000b2006102222050d90030b200641011023000b2006102222050d8c030b200641011023000b2006102222050d88030b200641011023000b2006102222050d84030b200641011023000b2009102222060d80030b200941011023000b2006102222050dfc020b200641011023000b2006102222050df8020b200641011023000b2006102222050df4020b200641011023000b2006102222050df0020b200641011023000b2006102222050dec020b200641011023000b2006102222050de8020b200641011023000b2006102222050de4020b200641011023000b2005102222080de0020b200541011023000b2008102222090ddc020b200841011023000b2006102222050dd8020b200641011023000b2006102222050dd3020b200641011023000b2006102222050dcf020b200641011023000b2006102222050dcb020b200641011023000b2006102222050dc7020b200641011023000b2006102222050dc3020b200641011023000b2006102222050dbf020b200641011023000b2006102222050dbb020b200641011023000b2006102222050db7020b200641011023000b2006102222050db3020b200641011023000b2006102222050daf020b200641011023000b2006102222050dab020b200641011023000b2006102222050da7020b200641011023000b2006102222050da3020b200641011023000b2006102222050d9f020b200641011023000b2006102222050d9b020b200641011023000b2006102222050d97020b200641011023000b2006102222050d93020b200641011023000b2006102222050d8f020b200641011023000b2006102222050d8b020b200641011023000b2006102222050d87020b200641011023000b2006102222050d83020b200641011023000b2006102222050dff010b200641011023000b2006102222050dfb010b200641011023000b2006102222050df7010b200641011023000b2006102222050df3010b200641011023000b2006102222050def010b200641011023000b2006102222050deb010b200641011023000b2006102222050de7010b200641011023000b2008102222090de3010b200841011023000b2008102222050ddf010b200841011023000b2009102222060ddb010b200941011023000b2006102222050dd7010b200641011023000b2006102222050dd3010b200641011023000b2006102222050dcf010b200641011023000b2006102222050dcb010b200641011023000b2006102222050dc7010b200641011023000b2006102222050dc3010b200641011023000b2006102222050dbf010b200641011023000b2006102222050dbb010b200641011023000b2006102222050db7010b200641011023000b2006102222050db3010b200641011023000b2006102222050daf010b200641011023000b2006102222050dab010b200641011023000b2006102222050da7010b200641011023000b2006102222050da3010b200641011023000b2006102222050d9f010b200641011023000b2006102222050d9b010b200641011023000b2006102222050d97010b200641011023000b2006102222050d93010b200641011023000b2006102222050d8f010b200641011023000b2008102222090d8b010b200841011023000b2008102222090d87010b200841011023000b2006102222050d83010b200641011023000b2006102222050d7f0b200641011023000b2006102222050d7b0b200641011023000b2009102222060d770b200941011023000b2006102222050d730b200641011023000b2006102222050d6f0b200641011023000b2006102222050d6b0b200641011023000b2008102222090d670b200841011023000b2006102222050d630b200641011023000b2006102222050d5f0b200641011023000b2006102222050d5b0b200641011023000b2006102222050d570b200641011023000b2006102222050d530b200641011023000b2006102222050d4f0b200641011023000b2006102222050d4b0b200641011023000b2006102222050d470b200641011023000b2005102222080d430b200541011023000b2006102222050d3f0b200641011023000b2006102222050d3b0b200641011023000b2008102222090d370b200841011023000b2006102222050d330b200641011023000b2006102222050d2f0b200641011023000b2008102222090d2b0b200841011023000b2008102222090d270b200841011023000b2006102222050d230b200641011023000b2001102222060d1f0b200141011023000b2008102222090d1b0b200841011023000b2006102222050d170b200641011023000b2008102222090d130b200841011023000b2005102222080d0f0b200541011023000b2006102222050d0b0b200641011023000b2005102222080d070b200541011023000b2006102222050d030b200641011023000b1024000b1024000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d41011023000b200941011023000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210250240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102122050d020c060b200928020021050c020b200810222205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10200b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1020200341106a24000f0b200841011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410212205450d020c030b200528020021050c030b2004102222050d010b200441011023000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a0000200320062002102620032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a2002102720032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001020200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d41011023000b200941011023000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b200941011023000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102122080d020c050b200b28020021080c020b200710222208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610212205450d020c040b200b28020021050c040b2006102222050d020b200641011023000b200741011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102122090d020c060b200728020021090c020b200d10222209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102122060d020c070b200728020021060c020b200910222206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b1024000b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410212205450d020c030b200528020021050c030b2004102222050d010b200441011023000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102122090d020c060b200728020021090c020b200d10222209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102122050d020c070b200728020021050c020b200910222205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b1024000b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010200b200341106a24000b05001024000bc10703097f047e017f230041e0006b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a41086a220720052003410c6c6a220a41f0026a280200360200200a41e8026a290200210b2001410c6a200341016a360200200141086a2004360200200141046a20053602002002200b370320200241306a41186a2006290300220b370300200241306a41106a2008290300220c370300200241306a41086a2009290300220d370300200241d8006a2007280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000f0b20004100360200200241e0006a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210b0c010b2004ad210b410021030b20051020200ba7210402400240200b422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210b0c010b2004ad210b410021050b20031020200ba7210420052103200b422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220a200341106a2900003703002002200341086a290000370300200241206a41086a220f20052006410c6c6a220341f0026a2802003602002002200341e8026a290200370320200520064102746a41f0036a2802002103024020074101460d00410120076b2105034020032802ec032103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241306a41186a2008290300220b370300200241306a41106a2009290300220c370300200241306a41086a200a290300220d370300200241d8006a200f280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000b970603087f017e017f23004180026b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341e0006c6a41e8026a41e0001084041a2001410c6a200341016a360200200141086a2004360200200141046a200536020020024180016a41186a200629030037030020024180016a41106a200829030037030020024180016a41086a2009290300370300200220022903003703800120024180016a41206a200241206a41e0001084041a200020024180016a4180011084041a20024180026a24000f0b2000420237032020024180026a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210a0c010b2004ad210a0b20051020200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210a0c010b2004ad210a0b20031020200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641e0006c6a41e8026a41e0001084041a200520064102746a418c0b6a2802002103024020074101460d00410120076b2105034020032802880b2103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a200336020020024180016a41186a200829030037030020024180016a41106a200929030037030020024180016a41086a200b290300370300200220022903003703800120024180016a41206a200241206a41e0001084041a200020024180016a4180011084041a20024180026a24000b130020004100360204200041c8d7c4003602000b130020004107360204200041b884c0003602000b130020004102360204200041c084c0003602000bc30201047f230041d0006b22022400024002400240410f10222203450d00200341076a41002900ce8240370000200341002900c782403700002003410f411e10212203450d012003200136000f200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034113200241306a1000200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041c8d7c400410041001001417f460d002002422037022420022002360220200241306a200241206a103820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031020200241d0006a24000f0b410f41011023000b411e41011023000b419a88c00041331039000bdd0403027f017e0d7f230041d0006b22022400200241086a2001108e0102400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210d0c030b1031000b200541011023000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d03402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001001220f200f417f461b220f4120200f4120491b20052802006a360200200f411f4d0d02200c41016a2105200241106a41186a220f2007290300370300200241106a41106a22102008290300370300200241106a41086a2211200e290300370300200220022903303703100240200c200d470d00200a20052005200a491b220dad4205862204422088a70d042004a7220e4100480d040240200c450d002006200b200e102122060d010c060b200e10222206450d050b2006200b6a220c2002290310370000200c41186a200f290300370000200c41106a2010290300370000200c41086a2011290300370000200a41026a210a200b41206a210b2005210c20052003490d000b0b2000200d36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200d450d00200610200b200241d0006a24000f0b1024000b200e41011023000b5e01017f230041306b220224002002200136020c20022000360208200241246a41013602002002410336022c20024201370214200241ec81c5003602102002200241086a3602282002200241286a360220200241106a41f481c5001048000b960803037f017e077f23004190016b22012400200141106a41086a2202420037030020014200370310418788c0004113200141106a100220014180016a41086a20022903003703002001200129031037038001410021020240024002400240024020014180016a411041c8d7c400410041001001417f460d002001410036021020014180016a4110200141106a41044100100141016a41044d0d01200128021021020b412010222203450d01200320002900002204370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a29000037000020032d000121052003102020014180016a20054108742004a7220341c00171724106762205103702400240024002402003413f7122032001280288014f0d00200120012802800120034105746a2203103b2001290300200141086a290300844200510d010b0240200128028401450d0020012802800110200b200141106a20021037024020012802182203413f4d0d00200141186a21050340200241016a210202402001280214450d00200128021010200b200141106a200210372005280200220341c0004f0d000b0b2001280210210620012802142107200141106a41186a2208200041186a290000370300200141106a41106a2209200041106a290000370300200141106a41086a220a200041086a29000037030020012000290000370310200341016a210520072003470d0620034101742207200520052007491b2207ad4205862204422088a70d052004a7220b4100480d052003450d0120062003410574200b10212206450d020c060b20032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a290000370000200141106a41086a20014180016a41086a28020036020020012001290380013703102005200141106a103c20014190016a24000f0b200b102222060d040b200b41011023000b419a88c00041331039000b412041011023000b1024000b200241067420036a210b200620034105746a22032001290310370000200341186a2008290300370000200341106a2009290300370000200341086a200a2903003700000240200541c000470d00200141106a41086a2203420037030020014200370310418788c0004113200141106a100220014180016a41086a200329030037030020012001290310370380012001200241016a36021020014180016a4110200141106a410410030b2001200536021820012007360214200120063602102002200141106a103c200141106a41086a2000290000370300200141106a41106a200041086a290000370300200141106a41186a200041106a290000370300200141306a200041186a2900003703002001200b360214200141013a0010200141106a103d20014190016a24000ba40604027f017e037f037e230041c0006b22022400024002400240411410222203450d00200341106a41002800a5ef40360000200341086a410029009def4037000020034100290095ef4037000020034114413410212203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22054200370300200241206a41106a22064200370300200241206a41086a220742003703002002420037032020034134200241206a1000200241186a2005290300370300200241106a2006290300370300200241086a2007290300370300200220022903203703000240024002402002412041c8d7c400410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012205417f460d022005410f4d0d02200241286a29030021082002290320210420031020411810222203450d010c050b42002108200310204118102222030d040b411841011023000b419a88c00041331039000b411441011023000b413441011023000b200341106a41002900b9ef40370000200341086a41002900b1ef40370000200341002900a9ef40370000024020034118413810212203450d0020032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a29000037000042002109200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034138200241206a1000200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041c8d7c400410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a290300210a200229032021090c010b4200210a0b200310202000200920047c22043703002000200a20087c2004200954ad7c370308200241c0006a24000f0b419a88c00041331039000b413841011023000bda0401097f230041d0006b2202240002400240410f10222203450d00200341076a41002900ce8240370000200341002900c782403700002003410f411e10212204450d012004200036000f200241286a41186a22004200370300200241286a41106a22054200370300200241286a41086a220342003703002002420037032820044113200241286a1000200241086a41186a2000290300370300200241086a41106a2005290300370300200241086a41086a20032903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a103e02400240024002402000450d00200041057421072003280200210020022802282108200228022c21092006210303400240024002400240200920006b41204f0d00200041206a22052000490d072009410174220a20052005200a491b220a4100480d072009450d0120082009200a102122080d020c080b200041206a21050c020b200a10222208450d060b200a21090b200820006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200741606a22070d000b200241306a20053602002002200936022c200220083602280c010b20032802002105200228022c2109200228022821080b200241086a412020082005100302402009450d00200810200b200410200240200141046a280200450d00200610200b200241d0006a24000f0b1024000b200a41011023000b410f41011023000b411e41011023000bae1e01067f230041e0026b2201240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024041cec6c000411041c8d7c400410041001001417f460d00200141003602880141cec6c000411020014188016a41044100100141016a41044d0d022001280288012102410021030c010b410121030b200141106a200041f0001084041a20014184016a20023602002001200336028001200141c0026a41086a22004200370300200142003703c00241bccec000410d200141c0026a1002200141a8026a41086a2000290300370300200120012903c0023703a8022001410036028801200141a8026a411020014188016a10122102024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280288012200417f460d002002450d002001200036028802200120003602840220012002360280022000450d012001200036028c012001200236028801200141086a20014188016a10bc0102402001280208450d0041012102200128020c220341016a220420034f0d030b410021002001280284020d2c0c2d0b200141003602880220014201370380020b20014100360290012001420137038801200141013602c002200141c0026a20014188016a103e0240024002402001280280014101470d00200128028c0120014190016a2802002200470d01200041016a22022000490d3120004101742203200220022003491b22034100480d312000450d042001280288012000200310212202450d050c2a0b200128028c0120014190016a2802002200470d01200041016a22022000490d3020004101742203200220022003491b22034100480d302000450d052001280288012000200310212202450d060c270b20012802880121020c290b20012802880121020c260b0240200341c000490d0041022102200341808001490d00410441052003418080808004491b21020b410121030240200441c000490d0041022103200441808001490d00410441052004418080808004491b21030b20032002470d04200120014180026a36028801200420014188016a2002108c022001280280014101470d0520012802840220014188026a2802002200470d08200041016a22022000490d2d20004101742203200220022003491b22034100480d2d2000450d0c2001280280022000200310212202450d0d0c210b2003102222020d250b200341011023000b2003102222020d210b200341011023000b2000200320026b6a2200417f4c0d102000450d012000102222050d02200041011023000b20012802840220014188026a2802002200470d03200041016a22022000490d2720004101742203200220022003491b22034100480d272000450d082001280280022000200310212202450d090c190b410121050b200120003602980220012000360294022001200536029002200120014190026a36028801200420014188016a2003108c0220002003490d0e20012802980222042000490d0f20014188026a28020022042002490d10200128029002210520012802800221062001200020036b22003602a0022001200420026b22043602a40220002004470d11200520036a200620026a20001084041a02402001280280014101470d0020012802940220014198026a2802002200470d03200041016a22022000490d2620004101742203200220022003491b22034100480d262000450d092001280290022000200310212202450d0a0c150b20012802940220014198026a2802002200470d03200041016a22022000490d2520004101742203200220022003491b22034100480d252000450d0a2001280290022000200310212202450d0b0c120b20012802800221020c190b20012802800221020c160b20012802900221020c120b20012802900221020c0f0b2003102222020d140b200341011023000b2003102222020d100b200341011023000b2003102222020d0b0b200341011023000b2003102222020d070b200341011023000b419a88c00041331039000b1031000b20032000102d000b20002004102e000b20022004102d000b2001200141a0026a3602d8022001200141a4026a3602dc0220014188016a41146a4100360200200141c0026a41146a4104360200200141cc026a4105360200200141a8026a41146a4103360200200141c8d7c400360298012001420137028c01200141d0d2c40036028801200141053602c402200142033702ac02200141fcd1c4003602a802200120014188016a3602d0022001200141dc026a3602c8022001200141d8026a3602c0022001200141c0026a3602b802200141a8026a418cd3c4001048000b2001200336029402200120023602900220014198026a28020021000b20014198026a2203200041016a360200200220006a41003a000020014184016a2802002104024002400240024002402001280294022202200328020022006b41044f0d00200041046a22032000490d1620024101742200200320032000491b22004100480d162002450d012001280290022002200010212202450d020c030b20012802900221020c030b2000102222020d010b200041011023000b2001200036029402200120023602900220014198026a28020021000b20014198026a200041046a360200200220006a20043600000c020b2001200336029402200120023602900220014198026a28020021000b20014198026a200041016a360200200220006a41013a00000b200141106a20014190026a10b80120014198026a280200210220012802940221032001280290022100200128028402450d0b200128028002102020000d0c0c0d0b2001200336028402200120023602800220014188026a28020021000b20014188026a2203200041016a360200200220006a41003a000020014184016a2802002104024002400240024002402001280284022202200328020022006b41044f0d00200041046a22032000490d1120024101742200200320032000491b22004100480d112002450d012001280280022002200010212202450d020c030b20012802800221020c030b2000102222020d010b200041011023000b2001200036028402200120023602800220014188026a28020021000b20014188026a200041046a360200200220006a20043600000c020b2001200336028402200120023602800220014188026a28020021000b20014188026a200041016a360200200220006a41013a00000b200141106a20014180026a10b80120014188026a2802002102200128028402210320012802800222000d070c080b2001200336028c01200120023602880120014190016a28020021000b20014190016a2203200041016a360200200220006a41003a000020014184016a280200210402400240024002400240200128028c012202200328020022006b41044f0d00200041046a22032000490d0c20024101742200200320032000491b22004100480d0c2002450d012001280288012002200010212202450d020c030b20012802880121020c030b2000102222020d010b200041011023000b2001200036028c01200120023602880120014190016a28020021000b20014190016a200041046a360200200220006a20043600000c020b2001200336028c01200120023602880120014190016a28020021000b20014190016a200041016a360200200220006a41013a00000b200141106a20014188016a10b80120014190016a2802002102200128028c0121032001280288012100200128028402450d010b20012802800210200b2000450d010b200141c0026a41086a22044200370300200142003703c00241bccec000410d200141c0026a1002200141a8026a41086a2004290300370300200120012903c0023703a802200141a8026a411020002002100302402003450d00200010200b024020012d0010417b6a220041064b0d00024002400240024020000e0700020404010403000b200141186a2d00004101470d03200141246a280200450d03200141206a2802001020200141e0026a24000f0b200141186a280200450d0220012802141020200141e0026a24000f0b20012d00144103470d0102402001411c6a280200450d00200141186a28020010200b200141286a280200450d01200141246a2802001020200141e0026a24000f0b200141186a2d00004105490d00200141c0006a280200450d002001413c6a28020010200b200141e0026a24000f0b20014188016a200141106a41f8001084041a02400240024041f80010222200450d00200020014188016a41f80010840421002001428180808010370294022001200036029002200141c0026a41086a22024200370300200142003703c00241bccec000410d200141c0026a1002200141a8026a41086a2002290300370300200120012903c0023703a802200141003602c802200142013703c002200141013602800220014180026a200141c0026a103e024002400240024002400240024020002802704101470d0020012802c40220022802002202470d01200241016a22032002490d0a20024101742204200320032004491b22044100480d0a2002450d0320012802c0022002200410212203450d040c0d0b20012802c40220022802002202470d01200241016a22032002490d0920024101742204200320032004491b22044100480d092002450d0420012802c0022002200410212203450d050c070b20012802c00221030c0c0b20012802c00221030c060b2004102222030d090b200441011023000b2004102222030d020b200441011023000b41f80041081023000b200120043602c402200120033602c002200141c8026a28020021020b200141c8026a2204200241016a360200200320026a41003a0000200041f4006a280200210502400240024020012802c4022203200428020022026b41044f0d00200241046a22042002490d0320034101742202200420042002491b22024100480d032003450d0120012802c0022003200210212203450d020c040b20012802c00221030c040b2002102222030d020b200241011023000b1024000b200120023602c402200120033602c002200141c8026a28020021020b200141c8026a200241046a360200200320026a20053600000c020b200120043602c402200120033602c002200141c8026a28020021020b200141c8026a200241016a360200200320026a41013a00000b2000200141c0026a10b80120012802c4022102200141a8026a411020012802c0022203200141c8026a280200100302402002450d00200310200b20014190026a108f0220001020200141e0026a24000b9d0701037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002202413f4b0d00200141046a280200200141086a2802002200470d01200041016a22032000490d1120004101742204200320032004491b22044100480d112000450d0520012802002000200410212203450d060c170b2002418080014f0d01200141046a2802002203200141086a28020022006b41024f0d02200041026a22042000490d1020034101742200200420042000491b22004100480d102003450d0820012802002003200010212203450d090c140b200128020021030c160b20024180808080044f0d01200141046a2802002203200141086a28020022006b41044f0d04200041046a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d08200128020020032000102122030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102122030d0a0c0e0b2004102222030d110b200441011023000b200128020021030c050b200128020021030c070b2000102222030d0b0b200041011023000b200010222203450d060b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b200410222203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200028020021030240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0420024101742200200420042000491b22004100480d042002450d01200128020020022000102122020d020c070b200128020021020c020b200010222202450d050b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b1024000b200041011023000b200441011023000b200041011023000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000bea1105027f017e067f037e0b7f230041e0026b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241306a41086a2207200141086a28020036020020022001290200370330024020002f01062201410b4f0d00200020034103746a220841106a200841086a2208200120036b4103741085041a2008200437000020002003410c6c6a220141ec006a200141e0006a2209200041066a22082f010020036b410c6c1085041a200141e8006a200728020036020020092002290330370200200820082f010041016a3b01002002200036001720022006360013200241e0026a24000f0b02400240024041e4011022220a450d00200a41003b0106200a4100360200200a41086a200241d0006a41dc011084042107200241d0006a41086a2208200041b0016a280200360200200220002902a8013703502000413c6a330000210b2000413e6a310000210c20002d003f21092000350038210d2007200041c0006a200041066a220e2f010041796a22014103741084042107200a41e0006a200041b4016a2001410c6c108404210f200e41063b0100200a20013b0106200241c0006a41086a200828020036020020022002290350370340200d200b200c4210868442208684210b02400240200341064b0d00200041086a20034103746a220741086a2007200041066a22012f010020036b4103741085041a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c1085041a200741086a200241306a41086a280200360200200720022903303702000c010b200720034103746a41506a2007200341796a22084103746a2207200141ffff037120086b4103741085041a20072004370000200f2003410c6c6a220341b87f6a200341ac7f6a2207200a41066a22012f010020086b410c6c1085041a200341b47f6a200241306a41086a280200360200200720022903303702000b200120012f010041016a3b0100200241206a41086a2210200241c0006a41086a2211280200360200200220093a0017200220022903403703202002200b3e02102002200b4230883c00162002200b4220883d0114200241086a22122010280200360200200220022903203703002002290310210402400240024020002802002209450d0020002f0104211303402002200641016a220636021020022009360214200241306a41086a2214201228020036020020022002290300370330201341ffff0371210820092f01062200410a4d0d0241940210222207450d03200741003b010620074100360200200741086a200241d0006a418c021084042103200941386a290000210b200241d0006a41086a220f200941b0016a2802003602002002200941a8016a2902003703502003200941c0006a200941066a22152f0100220141796a22004103741084042116200741e0006a200941b4016a2000410c6c1084042117200741e4016a20094180026a2001417a6a220e4102741084042118201541063b0100200720003b01060240200e450d00410021002018210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b2011200f28020036020020022002290350370340200f20112802003602002002200229034037035002400240201341ffff0371220341064b0d00200941086a2200200841016a220e4103746a200020084103746a220020152f0100220120086b22134103741085041a20002004370000200941e0006a2008410c6c6a2200410c6a20002013410c6c1085041a200041086a2014280200360200200020022903303702002015200141016a22003b0100200941e4016a2201200841027422156a41086a2001200e4102746a2213200041ffff03712201200e6b4102741085041a2013200a360200200320014f0d01200920156a41e8016a2100034020002802002203200841016a22083b010420032009360200200041046a210020012008470d000c020b0b20162008417a6a22034103746a2016200841796a22004103746a220e200741066a22012f010020006b4103741085041a200e200437000020172008410c6c6a220e41b87f6a200e41ac7f6a221320012f0100221520006b410c6c1085041a200e41b47f6a2014280200360200201320022903303702002001201541016a220e3b01002018200841027422136a416c6a201820034102746a2201200e41ffff0371220820036b4102741085041a2001200a360200200320084b0d00200720136a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320082000470d000b0b2010200f280200360200200220022903503703202012201028020036020020022002290320370300024020092802002200450d0020092f0104211320002109200b21042007210a0c010b0b2007210a200b21040b41940210222200450d03200041003b010620004100360200200041086a200241d0006a418c0210840421012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f010622034103746a200437000020002003410c6c6a220141e8006a200241086a280200360200200141e0006a2002290300370200200041e4016a200341016a22034102746a200a360200200020033b0106200a20033b0104200a20003602000c040b200941086a2201200841016a22034103746a200120084103746a2201200020086b22074103741085041a2001200437000020092008410c6c6a220141ec006a200141e0006a220e2007410c6c1085041a200141e8006a200241306a41086a280200360200200e2002290330370200200941066a200041016a22003b0100200941e4016a220120084102746a41086a200120034102746a2201200041ffff0371220720036b4102741085041a2001200a360200201341ffff037120074f0d0320092003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b010420012009360200200341046a210320072000470d000c040b0b41940241041023000b41e40141041023000b41940241041023000b200241e0026a24000bfe0705017f037e027f047e027f230041e0016b22032400200241106a290300210420024188016a29030021052002290308210620022802002107200341206a200241186a41f0001084041a20012802002108200341b0016a41186a20034188016a290300370300200341b0016a41106a20034180016a290300370300200341b0016a41086a200341f8006a290300370300200320032903703703b00102400240024041d00010222202450d0042002109200242003703002002410036022420022007360220200241003a0048200241186a4200370300200241106a4200370300200241086a42003703002002200341206a41d0006a2201290300370328200241306a200141086a290300370300200241386a200141106a290300370300200241c0006a200141186a29030037030020034190016a41086a220142003703002003420037039001418feec000411620034190016a1002200341d0016a41086a200129030037030020032003290390013703d001024002400240200341d0016a411041c8d7c400410041001001417f460d0020034200370398012003420037039001200341d0016a411020034190016a4110410010012201417f460d022001410f4d0d024201210a42002109200329039001220b427e5420034190016a41086a290300220c50200c4201511b0d01200341106a200b200c427f4200108704200341106a41086a29030021092003290310210a0c010b4201210a0b200320062004200a200910870420034190016a41186a200341b0016a41186a29030037030020034190016a41106a200341b0016a41106a29030037030020034190016a41086a200341b0016a41086a290300370300200320032903b00137039001200329030021090240024002400240200841046a28020020082802082201470d00200141016a22072001490d032001410174220d20072007200d491b220dad42d0007e220a422088a70d03200aa7220e4100480d032001450d012008280200200141d0006c200e10212207450d020c060b200828020021070c060b200e102222070d040b200e41081023000b1024000b419a88c00041331039000b41d00041081023000b20082007360200200841046a200d360200200841086a28020021010b2007200141d0006c6a22014200370310200142003703082001200937030020012002360220200120032903900137022c200141186a4200370300200141246a428180808010370200200141c4006a20034190016a41186a2903003702002001413c6a20034190016a41106a290300370200200141346a20034190016a41086a290300370200200841086a2202200228020041016a3602002000200437030820002006370300200041106a200341206a41f0001084041a2000200537038001200341e0016a24000bdb1801187f230041c00f6b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241206a41186a22062000412c6a290000370300200241206a41106a2207200041246a290000370300200241206a41086a22082000411c6a29000037030020022000290014370320200241a0026a200141e0001084041a024020032f01062201410b4f0d00200320044105746a220041286a200041086a2209200120046b4105741085041a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000200920022903203700002003200441e0006c6a220041c8036a200041e8026a2200200341066a22032f010020046b41e0006c1085041a2000200241a0026a41e0001084042100200320032f010041016a3b0100200241c00f6a240020000f0b02400240024041880b1022220a450d00200a41003b0106200a4100360200200a41086a20024190046a41800b10840421012002200341ca016a2d00003a00aa03200220032f00c8013b01a803200220032900db01370398032002200341e0016a29000037009d03200341cb016a280000210b200341cf016a280000210c200341d3016a280000210d200341d7016a280000210e20024190046a200341a8076a41e0001084041a2001200341e8016a200341066a22062f010041796a22004105741084042101200a41e8026a20034188086a200041e0006c1084042107200641063b0100200a20003b0106200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241b0036a20024190046a41e0001084041a02400240200441064b0d00200341086a20044105746a220141206a2001200341066a22002f010020046b4105741085041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200341e8026a200441e0006c6a220f41e0006a200f20002f010020046b41e0006c1085041a200f200241a0026a41e0001084041a0c010b200120044105746a41c07e6a2001200441796a22064105746a2201200041ffff037120066b4105741085041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a290300370000200120022903203700002007200441e0006c6a220041c07b6a200041e07a6a220f200a41066a22002f010020066b41e0006c1085041a200f200241a0026a41e0001084041a0b20024188026a41026a220420022d0096033a0000200020002f010041016a3b0100200220022f0194033b01880220022002290380033703800120022002290085033700850120024190016a200241b0036a41e0001084041a2002411c6a41026a221020042d00003a0000200220022f0188023b011c2002200229038001370308200220022900850137000d200241206a20024190016a41e0001084041a02400240024020032802002207450d0020032f0104211103402002419c026a41026a221620102d00003a0000200220022f011c3b019c0220022002290308370388022002200229000d37008d02200241a0026a200241206a41e0001084041a201141ffff0371210620072f01062203410a4d0d0241b80b10222201450d03200141003b010620014100360200200141086a20024190046a41b00b10840421002002200741ca016a2d00003a00aa03200220072f00c8013b01a803200220072900db01370398032002200741e0016a29000037009d03200741cb016a2800002112200741cf016a2800002115200741d3016a2800002114200741d7016a280000211320024190046a200741a8076a41e0001084041a2000200741e8016a200741066a22092f0100220441796a22034105741084042117200141e8026a20074188086a200341e0006c1084042118200141880b6a200741a40b6a2004417a6a22084102741084042119200941063b0100200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241b0036a20024190046a41e0001084041a200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241ac036a41026a220820022d0096033a0000200220022f0194033b01ac0320022002290380033703800120022002290085033700850120024190046a200241b0036a41e0001084041a02400240201141ffff0371220041064b0d00200741086a2203200641016a22044105746a200320064105746a220320092f0100221120066b22194105741085041a2003200e36000f2003200d36000b2003200c3600072003200b360003200341026a20162d00003a0000200320022f019c023b00002003200229038802370013200341186a200229008d02370000200741e8026a200641e0006c6a220341e0006a2003201941e0006c1085041a2003200241a0026a41e0001084041a2009201141016a22033b0100200741880b6a2211200641027422196a41086a201120044102746a2211200341ffff037120046b4102741085041a2011200a360200200020092f010022044f0d01200720196a418c0b6a2103034020032802002200200641016a22063b010420002007360200200341046a210320042006470d000c020b0b20172006417a6a22044105746a2017200641796a22034105746a2200200141066a22092f010020036b4105741085041a200041186a200229008d023700002000200e36000f2000200d36000b2000200c3600072000200b360003200041026a20162d00003a0000200020022f019c023b000020002002290388023700132018200641e0006c6a220041c07b6a200041e07a6a220020092f010020036b41e0006c1085041a2000200241a0026a41e0001084041a200920092f010041016a22003b01002019200641027422116a416c6a201920044102746a2209200041ffff0371220620046b4102741085041a2009200a360200200420064b0d00200120116a41f00a6a2100034020002802002204200341016a22033b010420042001360200200041046a210020062003470d000b0b20024184026a41026a220320082d00003a0000200220022f01ac033b01840220022002290380013703f00120022002290085013700f50120024190016a20024190046a41e0001084041a201020032d00003a0000200220022f0184023b011c200220022903f001370308200220022900f50137000d200241206a20024190016a41e0001084041a024020072802002203450d0020072f010421112012210b2013210e2014210d2015210c200321072001210a0c010b0b2012210b2013210e2014210d2015210c2001210a0b41b80b10222203450d03200341003b010620034100360200200341086a20024190046a41b00b10840421012003200528020022003602880b200520033602002005200528020441016a360204200041003b010420002003360200200120032f010622044105746a220020022f011c3b00002000200e36000f2000200d36000b2000200c3600072000200b36000320002002290308370013200041026a2002411c6a41026a2d00003a0000200041186a200229000d3700002003200441e0006c6a41e8026a200241206a41e0001084041a200341880b6a200441016a22004102746a200a360200200320003b0106200a20003b0104200a20033602000c040b200741086a2200200641016a22044105746a200020064105746a2200200320066b22014105741085041a2000200e36000f2000200d36000b2000200c3600072000200b360003200041026a2002419c026a41026a2d00003a0000200020022f019c023b00002000200229038802370013200041186a200229008d023700002007200641e0006c6a220041c8036a200041e8026a2200200141e0006c1085041a2000200241a0026a41e0001084041a200741066a2200200341016a22033b0100200741880b6a220120064102746a41086a200120044102746a2201200341ffff037120046b4102741085041a2001200a360200201141ffff037120002f010022034f0d03200a20043b0104200a200736020020042003460d032003417f6a210120072004417f6a22034102746a41900b6a2100034020002802002204200341026a3b010420042007360200200041046a21002001200341016a2203470d000c040b0b41b80b41081023000b41880b41081023000b41b80b41081023000b200241c00f6a2400200f0bbc0101047f230041306b22012400200120001032024020012802004101470d00200141286a2102200141246a21030340024020032802002204450d002002280200450d00200410200b20012000103220012802004101460d000b0b0240200028020422044180e5c200460d0020042802002103200410202003450d0020032802002100200310202000450d00024020002802002204450d000340200010202004210020042802002203210420030d000b0b200010200b200141306a24000be20303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200141016a2101200441e0006a2802002204450d030c010b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010202005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110202005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a2802002104024020064101460d00410120066b2101034020002802e4012100200141016a22010d000b0b410021012004450d020b2002417f6a210202402005a7450d00200410200b20020d000b0b024020004180e5c200460d0020002802002101200010202001450d0020012802002104200110202004450d00024020042802002201450d000340200410202001210420012802002200210120000d000b0b200410200b0ba11f01407f23004190066b22042400200441e0006a41186a200241186a290000370300200441e0006a41106a200241106a290000370300200441e0006a41086a200241086a290000370300200420022900003703600240024002400240200128020022054180e5c200460d00200128020421060c010b41ec0310222205450d0141002106200541003b010620054100360200200541086a200441f8016a41e4031084041a20014100360204200120053602000b0c010b41ec0341041023000b41002102024003400240024002400240024002400240024020020e020001010b200541086a2107200541066a210820052f01062209410574210a417f2102024002400240024002400340200a450d01200241016a2102417f4101200441e0006a20074120108604220b4100481b4100200b1b220b450d04200a41606a210a200741206a2107200b4101460d000b20060d010c020b200921022006450d010b2006417f6a2106200520024102746a41ec036a2802002105410021020c0a0b200441086a41186a220b200441e0006a41186a220a290300370300200441086a41106a220c200441e0006a41106a2207290300370300200441086a41086a2209200441e0006a41086a220d290300370300200420042903603703082001200128020841016a360208200a200b2903003703002007200c290300370300200d200929030037030020042004290308370360200441e8016a41086a220c200341086a280200360200200420032902003703e80120082f01002209410b4f0d01200520024105746a220b41286a200b41086a220e200920026b4105741085041a200b41206a200a290300370000200b41186a2007290300370000200b41106a200d290300370000200e200429036037000020052002410c6c6a220a41f4026a200a41e8026a220d200541066a22072f010020026b410c6c1085041a200a41f0026a200c280200360200200d20042903e801370200200720072f010041016a3b01000c0a0b200441f8016a41086a220a20052002410c6c6a220241f0026a22072802003602002004200241e8026a22022902003703f8012007200341086a28020036020020022003290200370200200441e0006a41086a2202200a280200360200200420042903f801370360200041013602002000410c6a20022802003602002000200429036037020420044190066a24000f0b41ec031022220f450d04200f41003b0106200f4100360200200f41086a200441f8016a41e4031084042107200441f8016a41086a220d200541b8036a280200360200200420052902b0033703f8012004200541e0016a2900003700c501200420052900db013703c0012004200541ca016a2d00003a00d201200420052f00c8013b01d001200541cb016a2800002110200541cf016a2800002111200541d3016a2800002112200541d7016a28000021132007200541e8016a200541066a220b2f010041796a220a4105741084042107200f41e8026a200541bc036a200a410c6c108404210c200b41063b0100200f200a3b0106200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200441286a41086a200d280200360200200420042903f80137032802400240200241064b0d00200541086a20024105746a220a41206a200a20082f010020026b4105741085041a200a41186a200441e0006a41186a290300370000200a41106a200441e0006a41106a290300370000200a41086a200441e0006a41086a290300370000200a2004290360370000200541e8026a2002410c6c6a220a410c6a200a20082f010020026b410c6c1085041a200a41086a200441e8016a41086a280200360200200a20042903e8013702000c010b200720024105746a41c07e6a2007200241796a220d4105746a2207200a41ffff0371200d6b4105741085041a200741186a200441e0006a41186a290300370000200741106a200441e0006a41106a290300370000200741086a200441e0006a41086a29030037000020072004290360370000200c2002410c6c6a220241b87f6a200241ac7f6a220a200f41066a22082f0100200d6b410c6c1085041a200241b47f6a200441e8016a41086a280200360200200a20042903e8013702000b4101210d200820082f010041016a3b01004102211420044198016a41026a220220042d00be013a000041082115200441d8016a41086a2216200441286a41086a280200360200200420042f01bc013b019801200420042903a801370350200420042900ad01370055200420042903283703d801200441c0006a41086a221720162802003602002004413c6a41026a221820022d00003a0000200420042903d801370340200420042903503703282004200429005537002d200420042f0198013b013c2005280200220e450d0120052f0104211941ffff03211a410a211b419c04211c4100211d419404211e41ca01211f41db01212041e001212141cb01212241cf01212341d301212441d701212541b803212641b003212741e8012128410621294179212a4105212b41bc03212c41e802212d410c212e418804212f41ec032130417a21314118213241f00321334104210c41ac7f213441b87f213541b47f2136416c213741d40321380c060b20044194016a20146a223d20182d00003a0000200420042f013c3b019401200420042903283703602004200429002d37006520044198016a20156a223e201728020036020020042004290340370398012019201a712109200e2f01062202201b4d0d01201c1022220b450d02200b201d3b0106200b201d360200200b20156a200441f8016a201e108404210a2004200e201f6a2d00003a00d2012004200e2f00c8013b01d0012004200e20206a2900003703c0012004200e20216a2900003700c501200e20226a2800002139200e20236a280000213c200e20246a280000213b200e20256a280000213a200441f8016a20156a223f200e20266a2802003602002004200e20276a2902003703f801200a200e20286a200e20296a22402f01002207202a6a2202202b741084042141200b202d6a200e202c6a2002202e6c1084042142200b20306a200e202f6a200720316a22082014741084042143204020293b0100200b20023b010602402008450d00410021022043210a0340200a280200220720023b01042007200b360200200a200c6a210a20082002200d6a2202470d000b0b200441e8016a20156a2202203f280200360200200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200420042903f8013703e801200441d4016a20146a220820042d00be013a0000200420042f01bc013b01d401200420042903a8013703f801200420042900ad013700fd0120162002280200360200200420042903e8013703d801024002402019201a71220a20294b0d00200e20156a22022009200d6a2219202b746a20022009202b746a220220402f010020096b202b741085041a200220326a20042900653700002002201336000f2002201236000b2002201136000720022010360003200220146a203d2d00003a0000200220042f0194013b000020022004290360370013200e202d6a2009202e6c6a2202202e6a200220402f0100220720096b202e6c1085041a200220156a203e280200360200200220042903980137020020402007200d6a22023b0100200e20306a2207200920147422116a20156a200720192014746a22402002201a71220720196b2014741085041a2040200f360200200a20074f0d01200e20116a20336a210203402002280200220a2009200d6a22093b0104200a200e3602002002200c6a210220072009470d000c020b0b2041200920316a2207202b746a20412009202a6a2202202b746a220a200b20296a22192f010020026b202b741085041a200a20326a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a20146a203d2d00003a0000200a20042f0194013b0000200a200429036037001320422009202e6c6a220a20356a200a20346a224020192f0100221120026b202e6c1085041a200a20366a203e280200360200204020042903980137020020192011200d6a220a3b01002043200920147422406a20376a204320072014746a2219200a201a71220920076b2014741085041a2019200f360200200720094b0d00200b20406a20386a210a0340200a28020022072002200d6a22023b01042007200b360200200a200c6a210a20092002470d000b0b20044190016a20146a220220082d00003a000020044180016a20156a220a2016280200360200200420042f01d4013b019001200420042903f801370350200420042900fd01370055200420042903d801370380012017200a280200360200201820022d00003a00002004200429038001370340200420042903503703282004200429005537002d200420042f0190013b013c0240200e2802002202450d00200e2f0104211920392110203a2113203b2112203c21112002210e200b210f410121020c070b20392110203a2113203b2112203c2111200b210f0b419c0410222202450d03200241003b010620024100360200200241086a200441f8016a419404108404210d20022001280200220a3602ec03200120023602002001200128020441016a360204200a41003b0104200a2002360200200d20022f010622074105746a220a2004290328370013200a20042f013c3b0000200a201336000f200a201236000b200a2011360007200a2010360003200a41186a200429002d370000200a41026a2004413c6a41026a2d00003a000020022007410c6c6a220a41f0026a200441c0006a41086a280200360200200a41e8026a2004290340370200200241ec036a200741016a220a4102746a200f3602002002200a3b0106200f200a3b0104200f20023602000c060b200e41086a220a200941016a22074105746a200a20094105746a220a200220096b4105741085041a200a41186a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a41026a20044194016a41026a2d00003a0000200a20042f0194013b0000200a2004290360370013200e2009410c6c6a220241f4026a200241e8026a220a200e41066a220d2f0100220b20096b410c6c1085041a200241f0026a20044198016a41086a280200360200200a200429039801370200200d200b41016a22023b0100200e41ec036a220a20094102746a41086a200a20074102746a220a200241ffff0371220d20076b4102741085041a200a200f360200201941ffff0371200d4f0d05200e2007417f6a22024102746a41f0036a210a0340200a2802002207200241016a22023b01042007200e360200200a41046a210a200d2002470d000c060b0b419c0441041023000b41ec0341041023000b419c0441041023000b410121020c000b0b2000410036020020044190066a24000b0a0041fc82c000102f000b4d01017f230041206b22002400200041146a41013602002000410336021c200041eca1c40036021820004201370204200041f4a1c4003602002000200041186a360210200041a884c0001048000b110020012000280200200028020410fd010b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241c8d7c400360204200241c8d7c400360200200210e603000bafba020f2a7f017ec4017f027e257f017e7b7f017e0c7f017e0d7f017e0b7f017e4c7f230041e0006b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410d4b0d00024020040e0e00090607030a0c080e050d02040b000b200141186a2802002105200141146a2802002106200141106a28020021072001410c6a2802002108200141086a2802002109200141046a280200210a200241046a280200200241086a2802002204470d16200441016a220b2004490d5e2004410174220c200b200b200c491b220c4100480d5e2004450d2d20022802002004200c1021220b450d2e0c570b2001410c6a280200210b200141086a2802002107200141046a280200210520012d00012108200241046a280200200241086a2802002204470d0d200441016a22062004490d5d2004410174220d20062006200d491b220d4100480d5d2004450d1c20022802002004200d10212206450d1d0c540b2001410c6a280200210e200141086a280200210f200141046a2802002110200241046a280200200241086a2802002204470d0d200441016a220b2004490d5b20044101742205200b200b2005491b22054100480d5b2004450d1d2002280200200420051021220b450d1e0c510b2001410c6a2802002111200141086a2802002112200141046a2802002113200241046a280200200241086a2802002204470d0d200441016a220b2004490d5b20044101742205200b200b2005491b22054100480d5b2004450d1e2002280200200420051021220b450d1f0c4e0b200141146a2802002114200141106a28020021152001410c6a2802002116200141086a2802002117200141056a2d00002118200141046a2d00002119200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d1f2002280200200420051021220b450d200c4b0b2001410c6a280200211a200141086a280200211b200141046a280200211c200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d202002280200200420051021220b450d210c480b2001410c6a2802002106200141086a280200211d200141046a280200211e200241046a280200200241086a2802002204470d0d200441016a220b2004490d5820044101742205200b200b2005491b22054100480d582004450d212002280200200420051021220b450d220c450b2001410c6a2802002106200141086a280200211f200141046a2802002120200241046a280200200241086a2802002204470d0d200441016a220b2004490d5720044101742205200b200b2005491b22054100480d572004450d222002280200200420051021220b450d230c420b2001410c6a2802002106200141086a2802002121200141046a2802002122200241046a280200200241086a2802002204470d0d200441016a220b2004490d5620044101742205200b200b2005491b22054100480d562004450d232002280200200420051021220b450d240c3f0b2001410c6a2802002106200141086a2802002123200141046a2802002124200241046a280200200241086a2802002204470d0e200441016a220b2004490d5520044101742205200b200b2005491b22054100480d552004450d262002280200200420051021220b450d270c3c0b2001410c6a2802002125200141086a2802002126200141046a2802002127200241046a280200200241086a2802002204470d0e200441016a220b2004490d5420044101742205200b200b2005491b22054100480d542004450d272002280200200420051021220b450d280c390b200141286a2802002128200141246a2802002129200141206a280200212a2001411c6a2802002109200141186a280200212b200141146a280200212c2001410c6a290200212d200141086a280200212e200141046a280200210a200241046a280200200241086a2802002204470d0e200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d282002280200200420051021220b450d290c360b2001410c6a280200212f200141086a2802002130200141046a2802002131200241046a280200200241086a2802002204470d0e200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d292002280200200420051021220b450d2a0c330b2001410c6a2802002132200141086a2802002133200141046a2802002134200241046a280200200241086a2802002204470d0e200441016a220b2004490d5020044101742205200b200b2005491b22054100480d502004450d2a2002280200200420051021220b450d2b0c300b200141046a2802002104200241046a280200200241086a280200220b470d0e200b41016a2205200b490d50200b4101742206200520052006491b22064100480d50200b450d2b2002280200200b200610212205450d2c0c2d0b200228020021060c470b2002280200210b0c440b2002280200210b0c410b2002280200210b0c3e0b2002280200210b0c3b0b2002280200210b0c380b2002280200210b0c350b2002280200210b0c320b2002280200210b0c410b2002280200210b0c2e0b2002280200210b0c2b0b2002280200210b0c280b2002280200210b0c250b2002280200210b0c220b200228020021050c1f0b200d102222060d370b200d41011023000b20051022220b0d330b200541011023000b20051022220b0d2f0b200541011023000b20051022220b0d2b0b200541011023000b20051022220b0d270b200541011023000b20051022220b0d230b200541011023000b20051022220b0d1f0b200541011023000b20051022220b0d1b0b200541011023000b200c1022220b0d290b200c41011023000b20051022220b0d150b200541011023000b20051022220b0d110b200541011023000b20051022220b0d0d0b200541011023000b20051022220b0d090b200541011023000b20051022220b0d050b200541011023000b2006102222050d010b200641011023000b20022005360200200241046a2006360200200241086a280200210b0b200241086a200b41016a3602002005200b6a41083a00004101210d410021064100210b024002400240024003400240200b2006470d0020064101742205200641016a220720072005491b22054100480d27024002402006450d00200d200620051021220d0d010c040b20051022220d450d030b200521060b200d200b6a200441807f72200441ff0071200441077622051b3a0000200b41016a210b2005210420050d000b200b417f6a210a200241086a2107200241046a2136200b210503400240024002400240203628020020072802002204470d00200441016a22082004490d2a20044101742209200820082009491b22094100480d2a2004450d01200228020020042009102122080d020c060b200228020021080c020b200910222208450d040b2002200836020020362009360200200728020021040b2007200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b0240200241046a2802002205200241086a28020022046b200a4d0d00200228020021050c040b2004200b6a22072004490d2520054101742204200720072004491b22044100480d25024002402005450d0020022802002005200410212205450d010c040b2004102222050d030b200441011023000b200541011023000b200941011023000b20022005360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200520046a200d200b1084041a4101213602402006450d00200d10200b4101210d410621040c1f0b2002200b360200200241046a2005360200200241086a28020021040b410121e001410821e101200241086a200441016a360200200b20046a410a3a0000410021e2012003412c6a22e301410036020020034201370224200320023602202034203241186c6a21e401410721e50141ff0021e60141807f21e701410021e801410021e901203221ea010240024041004100460d004114214c0c010b4113214c411021040c1e0b411021040c1d0b2002200b360200200241046a2005360200200241086a28020021040b410121d301410821d401200241086a200441016a360200200b20046a41063a0000410021d501200341dc006a22d601410036020020034201370254200320023602502031202f4104746a21d701410721d80141ff0021d90141807f21da01410021db01410021dc01202f21dd010240024041004100460d004110214c0c010b410f214c411021040c1c0b411021040c1b0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41003a0000200341dc006a22d20141003602002003420137025420032002360250202d422088a721064100210b41002104202da72208210502400240024003400240024002400240200b2004470d00200b41016a2204200b490d22200b4101742207200420042007491b22044100480d22200b450d012003280254200b20041021220b0d020c050b2003280254210b0c020b20041022220b450d030b200341d0006a41086a20043602002003200b36025420d20128020021040b20d201200441016a360200200b20046a200541807f72200541ff0071200541077622071b3a0000200341d0006a41086a280200210b20d20128020021042007210520070d000b024002400240200b20046b20084f0d00200420086a22052004490d20200b4101742204200520052004491b22044100480d20200b450d012003280254200b200410212205450d020c040b200328025421050c040b2004102222050d020b200441011023000b200441011023000b200341d8006a200436020020032005360254200341dc006a28020021040b200341dc006a220b200420086a360200200520046a200a20081084041a0240202e450d00200a10200b200341d8006a210702400240024002400240034002400240024002402007280200200b2802002204470d00200441016a22052004490d24200441017422d2012005200520d201491b22d2014100480d242004450d012003280254200420d201102122050d020c050b200328025421050c020b20d20110222205450d030b200720d20136020020032005360254200b28020021040b200b200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b4101212e202c450d04200341dc006a2105200341d8006a21072009210b03400240024002400240200728020020052802002204470d00200441016a22062004490d24200441017422d2012006200620d201491b22d2014100480d242004450d012003280254200420d201102122060d020c060b200328025421060c020b20d20110222206450d040b200720d20136020020032006360254200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b024002400240200341d8006a280200220b200341dc006a28020022046b20094f0d00200420096a22052004490d22200b4101742204200520052004491b22044100480d22200b450d012003280254200b20041021220b450d020c050b2003280254210b0c050b20041022220b0d030b200441011023000b20d20141011023000b20d20141011023000b200341d8006a20043602002003200b360254200341dc006a28020021040b200341dc006a200420096a360200200b20046a202c20091084041a4100212e202b450d00202c10200b202a20284104746a21b602200341dc006a2105200341d8006a21072028210b0240024003400240024002400240200728020020052802002204470d00200441016a22062004490d21200441017422d2012006200620d201491b22d2014100480d212004450d012003280254200420d201102122060d020c050b200328025421060c020b20d20110222206450d030b200720d20136020020032006360254200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02402028450d00411021b702410821b802410c21b902417f21ba02410621bb02410121bc02410021bd02410721be0241ff0021bf0241807f21c002410221c102410321c202411a21c302410421c402410521c502411021c602202a21d201411b214c0c020b202a21d201410521040c1b0b20d20141011023000b411021040c190b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41053a0000200341d0006a410c6a220a4100360200200342013702542003200236025020272025410c6c6a21094101210741002105410021042025210b02400240024002400340024020042005470d00200541016a22062005490d1f20054101742208200620062008491b22064100480d1f024002402005450d00200720052006102122070d010c040b200610222207450d030b200341d0006a41086a200636020020032007360254200621050b200a200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b0240024002400240024002402025450d002025410c6c41746a210b202721040340200441046a28020022054102460d02200341086a20042802002005200441086a280200200341d0006a104a20032d00082205411a470d042004410c6a2104200b41746a220b4174470d000c030b0b202721090c010b2004410c6a21090b20272025410c6c6a20096b2104024003402004450d01200441746a21042009280204210b2009410c6a2109200b4102470d000b0b02402026450d00202710200b200341d0006a41086a2802002137200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d252004410174220d20072007200d491b220d4100480d252004450d0120052802002004200d102122070d020c090b200528020021070c020b200d10222207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490d21200b4101742204200620062004491b22044100480d21200b450d022005280200200b20041021220b450d030c060b2005280200210b0c060b20032f000920032d000b411074722107200341086a41086a290300212d200328020c21082004410c6a210402400340200b450d01200b41746a210b200428020421062004410c6a210420064102470d000b0b02402026450d00202710200b0240200341d0006a41086a280200450d00200328025410200b200020073b0001200020053a0000200041036a20074110763a0000200041086a202d370000200041046a20083600004100219103410121c0014101210c0c1b0b20041022220b0d030b200441011023000b200641011023000b200d41011023000b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b4100213c410121364101210d4101213741012138410121394101213a4101213b410721040c170b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41013a0000202420064104746a21c2014100210b410021c301410021c401410121c50120062104024002400340024020c30120c401470d00200b20c30141016a22052005200b491b22c4014100480d1b0240200b450d0020c50120c30120c401102122c5010d010c030b20c401102222c501450d020b20c50120c3016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20c30141016a21c3012005210420050d000b02402006450d00411021c601410521c701410121c801410021c901410421ca01410221cb01410721cc0141ff0021cd0141807f21ce01410321cf01202421d001410e214c0c020b202421d101410421040c170b20c40141011023000b411021040c150b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41073a00002022200641146c6a21b1014100210b410021b201410021b301410121b40120062104024002400340024020b20120b301470d00200b20b20141016a22052005200b491b22b3014100480d190240200b450d0020b40120b20120b301102122b4010d010c030b20b301102222b401450d020b20b40120b2016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20b20141016a21b2012005210420050d000b02402006450d00411421b501410421b601410121b701411021b801410721b90141ff0021ba0141807f21bb01410021bc01410221bd01202221be01410d214c0c020b202221bf01410321040c150b20b30141011023000b411021040c130b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41033a0000202020064102746a21a5014100210b410021a601410021a701410121a801200621040240024002400340024020a60120a701470d00200b20a60141016a22052005200b491b22a7014100480d180240200b450d0020a80120a60120a701102122a8010d010c030b20a701102222a801450d020b20a80120a6016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20a60141016a21a6012005210420050d000b2006450d01410121a901410721aa0141ff0021ab0141807f21ac01410021ad01410221ae01410421af01202021b001410c214c0c020b20a70141011023000b410121040c120b411021040c110b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41023a0000201e200641286c6a2187014100210b410021880141002189014101218a01200621040240024003400240208801208901470d00200b20880141016a22052005200b491b2289014100480d150240200b450d00208a012088012089011021228a010d010c030b2089011022228a01450d020b208a012088016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20880141016a2188012005210420050d000b02402006450d004128218b014104218c014124218d014120218e01411c218f01411a219001411921910141142192014110219301410721940141ff0021950141807f21960141012197014100219801410221990141f000219a014103219b01417f219c01413f219d0141c000219e0141ff01219f01201e21a001410b214c0c020b201e21a001410221040c110b20890141011023000b411021040c0f0b2002200b360200200241046a2005360200200241086a28020021040b4101216741082168200241086a200441016a360200200b20046a41093a000041002169200341dc006a226a41003602002003420137025420032002360250201c201a411c6c6a216b4107216c41ff00216d41807f216e4100216f41002170201a21710240024041004100460d004107214c0c010b4106214c411021040c0e0b411021040c0d0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41003a000002400240024002400240024041041022225b450d00205b41eec2b5ab0636000002400240024002400240024002400240024020194101460d00024020194102460d0020194103470d024100215c4101215d2017215e2016215f20152160410121614101216241012163410110222264450d1e410021040c1b0b2003410036024820034201370340200341c8006a21094101210741002105410021042017210b0340024020042005470d00200541016a22062005490d1d20054101742208200620062008491b22064100480d1d024002402005450d00200720052006102122070d010c0b0b200610222207450d0a0b2003200636024420032007360240200621050b2009200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b201620144104746a21c7022014450d03201621c8022017450d04410421c902201620144104746a22ca0241706a21cb02410021cc02410121cd02411021ce02417f21cf02410821d002410721d10241ff0021d20241807f21d302411a21d402201721d502410021d602201621d7024105214c0c0c0b4100215d2003410036024820034201370340200341146a2014360200200341086a41086a20153602002003201636020c20032017360208200341d0006a200341086a200341c0006a104b20032d005022d802411a470d01200341c0006a41086a28020021602003280244215f2003280240215e41012161410021624100215c41012118410121634101102222640d090c1c0b4101215e410021044100210b20152105034002400240024002402004200b470d00200441016a220b2004490d1e20044101742206200b200b2006491b225f4100480d1e2004450d01205e2004205f1021225e0d020c0b0b2004215f0c020b205f1022225e450d090b2004210b205f21040b205e200b6a200541807f72200541ff0071200541077622061b3a0000200b41016a210b2006210520060d000b205f200b6b20154f0d0c200b20156a2204200b490d19205f4101742205200420042005491b22044100480d19205f450d03205e205f20041021225e450d040c0b0b20032d0053411074210420032f0051210b200341d0006a41086a29030021bc03200328025421bd0302402003280244450d00200328024010200b200b20047221be03410d21040c170b201621c8020b20c80220c702460d06410e21040c150b20041022225e0d070b200441011023000b200641011023000b205f41011023000b410441011023000b410021040c0f0b410f21040c0e0b411021040c0d0b2004215f0b205e200b6a201720151084041a200b20156a21604101215d02402016450d00201710200b41002162410121614101215c4100211841012163410110222264450d0e410021040c0b0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41043a0000200341d0006a410c6a220a4100360200200342013702542003200236025020132011410c6c6a21094101210741002105410021042011210b024002400240024002400340024020042005470d00200541016a22062005490d1220054101742208200620062008491b22064100480d12024002402005450d00200720052006102122070d010c040b200610222207450d030b200341d0006a41086a200636020020032007360254200621050b200a200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b0240024002400240024002402011450d002011410c6c41746a21052013210b0340200b41046a28020022074102460d02200b41086a2802002108200b280200210a0240024002400240200341d0006a41086a2227280200200341d0006a410c6a22252802002204470d00200441016a22062004490d1b20044101742226200620062026491b22264100480d1b2004450d01200328025420042026102122060d020c0d0b200328025421060c020b202610222206450d0b0b20272026360200200320063602540b2025200441016a360200200620046a41f0003a0000200341086a200a20072008200341d0006a104a20032d00082206411a470d04200b410c6a210b200541746a22054174470d000c030b0b201321090c010b200b410c6a21090b20132011410c6c6a20096b2104024003402004450d01200441746a21042009280204210b2009410c6a2109200b4102470d000b0b02402012450d00201310200b200341d0006a41086a2802002137200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d182004410174220d20072007200d491b220d4100480d182004450d0120052802002004200d102122070d020c090b200528020021070c020b200d10222207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490d14200b4101742204200620062004491b22044100480d14200b450d022005280200200b20041021220b450d030c070b2005280200210b0c070b20032f000920032d000b411074722107200341086a41086a290300212d200328020c2108200b410c6a2104024003402005450d01200541746a21052004280204210b2004410c6a2104200b4102470d000b0b02402012450d00201310200b0240200341d0006a41086a280200450d00200328025410200b200020073b0001200020063a0000200041036a20074110763a0000200041086a202d370000200041046a20083600004100210c410121c0010c0d0b20041022220b0d040b200441011023000b200641011023000b200d41011023000b202641011023000b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b4100213d410121364101210d4101213741012138410121394101213a4101213b4101213c410821040c090b2002200b360200200241046a2005360200200241086a28020021040b4101214141082142200241086a200441016a360200200b20046a410b3a000041002143200341dc006a2244410036020020034201370254200320023602502010200e411c6c6a21454107214641ff00214741807f2148410021494100214a200e214b0240024041004100460d004101214c0c010b4100214c411021040c080b411021040c070b20022006360200200241046a200d360200200241086a28020021040b200241086a220d200441016a360200200620046a20083a000002400240024002400240200241046a2802002206200d28020022046b200b4f0d002004200b6a22082004490d0c20064101742204200820082004491b22044100480d0c2006450d0120022802002006200410212206450d020c030b200228020021060c030b2004102222060d010b200441011023000b20022006360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200620046a2005200b1084041a410021354101213602402007450d00200510200b4101210d4101213741012138410121394101213a4101213b4101213c4101213d4101213e4101213f41012140410921040c050b2002200b360200200241046a200c360200200241086a28020021040b4101210c200241086a200441016a360200410021c001200b20046a41003a00002003411c6a2005360200200341186a200636020020032007360214200320083602102003200936020c2003200a360208200341d0006a200341086a2002104c200320032900513703402003200341d0006a41086a290000370047024020032d00502204411a470d00410021c101410121364101210d4101213741012138410121394101213a4101213b4101213c4101213d4101213e4101213f41012140410121350c030b20002003290340370001200020043a0000200041086a20032900473700000b41012191030b4101219203410c21040c010b410a21040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e11000102030405060708090a0b0c1e222328280b206420183a0000410121044101210b20602105034002400240024002402004200b470d00200420636a220b2004490dfe0120042063742206200b200b2006491b22654100480dfe012004450d01206420042065102122640d020c2a0b200421650c020b206510222264450d280b2004210b206521040b2064200b6a200541807f72200541ff0071200541077622061b3a0000200b20636a210b2006210520060d000b2065200b6b20604f0d17200b20606a2204200b490df90120654101742205200420042005491b22044100480df9012065450d1520642065200410212264450d180c160b0240201f450d00202010200b200241086a2105200241046a210720a601210b03400240024002400240200728020020052802002204470d00200441016a22062004490dfe0120044101742208200620062008491b22084100480dfe012004450d01200228020020042008102122060d020c270b200228020021060c020b200810222206450d250b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20a6014f0d00200420a6016a22052004490dfa01200b4101742204200520052004491b22044100480dfa01200b450d0c2002280200200b20041021220b450d100c0d0b2002280200210b0c0d0b20a001208701460da101034020a00141186a2d00004104460da20120a00141106a280200210420a001410c6a280200210b024020a00141046a280200450d0020a00128020010200b02402004450d00200b10200b20a00141286a22a001208701470d000ca2010b0b20bf0120b101460d9f01034020bf01410c6a2802004104460da001024020bf0141046a280200450d0020bf0128020010200b20bf0141146a22bf0120b101470d000ca0010b0b20d10120c201460de401034020d101410d6a2d00004105460de501024020d10141046a280200450d0020d10128020010200b20d10141106a22d10120c201470d000ce5010b0b202a20284104746a210b02400340200b20d201460d0120d201280200210420d20141106a21d20120044108470d000b0b02402029450d00202a10200b200341d0006a41086a280200210a200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490df9012004410174220d20072007200d491b220d4100480df9012004450d0120052802002004200d102122070d020c240b200528020021070c020b200d10222207450d220b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490df501200b4101742204200620062004491b22044100480df501200b450d0d2005280200200b20041021220b450d100c0e0b2005280200210b0c0e0b410121370c98010b4101213d410821040cf1010b4101213e0c070b410121c101410a21040cef010b2000411a3a0000024020012d00002204410e4b0d000240024002400240024002400240024002400240024002400240024020040e0f0009080703050a0b0d0e0c02060401000b2035450dcb01200141086a280200450dcb01200141046a2802001020200341e0006a24000f0b2036450dca010240200141086a280200450d00200141046a28020010200b0240200141146a2802002202450d00200141186a280200450d00200210200b200141246a280200450dca01200141206a2802001020200341e0006a24000f0b2038450dc901410c21e0022001410c6a2802002204450d8301411821e102410421e202200141046a28020022e302200441186c6a21e402411421e502411021e602410921e702410821e80241ffffffff0321e902417021ea02411f214c0c2e0b203e450dc801200141086a280200450dc801200141046a2802001020200341e0006a24000f0b200d450dc701200141046a2d000022044102460d1f20044101460d1e20040d202001410c6a280200450dc701200141086a2802001020200341e0006a24000f0b203d450dc601200141086a280200450dc601200141046a2802001020200341e0006a24000f0b2037450dc501410c21eb022001410c6a2802002204450d7c411c21ec02410421ed02200141046a28020022ee022004411c6c6a21ef02410821f002411421f102411021f202410921f30241ffffffff0321f402417021f5024120214c0c290b203f450dc40102402001410c6a2802002204450d00200141046a2802002102200441286c210403400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241286a2102200441586a22040d000b0b200141086a280200450dc401200141046a2802001020200341e0006a24000f0b2040450dc30102402001410c6a2802002204450d00200141046a28020021022004410474210403400240200241046a280200450d00200228020010200b200241106a2102200441706a22040d000b0b200141086a280200450dc301200141046a2802001020200341e0006a24000f0b20c101450dc2010240200141086a280200450d00200141046a28020010200b200141146a280200450dc201200141106a2802001020200341e0006a24000f0b203c450dc101200141086a280200450dc101200141046a2802001020200341e0006a24000f0b203b450dc0012001410c6a2802002204450d74410421f602200141046a28020022f70220044104746a21f802411021f902410921fa02410821fb0241ffffffff0321fc02417021fd024121214c0c230b2039450dbf01410c21fe022001410c6a2802002204450d70411c21ff024104218003200141046a2802002281032004411c6c6a218203410821830341142184034110218503410921860341ffffffff0321870341702188034122214c0c210b203a450dbe0102402001410c6a2802002204450d00200141046a2802002102200441146c210403400240200241046a280200450d00200228020010200b200241146a21022004416c6a22040d000b0b200141086a280200450dbe01200141046a2802001020200341e0006a24000f0b2001104d0cbd010b02402030450d00203110200b200341d0006a41086a2802002137200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490df4012004410174220d20072007200d491b220d4100480df4012004450d0120052802002004200d102122070d020c200b200528020021070c020b200d10222207450d1e0b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490df001200b4101742204200620062004491b22044100480df001200b450d0f2005280200200b20041021220b450d120c100b2005280200210b0c100b410121050c630b20041022220b450d030b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420a6016a360200200b20046a20a80120a6011084041a4100213e41012136024020a701450d0020a80110200b4101210d4101213741012138410121394101213a4101213b4101213c4101213d0b4101213f0c94010b200441011023000b20041022220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a0240200a450d00200910200b4101210d41002136202c450d21202e450d20202b450d1f202c10200c220b200441011023000b200410222264450d020b200421650b2064200b6a205e20601084041a0240205f450d00205e10200b200b20606a216602400240024020194102460d00024020194101460d0020190d02205c20164572450d030c710b205d450d702014450d6f2014410c6c210b201621040340024020042802002205450d00200441046a280200450d00200510200b2004410c6a2104200b41746a220b0d000c700b0b2061450d6f2014450d6e410421d902201620144104746a21da02411021db02410c21dc02410821dd02417421de02201621df02411e214c0c170b2062201645720d6e0b201710200c6d0b200441011023000b20041022220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b4100213b410121364101210d4101213741012138410121394101213a0cd8010b200441011023000b200041086a20bc03370200200041046a20bd03360200200020be0341087420d80272360200205b10200c680b0240200141146a2802002204450d002001410c6a28020021022004410c6c2104034002402002280200220b450d00200241046a280200450d00200b10200b2002410c6a2102200441746a22040d000b0b200141106a280200450da8012001410c6a2802001020200341e0006a24000f0b200141146a2802002204450d46410c21e8032001410c6a28020022e90320044104746a21ea03411021eb03410821ec03410421ed03417421ee034123214c0c080b2001410c6a280200450da601200141086a2802001020200341e0006a24000f0b411021ef03410c21f003417421f103410421f203411c214c0c0c0b2015450d67201610200c670b200841011023000b200d41011023000b206541011023000b200d41011023000b024002400240024002400240024002400240024002400240204c0e260100037e556c0504077b5008090a0bb901ba015a59ac01ad018b017a4f4e4d4c7948476764615e5b494645450b200328025421040c010b204920416a22042049490ddb012049204174220b20042004200b491b220b2043480ddb01024002402049450d0020032802542049200b102122040d010c350b200b10222204450d340b200341d0006a20426a200b360200200320043602542044280200214a0b2044204a20416a3602002004204a6a204b204872204b204771204b20467622041b3a000002402004450d002004214b200341d0006a20426a28020022492044280200224a470d224100214c0c140b200e450d7c411c214d4118214e4114214f410821504107215141ff00215241807f2153200341dc006a21544101215541002156411a2157201021584102214c0c120b2058204d6a21592058280204220a450d7c2058204e6a28020021082058204f6a2802002125205820506a290200212d2058280200210b2058280210210903400240024002400240200341d0006a20506a220528020020542802002204470d00200420556a22062004490dde0120042055742207200620062007491b22072056480dde012004450d01200328025420042007102122060d020c3f0b200328025421060c020b200710222206450d3d0b2005200736020020032006360254205428020021040b2054200420556a360200200620046a200b205372200b205271200b20517622041b3a00002004210b20040d000b2003202d3702442003200a360240200341086a200341c0006a200341d0006a101e20032d0008225a2057470d522008210b03400240024002400240200528020020542802002204470d00200420556a22062004490dde0120042055742207200620062007491b22072056480dde012004450d01200328025420042007102122060d020c3d0b200328025421060c020b200710222206450d3b0b2005200736020020032006360254205428020021040b2054200420556a360200200620046a200b205372200b205271200b20517622041b3a00002004210b20040d000b02400240024002402005280200220b205428020022046b20084f0d00200420086a22062004490ddd01200b2055742204200620062004491b22042056480ddd01200b450d012003280254200b20041021220b0d020c2e0b2003280254210b0c020b20041022220b450d2c0b200520043602002003200b360254205428020021040b2054200420086a360200200b20046a200920081084041a02402025450d00200910200b2059215820592045470d1f0c7d0b200328025421040c010b206f20676a2204206f490dd801206f206774220b20042004200b491b220b2069480dd80102400240206f450d002003280254206f200b102122040d010c300b200b10222204450d2f0b200341d0006a20686a200b36020020032004360254206a28020021700b206a207020676a360200200420706a2071206e722071206d712071206c7622041b3a000002402004450d0020042171200341d0006a20686a280200226f206a2802002270470d1c4106214c0c0e0b201a450d75411c21724118217341142174410821754107217641ff00217741807f2178200341dc006a21794101217a4100217b411a217c4102217d4104217e201c217f4108214c0c0c0b207f20726a218001207f2802042208450d75207f20736a2802002107207f20746a280200218101207f20756a290200212d207f280210218201207f280200210b03400240024002400240200341d0006a20756a22830128020020792802002204470d002004207a6a22052004490ddb012004207a742206200520052006491b2206207b480ddb012004450d01200328025420042006102122050d020c3a0b200328025421050c020b200610222205450d380b208301200636020020032005360254207928020021040b20792004207a6a360200200520046a200b207872200b207771200b20767622041b3a00002004210b20040d000b2003202d37024420032008360240200341086a200341c0006a200341d0006a101e20032d0008228401207c470d492082012007207d746a2185012007210b0340024002400240024020830128020020792802002204470d002004207a6a22052004490ddb012004207a742206200520052006491b2206207b480ddb012004450d01200328025420042006102122050d020c380b200328025421050c020b200610222205450d360b208301200636020020032005360254207928020021040b20792004207a6a360200200520046a200b207872200b207771200b20767622041b3a00002004210b20040d000b2007450dcc01208201218601410021040c84010b20a0012204208b016a21a00120042d00182226208c01460d142004208d016a280000210a2004208e016a28000021122004208f016a280000210620042090016a2d000021a10120042091016a2c000021a20120042092016a280200212520042093016a28020021a301200428020c2113200428020421a40120042802002111410121092088014101742107208801210b2004280208222721050340200921040240200b208901470d00200b2097016a2208200b490dd7012007200820082007491b228901209801480dd7010240200b450d00208a01200b2089011021228a010d010c3d0b2089011022228a01450d3c0b208a01200b6a20052096017220052095017120052094017622081b3a000020042097016a210920072099016a2107200b2097016a210b2008210520080d000b0240208901200b6b20274f0d00200b20276a2205200b490dd601208901209701742207200520052007491b2205209801480dd60102400240208901450d00208a0120890120051021228a010d010c2d0b20051022228a01450d2c0b20052189010b208a01200b6a201120271084041a024020a401450d00201110200b20880120276a21072098012088016b20276b21092025210b03400240200720046a2205208901470d0020052097016a22082005490dd70120052097017422880120082008208801491b228901209801480dd701024020092004470d002089011022228a010d010c3c0b208a0120052089011021228a01450d3b0b208a0120076a20046a200b20960172200b20950171200b2094017622051b3a000020042097016a21042005210b20050d000b02400240024020092089016a20046b20254f0d00200720046a220520256a220b2005490dd801208901209701742205200b200b2005491b220b209801480dd801208901450d01208a01208901200b1021228a010d020c2c0b208901210b0c010b200b1022228a01450d2a0b208a0120076a20046a201320251084041a200720256a2205200b6b2107024020a301450d00201310200b200520046a2105200720046a210402400240024002400240024002400240024002400240024002400240024002400240024002402026209701460d0002402026209901460d002026209b01470d022004450d05200b21060c0f0b2004450d02200b21040c080b2004450d02200b21070c0a0b2004450d03200b2189010c0f0b200b2097016a2204200b490de501200b209701742205200420042005491b2204209801480de501200b450d03208a01200b20041021228a010d040c2f0b200b2097016a2204200b490de401200b209701742205200420042005491b2207209801480de401200b450d05208a01200b20071021228a010d060c2d0b200b2097016a2204200b490de301200b209701742205200420042005491b2206209801480de301200b450d07208a01200b20061021228a010d080c2b0b200b2097016a2204200b490de201200b209701742205200420042005491b228901209801480de201200b450d09208a01200b2089011021228a010d0a0c290b20041022228a01450d2b0b200b21050b208a0120056a2099013a00000240024002400240200420052097016a220b470d0020042097016a220b2004490de3012004209701742205200b200b2005491b228901209801480de3012004450d01208a0120042089011021228a010d020c320b20042189010c020b2089011022228a01450d300b2004210b0b208a01200b6a2012209701463a0000200b2097016a218801200b209701742204208c016a210720042099016a210b0340200721040240208801208901470d002088012097016a2205208801490de101200b20052005200b491b228901209801480de1010240208801450d00208a012088012089011021228a010d010c3e0b2089011022228a01450d3d0b208a012088016a20062096017220062095017120062094017622051b3a000020042099016a2107200b2099016a210b2088012097016a2188012005210620050d000b2012209701470d0903400240208801208901470d002088012097016a220b208801490de1012004200b200b2004491b228901209801480de1010240208801450d00208a012088012089011021228a010d010c3b0b2089011022228a01450d3a0b208a012088016a200a20960172200a20950171200a20940176220b1b3a000020042099016a21042088012097016a218801200b210a200b0d000c0a0b0b20071022228a01450d270b200b21050b208a0120056a2097013a00000240024002400240200720052097016a220b470d0020072097016a22042007490de001200720970174220b20042004200b491b2204209801480de0012007450d01208a01200720041021228a010d020c2e0b200721040c020b20041022228a01450d2c0b2007210b0b208a01200b6a209a013a000002400240024002402004200b2097016a220b470d0020042097016a220b2004490de0012004209701742205200b200b2005491b228901209801480de0012004450d01208a0120042089011021228a010d020c2d0b20042189010c020b2089011022228a01450d2b0b2004210b0b208a01200b6a2012209701463a0000200b2097016a218801200b209701742204208c016a210720042099016a210b0340200721040240208801208901470d002088012097016a2205208801490dde01200b20052005200b491b228901209801480dde010240208801450d00208a012088012089011021228a010d010c3a0b2089011022228a01450d390b208a012088016a20062096017220062095017120062094017622051b3a000020042099016a2107200b2099016a210b2088012097016a2188012005210620050d000b2012209701470d0603400240208801208901470d002088012097016a220b208801490dde012004200b200b2004491b228901209801480dde010240208801450d00208a012088012089011021228a010d010c370b2089011022228a01450d360b208a012088016a200a20960172200a20950171200a20940176220b1b3a000020042099016a21042088012097016a218801200b210a200b0d000c070b0b20061022228a01450d230b200b21050b208a0120056a209b013a00000240024002400240200620052097016a220b470d0020062097016a22042006490ddd01200620970174220b20042004200b491b2204209801480ddd012006450d01208a01200620041021228a010d020c290b200621040c020b20041022228a01450d270b2006210b0b208a01200b6a20a201209c01732205209d0171209e0172200520a201209c014a1b3a000002400240024002402004200b2097016a220b470d0020042097016a220b2004490ddd012004209701742205200b200b2005491b228901209801480ddd012004450d01208a0120042089011021228a010d020c280b20042189010c020b2089011022228a01450d260b2004210b0b208a01200b6a20a101209f0171209801473a0000200b2097016a21880120a001208701470d1b0c82010b2089011022228a01450d1f0b200b21050b208a0120056a2098013a000020052097016a2188012005209701742099016a210403400240208801208901470d002088012097016a220b208801490dd8012004200b200b2004491b228901209801480dd8010240208801450d00208a012088012089011021228a010d010c330b2089011022228a01450d320b208a012088016a200620960172200620950171200620940176220b1b3a000020042099016a21042088012097016a218801200b2106200b0d000b0b20a001208701470d180c7e0b20a60120a90174210b20b00128020021040340024020a60120a701470d0020a60120a9016a220520a601490dd601200b20052005200b491b22a70120ad01480dd601024020a601450d0020a80120a60120a701102122a8010d010c3d0b20a701102222a801450d3c0b20a80120a6016a200420ac0172200420ab0171200420aa017622051b3a0000200b20ae016a210b20a60120a9016a21a6012005210420050d000b20b00120af016a22b00120a501470d15410121040cd2010b20be0120b5016a21bf0120be0128020c220920b601460d1120be01280204210a20be01280200210820b20120b70174210520be0120b8016a280200210420be012802082207210b0340024020b20120b301470d0020b20120b7016a220620b201490dd5012005200620062005491b22b30120bc01480dd501024020b201450d0020b40120b20120b301102122b4010d010c390b20b301102222b401450d380b20b40120b2016a200b20bb0172200b20ba0171200b20b9017622061b3a0000200520bd016a210520b20120b7016a21b2012006210b20060d000b02400240024020b30120b2016b20074f0d0020b20120076a220b20b201490dd60120b30120b701742205200b200b2005491b220b20bc01480dd60120b301450d0120b40120b301200b102122b4010d020c290b20b301210b0c010b200b102222b401450d270b20b40120b2016a200820071084041a2007200b6b20b2016a21050240200a450d00200810200b024002402005450d00200720b2016a2105200b21b3010c010b200b20b7016a2205200b490dd401200b20b701742206200520052006491b22b30120bc01480dd40102400240200b450d0020b401200b20b301102122b4010d010c270b20b301102222b401450d260b200b21050b20b40120056a20093a0000200520b7016a21b201200520b7017420bd016a210b0340024020b20120b301470d0020b20120b7016a220520b201490dd501200b20052005200b491b22b30120bc01480dd501024020b201450d0020b40120b20120b301102122b4010d010c380b20b301102222b401450d370b20b40120b2016a200420bb0172200420ba0171200420b9017622051b3a0000200b20bd016a210b20b20120b7016a21b2012005210420050d000b20bf0121be0120bf0120b101470d130c7b0b20d00120c6016a21d10120d0012d000d222520c701460d0f20d0012d000c210420d001280208210920d001280204212720d001280200210a024020c40120c301470d0020c30120c8016a220b20c301490dd30120c30120c801742205200b200b2005491b22c40120c901480dd301024020c301450d0020c50120c30120c401102122c5010d010c260b20c401102222c501450d250b20c50120c3016a20043a000020c30120c8016a210420c30120c80174220b20ca016a2108200b20cb016a21052009210b0340200821070240200420c401470d00200420c8016a22062004490dd4012005200620062005491b22c40120c901480dd40102402004450d0020c501200420c401102122c5010d010c360b20c401102222c501450d350b20c50120046a200b20ce0172200b20cd0171200b20cc017622061b3a0000200720cb016a2108200520cb016a2105200420c8016a21042006210b20060d000b2009450dbc014100210502400340200420056a210b200a20056a2d0000220820cf014b0dbf0141ff00210602400240024002400240024020080e0401000203010b41fe0021060b200b20c401470d030c020b41fd002106200b20c401460d010c020b41fc002106200b20c401470d010b200b20c8016a2208200b490dd5012007200820082007491b22c40120c901480dd5010240200b450d0020c501200b20c401102122c5010d010c030b20c401102222c501450d020b20c50120046a20056a20063a0000200720cb016a21072009200520c8016a2205470d000b200420056a210b20270dbf010cc0010b20c40141011023000b411021040ccf010b411021040cce010b411021040ccd010b411021040ccc010b411021040ccb010b411021040cca010b411021040cc9010b411021040cc8010b411021040cc7010b411021040cc6010b411021040cc5010b410621040cc4010b410621040cc3010b410621040cc2010b410621040cc1010b410421040cc0010b410321040cbf010b410221040cbe010b410d214c411021040cbd010b410c214c411021040cbc010b410b214c411021040cbb010b410b214c411021040cba010b4107214c411021040cb9010b4102214c411021040cb8010b4101214c411021040cb7010b20890141011023000b200641011023000b200741011023000b200441011023000b20890141011023000b200441011023000b20890141011023000b200441011023000b20890141011023000b200441011023000b20b30141011023000b20c40141011023000b200b41011023000b200b41011023000b200541011023000b200b41011023000b200b41011023000b20890141011023000b20890141011023000b20890141011023000b20890141011023000b20890141011023000b200641011023000b200741011023000b200641011023000b200741011023000b20c40141011023000b20b30141011023000b20b30141011023000b20890141011023000b20890141011023000b20a70141011023000b20860422042085046a218604024020042802042206450d0020042802082107024020042087046a2802002204450d0020042087046c210b200621040340024020042802002205450d0020042084046a280200450d00200510200b20042087046a2104200b2088046a220b0d000b0b2007450d00200610200b20860420c702460d274125214c411021040c96010b20fc03220620fe036a21fc03024020062802042204450d000240200620fb036a280200220b450d00200b20fb036c210b0340024020042802002205450d0020042080046a280200450d00200510200b200420fb036a2104200b2081046a220b0d000b0b200620ff036a280200450d0020062080046a28020010200b20fc0320fd03460d5d4124214c411021040c95010b208a02280200220b450d45208a0220f4036a2802002104208a0220f5036a2802002106208a0228020c21050240208a02280204450d00200b10200b02402004450d00200420f60374210b200521040340024020042d000020f703470d00200420f8036a28020020f90371450d00200420f6036a28020010200b200420f5036a2104200b20fa036a220b0d000b0b208a0220f3036a218a0202402006450d00200510200b208a0220e401460d45411d214c411021040c94010b20c802220420ef036a21c802024020042802042206450d00200428020821070240200420f0036a2802002204450d00200420f0036c210b200621040340024020042802002205450d00200420f2036a280200450d00200510200b200420f0036a2104200b20f1036a220b0d000b0b2007450d00200610200b024020c80220c702470d00410f21040c94010b411c214c411021040c93010b20e903220620eb036a21e903024020062802042204450d000240200620e8036a280200220b450d00200b20e8036c210b0340024020042802002205450d00200420ed036a280200450d00200510200b200420e8036a2104200b20ee036a220b0d000b0b200620ec036a280200450d00200620ed036a28020010200b20e90320ea03470d010b200141106a280200450d602001410c6a2802001020200341e0006a24000f0b4123214c411021040c90010b024020e00320dd036a280200220b450d0020e0032802042104200b20df0374210b0340024020042d000020e503470d00200420e2036a28020020e60371450d00200420df036a28020010200b200420e4036a2104200b20e7036a220b0d000b0b024020e00320e2036a280200450d0020e00320df036a28020010200b20e00320de036a2104024020e00320e3036a280200450d0020e00328021010200b200421e003200420e103460d52411a214c411021040c8f010b024020d603280208220b450d0020d6032802002104200b20d50374210b0340024020042d000020d903470d00200420da036a28020020db0371450d00200420d5036a28020010200b200420d8036a2104200b20dc036a220b0d000b0b20d60320d8036a2104024020d60320d5036a280200450d0020d60328020010200b200421d603200420d703460d4f4119214c411021040c8e010b024020cd0320ca036a280200220b450d0020cd032802042104200b20cc0374210b0340024020042d000020d203470d00200420cf036a28020020d30371450d00200420cc036a28020010200b200420d1036a2104200b20d4036a220b0d000b0b024020cd0320cf036a280200450d0020cd0320cc036a28020010200b20cd0320cb036a2104024020cd0320d0036a280200450d0020cd0328021010200b200421cd03200420ce03460d484118214c411021040c8d010b024020c20320c1036a280200450d0020c20328020010200b024020c20320c4036a280200220b450d0020c20328020c2104200b20c10374210b0340024020042d000020c603470d00200420c7036a28020020c80371450d00200420c1036a28020010200b200420c5036a2104200b20c9036a220b0d000b0b20c20320c0036a2104024020c20320c5036a280200450d0020c20320bf036a28020010200b200421c203200420c303460d424117214c411021040c8c010b2080012802042205450d0120800120b4036a280200210620800120b6036a28020021072080012802102108024020800120b5036a2802002204450d00200420b70374210b200521040340024020042d000020b903470d00200420b6036a28020020ba0371450d00200420b7036a28020010200b200420b8036a2104200b20bb036a220b0d000b0b02402007450d00200510200b20800120b3036a21800102402006450d00200810200b208001206b460d01410a214c411021040c8b010b20032d000b21ae0320032f000921af03200341106a29030021b003200328020c21b1030240208101450d0020820110200b411021b203208001206b460d00411c21b303411421b403410c21b503410821b603410421b703411021b803410921b90341ffffffff0321ba03417021bb03410a214c0c020b20ae0320b2037421040240201b450d00201c10200b20af0320047221040240200341d0006a41086a280200450d00200328025410200b200020043b000120002084013a0000200041036a20044110763a0000200041086a20b003370000200041046a20b10336000041002105410121c0014101210c410121910341012192030b410121060c3a0b411021040c87010b20592802042205450d01205920a6036a2802002106205920a8036a2802002107205928021021080240205920a7036a2802002204450d00200420a90374210b200521040340024020042d000020ab03470d00200420a8036a28020020ac0371450d00200420a9036a28020010200b200420aa036a2104200b20ad036a220b0d000b0b02402007450d00200510200b205920a5036a215902402006450d00200810200b20592045460d014104214c411021040c86010b20032d000b21a00320032f000921a103200341106a29030021a203200328020c21a30302402025450d00200910200b411021a40320592045460d00411c21a503411421a603410c21a703410821a803410421a903411021aa03410921ab0341ffffffff0321ac03417021ad034104214c0c010b20a00320a4037421040240200f450d00201010200b20a10320047221040240200341d0006a41086a280200450d00200328025410200b200020043b00012000205a3a0000200041036a20044110763a0000200041086a20a203370000200041046a20a30336000041002107410121c0014101210c4101219103410121920341012105410121060c370b411021040c83010b2098032099036a2d0000209a03460d622098032802042106209803280200210502402098032802082204450d002004209b0374210b200521040340024020042d0000209c03470d002004209d036a280200209e0371450d002004209b036a28020010200b20042097036a2104200b209f036a220b0d000b0b2098032097036a21980302402006450d00200510200b20980320d701460d624112214c411021040c82010b0240024020ad02208a036a2d0000208b03460d0020ad02280204210620ad022802002105024020ad022802082204450d002004208c0374210b200521040340024020042d0000208d03470d002004208e036a280200208f0371450d002004208c036a28020010200b20042089036a2104200b2090036a220b0d000b0b20ad022089036a21ad0202402006450d00200510200b024020ad0220d701470d00410b21040c84010b4111214c0c010b410b21040c82010b411021040c81010b024020810320fe026a280200220b450d002081032802042104200b20800374210b0340024020042d0000208603470d0020042083036a28020020870371450d0020042080036a28020010200b20042085036a2104200b2088036a220b0d000b0b02402081032083036a280200450d002081032080036a28020010200b20810320ff026a210402402081032084036a280200450d0020810328021010200b20042181032004208203470d010b200141086a280200450d4e200141046a2802001020200341e0006a24000f0b4122214c411021040c7e0b024020f702280208220b450d0020f7022802002104200b20f60274210b0340024020042d000020fa02470d00200420fb026a28020020fc0271450d00200420f6026a28020010200b200420f9026a2104200b20fd026a220b0d000b0b20f70220f9026a2104024020f70220f6026a280200450d0020f70228020010200b200421f702200420f802470d010b200141086a280200450d4b200141046a2802001020200341e0006a24000f0b4121214c411021040c7b0b024020ee0220eb026a280200220b450d0020ee022802042104200b20ed0274210b0340024020042d000020f302470d00200420f0026a28020020f40271450d00200420ed026a28020010200b200420f2026a2104200b20f5026a220b0d000b0b024020ee0220f0026a280200450d0020ee0220ed026a28020010200b20ee0220ec026a2104024020ee0220f1026a280200450d0020ee0228021010200b200421ee02200420ef02470d010b200141086a280200450d48200141046a2802001020200341e0006a24000f0b4120214c411021040c780b024020e30220e2026a280200450d0020e30228020010200b024020e30220e5026a280200220b450d0020e30228020c2104200b20e20274210b0340024020042d000020e702470d00200420e8026a28020020e90271450d00200420e2026a28020010200b200420e6026a2104200b20ea026a220b0d000b0b20e30220e1026a2104024020e30220e6026a280200450d0020e30220e0026a28020010200b200421e302200420e402470d010b200141086a280200450d45200141046a2802001020200341e0006a24000f0b411f214c411021040c750b20df02220620db026a21df02024020062802042204450d000240200620dc026a280200220b450d00200b20dc026c210b0340024020042802002205450d00200420d9026a280200450d00200510200b200420dc026a2104200b20de026a220b0d000b0b200620dd026a280200450d00200620d9026a28020010200b20df0220da02470d030b2015450d00201610200b2003411c6a2066360200200341186a20653602002003206436021420034284808080c00037020c2003205b360208200341d0006a200341086a2002104c200320032900513703402003200341d0006a41086a290000370047024020032d00502204411a470d004100210d41012136410621040c730b20002003290340370001200020043a0000200041086a20032900473700000b41002108410121c0014101210c410121910341012192034101210541012106410121070c250b411e214c411021040c700b20d702210502400340200520c9026a28020022080d0120d60220cd026a21d60220ca02200520ce026a2205470d000c0b0b0b200520ce026a21d70220d60220cd026a212520d50220cf026a21d502200520d0026a290200212d2005280200210a200341c0006a20d0026a220928020021042003280244210b034002400240024002402004200b470d00200b20cd026a2206200b490d75200b20cd02742207200620062007491b220720cc02480d75200b450d012003280240200b2007102122060d020c080b200328024021060c020b200710222206450d060b20032007360244200320063602402007210b0b2009200420cd026a2207360200200620046a20d60220d3027220d60220d2027120d60220d1027622061b3a000020072104200621d60220060d000b200341086a20d0026a202d3703002003200836020c2003200a360208200341d0006a200341086a200341c0006a104b024020032d005022d80220d402470d00024020cb022005460d00202521d60220d5020d060b200541106a22c80220c702470d090c080b20032d005321820420032f0051218304200341d0006a20d0026a29030021bc03200328025421bd034104218404201620144104746a41706a2005460d004110218504200541106a218604410c21870441742188044125214c0c0b0b02402015450d00201610200b20d802411a470d010b200341c8006a28020021602003280244215f2003280240215e41022118410021614101215d410021624100215c410121634101102222640d030c700b20820420ce0274210402402003280244450d00200328024010200b20830420047221be030c030b200741011023000b4105214c0c050b410021040c690b410d21040c680b410f21040c670b410e21040c660b410f21040c650b411021040c640b411021040c630b20d201220520b7026a21d2010240024002402005280200220620b802460d00200520b8026a28020021042005280204210b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200620ba026a220620bb024b0d00200520b9026a280200210a024002400240024020060e0700050203010607000b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d0b200520bc026a22082005490dac01200520bc02742209200820082009491b220920bd02480dac012005450d1b200328025420052009102122080d1c0c420b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d06200520bc026a22082005490dab01200520bc02742209200820082009491b220920bd02480dab012005450d0e200328025420052009102122080d0f0c3d0b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d06200520bc026a22082005490daa01200520bc02742209200820082009491b220920bd02480daa012005450d10200328025420052009102122080d110c3f0b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d06200520bc026a22082005490da901200520bc02742209200820082009491b220920bd02480da9012005450d12200328025420052009102122080d130c3c0b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d06200520bc026a22082005490da801200520bc02742209200820082009491b220920bd02480da8012005450d14200328025420052009102122080d150c3c0b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d07200520bc026a22082005490da701200520bc02742209200820082009491b220920bd02480da7012005450d19200328025420052009102122080d1a0c3e0b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d07200520bc026a22082005490da601200520bc02742209200820082009491b220920bd02480da6012005450d1b200328025420052009102122080d1c0c360b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d07200520bc026a22082005490da501200520bc02742209200820082009491b220920bd02480da5012005450d1d200328025420052009102122080d1e0c360b200328025421080c090b200328025421080c0b0b200328025421080c0d0b200328025421080c0f0b200328025421080c110b200328025421080c130b200328025421080c150b200328025421080c170b200910222208450d2e0b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20c5023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9f01200520bc02742209200820082009491b220920bd02480d9f012005450d01200328025420052009102122080d020c200b200328025421080c020b200910222208450d1e0b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9f01200b20bc02742208200520052008491b220820bd02480d9f01200b450d012003280254200b2008102122050d020c2e0b200328025421050c020b200810222205450d2c0b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000b200341086a200a200341d0006a102620032d0008220420c302460d150c170b200910222208450d2e0b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20c2023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9c01200520bc02742209200820082009491b220920bd02480d9c012005450d01200328025420052009102122080d020c1c0b200328025421080c020b200910222208450d1a0b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9c01200b20bc02742208200520052008491b220820bd02480d9c01200b450d012003280254200b2008102122050d020c1e0b200328025421050c020b200810222205450d1c0b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000b200341086a200a200341d0006a102620032d0008220420c302460d120c150b200910222208450d290b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20c4023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9901200520bc02742209200820082009491b220920bd02480d99012005450d01200328025420052009102122080d020c240b200328025421080c020b200910222208450d220b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9901200b20bc02742208200520052008491b220820bd02480d9901200b450d012003280254200b2008102122050d020c250b200328025421050c020b200810222205450d230b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000b200341086a200a200341d0006a102620032d0008220420c302460d0f0c100b200910222208450d270b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20bd023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9601200520bc02742209200820082009491b220920bd02480d96012005450d01200328025420052009102122080d020c230b200328025421080c020b200910222208450d210b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9601200b20bc02742208200520052008491b220820bd02480d9601200b450d012003280254200b2008102122050d020c240b200328025421050c020b200810222205450d220b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000c0d0b0b200910222208450d260b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20bc023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9301200520bc02742209200820082009491b220920bd02480d93012005450d01200328025420052009102122080d020c160b200328025421080c020b200910222208450d140b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9301200b20bc02742208200520052008491b220820bd02480d9301200b450d012003280254200b2008102122050d020c170b200328025421050c020b200810222205450d150b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000c0a0b0b200910222208450d240b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20c1023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9001200520bc02742209200820082009491b220920bd02480d90012005450d01200328025420052009102122080d020c150b200328025421080c020b200910222208450d130b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9001200b20bc02742208200520052008491b220820bd02480d9001200b450d012003280254200b2008102122050d020c160b200328025421050c020b200810222205450d140b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000c070b0b200910222208450d1a0b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20bb023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d8d01200520bc02742209200820082009491b220920bd02480d8d012005450d01200328025420052009102122080d020c140b200328025421080c020b200910222208450d120b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d8d01200b20bc02742208200520052008491b220820bd02480d8d01200b450d012003280254200b2008102122050d020c150b200328025421050c020b200810222205450d130b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000c040b0b200910222208450d180b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20be023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d8a01200520bc02742209200820082009491b220920bd02480d8a012005450d01200328025420052009102122080d020c130b200328025421080c020b200910222208450d110b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d8a01200b20bc02742208200520052008491b220820bd02480d8a01200b450d012003280254200b2008102122050d020c140b200328025421050c020b200810222205450d120b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000b0b20c60220b7026a21c60220d20120b602470d1c20b60221d2010c1d0b20032f000920032d000b411074722106200341106a290300212d0c020b20032f000920032d000b411074722106200341106a290300212d0c010b20032f000920032d000b411074722106200341106a290300212d0b200328020c21072028410474210502400340200520c602460d01202a20c6026a210b20c60241106a21c602200b2802004108470d000b0b02402029450d00202a10200b0240200341d8006a280200450d00200328025410200b0240202c450d00202e450d00202b450d00202c10200b02402004411a470d004101210d410021360c1c0b200020063b0001200020043a0000200041036a20064110763a0000200041086a202d370000200041046a20073600004100210b410121c0014101210c410121910341012192034101210541012106410121074101210820012d00002204410e4d0d340c440b200941011023000b200941011023000b200841011023000b200941011023000b200841011023000b200941011023000b200841011023000b200941011023000b200841011023000b200941011023000b200841011023000b200941011023000b200841011023000b200941011023000b200841011023000b200841011023000b200941011023000b200941011023000b200941011023000b200941011023000b200941011023000b200941011023000b200941011023000b200941011023000b411b214c0c030b410521040c650b410521040c640b410621040c630b411021040c620b208a02280200220b450d35208a0220af026a2802002104208a0220b0026a2802002106208a0228020c21050240208a02280204450d00200b10200b02402004450d00200420b10274210b200521040340024020042d000020b202470d00200420b3026a28020020b40271450d00200420b1026a28020010200b200420b0026a2104200b20b5026a220b0d000b0b208a0220ae026a218a0202402006450d00200510200b208a0220e401460d354116214c411021040c610b2080012802042205450d5920800120a5026a280200210620800120a7026a28020021072080012802102108024020800120a6026a2802002204450d00200420a80274210b200521040340024020042d000020aa02470d00200420a7026a28020020ab0271450d00200420a8026a28020010200b200420a9026a2104200b20ac026a220b0d000b0b02402007450d00200510200b20800120a4026a21800102402006450d00200810200b208001206b460d594109214c411021040c600b201c2180010b208001206b460d57411c21a402411421a502410c21a602410821a702410421a802411021a902410921aa0241ffffffff0321ab02417021ac024109214c411021040c5e0b20592802042205450d022059209c026a28020021062059209e026a28020021072059280210210802402059209d026a2802002204450d002004209f0274210b200521040340024020042d000020a102470d002004209e026a28020020a20271450d002004209f026a28020010200b200420a0026a2104200b20a3026a220b0d000b0b02402007450d00200510200b2059209b026a215902402006450d00200810200b20592045460d024103214c411021040c5d0b201021590b20592045460d00411c219b024114219c02410c219d024108219e024104219f02411021a002410921a10241ffffffff0321a202417021a3024103214c0c040b0240200f450d00201010200b200341d0006a41086a2802002137200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d602004410174220d20072007200d491b220d4100480d602004450d0120052802002004200d102122070d020c070b200528020021070c020b200d10222207450d050b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490d5f200b4101742204200620062004491b22044100480d5f200b450d012005280200200b20041021220b450d050c020b2005280200210b0c020b20041022220b450d030b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b41002137410121364101210d0b410121380c2e0b200441011023000b200d41011023000b411021040c560b02402021450d00202210200b200241086a2105200241046a210720b201210b024003400240024002400240200728020020052802002204470d00200441016a22062004490d5d20044101742208200620062008491b22084100480d5d2004450d01200228020020042008102122060d020c050b200228020021060c020b200810222206450d030b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200241046a280200220b200241086a28020022046b20b2014f0d00200420b2016a22052004490d5d200b4101742204200520052004491b22044100480d5d200b450d012002280200200b20041021220b450d040c020b2002280200210b0c020b20041022220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420b2016a360200200b20046a20b40120b2011084041a4100213a41012136024020b301450d0020b40110200b4101210d4101213741012138410121390c520b200441011023000b200841011023000b0240201d450d00201e10200b200241086a2105200241046a2107208801210b03400240024002400240200728020020052802002204470d00200441016a22062004490d5b20044101742208200620062008491b22084100480d5b2004450d01200228020020042008102122060d020c070b200228020021060c020b200810222206450d050b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200241046a280200220b200241086a28020022046b2088014f0d0020042088016a22052004490d5a200b4101742204200520052004491b22044100480d5a200b450d012002280200200b20041021220b450d050c020b2002280200210b0c020b20041022220b450d030b2002200b360200200241046a2004360200200241086a28020021040b200241086a20042088016a360200200b20046a208a012088011084041a4100213f410121360240208901450d00208a0110200b4101210d4101213741012138410121394101213a4101213b4101213c4101213d4101213e0b410121400c440b200441011023000b200841011023000b20890220ed016a218a02208902280200228b02450d2320890220ee016a280200218c0220890220ef016a280200218d0220890228020c218e02208902290204212d4100218f0220f1014100360200200320f201370244208b02202d20f30188a722900220f401746a2191022003200341206a360240202da72192024100219302024041004100460d00410121040c010b410221040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000102040607070b208601280200210b0340024002400240024020830128020020792802002204470d002004207a6a22052004490d702004207a742206200520052006491b2206207b480d702004450d01200328025420042006102122050d020c0d0b200328025421050c020b200610222205450d0b0b208301200636020020032005360254207928020021040b20792004207a6a360200200520046a200b207872200b207771200b20767622041b3a00002004210b20040d000b208601207e6a228601208501470d130c610b200328024421040c010b208f0220eb016a2204208f02490d68208f0220eb0174220b20042004200b491b220b20f801480d6802400240208f02450d002003280244208f02200b102122040d010c0a0b200b10222204450d090b20fa01200b3602002003200436024420f1012802002193020b20f10120930220eb016a36020020042093026a20900220f7017220900220f6017120900220f5017622041b3a000002402004450d00200421900220fa01280200228f0220f101280200229302470d12410221040c170b209102208b02460d01208b02219402410321040c160b20940220f9016a219502209402290200222d20f30188a722042085027120fb01460d13200420ed017420ed01752107202da7210b0340024002400240024020fa0128020020f1012802002204470d00200420eb016a22052004490d6b200420eb01742206200520052006491b220620f801480d6b2004450d01200328024420042006102122050d020c0a0b200328024421050c020b200610222205450d080b20fa0120063602002003200536024420f10128020021040b20f101200420eb016a360200200520046a200b20f70172200b20f60171200b20f5017622041b3a00002004210b20040d000b024002400240024020fa0128020020f1012802002204470d00200420eb016a220b2004490d6a200420eb01742205200b200b2005491b220520f801480d6a2004450d012003280244200420051021220b0d020c0c0b2003280244210b0c020b20051022220b450d0a0b20fa0120053602002003200b36024420f10128020021040b20f101200420eb016a360200200b20046a20072086027322042087027120880272200420072086024a1b3a0000209502219402209502209102470d11209102209102229502470d140c030b208b02219502410421040c140b209102209502460d01410521040c130b2095022d0004210420950220f9016a219502200420fb01470d0f0b0240209202450d00208b0210200b208e02208c0220fb017422046a2106024002400240024002400240024002400240208c02450d00208e0220ed016a210b200420ff016a2107208e022104034020042d00002105208102200420f4016a2d00003a00002003200420eb016a2f00003b0108200520fe01460d02200341306a2080026a22082081022d00003a0000200320032f01083b0130200420fb016a290200212d200341086a20f0016a200420f0016a28020036020020ec0120032f01303b000020ec012080026a20082d00003a0000200320053a00082003202d37020c200341d0006a200341086a200341c0006a103020032d0050229602208202462205450d05200b20ef016a210b200720ff016a2107200420ef016a22042006470d000c040b0b208e0222042006460d020c010b200420ef016a22042006460d010b03400240024020042d0000220b20fc01460d00200b20fe01470d010c030b200420f9016a28020020fd0171450d00200420fb016a28020010200b200420ef016a22042006470d000b0b0240208d02450d00208e0210200b20fa01280200212520032802442189022003280240210520f101280200220a210b03400240024002400240200520f9016a2208280200200520f0016a22062802002204470d00200420eb016a22072004490d6c200420eb01742209200720072009491b220920f801480d6c2004450d01200520fb016a28020020042009102122070d020c0d0b200520fb016a28020021070c020b200910222207450d0b0b20082009360200200520fb016a2007360200200628020021040b2006200420eb016a360200200720046a200b20f70172200b20f60171200b20f5017622041b3a00002004210b20040d000b02402008280200220b200628020022046b200a4f0d002004200a6a22072004490d68200b20eb01742204200720072004491b220420f801480d68200b450d02200520fb016a280200200b20041021220b0d030c0b0b200520fb016a280200210b0c030b20032d005321970220032f0051219802200341d0006a20f9016a2903002199022003280254219a0202402007450d00034002400240200b2083026a22042d0000220720fc01460d00200720fe01470d010c030b200b28020020fd0171450d00200b2084026a28020010200b200b20ef016a210b200420ef016a2006470d000b0b0240208d02450d00208e0210200b024020fa01280200450d00200328024410200b2005450d03208a02218902208a0220e401470d0b0c390b20041022220b450d080b20082004360200200520fb016a200b360200200628020021040b20062004200a6a360200200b20046a208902200a1084041a02402025450d0020890210200b208a02218902208a0220e401470d070c360b208a0220e401460d12411821f303411421f403411021f503410421f603410921f703410821f80341ffffffff0321f903417021fa03411d214c0c0a0b200641011023000b200641011023000b200b41011023000b200941011023000b200541011023000b200441011023000b4115214c0c010b4115214c0c010b411021040c580b411021040c570b411021040c560b410021040c050b410121040c040b410321040c030b410421040c020b410421040c010b410521040c000b0b20970220ef0174210402402033450d00203410200b20980220047221040240200341206a41086a280200450d00200328022410200b200020043b000120002096023a0000200041036a20044110763a0000200041086a209902370000200041046a209a0236000041002106410121c0014101210c41012191034101219203410121050b410121070b410121080b4101210b20012d00002204410e4b0d100b02400240024020040e0f000b0a0904060c0d11120f02070501000b200141086a280200450d1b200141046a2802001020200341e0006a24000f0b200b450d1a0240200141086a280200450d00200141046a28020010200b0240200141146a2802002202450d00200141186a280200450d00200210200b200141246a280200450d1a200141206a2802001020200341e0006a24000f0b2006450d19410c21bf032001410c6a2802002204450d00411821c003410421c103200141046a28020022c203200441186c6a21c303411421c403411021c503410921c603410821c70341ffffffff0321c803417021c9034117214c0c140b200141086a280200450d18200141046a2802001020200341e0006a24000f0b200141086a280200450d17200141046a2802001020200341e0006a24000f0b2008450d16200141046a2d000022044102460d0e20044101460d0d20040d102001410c6a280200450d16200141086a2802001020200341e0006a24000f0b200c450d15200141086a280200450d15200141046a2802001020200341e0006a24000f0b2007450d14410c21ca032001410c6a2802002204450d00411c21cb03410421cc03200141046a28020022cd032004411c6c6a21ce03410821cf03411421d003411021d103410921d20341ffffffff0321d303417021d4034118214c0c100b200141086a280200450d13200141046a2802001020200341e0006a24000f0b02402001410c6a2802002204450d00200141046a2802002102200441286c210403400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241286a2102200441586a22040d000b0b200141086a280200450d12200141046a2802001020200341e0006a24000f0b02402001410c6a2802002204450d00200141046a28020021022004410474210403400240200241046a280200450d00200228020010200b200241106a2102200441706a22040d000b0b200141086a280200450d11200141046a2802001020200341e0006a24000f0b20c001450d100240200141086a280200450d00200141046a28020010200b200141146a280200450d10200141106a2802001020200341e0006a24000f0b209103450d0f200141086a280200450d0f200141046a2802001020200341e0006a24000f0b209203450d0e2001410c6a2802002204450d00410421d503200141046a28020022d60320044104746a21d703411021d803410921d903410821da0341ffffffff0321db03417021dc034119214c0c0b0b200141086a280200450d0d200141046a2802001020200341e0006a24000f0b2005450d0c410c21dd032001410c6a2802002204450d00411c21de03410421df03200141046a28020022e0032004411c6c6a21e103410821e203411421e303411021e403410921e50341ffffffff0321e603417021e703411a214c0c0a0b200141086a280200450d0b200141046a2802001020200341e0006a24000f0b02402001410c6a2802002204450d00200141046a2802002102200441146c210403400240200241046a280200450d00200228020010200b200241146a21022004416c6a22040d000b0b200141086a280200450d0a200141046a2802001020200341e0006a24000f0b2001104d200341e0006a24000f0b0240200141146a2802002204450d002001410c6a28020021022004410c6c2104034002402002280200220b450d00200241046a280200450d00200b10200b2002410c6a2102200441746a22040d000b0b200141106a280200450d082001410c6a2802001020200341e0006a24000f0b200141146a2802002204450d00410c21fb032001410c6a28020022fc0320044104746a21fd03411021fe03410821ff03410421800441742181044124214c0c060b200141106a280200450d062001410c6a2802001020200341e0006a24000f0b2001410c6a280200450d05200141086a2802001020200341e0006a24000f0b411021040c350b411021040c340b411021040c330b411021040c320b411021040c310b200341e0006a24000f0b20e80120e0016a220420e801490d3020e80120e00174220b20042004200b491b220b20e201480d3002400240024020e801450d00200328022420e801200b102122040d010c020b200b10222204450d010b200341206a20e1016a200b3602002003200436022420e30128020021e9010c020b200b41011023000b200328022421040b20e30120e90120e0016a360200200420e9016a20ea0120e7017220ea0120e6017120ea0120e5017622041b3a000002402004450d00200421ea01200341206a20e1016a28020022e80120e30128020022e901470d064113214c0c070b02402032450d00410121eb01200341086a41017221ec01411821ed01411421ee01411021ef01410c21f001200341c0006a410c6a21f101420121f201422021f301410321f401410721f50141ff0021f60141807f21f701410021f801410821f901200341c0006a41086a21fa01410421fb01410921fc0141ffffffff0321fd0141ac0121fe01417021ff014102218002200341086a41026a218102411a2182024178218302417c21840241ff01218502417f218602413f21870241c00021880220342189024115214c0c090b2034218a020b208a0220e401460d00411821ae02411421af02411021b002410421b102410921b202410821b30241ffffffff0321b402417021b5024116214c0c080b02402033450d00203410200b200341206a41086a2802002137200328022421092003280220220541046a21082003412c6a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d312004410174220d20072007200d491b220d4100480d312004450d0120052802002004200d102122070d020c070b200528020021070c020b200d10222207450d050b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490d30200b4101742204200620062004491b22044100480d30200b450d012005280200200b20041021220b450d050c020b2005280200210b0c020b20041022220b450d030b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b41002138410121364101210d410121370b410121390c240b200441011023000b200d41011023000b4114214c0c010b411021040c260b411021040c250b411021040c240b411021040c230b20db0120d3016a220420db01490d2420db0120d30174220b20042004200b491b220b20d501480d2402400240024020db01450d00200328025420db01200b102122040d010c020b200b10222204450d010b200341d0006a20d4016a200b3602002003200436025420d60128020021dc010c020b200b41011023000b200328025421040b20d60120dc0120d3016a360200200420dc016a20dd0120da017220dd0120d9017120dd0120d8017622041b3a000002402004450d00200421dd01200341d0006a20d4016a28020022db0120d60128020022dc01470d04410f214c0c090b0240024002400240202f450d00202f41047441706a2109411021de01203121040340200341086a41086a2208200441086a280200360200200320042902003703082004410d6a2d0000220a4102460d022004410c6a2d000021df01200341306a41086a220b200828020036020020032003290308370330200341206a41086a2225200b280200360200200320032903303703200240024002400240200341d0006a41086a2206280200200341d0006a410c6a2205280200220b470d00200b41016a2207200b490d2b200b4101742227200720072027491b22274100480d2b200b450d012003280254200b2027102122070d020c0a0b200328025421070c020b202710222207450d080b20062027360200200320073602542005280200210b0b2005200b41016a3602002007200b6a41fdf9ff7720df0141037441187141107376413f7141c000723a0000024002400240024020062802002005280200220b470d00200b41016a2207200b490d2b200b41017422df012007200720df01491b22df014100480d2b200b450d012003280254200b20df01102122070d020c0b0b200328025421070c020b20df0110222207450d090b200620df01360200200320073602542005280200210b0b2005200b41016a3602002007200b6a200a4100473a0000200341c0006a41086a202528020036020020032003290320370340200341086a200341c0006a200341d0006a101e20032d000822df01411a470d04200941706a2109200441106a220420d701470d000c090b0b203122ad0220d701470d010c080b200441106a22ad0220d701460d080b4110218903410d218a034102218b034104218c034109218d034108218e0341ffffffff03218f0341702190034111214c0c0b0b20032d000b21930320032f00092194032008290300219503200328020c2196032009450d004110219703200441106a219803410d2199034102219a034104219b034109219c034108219d0341ffffffff03219e034170219f034112214c0c0b0b20930320de0174210402402030450d00203110200b20940320047221040240200341d0006a41086a280200450d00200328025410200b200020043b0001200020df013a0000200041036a20044110763a0000200041086a209503370000200041046a2096033600004100219203410121c0014101210c41012191030c060b202741011023000b20df0141011023000b4110214c0c050b410b21040c1b0b410b21040c1a0b410b21040c190b410c21040c180b411021040c170b411021040c160b411021040c150b411021040c140b2004210b0b2027450d010b200a10200b024002400240024002400240202520ca01470d0020c401200b470d02200b20c8016a2204200b490d18200b20c801742205200420042005491b22c40120c901480d18200b450d0120c501200b20c401102122c5010d020c0a0b024020c401200b470d00200b20c8016a2204200b490d18200b20c801742205200420042005491b220420c901480d18200b450d0320c501200b2004102122c5010d040c0b0b20c40121040c030b20c401102222c501450d080b20c501200b6a20c9013a00000c020b2004102222c501450d070b20c501200b6a20c8013a000002400240024002402004200b20c8016a220b470d00200420c8016a220b2004490d17200420c801742205200b200b2005491b22c40120c901480d172004450d0120c501200420c401102122c5010d020c0b0b200421c4010c020b20c401102222c501450d090b2004210b0b20c501200b6a202520cc017120cd01733a00000b200b20c8016a21c30120d10121d00120d10120c201470d070b02402023450d00202410200b200241086a2105200241046a210720c301210b03400240024002400240200728020020052802002204470d00200441016a22062004490d1620044101742208200620062008491b22084100480d162004450d01200228020020042008102122060d020c070b200228020021060c020b200810222206450d050b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200241046a280200220b200241086a28020022046b20c3014f0d00200420c3016a22052004490d15200b4101742204200520052004491b22044100480d15200b450d012002280200200b20041021220b450d050c020b2002280200210b0c020b20041022220b450d030b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420c3016a360200200b20046a20c50120c3011084041a4100214041012136024020c401450d0020c50110200b4101210d4101213741012138410121394101213a4101213b4101213c4101213d4101213e4101213f0b41012135410921040c0e0b200441011023000b200841011023000b20c40141011023000b200441011023000b20c40141011023000b410e214c411021040c080b0240208101450d0020820110200b208001217f208001206b470d060b0240201b450d00201c10200b200341d0006a41086a2802002137200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d0d2004410174220d20072007200d491b220d4100480d0d2004450d0120052802002004200d102122070d020c090b200528020021070c020b200d10222207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490d0c200b4101742204200620062004491b22044100480d0c200b450d012005280200200b20041021220b450d070c020b2005280200210b0c020b20041022220b450d050b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b41002139410121364101210d41012137410121380b4101213a0b4101213b0b4101213c410721040c030b200441011023000b200d41011023000b4108214c411021040c000b0b1024000b1024000b410141011023000bdf0401077f200441046a210502400240024002400240024002400240200441086a2802002004410c6a2802002206470d00200641016a22072006490d0520064101742208200720072008491b22074100480d052006450d0120052802002006200710212208450d020c030b200528020021080c030b2007102222080d010b200741011023000b200441086a2007360200200441046a20083602002004410c6a28020021060b2004410c6a2207200641016a360200200820066a20024101463a0000200441086a2109200441046a210a03400240024002400240200928020020072802002206470d00200641016a22082006490d052006410174220b20082008200b491b220b4100480d052006450d0120052802002006200b102122080d020c060b200528020021080c020b200b10222208450d040b2009200b360200200a2008360200200728020021060b2007200641016a360200200820066a200141807f72200141ff0071200141077622061b3a00002006210120060d000b024020024101470d002004410c6a2101200441086a2108200441046a210b03400240024002400240200828020020012802002206470d00200641016a22072006490d0620064101742209200720072009491b22094100480d062006450d01200528020020062009102122070d020c080b200528020021070c020b200910222207450d060b20082009360200200b2007360200200128020021060b2001200641016a360200200720066a200341807f72200341ff0071200341077622061b3a00002006210320060d000b0b2000411a3a00000f0b1024000b200b41011023000b200941011023000bfe07030f7f017e017f200241086a2103200241046a21042001280200220521060240024002400240024003400240024002400240200428020020032802002207470d00200741016a22082007490d0520074101742209200820082009491b22094100480d052007450d01200228020020072009102122080d020c060b200228020021080c020b200910222208450d040b2002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b200141086a280200210a2001280204220b2107024002402001410c6a280200220c450d00200b21072005450d00200b200c410c6c6a220d41746a210e200241086a210341002107200b210f0340200f210802400340200828020022100d01200741016a2107200d2008410c6a2208470d000c040b0b2008410c6a210f200741016a21112005417f6a2105200841046a290200211203400240024002400240200241046a220428020020032802002206470d00200641016a22092006490d0820064101742201200920092001491b22014100480d082006450d01200228020020062001102122090d020c0a0b200228020021090c020b200110222209450d080b2002200936020020042001360200200328020021060b2003200641016a360200200920066a200741807f72200741ff0071200741077622061b3a00002006210720060d000b2012422088a72213210603400240024002400240200428020020032802002207470d00200741016a22092007490d0820074101742201200920092001491b22014100480d082007450d01200228020020072001102122090d020c0b0b200228020021090c020b200110222209450d090b2002200936020020042001360200200328020021070b2003200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b024002400240024020042802002206200328020022076b20134f0d00200720136a22092007490d0720064101742207200920092007491b22074100480d072006450d01200228020020062007102122060d020c0b0b200228020021060c020b200710222206450d090b2002200636020020042007360200200328020021070b2003200720136a360200200620076a201020131084041a02402012a7450d00201010200b0240200e2008460d002011210720050d010b0b2008410c6a21070b2007200b200c410c6c6a2202460d000340024020072802002206450d00200741046a280200450d00200610200b2007410c6a22072002470d000b0b0240200a450d00200b10200b2000411a3a00000f0b1024000b200941011023000b200141011023000b200141011023000b200741011023000bd806010a7f200128020421032001280200210441002105410121064100210720012802082208210902400240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d05024002402005450d0020062005200a102122060d010c040b200a10222206450d030b200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d032005410174220a20092009200a491b22094100480d03024002402005450d0020062005200910212206450d010c030b2009102222060d020b200941011023000b200a41011023000b200921050b200620076a200420081084041a02402003450d00200410200b200128020c210c02400240024002400240200520086b20076b200141146a28020022094f0d00200820076a220a20096a2203200a490d052005410174220a20032003200a491b220a4100480d052005450d0120062005200a10212206450d020c030b200820096a20076a21030c030b200a102222060d010b200a41011023000b200a21050b200620086a20076a200c20091084041a200241086a210a200241046a210820032109034002400240024002402008280200200a2802002207470d00200741016a220b2007490d0520074101742204200b200b2004491b22044100480d052007450d012002280200200720041021220b0d020c060b2002280200210b0c020b20041022220b450d040b2002200b36020020082004360200200a28020021070b200a200741016a360200200b20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b024002400240200241046a2802002209200241086a28020022076b20034f0d00200720036a220a2007490d0320094101742207200a200a2007491b22074100480d032009450d0120022802002009200710212209450d020c050b200228020021090c050b2007102222090d030b200741011023000b1024000b200441011023000b20022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a200620031084041a02402005450d00200610200b2000411a3a00000240200141106a280200450d00200c10200b0bf30f01347f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002201410d4b0d00024020010e0e000203040506070809140a0b0c0d000b200041086a280200450d13200041046a28020010200f0b0240200041086a280200450d00200041046a28020010200b0240200041146a2802002201450d00200041186a280200450d00200110200b200041246a280200450d12200041206a28020010200f0b0240200041086a280200450d00200041046a28020010200b200041146a280200450d11200041106a28020010200f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d00200128020010200b200141106a2101200241706a22020d000b0b200041086a280200450d10200041046a28020010200f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101200241586a22020d000b0b200041086a280200450d0f200041046a28020010200f0b200041086a280200450d0e200041046a28020010200f0b200041086a280200450d0d200041046a28020010200f0b200041086a280200450d0c200041046a28020010200f0b2000410c6a2802002201450d0a41042103200041046a280200220420014104746a210541102106410921074108210841ffffffff0321094170210a410021010c050b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d00200128020010200b200141146a21012002416c6a22020d000b0b200041086a280200450d0a200041046a28020010200f0b410c210b2000410c6a2802002201450d07411c210c4104210d200041046a280200220e2001411c6c6a210f4108211041142111411021124109211341ffffffff03211441702115410121010c030b410c21162000410c6a2802002201450d054118211741042118200041046a2802002219200141186c6a211a4114211b4110211c4109211d4108211e41ffffffff03211f41702120410221010c020b410c21212000410c6a2802002201450d03411c212241042123200041046a28020022242001411c6c6a21254108212641142127411021284109212941ffffffff03212a4170212b410321010c010b024002400240200041046a2d000022014102460d0020014101460d0120010d022000410c6a280200450d09200041086a28020010200f0b200041146a2802002201450d03410c212c2000410c6a280200222d20014104746a212e4110212f410821304104213141742132410421010c020b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002206450d00200141046a280200450d00200610200b2001410c6a2101200241746a22020d000b0b200041106a280200450d072000410c6a28020010200f0b2000410c6a280200450d06200041086a28020010200f0b0340024002400240024002400240024002400240024020010e050001020304040b024020042802082202450d0020042802002101200220037421020340024020012d00002007470d00200120086a280200200971450d00200120036a28020010200b200120066a21012002200a6a22020d000b0b200420066a21010240200420036a280200450d00200428020010200b2001210420012005470d040c0e0b0240200e200b6a2802002202450d00200e28020421012002200d7421020340024020012d00002013470d00200120106a280200201471450d002001200d6a28020010200b200120126a2101200220156a22020d000b0b0240200e20106a280200450d00200e200d6a28020010200b200e200c6a21010240200e20116a280200450d00200e28021010200b2001210e2001200f470d040c0c0b0240201920186a280200450d00201928020010200b02402019201b6a2802002202450d00201928020c2101200220187421020340024020012d0000201d470d002001201e6a280200201f71450d00200120186a28020010200b2001201c6a2101200220206a22020d000b0b201920176a210102402019201c6a280200450d00201920166a28020010200b200121192001201a470d040c0a0b0240202420216a2802002202450d0020242802042101200220237421020340024020012d00002029470d00200120266a280200202a71450d00200120236a28020010200b200120286a21012002202b6a22020d000b0b0240202420266a280200450d00202420236a28020010200b202420226a21010240202420276a280200450d00202428021010200b2001212420012025470d040c080b202d2233202f6a212d024020332802042201450d0002402033202c6a2802002202450d002002202c6c21020340024020012802002234450d00200120316a280200450d00203410200b2001202c6a2101200220326a22020d000b0b203320306a280200450d00203320316a28020010200b202d202e470d040c060b410021010c040b410121010c030b410221010c020b410321010c010b410421010c000b0b200041106a280200450d042000410c6a28020010200c040b200041086a280200450d03200041046a28020010200f0b200041086a280200450d02200041046a28020010200f0b200041086a280200450d01200041046a28020010200f0b200041086a280200450d00200041046a28020010200f0b0bacdc012b067f017e017f017e027f017e027f017e227f027e037f017e0f7f027e0a7f017e257f027e187f027e057f017e127f027e227f027e167f017e077f027e027f017e017f017e197f017e147f017e0b7f017e0b7f017e1c7f230041e080046b22022400024002402001280204220320012802082204470d00200241013a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022802cc8004210120022802c88004210420004101360200200041003a00042001450d01200410200c010b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d01200128020020046a2d00002104200141086a2005360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004410b4b0d0002400240024002400240024002400240024002400240024020040e0c00070405020809060b030a01000b200241386a2001104f41012106200228023c210720022802384101470d1220074108762101200241c8006a2802002104200241386a41086a29030021080caf010b200241386a2001105020022802384101470d0b200228023c22014108762109200241386a41086a290300220a4220882108200241c8006a280200210b0cc2010b200241386a2001105020022802384101470d0b200228023c22044108762103200241386a41086a2903002208422088210a200241c8006a28020021010cbf010b200241386a2001105020022802384101470d0b200228023c2201410876210c200241386a41086a290300220d4220882108200241c8006a280200210e0cbc010b200241386a2001105020022802384101470d0b200228023c22014108762104200241386a41086a2903002208422088210a200241c8006a28020021030cb9010b200241386a2001105020022802384101470d0b200228023c22014108762103200241386a41086a2903002208422088210a200241c8006a28020021040cb6010b200241386a2001105020022802384101470d0b200228023c22014108762104200241386a41086a2903002208422088210a200241c8006a28020021030cb3010b200241386a2001105020022802384101470d0c200228023c22014108762104200241386a41086a2903002208422088210a200241c8006a28020021030cb0010b200241386a2001105020022802384101470d0c200228023c22044108762103200241386a41086a2903002208422088210a200241c8006a28020021010cad010b200241386a2001105020022802384101470d0c200228023c220f4108762101200241386a41086a29030022104220882108200241c8006a28020021110caa010b200241386a2001105020022802384101470d0c200228023c22124108762101200241386a41086a2903002208422088210a200241c8006a28020021130ca7010b200241386a2001105020022802384101470d0c200041013602002000200241386a41047222012902003702042000410c6a200141086a290200370200200241e080046a24000f0b200041123a000420004101360200200041056a20043a0000200241e080046a24000f0b200241306a200241cc006a280200360200200241286a2214200241386a410c6a2902003703002002200229023c37032041002109410021014100211503402001411f4b0d0c20142802002205200241206a410c6a22162802002204460d1b200441016a21032004417f460d5720052003490d58200228022020046a2d0000210420162003360200200441ff00712001411f71742015722115200141076a21012004418001710d000b20014120490d2e20046741686a41ff017141044f0d2e41002109410d21170c0c0b200241d880046a200241cc006a280200360200200241d080046a2201200241c4006a2902003703002002200229023c3703c88004200128020021034100210420022802d48004210120022802c8800421184100211903402004411f4b0d0d20032001460d1b2001417f460d582003200141016a2207490d59201820016a2d0000220541ff00712004411f71742019722119200441076a2104200721012005418001710d000b200241d480046a2007360200024020044120490d00410d211a20056741686a41ff01714104490d1c0b2019450d3641042105200241c880046a410c6a211b4108211c410021064100211d024020032007460d000340200741016a21012007417f460d7420032001490d75201820076a2c00002104201b200136020020044100480d474107211a200441c00071450d48200441807f7222044170470d4a200241386a200241c880046a105120022f003d20022d003f41107472210420022d003c211a20022802384101460d49200241386a410c6a2802002103200241386a41086a2802002118024002400240201d2006470d0020064101742201200641016a220720072001491b2207ad420c7e2208422088a70d8b012008a722014100480d8b012006450d0120052006410c6c2001102122050d020c7d0b200621070c010b200110222205450d7b0b2005201c6a220120033602002001417b6a200441ffffff077122044110763a0000200141796a20043b00002001417c6a2018360200200141786a201a3a0000201d41016a220120194f0d4b201c410c6a211c20022802c880042118200721062001211d200241c880046a41086a2802002203201b2802002207470d000b0b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b200241286a280200210120022802242118200228022021074105211a0c480b200241d880046a200241cc006a280200360200200241d080046a221e200241386a410c6a2902003703002002200229023c3703c88004410021014100211c03402001411f4b0d0d201e2802002205200241c880046a410c6a221f2802002204460d1c200441016a21032004417f460d5920052003490d5a20022802c8800420046a2d00002104201f2003360200200441ff00712001411f7174201c72211c200141076a21012004418001710d000b20014120490d2d20046741686a41ff017141034b0d2d410d21200c0d0b200241d880046a200241cc006a280200360200200241d080046a2221200241386a410c6a2902003703002002200229023c3703c8800441002122410021014100210603402001411f4b0d0e20212802002205200241c880046a410c6a22232802002204460d1d200441016a21032004417f460d5a20052003490d5b20022802c8800420046a2d0000210420232003360200200441ff00712001411f71742006722106200141076a21012004418001710d000b20014120490d2d20046741686a41ff017141044f0d2d410d2101410021230cac010b200241cc006a2802002124200241c8006a2802002101200241c4006a280200211a200241c0006a2802002125200228023c2126410021044100211d03402004411f4b0d0e201a2001460d1d2001417f460d5b201a200141016a2227490d5c202620016a2d0000220341ff00712004411f7174201d72211d200441076a2104202721012003418001710d000b024020044120490d00410d210120036741686a41ff017141034d0d1e0b41042105201d450d364100212841012129411f212a417f212b41ff00212c4107212d418001212e4168212f4120213041ff012131410321324202213342202134410221354100213641002137410021230c790b200241d880046a200241cc006a280200360200200241d080046a2239200241386a410c6a2902003703002002200229023c3703c88004410021014100211b03402001411f4b0d0e20392802002205200241c880046a410c6a22232802002204460d1e200441016a21032004417f460d5c20052003490d5d20022802c8800420046a2d0000210420232003360200200441ff00712001411f7174201b72211b200141076a21012004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d1f0b201b450d364104213a4100213b4101213c410c213d4108213e417f213f41032140411f214141ff002142410721434180012144416821454120214641ff01214742142148422021494114214a41002139410421054100214b4100214c410121230c790b200241386a4100418080011083041a410021184100210502402007450d00200141086a211d200141046a211b410121064100211841002103410021190340201b280200221c201d28020022056b200720196b220441808001200441808001491b2204490d29200520046a221a2005490d68201c201a490d69200241386a200128020020056a20041084041a201d201a3602000240024002400240201820036b20044f0d00200320046a22052003490d87012018410174221a20052005201a491b221a4100480d87012018450d0120062018201a102122060d020c6e0b200420036a21050c020b201a10222206450d6c0b201a21180b200620036a200241386a20041084041a200521032007200420196a22194b0d000b0b200241003602c08004200220053602bc8004200220063602b88004200241386a200241b880046a104f4101211b200228023c210720022802384101470d1320074108762101200241386a41086a2903002208422088a7211a200241c8006a28020021042008a7211d0c9b010b200241cc006a2802002155200241c8006a2802002101200241c4006a2802002107200241c0006a2802002156200228023c215741002123410021044100215803402004411f4b0d0d20072001460d1e2001417f460d5c2007200141016a2259490d5d205720016a2d0000220341ff00712004411f71742058722158200441076a2104205921012003418001710d000b20044120490d2a20036741686a41ff017141044f0d2a410d2101410021070ca2010b200241d880046a200241cc006a280200360200200241d080046a2201200241c4006a2902003703002002200229023c3703c88004200128020021054100210420022802d48004210120022802c8800421184100210303402004411f4b0d0d20052001460d1e2001417f460d5d2005200141016a2207490d5e201820016a2d0000221941ff00712004411f71742003722103200441076a2104200721012019418001710d000b200241d480046a2007360200024020044120490d00410d211820196741686a41ff01714104490d1f0b2003450d35200241386a410c6a211b200241386a41086a21154100211d41002119410021014100211c410421050340200241386a200241c880046a105120022f003d20022d003f411074722104201b280200211a2015280200210620022d003c211820022802384101460d3d200141016a210702402001201c470d00201d20072007201d491b221cad420c7e2208422088a70d81012008a722584100480d810102402001450d00200520192058102122050d010c6d0b205810222205450d6c0b200520196a220120183a0000200141036a20044110763a0000200141016a20043b0000200141086a201a360200200141046a2006360200201d41026a211d2019410c6a21192007210120072003490d000c370b0b200241d880046a200241cc006a280200360200200241d080046a225a200241386a410c6a2902003703002002200229023c3703c88004410021014100212303402001411f4b0d0d205a2802002211200241c880046a410c6a22052802002204460d1f200441016a21032004417f460d5e20112003490d5f20022802c88004222220046a2d0000210420052003360200200441ff00712001411f71742023722123200141076a21012004418001710d000b024020014120490d00410d210f20046741686a41ff017141034d0d200b2023450d36200241c880046a410c6a2150200241386a41086a215b4100215241002153410021514100215a4104214f4104215c41042105024020112003460d000340200341016a21042003417f460d6e20112004490d6f202220036a2c000021012050200436020020014100480d454106210f200141c00071450d46200141807f72224e41ff017141fc01490d4720112004460d48200341026a21032004417f460d7020112003490d71202220046a2d00002101410c210f200241c880046a410c6a20033602004100210302402001450d0020014101470d4b41800221030b200241386a200241c880046a1028200241386a410c6a280200215d205b280200215e200228023c210f20022802384101460d4b205141016a210402402051205a470d002052200420042052491b225aad4204862238422088a70d81012038a722014100480d8101024002402051450d00204f205320011021224f0d010c760b20011022224f450d750b204f215c204f21050b200520536a2201200f3602002001410c6a204d4180807c71204e417f7341ff017172200372224d360200200141086a205d360200200141046a205e360200200420234f0d4c205241026a2152205341106a215320022802c88004212220042151200241c880046a41086a280200221120502802002203470d000b0b200241013a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b0c470b200241cc006a280200215f200241c8006a2802002101200241c4006a2802002118200241c0006a2802002160200228023c2161410021044100216203402004411f4b0d0d20182001460d202001417f460d5f2018200141016a2219490d60206120016a2d0000220341ff00712004411f71742062722162200441076a2104201921012003418001710d000b20044120490d2820036741686a41ff017141034b0d28410d21120c0d0b200241cc006a2802002106200241c8006a2802002101200241c4006a2802002103200241c0006a280200211a200228023c2118410021044100210503402004411f4b0d0e20032001460d212001417f460d602003200141016a2219490d61201820016a2d0000220741ff00712004411f71742005722105200441076a2104201921012007418001710d000b024020044120490d00410d210120076741686a41ff01714104490d220b200620194621010240201a450d00201810200b2001450d2a410921040c94010b410f21170b41002163410021640ca8010b200241d480046a2001360200410f211a0c0e0b410f21200b0c0e0b410f2101410021230c9e010b410f21010c0f0b410f21010c100b410f2101410021070c95010b200241d480046a2001360200410f21180c110b410f210f0c120b410f21120b0c120b410f21010c130b2007450d19200241386a41004180081083041a200241c080046a2258280200210420022802bc8004211520022802b8800421624101211b4100211d410021034100211c0340201520046b2007201c6b22014180082001418008491b2201490d1b200420016a22192004490d5620152019490d57200241386a206220046a20011084041a205820193602000240024002400240201d20036b20014f0d00200320016a221a2003490d72201d4101742204201a201a2004491b22044100480d72201d450d01201b201d20041021221b0d020c5c0b200120036a211a0c020b20041022221b450d5a0b2004211d0b201b20036a200241386a20011084041a20192104201a210320072001201c6a221c4b0d000b200241386a201b201a105220022802384101470d2841082107201d450d2b201b10200c87010b200241013a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241c880046a200241386a102b20022903c880042208422088a7216320022802d08004210b2008a7216441052117410021090c9a010b200241d480046a2003360200200241013a0037200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241376a3602082002200241086a360248200241206a200241386a102b200241b880046a41086a200241206a41086a280200360200200220022903203703b880044105211a0b200241106a41086a2201200241b880046a41086a280200360200200220022903b88004370310200128020021012002280214211820022802102107410021040c96010b200241013a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b200241106a41086a200241206a41086a2802003602002002200229032037031041052120200229031021080b2008422088a721652002280218210e2008a721664100210c0c92010b200241013a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b20022903202208422088a72122200228022821032008a72123410521010c8f010b200241013a00c88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241c880046a3602082002200241086a360248200241b880046a200241386a102b410521010b200241106a41086a2204200241b880046a41086a280200360200200220022903b880043703102004280200210420022802142103200228021021070c8b010b200241013a0037200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241376a3602082002200241086a360248200241206a200241386a102b200241b880046a41086a200241206a41086a280200360200200220022903203703b88004410521010b200241106a41086a2204200241b880046a41086a280200360200200220022903b8800437031020022903102208422088a72107200428020021032008a721190c87010b200241013a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022903c880042208422088a7212320022802d0800421032008a72107410521010c84010b200241d480046a2005360200200241013a0037200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241376a3602082002200241086a360248200241206a200241386a102b200241b880046a41086a200241206a41086a280200360200200220022903203703b88004410521180b200241106a41086a2201200241b880046a41086a280200360200200220022903b8800437031020022903102208422088a7211a200128020021012008a72106410021040c80010b200241013a0037200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241376a3602082002200241086a360248200241206a200241386a102b200241b880046a41086a200241206a41086a280200360200200220022903203703b880044105210f0b200241106a41086a2201200241b880046a41086a280200360200200220022903b8800437031020022903102208422088a7215d200128020021112008a7215e0c7c0b200241013a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022802d08004211320022903c880042108410521120b2008422088a721672008a721680c780b200241013a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b410521010b2000200136020420004101360200200041086a20022902c88004370200200041106a200241c880046a41086a280200360200201a450d8a0120181020200241e080046a24000f0b200241013a00b88004200241dc80046a41013602002002410136020c200242013702cc8004200241f8cac4003602c880042002200241b880046a3602082002200241086a3602d88004200241206a200241c880046a102b20022802282104200229032021084105210702402018450d00200610200b0c740b2015450d07410021694104216a4101216b411f216c410c216d200241206a410c6a216e4108216f200241206a41086a2170417f217141ff002172410721734180012174416821754120217641ff01217741032178418080042179421c217a4220217b411c217c4110217d4118217e4114217f410421054100211441002116410221230c500b201c450d08410021830141042184014101218501411f218601410c218701200241c880046a410c6a2188014108218901200241c880046a41086a218a01417f218b0141ff00218c014107218d01418001218e014168218f01412021900141ff0121910141032192014105219301421c2194014220219501411c2196014110219701411821980141142199014102219a014202219b01417c219c01410421054100211e4100211f410321230c500b2006450d084104219e014100219f01410121a001410c21a101200241386a410c6a21a201410821a301200241386a41086a21a401417f21a501410321a601411f21a70141ff0021a801410721a90141800121aa01416821ab01412021ac0141ff0121ad01422821ae01422021af01412821b001411c21b101411a21b201411921b301411821b401411421b501411021b601410221b70141c00021b80141807f21b901417021ba0141fc0121bb014100212141042105410021bc01410021bd01410421230c500b2058450d0a410021be01410020076b21bf01410421c001410121c101417f21c20141e00021c301410321c401411f21c50141ff0021c601410721c70141800121c801416821c901412021ca0141ff0121cb01411021cc01410821cd0141c00021ce0141807f21cf0141fb0121d0014180807c21d101420421d201422021d301410221d401410021d50141042105410021d601410021d701410521230c500b2062450d0d200241c1006a21d901410021da01410421db01410121dc01411f21dd01417f21de0141ff0021df01410721e00141800121e101416821e201412021e30141ff0121e4014180800121e501411021e601200241206a41106a21e701410c21e801200241206a410c6a21e901422021ea01410321eb01410221ec01410821ed01200241386a41086a21ee01410621ef01411421f001200241386a41146a21f101420421f201421821f301411821f401417e21f501420321f601410121f701420121f80141f8cac40021f90141c00021fa0141807f21fb0141fb0121fc014180807c21fd0141042105410021fe01410021ff01410621230c500b410021074100211a4100211d0c0f0b200241013a0010200241dc80046a41013602002002410136020c200242013702cc8004200241f8cac4003602c880042002200241106a3602082002200241086a3602d88004200241206a200241c880046a102b20022903202208422088a7211a200228022821042008a7210341052107410021010240201d450d00201b10200b2003211d0c6c0b20024103410220011b3a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b200241c3006a200241d080046a280200360000200220022903c8800437003b200041053a000420004101360200200020022900383700052000410c6a2002413f6a290000370000200241e080046a24000f0b410021144104210541002116410021010c4f0b4100210741042105410021040c130b4100211e410421054100211f410121010c4d0b410021bc0141042105410021010c640b41002136410021370c620b4100214b41042105410021010c600b410021d60141042105410021530c5e0b41042105410021074100211c0b200241d480046a28020020022802d88004462101024020022802cc8004450d0020022802c8800410200b2001450d022007ad422086201cad84210a410621040c600b41042105410021044100215a0c450b410021fe0141042105410021ff01410221010c450b20024103410220011b3a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b20022903202208422088210a200228022821014105210441002103201c450d66200510200c660b201b41087621070b2005200241c080046a2802002203490d37200520036b2204417f4c0d38024002402004450d002004102222010d01200441011023000b410121010b201aad4220862108201dad210a2001200620036a20041084041a2004ad220d422086211002402018450d00200610200b2008200a84210a2010200d8421082007410874201b41ff0171722105410121040c5b0b200241c8006a2802002101201c450d62200510200c620b0c5b0b4118211a0b0c010b20044180feff07714108762103200241c8006a2802002101200241c4006a2802002118200241386a41086a28020021070b2003410874200441ff01717221042006450d69200510200c690b201d41016a21040b200241d480046a28020020022802d88004462101024020022802cc8004450d0020022802c8800410200b02402001450d002004ad4220862007ad84210a410521040c540b20024103410220011b3a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b20022903202208422088210a2002280228210141052104410021032007450d68200510200c680b4118210f0b0c030b204e21010c020b200241013a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b0b200228022821112002280224215d2002280220215e4105210f0b200141ff0171410874200f72210f2051450d3c0c320b200241c8006a280200211120510d310c3b0b205141016a21040c310b417f2005102d000b20052003102e000b417f2003102d000b20032005102e000b417f200141016a102d000b200141016a2003102e000b417f2003102d000b20032005102e000b417f2003102d000b20032005102e000b417f200141016a102d000b200141016a201a102e000b417f2003102d000b20032005102e000b417f200141016a102d000b200141016a2007102e000b417f200141016a102d000b200141016a2005102e000b417f2003102d000b20032011102e000b417f200141016a102d000b200141016a2018102e000b417f200141016a102d000b200141016a2003102e000b2005201a102d000b201a201c102e000b201a41011023000b20042019102d000b20192015102e000b200441011023000b205841041023000b417f2001102d000b20012003102e000b417f2004102d000b20042011102e000b417f2003102d000b20032011102e000b200141041023000b200141041023000b20032005102d000b1031000b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b200520536a21ca02411021cb02410421cc02410921cd02410821ce0241ffffffff0321cf02417021d002410d2123410321010c010b200241d480046a28020020022802d88004462101024020022802cc8004450d0020022802c8800410200b02402001450d002004ad422086205aad84210a410721040c1a0b20024103410220011b3a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b422021920220022903202110200228022821112004450d134104219302200520044104746a21940241102195024109219602410821970241ffffffff0321980241702199022005219a0241082123410321010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010206060b2002412c6a280200200228023046210102402002280224450d00200228022010200b2001450d032016ad4220862014ad84210a410c21040ce8010b200241d480046a28020020022802d88004462101024020022802cc8004450d0020022802c8800410200b2001450d01201fad422086201ead84210a410a21040ce7010b2019205f46210102402060450d00206110200b2001450d0220ff01ad42208620fe01ad84210a410b21040ce6010b20024103410220011b3a00b88004411421a602200241386a41146a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b422021a7022002290320210d2002280228210e201f450d03411c21a8022005201f411c6c6a21a902410c21aa02410821ab02410421ac02411021ad02410921ae0241ffffffff0321af02417021b002200521b102410a21230cc3010b20024103410220011b3a00b88004411421b202200241386a41146a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241c880046a200241386a102b422021b30220022903c88004210a20022802d08004210b2016450d04411c21b40220052016411c6c6a21b502410c21b602410821b702410421b802411021b902410921ba0241ffffffff0321bb02417021bc02200521bd02410b21230cc4010b20024103410220011b3a0020411421be02200241386a41146a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b422021bf0220022903c88004210820022802d08004211320ff01450d05411821c002200520ff0141186c6a21c102410421c202411021c302410c21c402410921c502410821c60241ffffffff0321c702417021c802200521c902410c21230cc5010b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020230e0f000102030405060b0d0f1517191d2c2c0b2036222220296a213620272101410021044100210303402004202a4b0d07201a2001460d092001202b460d79201a200120296a2227490d7a202620016a2d00002223202c712004202a717420037221032004202d6a2104202721012023202e710d000b024020042030490d00202367202f6a20317120324d0d4b0b024020372022470d0020222029742201203620362001491b2237ad2033862238203488a70de0012038a722012028480de00102402022450d00200520222035742001102122050d010ca3010b200110222205450da2010b200520222035746a20033602002036201d490db7010cf5010b200241386a200241c880046a10532002280238203c460d2e200241386a203e6a280200214d200228023c214e200241c880046a203e6a2802002204200241c880046a203d6a22232802002203460d2f2003203c6a21012003203f460d9b0120042001490d9c01200241386a203d6a280200214f20022802c88004222220036a2d0000215020232001360200205020404b0d320240024002400240024020500e0400030102000b4100215041002151410021030340205120414b0d2220042001460d272001203f460d920120042001203c6a2252490d9301202220016a2d000021532023205236020020532042712051204171742003722103205120436a21512052210120532044710d000b4100215020512046490d0320536720456a204771203a4f0d030c6c0b41002151410021030340205120414b0d1620042001460d242001203f460d930120042001203c6a2252490d9401202220016a2d000021532023205236020020532042712051204171742003722103205120436a21512052210120532044710d000b4102215020512046490d0220536720456a204771203a4f0d020c5c0b41002151410021030340205120414b0d1520042001460d242001203f460d8a0120042001203c6a2252490d8b01202220016a2d000021532023205236020020532042712051204171742003722103205120436a21512052210120532044710d000b4103215020512046490d0120536720456a204771203a4f0d010c5b0b41002151410021030340205120414b0d1420042001460d212001203f460d870120042001203c6a2252490d8801202220016a2d000021532023205236020020532042712051204171742003722103205120436a21512052210120532044710d000b4101215020512046490d0020536720456a204771203a490d5a0b200241b880046a203e6a2003360200200220503602bc80042002204f3602b8800420022902bc800421380240204b204c470d00204b203c742201204b203c6a220420042001491b2204ad20487e2254204988a70ddf012054a72201203b480ddf0102400240204b450d002005204b204a6c2001102122050d010ca0010b200110222205450d9f010b2004214b0b2005204c204a6c6a2201203837020c2001204f3602082001204d3602042001204e3602002039204a6a2139204c203c6a2201214c2001201b490db7010cf3010b2016224f206b6a2116410021014100212203402001206c4b0d0a20702802002251206e2802002204460d0c2004206b6a210320042071460d7b20512003490d7c200228022020046a2d00002104206e200336020020042072712001206c71742022722122200120736a210120042074710d000b024020012076490d0020046720756a20777120784d0d530b200241386a200241206a10282002280238206b460d55200241386a206d6a280200218001200241386a206f6a280200218101200228023c218201410021044100215303402004206c4b0d1c20702802002251206e2802002203460d1e2003206b6a210120032071460d8b0120512001490d8c012002280220225220036a2d00002103206e200136020020032072712004206c71742053722153200420736a210420032074710d000b024020042076490d0020036720756a207771206a490d5f0b4100214d200241386a410020791083041a024002402053450d004100214d4101215b41002103410021500340205120016b205320506b2204207920042079491b2204490d3b200120046a224e2001490da3012051204e490da401200241386a205220016a20041084041a206e204e3602000240024002400240204d20036b20044f0d00200320046a224e2003490de401204d206b742201204e204e2001491b22012069480de401204d450d01205b204d20011021225b0d020ca9010b200420036a214e0c020b20011022225b450da7010b2001214d0b205b20036a200241386a20041084041a2053200420506a22504d0d02206e28020021012070280200215120022802202152204e21030c000b0b4101215b4100214e0b02402014204f470d002014206b7422012014206b6a220420042001491b2204ad207a7e2238207b88a70dde012038a722012069480dde01024002402014450d0020052014207c6c2001102122050d010ca6010b200110222205450da5010b200421140b2005204f207c6c6a22012022206f7622043b00012001205b3602102001208201360204200120223a0000200120786a2004207d763a00002001207e6a204e3602002001207f6a204d3602002001206d6a2080013602002001206f6a20810136020020162015490db7010cc4010b201f22532085016a211f4100210141002122034020012086014b0d05208a0128020022512088012802002204460d0720042085016a21032004208b01460d7820512003490d7920022802c8800420046a2d0000210420880120033602002004208c01712001208601717420227221222001208d016a21012004208e01710d000b02402001209001490d00200467208f016a209101712092014d0d490b200241386a200241c880046a10282002280238208501460d4b200241386a2087016a2251280200214e200241386a2089016a2250280200215b200228023c214f200241386a200241c880046a102c2002280238228101208501460d4c2050280200218001200228023c214d02400240024020512802002201450d002001209a01742203209a0175228201ad209b0186223820950188a70ddf012038a72201208301480ddf01200110222252450da6012003209c016a219d0120522101204d210403402001200428020036020020012084016a210120042084016a21042003209c016a22030d000b209d01209a01762085016a2104208001450d020c010b41002182014104215241002104208001450d010b204d10200b024020022d003c209301470d00208101450d002051280200450d00205028020010200b0240201e2053470d00201e208501742201201e2085016a220320032001491b2203ad2094017e223820950188a70ddd012038a72201208301480ddd0102400240201e450d002005201e2096016c2001102122050d010ca7010b200110222205450da6010b2003211e0b200520532096016c6a220120222089017622033b0001200120523602102001204f360204200120223a000020012092016a2003209701763a000020012098016a200436020020012099016a20820136020020012087016a204e36020020012089016a205b360200201f201c490db7010cc4010b200241386a200241c880046a105320a201280200212220a401280200215b200228023c218001200228023820a001460d21200241386a200241c880046a105320a20128020021820120a4012802002123200228023c2101200228023820a001460d22200241c880046a20a3016a2802002251200241c880046a20a1016a224d2802002253460d23205320a0016a2104205320a501460d8e0120512004490d8f0120022802c88004224e20536a2d00002103204d20043602004100214f200320a6014b0d2402400240024002400240024020030e0400030102000b4100214f41002103410021530340200320a7014b0d1c20512004460d1d200420a501460d86012051200420a0016a2250490d8701204e20046a2d00002152204d2050360200205220a80171200320a70171742053722153200320a9016a210320502104205220aa01710d000b4100214f0240200320ac01490d0020526720ab016a20ad0171209e01490d5d0b20bc0120bd01460d030c040b200241386a200241c880046a105120a4012903002138200228023c2153200228023820a001460d3e4102214f20bc0120bd01460d020c030b20512004460d3f205320b7016a2150200420a501460da70120512050490da801204e20046a2c00002103204d20503602002003209f01480d40200320b80171450d36200320b90172220320ad017120bb01490d3620512050460d46205320a6016a2104205020a501460da90120512004490daa01200320a501732152204e20506a2d00002103410c2153200241c880046a410c6a20043602004103214f4100215102402003450d00200320a001470d49410121510b20bc0120bd01460d010c020b20512004460d3d205320b7016a2103200420a501460d970120512003490d9801204e20046a2c00002104204d2003360200200420a5014c0d42200420b80171450d36200420b90172220420ba01470d36200241386a200241c880046a105120a4012903002138200228023c2153200228023820a001460d464101214f20bc0120bd01470d010b20bc0120a00174220420bc0120a0016a220320032004491b2203ad20ae017e225420af0188a70ddc012054a72204209f01480ddc010240024020bc01450d00200520bc0120b0016c2004102122050d010c9a010b200410222205450d99010b200321bc010b200520bd0120b0016c6a2204200136020c200420223602082004205b3602042004208001360200200420ac016a2038370200200420b1016a2053360200200420b2016a20513a0000200420b3016a20523a0000200420b4016a204f3a0000200420b5016a208201360200200420b6016a2023360200202120b0016a212120bd0120a0016a220121bd0120012006490db7010cf2010b20072059460d34205920c1016a2101205920c201460d9a0120072001490d9b01205720596a2d0000220420c301470d3620d70120c1016a2153205920c4016a21224100210441002123034020222159200420c5014b0d0d20072001460d0e200120c201460d7c2007200120c1016a2203490d7d205720016a2d0000225120c60171200420c50171742023722123205920c1016a2122200420c7016a210420032101205120c801710d000b0240200420ca01490d0020516720c9016a20cb017120c4014d0d550b41002122024002402023450d0020bf0120036a214f205720036a215b4101214d41002152410021014100214e0340204f20016a450d302059450dab0120072059490dac01205b20016a2c0000220420be01480d3241062150200420ce0171450d33200420cf0172220420cb017120d0014d0d33200120c1016a215102402001204e470d002052205120512052491b224e20be01480dde0102402001450d00204d2001204e1021224d0d010cac010b204e1022224d450dab010b204d20016a200420c201733a0000205220d4016a2152205920c1016a21592051210120512023490d000b200320516a21030c010b4101214d410021514100214e0b204d20cc017620cc0174224f204d20cd017620cb017120cd0174225b72204d20cb0171224d72215241002101034041002104202220c5014b0d2820072003460d2a200320c201460d90012007200320c1016a2259490d9101205720036a2d0000222320c60171202220c50171742001722101202220c7016a212220592103202320c801710d000b0240202220ca01490d0020236720c9016a20cb017120c001490d6b0b024002400240200120c101460d0020010d6e4104210420d60120d701460d010c020b20072059460d6e205920c201460db2012007205920c1016a2201490db301205720596a2c0000220420be01480d6f41062150200420ce0171450d2a200420cf0172220420cb017120d0014d0d2a200420c2017321042001215920d60120d701470d010b20d60120c10174220120d60120c1016a220320032001491b2203ad20d20186223820d30188a70ddb012038a7220120be01480ddb010240024020d601450d00200520d60120c001742001102122050d010cad010b200110222205450dac010b200321d6010b200520d70120c001746a220120d80120d10171200420cb017120cd01747220c3017222d80136020c200120513602082001204e3602042001205b204d72204f7236020020d50120cc016a21d501205321d70120532058490db7010cee010b20ff01224e20dc016a21ff0141002101410021030340200120dd014b0d0a20182019460d0b201920de01460d792018201920dc016a2204490d7a206120196a2d0000222220df0171200120dd0171742003722103200120e0016a210120042119202220e101710d000b0240200120e301490d0020226720e2016a20e4017120db01490d530b41002153200241386a410020e5011083041a024002402003450d00410021504101214d41002151410021520340201820046b200320526b220120e501200120e501491b2201490d21200420016a22192004490d870120182019490d8801200241386a206120046a20011084041a0240024002400240205020516b20014f0d00205120016a22222051490de001205020dc01742204202220222004491b220420da01480de0012050450d01204d205020041021224d0d020c97010b200120516a21220c020b20041022224d450d95010b200421500b204d20516a200241386a20011084041a20192104202221512003200120526a22524b0d000c020b0b4101214d2004211941002150410021220b20e701202236020020e90141003602002002204d36022020022022ad20ea01862050ad8437022441002101410021520340200120dd014b0d2420222053460d25205320de01460d92012022205320dc016a2203490d9301204d20536a2d0000210420e9012003360200200420df0171200120dd0171742052722152200120e0016a210120032153200420e101710d000b0240200120e301490d0020046720e2016a20e4017120eb014d0d650b4100215b024002402052450d004100215041042180014100214d0340204d224f20dc016a214d410021014100212202400240024002400340200120dd014b0d01200241206a20ed016a280200225120e9012802002204460d02200420dc016a2103200420de01460d840120512003490d85012002280220225320046a2d0000211220e9012003360200201220df0171200120dd0171742022722122200120e0016a2101201220e101710d000b02400240200120e301490d0020126720e2016a20e4017120eb014d0d010b0240024020512003470d00200220dc013a00b8800420f10120dc01360200200220f70136020c200241386a20e6016a200241086a360200200220f80137023c200220f9013602382002200241b880046a360208200241c880046a200241386a102b200241c880046a20ed016a28020021800220022802cc800421810220022802c88004218202410521220c010b200420ec016a2101200320de01460db30120512001490db401205320036a2c0000210420e901200136020002400240200420da01480d00200420fa01710d01410621220c020b411821220c010b0240200420fb0172220120e4017120fc014d0d00202220fd01712103202220ed01762104200120de01732101410021510c060b41062122200121040b20820220ed0176218302410121514100210320810221840220800221850220820221010c040b206821012067218402410d21220c020b410f21222068210120672184020c010b200220dc013a00b8800420f10120dc01360200200220f70136020c200241386a20e6016a200241086a360200200220f80137023c200220f9013602382002200241b880046a360208200241c880046a200241386a102b20022903c88004223820ea0188a7218402200241c880046a20ed016a28020021132038a72101410521220b200120ed017621830241012151410021042013218502410021032001216820840221670b2003200420e4017120ed017472202220e4017172211220510d3902402050204f470d00205020dc01742204205020dc016a220320032004491b2204ad20f60186223820ea0188a70ddd012038a7220320da01480ddd01024002402050450d00208001205020eb0174200310212280010d010cb2010b20031022228001450db1010b200421500b208001204f20eb01746a220420013a000420042012360200204d2052490d000c020b0b4104218001410021504100214d0b41012122410821810141002101410021034100219d01034020012104200241386a200241206a1029200228023820dc01460d38200241c880046a20ec016a220120d90120ec016a2d00003a0000200220d9012f00003b01c88004200241386a20e8016a2802002152200241386a20e6016a280200215320f101280200214f0240024020ee012d0000225120ef01470d00202220de016a21220c010b205120f5016a20ec014b0d00202220dc016a22820120224f2186022082012122208602450d580b200241386a20ec016a22820120012d00003a0000200220022f01c880043b013802402003209d01470d00200320dc016a22012003490ddb01205b20012001205b491b229d01ad20f20186223820ea0188a70ddb012038a7220120da01480ddb0102402003450d002081012004200110212281010d010cb0010b20011022228101450daf010b20810120046a220120513a0000200120e8016a204f360200200120ed016a2053360200200120db016a2052360200200120eb016a2082012d00003a0000200120dc016a20022f01383b0000205b20ec016a215b200420e6016a2101200320dc016a210320220d000b20e90128020020e70128020046210102402002280224450d00200228022010200b2001450d6d024020fe01204e470d0020fe0120dc0174220120fe0120dc016a220420042001491b2204ad20f3017e223820ea0188a70dda012038a7220120da01480dda010240024020fe01450d00200520fe0120f4016c2001102122050d010cb1010b200110222205450db0010b200421fe010b2005204e20f4016c6a220120810136020c2001204d360208200120503602042001208001360200200120f0016a2003360200200120e6016a209d0136020020ff012062490db7010cc2010b410f210120370deb010cfe010b410f21200c440b200241013a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022802d08004210420022802cc8004210320022802c880042107410521012037450dfc010ce9010b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b200241b880046a41086a200241206a41086a280200360200200220022903203703b880044105212020022802b8800421660c430b02402091022089026a2802002204450d0020910228020421012004208c027421040340024020012d0000208e02470d002001208a026a280200208f0271450d002001208c026a28020010200b2001208d026a210120042090026a22040d000b0b0240209102208a026a280200450d00209102208c026a28020010200b2091022087026a21010240209102208b026a280200450d0020910228021010200b20012191022001208802470db3010c480b410f21170c490b0240209a022802082204450d00209a02280200210120042093027421040340024020012d0000209602470d0020012097026a28020020980271450d0020012093026a28020010200b20012095026a210120042099026a22040d000b0b209a022095026a21010240209a022093026a280200450d00209a0228020010200b2001219a022001209402470db2010ce4010b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241c880046a200241386a102b200241106a41086a200241c880046a41086a280200360200200220022903c8800437031041052117200228021021640c480b024020a502209d026a2802002204450d0020a5022802042101200420a0027421040340024020012d000020a202470d002001209e026a28020020a30271450d00200120a0026a28020010200b200120a1026a2101200420a4026a22040d000b0b024020a502209e026a280200450d0020a50220a0026a28020010200b20a502209b026a2101024020a502209f026a280200450d0020a50228021010200b200121a5022001209c02470db1010c590b410f2112204e0d660c670b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241c880046a200241386a102b20022903c880042238422088a72167200241d080046a28020021132038a7216841052112204e0d650c660b410f21500cdc010b200241013a00c88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241c880046a360208200241b880046a200241386a102b410521500cdb010b410f2101410021500cce010b024020b10220aa026a2802002204450d0020b1022802042101200420ac027421040340024020012d000020ae02470d00200120ab026a28020020af0271450d00200120ac026a28020010200b200120ad026a2101200420b0026a22040d000b0b024020b10220ab026a280200450d0020b10220ac026a28020010200b20b10220a8026a2101024020b10220a6026a280200450d0020b10228021010200b200121b102200120a902470dac010b200d20a702882108410521014100210c201e450df401200510200cf4010b024020bd0220b6026a2802002204450d0020bd022802042101200420b8027421040340024020012d000020ba02470d00200120b7026a28020020bb0271450d00200120b8026a28020010200b200120b9026a2101200420bc026a22040d000b0b024020bd0220b7026a280200450d0020bd0220b8026a28020010200b20bd0220b4026a2101024020bd0220b2026a280200450d0020bd0228021010200b200121bd02200120b502470dab010b200a20b30288210841052101410021092014450df601200510200cf6010b024020c90220c2026a280200450d0020c90228020010200b024020c90220be026a2802002204450d0020c90228020c2101200420c2027421040340024020012d000020c502470d00200120c6026a28020020c70271450d00200120c2026a28020010200b200120c3026a2101200420c8026a22040d000b0b20c90220c0026a2101024020c90220c3026a280200450d0020c90220c4026a28020010200b200121c902200120c102470daa010b200820bf0288210a410521124100210120fe01450de201200510200ce2010b410f21530ccc010b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b2002290224210820022802202104410521534100214f0ccc010b024020052802082204450d0020052802002101200420cc027421040340024020012d000020cd02470d00200120ce026a28020020cf0271450d00200120cc026a28020010200b200120cb026a2101200420d0026a22040d000b0b200520cb026a21010240200520cc026a280200450d00200528020010200b2001210520ca022001470da7010cc9010b410f21170c430b410f21010cc3010b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241c880046a200241386a102b200241b880046a41086a200241c880046a41086a280200360200200220022903c880043703b880044105211720022802b8800421640c410b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b0c100b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b0c0f0b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b0c0e0b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b2002290224210820022802202119410521010cbe010b200241013a0010200241dc80046a41013602002002410136020c200241d880046a200241086a360200200242013702cc8004200241f8cac4003602c880042002200241106a360208200241b880046a200241c880046a102b20022903b880042238422088a72167200241c080046a28020021132038a72168410521122050450d4f204d1020204e0d510c520b200241c8006a2802002103205b2123208001210120bd010dc6010cc7010b200241c8006a28020021032082012122205b0dc3010cc4010b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b2002290224210820022802202104410521534100214f410021510cc1010b410921530c190b410f21120c410b200241013a0037200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241376a360208200241c880046a200241386a102b200241b880046a41086a200241c880046a41086a280200360200200220022903c880043703b88004410521120c400b024020db0220d3026a280200450d0020db0228020010200b024020db0220d4026a2802002204450d0020db0228020c2101200420d3027421040340024020012d000020d702470d00200120d8026a28020020d90271450d00200120d3026a28020010200b200120d5026a2101200420da026a22040d000b0b20db0220d1026a2101024020db0220d5026a280200450d0020db0220d6026a28020010200b200121db02200120d202470d99010c4b0b410f21500b204e0db7010cc2010b200241013a0020200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241206a360208200241c880046a200241386a102b200241d280046a2f01002103200241d180046a2d00002119200241d080046a2d0000210120022802cc8004212320022802c88004210741052150204e450dc1010cb6010b2002200241c4006a2902003703b88004200241c0006a2802002119200228023c210120022802b88004210720022802bc80042103204c0db3010cb4010b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b0b200229022421082002280220211941052101410021500cb0010b200241013a0020200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241206a360208200241c880046a200241386a102b200241d080046a280200210120022802cc8004212320022802c88004210741052150204e0d030cbc010b410a21010cae010b411821500b204e450db9010b204d10200cb8010b410621530c0a0b410721070c0c0b200241013a0020200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241206a360208200241c880046a200241386a102b200241d280046a2f01002103200241d180046a2d00002119200241d080046a2d0000210120022802cc8004212320022802c880042107410521500cb6010b200241013a0010200241dc80046a41013602002002410136020c200241d880046a200241086a360200200242013702cc8004200241f8cac4003602c880042002200241106a360208200241b880046a200241c880046a102b200241c080046a280200210b20022802bc8004216320022802b88004216441052117204d450d27205b10202080010d280c290b411721500cb4010b20830220ed0174200120e4017172216820500d220c2f0b200241c8006a280200218502200241c4006a280200218402200241c0006a2802002168200228023c21122003450d200c1f0b200241b880046a41086a200241c8006a2802003602002053418080807871214f20534180807c71215120534108762103200220383703b8800420022902bc800421080ca2010b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b200241286a280200210320022903202138410521070c060b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b4105215320022902242108200228022021040c020b411821530b0b410021510ca5010b411821070b0b200441ff017141087420077221530c99010b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b200229022421082002280220210441052153410021510ca1010b200241c8006a28020021030c97010b4100214f0c9f010b410d210120370da7010cba010b410d21200b0b200241c080046a280200210e20022802bc800421654100210c0c020b200228023c2220410876210c200241c8006a280200210e200241c4006a2802002165200241386a41086a280200216620530d030c040b200228023c2120200241386a41106a280200210e200241c4006a2802002165200241386a41086a28020021660240204e450d00204e4104742104204f21010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010200b200141106a2101200441706a22040d000b0b2020410876210c205b0d010b2053450d020c010b204f10202053450d010b411c21870220052053411c6c6a218802410c2189024108218a024114218b024104218c024110218d024109218e0241ffffffff03218f0241702190022005219102410721230c7d0b201e450db501200510200cb5010b410d21170b0b200241186a280200210b20022802142163410021090c0e0b200228023c22174108762109200241c8006a280200210b200241c4006a2802002163200241386a41086a2802002164204f0d0f0c100b410d2112204e0d1d0c1e0b410d21500c94010b410d2101410021500c87010b410d21530c8b010b024020514109470d00205341ffffffff0371450d00205210200b4115218402418080c0002168410421122003450d010b20810121010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010200b200141106a2101200441706a22040d000b0b0240209d01450d0020810110200b2050450d0d0b208001102020022802240d0d0c0e0b410d21170b200241c080046a280200210b20022802bc800421630b208001450d010b208001410474210420820121010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010200b200141106a2101200441706a22040d000b0b410021092081010d010b204f450d020c010b2082011020204f450d010b411c219b022005204f411c6c6a219c02410c219d024108219e024114219f02410421a002411021a102410921a20241ffffffff0321a302417021a402200521a502410921230c6b0b2014450da401200510200ca4010b410d21010c780b410d21120b200241106a41086a2201200241b880046a41086a280200360200200220022903b8800437031020012802002185022002280214218402200228021021680b2002280224450d010b200228022010200b208402216720850221130c050b410d2150204e0d750c80010b4104215041a1e5c000210741242123204e0d740c7f0b200241013a0020200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241206a360208200241c880046a200241386a102b200241d280046a2f01002103200241d180046a2d00002119200241d080046a2d0000210120022802cc8004212320022802c88004210741052150204e0d730c7e0b41182150204e0d720c7d0b200220eb0120ec0120011b3a00b88004200241cc006a41013602002002410136020c200241386a41106a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241c880046a200241386a102b200241c880046a41086a280200211320022802cc8004216720022802c88004216802402003450d00200441106a2103410021010340024020810120016a22042d00004109470d00200441086a28020041ffffffff0371450d00200441046a28020010200b2003200141106a2201470d000b0b0240209d01450d0020810110200b4105211220500d010b204e450d020c010b2080011020204e450d010b411821d1022005204e41186c6a21d202410421d302411421d402411021d502410c21d602410921d702410821d80241ffffffff0321d902417021da02200521db02410e21230c650b20fe01450d8301200510200c83010b417f200141016a102d000b200141016a201a102e000b417f2003102d000b20032051102e000b417f2003102d000b20032051102e000b417f201941016a102d000b201941016a2018102e000b417f200141016a102d000b200141016a2007102e000b417f2003102d000b20032051102e000b417f200441016a102d000b200441016a2051102e000b417f200141016a102d000b200141016a2004102e000b417f200141016a102d000b200141016a2004102e000b20042019102d000b20192018102e000b417f2001102d000b20012051102e000b417f200141016a102d000b200141016a2004102e000b417f200141016a102d000b200141016a2004102e000b417f2004102d000b20042051102e000b417f200341016a102d000b200341016a2007102e000b200441011023000b417f205341016a102d000b205341016a2022102e000b417f2003102d000b20032051102e000b200441041023000b417f2001102d000b20012004102e000b200141041023000b417f2001102d000b20012007102e000b200141041023000b2001204e102d000b204e2051102e000b200141011023000b200141041023000b200141041023000b200141041023000b417f2050102d000b20502051102e000b417f2004102d000b20042051102e000b204e41011023000b417f2059102d000b20592007102e000b200141041023000b417f2001102d000b20012051102e000b200341041023000b200141081023000b200141041023000b417f205941016a102d000b205941016a2007102e000b410021230c110b410121230c110b410221230c110b410321230c110b410421230c110b410521230c110b410621230c110b410721230c120b410821230c120b410921230c130b410a21230c140b410b21230c150b410c21230c160b410d21230c160b410e21230c170b410021010c170b410121010c160b410221010c150b410321010c140b410321010c130b410321010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b410321010c0a0b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b410321010c010b410321010c000b0b1024000b200241106a41086a20033602002053418080807871214f20534180807c7121512053410876210320022038370310200229021421080b2038a721040c070b20504108742001722101200220083703b880042008a721070240204d450d00204e10200b20022802bc80042103204c450d010b2005210403400240200441046a280200450d00200428020010200b200441146a21042039416c6a22390d000b0b204b450d1e200510200c1e0b205210200c0a0b205a450d16205c10200c160b0b41002151410021030b205341ff0171200341ff0171410874722051418080fc077172204f7221072008422088a721032008a7212202402023450d00200110200b2004212320072101205b450d010b20800110200b20bd01450d010b2005210403400240200441046a280200450d00200428020010200b0240200441106a280200450d002004410c6a28020010200b200441286a2104202141586a22210d000b0b20bc01450d19200510200c190b200241106a41086a2201200241b880046a41086a280200360200200220022903b88004370310200128020021012002280214212320022802102107410021040b20014110762103200141087621190b201941ff0171410874200141ff017172211920034110742103200441ff01714108742104024020d701450d002005210103400240200141046a280200450d00200128020010200b200141106a210120d50141706a22d5010d000b0b201920037221032004205072210120d601450d10200510200c100b20102092028821084105210f41002101205a450d0c200510200c0c0b200510200c120b2059205546210102402056450d00205710200b02402001450d002053ad42208620d601ad84210a410221040c040b20024103410220011b3a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022903c88004210820022802d08004210302402053450d00205341047421042005210103400240200141046a280200450d00200128020010200b200141106a2101200441706a22040d000b0b2008422088210a410521014100210420d601450d0e200510200c0e0b200241d480046a28020020022802d88004462104024020022802cc8004450d0020022802c8800410200b02402004450d002001ad422086204bad84210a410821040c030b20024103410220041b3a00b88004200241386a41146a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b200229032021082002280228210302402001450d00200141146c21042005210103400240200141046a280200450d00200128020010200b200141146a21012004416c6a22040d000b0b2008422088210a4105210141002104204b450d0f200510200c0f0b2027202446210102402025450d00202610200b02402001450d002036ad4220862037ad84210a410421040c020b20024103410220011b3a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022903c880042208422088210a20022802d08004210441052101410021032037450d10200510200c100b200241d480046a28020020022802d88004462104024020022802cc8004450d0020022802c8800410200b2004450d012001ad42208620bc01ad84210a410321040b200020043a000420004100360200200041056a20022f00c880043b0000200041186a2008370200200041146a20013602002000410c6a200a370200200041086a2005360200200041206a2002290238370200200041076a200241ca80046a2d00003a0000200041286a200241386a41086a290200370200200241e080046a24000f0b20024103410220041b3a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b200229032021082002280228210302402001450d00200141286c21042005210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101200441586a22040d000b0b2008422088210a410521014100210420bc01450d0f200510200c0f0b201aad422086201dad8421082018450d00200610200b20004101360200200041106a2004360200200041086a200837020020002001410874200741ff017172360204200241e080046a24000f0b201241087621012067ad220a4220862068ad8421082060450d00206110200b20004101360200200041106a2013360200200041086a200a422086200842ffffffff0f838437020020002001410874201241ff017172360204200241e080046a24000f0b200f4108762101205dad2208422086205ead84211020022802cc8004450d0020022802c8800410200b20004101360200200041106a2011360200200041086a2008422086201042ffffffff0f838437020020002001410874200f41ff017172360204200241e080046a24000f0b200441ffffff07712203410874201841ff0171722104201aad220a4220862006ad84210820022802cc8004450d0020022802c8800410200b20004101360200200041106a2001360200200041086a200a422086200842ffffffff0f838437020020002003410874200441ff017172360204200241e080046a24000f0b200141087621042023ad220a4220862007ad8421082056450d00205710200b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241e080046a24000f0b200141087621042007ad220a4220862019ad84210820022802cc8004450d0020022802c8800410200b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241e080046a24000f0b2003ad220a4220862007ad842108410021032025450d00202610200b20004101360200200041106a2004360200200041086a200a422086200842ffffffff0f838437020020002003410874200141ff017172360204200241e080046a24000f0b200141087621042022ad220a4220862023ad84210820022802cc8004450d0020022802c8800410200b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241e080046a24000f0b200c410874202041ff01717221012065ad22084220862066ad84210d20022802cc8004450d0020022802c8800410200b20004101360200200041106a200e360200200041086a2008422086200d42ffffffff0f83843702002000200c410874200141ff017172360204200241e080046a24000f0b200441ffffff07712203410874201a41ff01717221042018ad220a4220862007ad84210820022802cc8004450d0020022802c8800410200b20004101360200200041106a2001360200200041086a200a422086200842ffffffff0f838437020020002003410874200441ff017172360204200241e080046a24000f0b2009410874201741ff01717221012063ad22084220862064ad84210a2002280224450d00200228022010200b20004101360200200041106a200b360200200041086a2008422086200a42ffffffff0f838437020020002009410874200141ff017172360204200241e080046a24000f0b200241e080046a24000b940301087f230041c0006b2202240041002103200141086a2104200141046a210541002106024002400240024002400340200341204f0d012005280200220720042802002208460d02200841016a21092008417f460d0420072009490d05200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b20034120490d0220086741686a41ff017141034b0d02200041013602002000410d3a0004200241c0006a24000f0b200041013602002000410f3a0004200241c0006a24000f0b200241013a000f200241346a41013602002002410136023c20024201370224200241f8cac40036022020022002410f6a3602382002200241386a360230200241106a200241206a102b2002412b6a200241186a28020036000020022002290310370023200041053a000420004101360200200020022900203700052000410c6a200241276a290000370000200241c0006a24000f0b2000410036020020002006360204200241c0006a24000f0b417f2009102d000b20092007102e000b9d05010c7f230041c080016b22022400200241086a2001104f41012103024020022802084101470d002000200229020c370204200041013602002000410c6a200241086a410c6a290200370200200241c080016a24000f0b200228020c2104200241086a4100418080011083041a41002105410021060240024002400240024002402004450d00200141086a2107200141046a21084100210941002105410121034100210a03402008280200220b200728020022066b2004200a6b220c41808001200c41808001491b220c490d022006200c6a220d2006490d03200b200d490d04200241086a200128020020066a200c1084041a2007200d3602000240024002400240200520096b200c4f0d002009200c6a22062009490d092005410174220d20062006200d491b220d4100480d092005450d0120032005200d102122030d020c0a0b200c20096a21060c020b200d10222203450d080b200d21050b200320096a200241086a200c1084041a200621092004200c200a6a220a4b0d000b0b2000200336020420004100360200200041146a2006360200200041106a41003602002000410c6a2006360200200041086a2005360200200241c080016a24000f0b200241013a008f8001200241b480016a4101360200200241013602bc8001200242013702a48001200241f8cac4003602a0800120022002418f80016a3602b880012002200241b880016a3602b080012002419080016a200241a080016a102b200241ab80016a2002419880016a2802003600002002200229039080013700a38001200041053a000420004101360200200020022900a080013700052000410c6a200241a780016a29000037000002402005450d00200310200b200241c080016a24000f0b2006200d102d000b200d200b102e000b1024000b200d41011023000be007010a7f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204470d00200241013a000f2002413c6a4101360200200241013602242002420137022c200241f8cac40036022820022002410f6a3602202002200241206a360238200241106a200241286a102b200241326a200241186a2802003601002002200229031037012a20022002412e6a29010037010620022002290128370300410521050c010b200441016a21062004417f460d0b20032006490d0c2001280200220720046a2d00002108410c21052001410c6a2006360200410021064100210902402008450d004101210920084101470d010b410120036b210a200441026a21042001410c6a210b4100210503402006411f4b0d02200a20046a4102460d032004450d0a20032004490d0b200720046a417f6a2d00002108200b2004360200200841ff00712006411f71742005722105200441016a2104200641076a21062008418001710d000b024020064120490d00410d210620086741686a41ff01714104490d040b2009450d042004417f6a2104410021062001410c6a210b4100210a03402006411f4b0d0720032004460d082004417f460d0e2003200441016a2201490d0f200720046a2d00002108200b2001360200200841ff00712006411f7174200a72210a200641076a2106200121042008418001710d000b024020064120490d00410d210420086741686a41ff01714104490d090b410121040c050b200020083a0005200020053a000420002002290300370106200041013602002000410c6a2002290106370100200241c0006a24000f0b410f21060c010b200241013a00102002413c6a4101360200200241013602242002420137022c200241f8cac4003602282002200241106a3602202002200241206a3602382002200241286a102b410521060b2000200636020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b410021040b20002005360204200041003602002000410c6a200a360200200041086a2004360200200241c0006a24000f0b410f21040c010b200241013a00102002413c6a4101360200200241013602242002420137022c200241f8cac4003602282002200241106a3602202002200241206a3602382002200241286a102b410521040b2000200436020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b417f2004102d000b20042003102e000b417f2006102d000b20062003102e000b417f200441016a102d000b200441016a2003102e000bbd0602057f027e0240024002402002450d00200241796a4100200241074b1b2103410021040340024002400240024002400240024002400240024002400240024002400240200120046a22052d0000220641187441187522074100480d002005410371450d01200441016a22042002490d0f0c100b4280808080102108200641b6d5c4006a2d000022054104460d0120054103460d0220054102470d08200441016a220620024f0d094280808080802021094280808080102108200120066a2d000041c00171418001460d0d0c110b0240200420034f0d000340200120046a220641046a280200200628020072418081828478710d01200441086a22042003490d000b0b0240200420024f0d000340200120046a2c00004100480d01200441016a22042002490d000b0b20042002490d0d0c0e0b42002109200441016a220520024f0d08200120056a2d00002105200641f001460d01200641f401470d022005411874411875417f4a0d06200541ff0171418f014d0d030c060b42002109200441016a220520024f0d07200120056a2d00002105200641e001460d03200641ed01470d042005411874411875417f4a0d05200541ff017141a001490d090c050b200541f0006a41ff01714130490d010c040b200541ff017141bf014b0d032007410f6a41ff017141024b0d03200541187441187541004e0d030b200441026a220620024f0d04200120066a2d000041c00171418001470d0a42002108200441036a220620024f0d0b200120066a2d000041c00171418001460d070c050b200541e0017141a001470d010c050b02402007411f6a41ff0171410c4f0d002005411874411875417f4a0d01200541ff017141bf014d0d050c010b200541ff017141bf014b0d00200741fe017141ee01470d0020054118744118754100480d040b4280808080802021090c080b420021090b420021080c060b428080808080e000210942808080801021080c050b42002108200441026a220620024f0d04200120066a2d000041c00171418001470d030b200641016a22042002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210942808080801021080b200020092008842004ad84370204200041013602000bca07010d7f230041c0086b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d082001280200220a20086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d03200241086a41004180081083041a2001410c6a210b200141086a210c4101210d4100210e41002108410021040340200720096b200620046b22034180082003418008491b2203490d05200920036a22052009490d0920072005490d0a200241086a200a20096a20031084041a200b20053602000240024002400240200e20086b20034f0d00200820036a22052008490d0f200e4101742209200520052009491b22094100480d0f200e450d01200d200e20091021220d0d020c100b200320086a21050c020b20091022220d450d0e0b2009210e0b200d20086a200241086a20031084041a02402006200320046a22044d0d00200b2802002109200c28020021072001280200210a200521080c010b0b200241086a200d2005105220022802084101470d050240200e450d00200d10200b200041083a000420004101360200200241c0086a24000f0b410f21030c010b200241013a0098082002411c6a41013602002002410136028c082002420137020c200241f8cac400360208200220024198086a36028808200220024188086a360218200241a8086a200241086a102b410521030b2000200336020420004101360200200041086a20022902a808370200200041106a200241a8086a41086a2802003602000c090b2000428080808010370200200041086a4200370200200241c0086a24000f0b200241013a009708200241bc086a41013602002002410136028c08200242013702ac08200241f8cac4003602a808200220024197086a36028808200220024188086a3602b80820024198086a200241a8086a102b200241b3086a200241a0086a28020036000020022002290398083700ab08200041053a000420004101360200200020022900a8083700052000410c6a200241af086a290000370000200e450d07200d1020200241c0086a24000f0b2000200d3602042000410c6a2005360200200041086a200e36020020004100360200200241c0086a24000f0b417f2009102d000b20092007102e000b20092005102d000b20052007102e000b1024000b200941011023000b200241c0086a24000b8f03010e7f230041b0016b22012400200141086a20001033024020012903284202510d00200141e0006a2102200141dc006a2103200141d8006a2104200141a4016a2105200141a0016a21062001419c016a210720014198016a210820014190016a210903402002280200210a2004280200210b024002402003280200220c450d00200c210d200b210e0340200e2802ec03210e200d417f6a220d0d000b0340200b200b2f01064102746a41ec036a280200210b200c417f6a220c0d000c020b0b200b210e0b20014188016a41206a200a3602002005200b2f0106360200200641003602002007200b36020020084100360200200942003703002001200e36028c01200141003602880120014188016a1042200141086a20001033200141086a41206a2903004202520d000b0b02402000280204220b4180e5c200460d00200b280200210c200b1020200c450d00200c280200210e200c1020200e450d000240200e280200220b450d000340200e1020200b210e200b280200220c210b200c0d000b0b200e10200b200141b0016a24000bbf0303027f017e027f02402001450d000340200028026c21002001417f6a22010d000b0b4100210341002101024003402002450d010240200120002f01064f0d0020014103742104200141016a21012002417f6a2102200020046a41146a290200a74103470d010c020b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010202005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110202005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41f0006a2802002100200420074103746a41146a2902002105024020064101460d00410120066b21010340200028026c2100200141016a22010d000b0b410021012002417f6a21022005a74103470d000b0b024020004180e5c200460d0020002802002101200010202001450d0020012802002104200110202004450d00024020042802002201450d000340200410202001210420012802002200210120000d000b0b200410200b0bb70b05077f017e037f017e017f230041d0016b22022400200241b0016a41186a22034200370300200241b0016a41106a22044200370300200241b0016a41086a22054200370300200242003703b001200241b0016a2001280200220620012802042207412020074120491b22081084041a2001200720086b3602042001200620086a360200024002402007411f4d0d0020024190016a41186a2207200329030037030020024190016a41106a2208200429030037030020024190016a41086a22062005290300370300200220022903b00137039001200241f0006a41186a2007290300370300200241f0006a41106a2008290300370300200241f0006a41086a20062903003703002002200229039001370370410121070c010b410021070b200241b0016a41186a2208200241f0006a41186a290300370300200241b0016a41106a2206200241f0006a41106a290300370300200241b0016a41086a2203200241f0006a41086a290300370300200220022903703703b001024002400240024002402007450d00200241306a41186a2008290300370300200241306a41106a2006290300370300200241306a41086a2003290300370300200220022903b0013703302002200110572002290300a7450d0120022903082109200241b0016a41186a22054200370300200241b0016a41106a220a4200370300200241b0016a41086a220b4200370300200242003703b001200241b0016a20012802002204200141046a22032802002207412020074120491b22081084041a2003200720086b22063602002001200420086a22083602002007411f4d0d0220024190016a41186a2207200529030037030020024190016a41106a2204200a29030037030020024190016a41086a2205200b290300370300200220022903b00137039001200241d0006a41186a2007290300370300200241d0006a41106a2004290300370300200241d0006a41086a20052903003703002002200229039001370350200241b0016a2006412020064120491b22076a41004100412020076b2007411f4b1b1083041a200241b0016a200820071084041a2003200620076b3602002001200820076a3602002006411f4d0d0320024190016a41186a2207200241b0016a41186a220329030037030020024190016a41106a2208200241b0016a41106a220429030037030020024190016a41086a2206200241b0016a41086a2205290300370300200220022903b00137039001200241f0006a41186a220a2007290300370300200241f0006a41106a220b2008290300370300200241f0006a41086a220c20062903003703002002200229039001370370200241b0016a2001105820022802b0012201450d0420022902b401210d2003200241306a41186a2903003703002004200241306a41106a2903003703002005200241306a41086a2903003703002006200241d0006a41086a2903003703002008200241d0006a41106a2903003703002007200241d0006a41186a290300370300200241106a41086a220e200c290300370300200241106a41106a220c200b290300370300200241106a41186a220b200a290300370300200220022903303703b0012002200229035037039001200220022903703703102000200d37020c2000200136020820002009370300200041146a20022903b0013702002000411c6a2005290300370200200041246a20042903003702002000412c6a2003290300370200200041346a2002290390013702002000413c6a2006290300370200200041c4006a2008290300370200200041cc006a2007290300370200200041ec006a200b290300370200200041e4006a200c290300370200200041dc006a200e290300370200200041d4006a2002290310370200200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000bb40503057f027e047f230041106b22022400200241003a0000200220012802002203200128020422044100472205108404210202400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d0020022d00002204ad210702400240200441037122034102460d00024020034101460d0020030d022004410276ad2107420121080c050b200241003a00002002200520064100472204108404210320062004490d07200141046a200620046b3602002001200520046a3602002006450d0220033100004208862007844202882107420121080c040b200241003a000e200241003b010c2002410c6a200520064103200641034922031b22041084041a200141046a200620046b3602002001200520046a36020020030d01200233010c200231000e421086844208862007844202882107420121080c030b02400240200441027622044104460d0020040d01200241003602002002200520064104200641044922031b22041084042109200141046a200620046b3602002001200520046a36020020030d0220093502002107420121080c040b42002108200242003703002002200520064108200641084922031b22041084042109200141046a200620046b3602002001200520046a36020020030d0220092903002107420121080c030b200441046a220a41084b0d0042002107200141046a210b410021030340200241003a00002002200520064100472204108404210920062004490d05200b200620046b220c3602002001200520046a22053602002006450d0120093100002003410374413871ad86200784210742012108200c2106200341016a22042103200441ff0171200a490d000c030b0b420021080b0b2000200737030820002008370300200241106a24000f0b20052004102d000b20042006102d000b20042006102d000be31507027f017e147f017e017f017e097f23004180026b22022400200241106a200110bc01024002400240024002400240024002400240024002402002280210450d0020022802142203ad42287e2204422088a70d0a2004a72205417f4c0d0a2005450d01200510222206450d032003450d020c040b2000410036020020024180026a24000f0b4108210620030d020b41002116410021130c020b200541081023000b200241c4016a210520024185016a2107200241186a4101722108200141046a2109200241f8016a210a200241c3016a220b41056a210c200241bf016a210d200241b6016a210e200241b0016a41076a210f41002110410021114100211220032113034020092802002114200241003a00b001200241b0016a20012802002215201441004722161084041a0240024002400240024002400240024020142016490d002009201420166b22173602002001201520166a22163602002014450d0a20022d00b001221441044b0d0a0240024002400240024002400240024002400240024020140e050004020301000b2002200110bc012002280200450d1420022802042214417f4c0d182014450d04201410762217450d0b2017200128020020092802002216201420162014491b22161084041a200928020022152016490d0c2009201520166b3602002001200128020020166a36020020162014460d050c090b200241003602b001200241b0016a201620174104201741044922151b22141084041a2009201720146b3602002001201620146a36020020150d1320022802b0012118200241086a200110bc012002280208450d13200228020c2216417f4c0d172016450d06201610762214450d0c2014200128020020092802002217201620172016491b22171084041a200928020022152017490d0d2009201520176b3602002001200128020020176a36020020172016470d070c0e0b200241b0016a2017412020174120491b22146a41004100412020146b2014411f4b1b1083041a200241b0016a201620141084041a2009201720146b3602002001201620146a3602002017411f4d0d122002200b2900003703782002200c29000037007d200d2800002115200241b0016a41046a2f01002114200e2d00002116200f290000210420022802b00121182007411f6a200241b0016a411f6a290000370000200741186a200241b0016a41186a290000370000200741106a200241b0016a41106a290000370000200741086a200241b0016a41086a290000370000200720022900b00137000020044220882119201420164110747221162004a721144101211a0c0e0b200242003703b001200241b0016a20162017410820174108491b22141084041a2009201720146b22153602002001201620146a2216360200201741074d0d1120022903b0012104200241b0016a201541c000201541c000491b22146a4100410041c00020146b2014413f4b1b1083041a200241b0016a201620141084041a2009201520146b3602002001201620146a3602002015413f4d0d11200241f8006a41086a200b41086a290000370300200241f8006a41106a200b41106a290000370300200241f8006a41186a200b41186a290000370300200241f8006a41206a200b41206a290000370300200241f8006a41256a200b41256a2900003700002002200b290000370378200f290000221b4220882119200241b0016a41046a2f0100200e2d0000411074722116200d280000211520022802b0012118201ba721144102211a0c0e0b200241b0016a200110c00120022802b0012214450d1020022902b4012104200241f8006a41306a200241b0016a41306a280200360200200241f8006a41286a200241b0016a41286a290200370300200241f8006a41206a200241b0016a41206a290200370300200241f8006a41186a200241b0016a41186a290200370300200241f8006a41106a200241b0016a41106a290200370300200241f8006a41086a200241b0016a41086a290200370300200220022902b0013703782004422088211920144108762116201441187421182004a721144100211a0c020b4101211741002014470d040b200241f8006a41306a200241b0016a41306a280200360200200241f8006a41286a200241b0016a41286a290200370300200241f8006a41206a200241b0016a41206a290200370300200241f8006a41186a200241b0016a41186a290200370300200241f8006a41106a200241b0016a41106a290200370300200241f8006a41086a200241b0016a41086a290200370300200220022902b00137037820174108762116201741187421182014ad21194104211a0b0c090b4101211441002016460d070b2016450d0b201410200c0b0b2014450d0a201710200c0a0b20162014102d000b201441011023000b20162015102d000b201641011023000b20172015102d000b2014450d042016ad22044220862004842219422088a721154103211a0b0b200241c0006a41306a221c200241f8006a41306a280200360200200241c0006a41286a221d200241f8006a41286a290300370300200241c0006a41206a221e200241f8006a41206a290300370300200241c0006a41186a221f200241f8006a41186a2220290300370300200241c0006a41106a2221200241f8006a41106a2222290300370300200241c0006a41086a2223200241f8006a41086a222429030037030020022002290378370340200241b0016a41106a22172015360200200241b0016a41086a221520194220862014ad8437030020052002290340370200200541086a2023290300370200200541106a2021290300370200200541186a201f290300370200200541206a201e290300370200200541286a201d290300370200200541306a201c280200360200200220183600b1012002201a3a00b001200220163b00b501200220164110763a00b701200a2004370300200241186a200241b0016a10bf0120022d00182118200241b0016a411f6a22142008411f6a290000370000200241b0016a41186a221a200841186a2900003703002017200841106a2900003703002015200841086a290000370300200220082900003703b00120184103460d03201241016a2116200241f8006a411f6a221c20142900003700002020201a2903003703002022201729030037030020242015290300370300200220022903b001370378024020122013470d002010201620162010491b2213ad42287e2204422088a70d052004a722144100480d0502402012450d00200620112014102122060d010c070b201410222206450d060b200620116a221420183a0000201441206a201c290000370000201441196a2020290300370000201441116a2022290300370000201441096a2024290300370000201441016a2002290378370000201041026a2110201141286a21112016211220162003490d000b0b2000201336020420002006360200200041086a201636020020024180026a24000f0b200241033a0018200241b0016a411f6a2008411f6a290000370000200241b0016a41186a200841186a290000370300200241b0016a41106a200841106a290000370300200241b0016a41086a200841086a290000370300200220082900003703b0010b2000410036020002402012450d00200621050340024020052d00002208450d00024020084101470d00200541086a280200450d01200541046a2802001020200541286a2105201141586a22110d020c030b200541106a280200450d002005410c6a28020010200b200541286a2105201141586a22110d000b0b02402013450d00200610200b20024180026a24000f0b1024000b201441081023000b1031000b8a0d010a7f23004180026b2202240002400240024002402001412041c8d7c400410041001001417f460d00200241e0016a41186a22034200370300200241e0016a41106a22044200370300200241e0016a41086a22054200370300200242003703e001410020014120200241e0016a41204100100122062006417f461b220641204922070d03200241c0016a41186a2003290300370300200241c0016a41106a2004290300370300200241c0016a41086a2005290300370300200220022903e0013703c001200241003a00e00120014120200241e0016a41012006412020071b2203100141016a41014b2204450d0320022d00e0012105200241186a200241c0016a41186a290300370300200241106a200241c0016a41106a290300370300200241086a200241c0016a41086a290300370300200220022903c001370300200241003a00e00120014120200241e0016a4101200320046a2203100141016a41014b2204450d03200320046a210320022d00e0012204450d0120044101470d03200241f8016a4200370300200241f0016a4200370300200241e8016a4200370300200242003703e00120014120200241e0016a4120200310012204417f460d032004411f4d0d03200241c0016a41186a2204200241e0016a41186a290300370300200241c0016a41106a2206200241e0016a41106a290300370300200241c0016a41086a2207200241e0016a41086a290300370300200220022903e0013703c001200241a0016a41186a22082004290300370300200241a0016a41106a22042006290300370300200241a0016a41086a22062007290300370300200220022903c0013703a00120024180016a41186a200829030037030020024180016a41106a200429030037030020024180016a41086a2006290300370300200220022903a00137038001200341206a2103410121060c020b200041023a002120024180026a24000f0b410021060b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a2903003703002002200229038001370360200241003a00e00120014120200241e0016a41012003100141016a41014b2207450d0041002104024020022d00e0012208450d0020084101470d01200241f8016a4200370300200241f0016a4200370300200241e8016a4200370300200242003703e00120014120200241e0016a4120200320076a10012201417f460d012001411f4d0d01200241c0016a41186a2201200241e0016a41186a290300370300200241c0016a41106a2203200241e0016a41106a290300370300200241c0016a41086a2204200241e0016a41086a290300370300200220022903e0013703c001200241a0016a41186a22072001290300370300200241a0016a41106a22012003290300370300200241a0016a41086a22032004290300370300200220022903c0013703a00120024180016a41186a200729030037030020024180016a41106a200129030037030020024180016a41086a2003290300370300200220022903a00137038001410121040b200241206a41186a220120024180016a41186a290300370300200241206a41106a220320024180016a41106a290300370300200241206a41086a220720024180016a41086a2903003703002002200229038001370320200241c0006a41186a2208200241e0006a41186a290300370300200241c0006a41106a2209200241e0006a41106a290300370300200241c0006a41086a220a200241e0006a41086a29030037030020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200241e0016a41186a220b2008290300370300200241e0016a41106a22082009290300370300200241e0016a41086a2209200a290300370300200241c0016a41086a220a2007290300370300200241c0016a41106a22072003290300370300200241c0016a41186a22032001290300370300200220022903403703e001200220022903203703c001200020063a0021200020053a0020200041c2006a20043a0000200020022903e0013700222000412a6a2009290300370000200041326a20082903003700002000413a6a200b290300370000200041c3006a20022903c001370000200041cb006a200a290300370000200041d3006a2007290300370000200041db006a200329030037000020024180026a24000f0b419a88c00041331039000b8b0202037f017e230041206b22022400024002402001411041c8d7c400410041001001417f460d002002411036020420022001360200200242003703102002410020014110200241106a41084100100122032003417f461b2203410820034108491b2204360208200341074d0d012002290310210520024100360210200241086a410020014110200241106a41042004100122012001417f461b22014104200141044922011b20046a36020020010d0120022802102101200241106a2002103820022802102203450d01200020022902143703102000200336020c2000200136020820002005370300200241206a24000f0b2000410036020c200241206a24000f0b419a88c00041331039000bc60401067f230041106b22022400200241003602082002420137030020012002103e200141046a2002103e200141086a2002103e200228020421032002280208210402400240024002400240024002400240024002400240024002400240024020012d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22054100480d0c2004450d0320022802002004200510212203450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22054100480d0b2004450d0420022802002004200510212203450d050c060b200228020021030c080b200228020021030c050b2005102222030d050b200541011023000b2005102222030d010b200541011023000b20022005360204200220033602000b200241086a200441016a360200200320046a41003a00000c020b20022005360204200220033602000b200241086a200441016a360200200320046a41013a00000b200128020c21062002200141146a280200220136020c2002410c6a2002103e02400240024020022802042205200241086a28020022036b20014f0d00200320016a22042003490d0320054101742207200420042007491b22074100480d032005450d0120022802002005200710212204450d020c040b200228020021040c040b2007102222040d020b200741011023000b1024000b2002200736020420022004360200200721050b200420036a200620011084041a200041202004200320016a100302402005450d00200410200b200241106a24000bfe0101097f200220006b220341606a2104200341a07f6a2105200341406a21062000200141057422076a210841002101200021090240024002400340200820096b41ff004d0d014101210a20032001460d02200020016a220b20024120108604450d0220042001460d02200b41206a20024120108604450d0220062001460d02200b41c0006a20024120108604450d0220052001460d02200b4180016a210920014180016a2101200b41e0006a200241201086040d000c020b0b200020016a210b200720016b210103402001450d024101210a2002200b460d01200b200241201086042109200141606a2101200b41206a210b20090d000b0b200a0f0b41000bb43401087f230041a0016b220824000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002410c6a280200200241106a28020010042209417f460d00410c1022220a450d01200a2009360208200a42818080801037020002404101450d00200a410141016a3602004101417e460d00200a410141027236020041041022220b450d03200b200a360200200a280208210c41031022220d450d04200d41026a41002d008cb7443a0000200d41002f008ab7443b000041061022220e450d05200e41046a41002f00e5ad433b0000200e41002800e1ad43360000412010222209450d062009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a41086a2802001005200a200a280204417f6a220d360204200d0d00200a10200b41031022220d450d07200d41026a41002d008cb7443a0000200d41002f008ab7443b000041031022220e450d08200e41026a41002d008fb7443a0000200e41002f008db7443b00002009412041c00010212209450d092009410636023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d36022041031022220d450d0a200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410f1022220e450d0b200e41076a41002900e0a244370000200e41002900d9a244370000200941c00041800110212209450d0c2009410736025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d36024041031022220d450d0d200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410f1022220e450d0e200e41076a41002900efa244370000200e41002900e8a2443700002009410836027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d36026041031022220d450d0f200d41026a41002d008cb7443a0000200d41002f008ab7443b000041081022220e450d10200e42e5f0d1fbb5ac98b6ec00370000200941800141800210212209450d112009410936029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d3602800141031022220d450d12200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410a1022220e450d13200e41086a41002f0087a3443b0000200e41002900ffa2443700002009410a3602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a00141031022220d450d14200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410a1022220e450d15200e41086a41002f0091a3443b0000200e4100290089a3443700002009410b3602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c00141031022220d450d16200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410a1022220e450d17200e41086a41002f009ba3443b0000200e4100290093a3443700002009410c3602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e00141031022220d450d18200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410b1022220e450d19200e41076a41002800a4a344360000200e410029009da344370000200941800241800410212209450d1a2009410d36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d3602800241031022220d450d1b200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410d1022220e450d1c200e41056a41002900ada344370000200e41002900a8a3443700002009410e3602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a00241031022220d450d1d200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410c1022220e450d1e200e41086a41002800bda344360000200e41002900b5a3443700002009410f3602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c00241031022220d450d1f200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410b1022220e450d20200e41076a41002800c8a344360000200e41002900c1a344370000200941103602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e00241031022220e450d21200e41026a41002d008cb7443a0000200e41002f008ab7443b000041151022220d450d22200d410d6a41002900d9a344370000200d41086a41002900d4a344370000200d41002900cca3443700002009411136029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e3602800341031022220d450d23200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410f1022220e450d24200e41076a41002900e8a344370000200e41002900e1a344370000200941123602bc03200941003602b8032009428f808080f0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a00341031022220d450d25200d41026a41002d008cb7443a0000200d41002f008ab7443b000041071022220e450d26200e41036a41002800f3a344360000200e41002800f0a344360000200941133602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c00341031022220e450d27200e41026a41002d008cb7443a0000200e41002f008ab7443b000041111022220d450d28200d41106a41002d0087a4443a0000200d41086a41002900ffa344370000200d41002900f7a344370000200941143602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e00341031022220d450d29200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410e1022220e450d2a200e41066a410029008ea444370000200e4100290088a44437000020094180044180081021220c450d2b200c411536029c04200c410036029804200c428e808080e00137029004200c200e36028c04200c42838080803037028404200c200d36028004410310222209450d2c200941026a41002d008cb7443a0000200941002f008ab7443b0000410e1022220d450d2d200d41066a410029009ca444370000200d4100290096a444370000200c41163602bc04200c41003602b804200c428e808080e0013702b004200c200d3602ac04200c4283808080303702a404200c20093602a004410310222209450d2e200941026a41002d008cb7443a0000200941002f008ab7443b000041101022220d450d2f200d41086a41002900aca444370000200d41002900a4a444370000200c41173602dc04200c41003602d804200c429080808080023702d004200c200d3602cc04200c4283808080303702c404200c20093602c004410310222209450d30200941026a41002d008cb7443a0000200941002f008ab7443b000041101022220d450d31200d41086a41002900bca444370000200d41002900b4a444370000200c41183602fc04200c41003602f804200c429080808080023702f004200c200d3602ec04200c4283808080303702e404200c20093602e00441031022220d450d32200d41026a41002d008cb7443a0000200d41002f008ab7443b0000411110222209450d33200941106a41002d00d4a4443a0000200941086a41002900cca444370000200941002900c4a444370000200c411936029c05200c410036029805200c4291808080900237029005200c200936028c05200c42838080803037028405200c200d3602800541031022220d450d34200d41026a41002d008cb7443a0000200d41002f008ab7443b0000411610222209450d352009410e6a41002900e3a444370000200941086a41002900dda444370000200941002900d5a444370000200c411a3602bc05200c41003602b805200c4296808080e0023702b005200c20093602ac05200c4283808080303702a405200c200d3602a00541031022220d450d36200d41026a41002d008cb7443a0000200d41002f008ab7443b0000411210222209450d37200941106a41002f00fba4443b0000200941086a41002900f3a444370000200941002900eba444370000200c411b3602dc05200c41003602d805200c4292808080a0023702d005200c20093602cc05200c4283808080303702c405200c200d3602c005410310222209450d38200941026a41002d008cb7443a0000200941002f008ab7443b0000410b1022220d450d39200d41076a4100280084a544360000200d41002900fda444370000200c411c3602fc05200c41003602f805200c428b808080b0013702f005200c200d3602ec05200c4283808080303702e405200c20093602e005200841086a41086a2005360200200841086a41206a4100360200200841086a41146a200641086a2802003602002008200436020c2008200336020820084100360238200820073602342008200a36023020084201370320200820062902003702142008200128020036022c200241146a28020021072002411c6a280200210f200841003602602008420137035820084118360248200841c8006a200841d8006a103e4100210402400240024002400240024002400340200c20046a220d28020021012008200d41086a2802002209360248200841c8006a200841d8006a103e0240024002400240200828025c2206200841d8006a41086a220e280200220a6b20094f0d00200a20096a2203200a490d0520064101742205200320032005491b22034100480d052006450d01200828025820062003102122060d020c060b200828025821060c020b200310222206450d040b2008200336025c200820063602580b200e200a20096a3602002006200a6a200120091084041a200d410c6a28020021052008200d41146a2802002201360248200841c8006a200841d8006a103e0240024002400240200828025c220a200e28020022036b20014f0d00200320016a22092003490d05200a4101742206200920092006491b22064100480d05200a450d012008280258200a2006102122090d020c070b200828025821090c020b200610222209450d050b2008200636025c200820093602582006210a0b200e200320016a2206360200200920036a200520011084041a0240024002400240024002400240024002400240024002400240024002400240200d41186a2802004101470d00200a2006470d01200a41016a2201200a490d11200a4101742203200120012003491b22014100480d11200a450d032009200a2001102122090d040c140b200a2006470d01200a41016a2201200a490d10200a4101742203200120012003491b22014100480d10200a450d052009200a2001102122090d060c140b200a21010c030b200a21010c050b200110222209450d100b2008200136025c200820093602580b200e200641016a220a360200200920066a41023a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0b20014101742205200320032005491b22034100480d0b2001450d03200920012003102122090d040c100b200110222209450d0e0b2008200136025c200820093602580b200e200641016a220a360200200920066a41013a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0820014101742205200320032005491b22034100480d082001450d03200920012003102122090d040c0e0b200310222209450d0c0b2008200336025c200820093602580b200e200641056a3602002009200a6a200d360000200441206a2204418006470d040c030b200310222209450d0a0b2008200336025c200820093602580b200e200641056a3602002009200a6a200d360000200441206a2204418006470d010b0b200828025c210902400240411d2007200f20082802582206200841e0006a280200200841086a1006220d417d460d00200d417f470d014100210a2009450d470c460b4102210a20090d450c460b41041022220e450d41200b280200220a28020041016a22014102490d07200a2001360200200e200a36020002402009450d00200610200b200841d0006a4281808080103703002008200e36024c2008200d36024820022802002106200228020421012008410036026020084201370358200841003602980120084198016a200841d8006a103e20082802602103200828025c21042008280258210a410a10762209450d4241012105024002400240200d20062001200a20032009410a200841086a10072206417d460d0020060d462008410936029c012008200941016a36029801024020092d00002206450d00024020064101470d00200841d8006a20084198016a10772008280258417e714104470d010b200910202004450d02200a10200c020b410021050b2009102002402004450d00200a10200b410321092005450d010b410221090b200841d8006a41386a200841086a41386a280200360200200841d8006a41306a200841086a41306a290300370300200841d8006a41286a200841086a41286a290300370300200841d8006a41206a200841086a41206a290300370300200841d8006a41186a200841086a41186a290300370300200841d8006a41106a200841086a41106a290300370300200841d8006a41086a200841086a41086a290300370300200820082903083703582000200841d8006a20091078200d1008200e28020022092009280200417f6a3602000240200e28020022092802000d0020092802081005200e28020022092009280204417f6a360204200e28020022092802040d00200910200b200e102041012106410021010c460b1024000b200341011023000b200641011023000b200141011023000b200141011023000b200341011023000b200341011023000b00000b1079000b410c41041023000b410441041023000b410341011023000b410641011023000b412041041023000b410341011023000b410341011023000b41c00041041023000b410341011023000b410f41011023000b41800141041023000b410341011023000b410f41011023000b410341011023000b410841011023000b41800241041023000b410341011023000b410a41011023000b410341011023000b410a41011023000b410341011023000b410a41011023000b410341011023000b410b41011023000b41800441041023000b410341011023000b410d41011023000b410341011023000b410c41011023000b410341011023000b410b41011023000b410341011023000b411541011023000b410341011023000b410f41011023000b410341011023000b410741011023000b410341011023000b411141011023000b410341011023000b410e41011023000b41800841041023000b410341011023000b410e41011023000b410341011023000b411041011023000b410341011023000b411041011023000b410341011023000b411141011023000b410341011023000b411641011023000b410341011023000b411241011023000b410341011023000b410b41011023000b410441041023000b410a41011023000b4184f1c000102f000b200610200b0240200a450d00200841d8006a41386a200841086a41386a280200360200200841d8006a41306a200841086a41306a290300370300200841d8006a41286a200841086a41286a290300370300200841d8006a41206a200841086a41206a290300370300200841d8006a41186a200841086a41186a290300370300200841d8006a41106a200841086a41106a290300370300200841d8006a41086a200841086a41086a290300370300200820082903083703582000200841d8006a200a107841002106410121010c010b200041c28ac00036020420004102360200200041086a41103602000240200841146a2802002209450d00200841086a41106a280200450d00200910200b0240200841246a280200450d00200841206a28020010200b200841306a2209280200220a200a280200417f6a36020002402009280200220a2802000d00200a28020810052009280200220a200a280204417f6a360204200928020022092802040d00200910200b0240200841386a2802002209450d002008413c6a280200450d00200910200b4100210a03400240200c200a6a220941046a280200450d00200928020010200b0240200941106a280200450d002009410c6a28020010200b200a41206a220a418006470d000b200c1020200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081005200b28020022092009280204417f6a360204200b28020022092802040d00200910200b200b1020200841a0016a24000f0b4100210a03400240200c200a6a220941046a280200450d00200928020010200b0240200941106a280200450d002009410c6a28020010200b200a41206a220a418006470d000b200c1020200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081005200b28020022092009280204417f6a360204200b28020022092802040d00200910200b200b102041002109024020014100472006720d00200d100802400340200e20096a220a280200220d200d280200417f6a36020002400240200a280200220d2802000d00200d2802081005200a280200220d200d280204417f6a360204200a280200220a280204450d010b200941046a22094104470d010c020b200a1020200941046a22094104470d000b0b200e10200b200841a0016a24000b5201027e02402003450d0020022802000d00200128022c220342002003290308220420023502047d220520052004562005507222021b37030820004105410420021b3602000f0b4192c9c00041f4031039000bb80e03047f037e047f230041900d6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042103200241146a2802002105200241246a2802002106200241346a2802002107200441106a2001280224290330420042204200108804200441386a4200370300200441306a4200370300200441286a4200370300200128022c2202420020022903082208427f200429031020042903184200521b7d220920092008562009507222021b370308200442003703200240024020020d0020012802282802082003200441206a412010102202417e460d0020020d06024002400240024002402005450d002004200141246a28020029033042002007ad220a42001088042001412c6a2802002202420020022903082208427f200429030020042903084200521b7d220920092008562009507222021b37030820020d052007450d0120074100480d0e20071022220b450d0f41012102200b2103024020074102490d00200b41002007417f6a220210830420026a2103200721020b200341003a00000c020b4100210b0c020b410021024101210b4200210a0b200141286a2802002802082006200b200210102203417e460d0120030d0a200b450d02200a2002ad4220868421090b20012802002102200441c0006a41186a2201200441206a41186a290300370300200441c0006a41106a2207200441206a41106a290300370300200441c0006a41086a2205200441206a41086a2903003703002004200429032037034020022802182103200441e0006a41186a2001290300370300200441e0006a41106a2007290300370300200441e0006a41086a200529030037030020042004290340370360200328020c0d082003410c6a417f360200200441d80c6a41186a200341e4006a290000370300200441d80c6a41106a200341dc006a290000370300200441d80c6a41086a200341d4006a2900003703002004200329004c3703d80c02400240200341106a220c28020022014180e5c200460d00200341146a280200210d0c010b41880b10222201450d0d4100210d200141003b010620014100360200200141086a200441d8016a41800b1084041a200341146a4100360200200341106a20013602000b0240024002400240034020012f0106220e410574210641002102417f2107024002400240034020062002460d01200741016a2107417f4101200441d80c6a200120026a41086a412010860422054100481b410020051b2205450d05200241206a210220054101460d000b200d0d010c020b200e2107200d450d010b200d417f6a210d200120074102746a41880b6a28020021010c010b0b20044180016a41186a200441d80c6a41186a29030037030020044180016a41106a200441d80c6a41106a29030037030020044180016a41086a200441d80c6a41086a290300370300200420042903d80c37038001200341186a21024100210d41000d010c020b200341186a21024101450d010b200441f0016a4200370300200441ec016a4180e5c200360200200441003602f801200441003602e801200442003703e00120044180e5c2003602dc01200441003602d8012001200741e0006c6a41e8026a2102200441d8016a10420c010b200441f40c6a20044180016a41086a290300370200200441fc0c6a20044180016a41106a290300370200200441840d6a20044180016a41186a290300370200200420023602e80c200420073602e40c2004200c3602e00c200420013602dc0c2004200d3602d80c20042004290380013702ec0c2004418c026a4200370200200441f8016a20042903c80137030020044180026a200441c8016a41086a29030037030020044195026a20042900a0013700002004419d026a200441a0016a41086a290000370000200441a5026a200441a0016a41106a290000370000200441ad026a200441a0016a41186a290000370000200441b4026a200441bf016a280000360000200442003703f001200442003703d80120044180e5c20036028802200441003a009402200441d80c6a200441d8016a104121020b200441d8016a41186a200441e0006a41186a290300370300200441d8016a41106a200441e0006a41106a290300370300200441d8016a41086a200441e0006a41086a290300370300200420042903603703d801200420093702a4012004200b3602a001200441d80c6a200241306a200441d8016a200441a0016a1044024020042802d80c450d0020042802dc0c2202450d00200441e00c6a280200450d00200210200b2003410c6a2202200228020041016a360200410421020c020b200a500d00200b10200b410521020b20002002360200200441900d6a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b10d701000b418ccbc400102f000b1024000b200741011023000b41880b41081023000bb10302017f027e230041e0006b22042400024002402003450d0020022802000d002002280204210320042001280224290330420042204200108804200441286a4200370300200441206a4200370300200441186a4200370300200128022c2202420020022903082205427f200429030020042903084200521b7d220620062005562006507222021b3703082004420037031002400240024020020d0020012802282802082003200441106a412010102202417e460d0020020d04200441306a20012802002802182202410c6a200241cc006a2002410020022802001b200441106a10d2012004280230450d01200441c0006a41086a200441306a41086a220228020036020020042004290330370340200441d0006a41086a2203200228020036020020042004290330370350200141186a210202402001411c6a280200450d00200228020010200b20022004290350370200200241086a2003280200360200410021010c020b20004105360200200441e0006a24000f0b200141206a4100360200410121010b2000410036020020002001360204200441e0006a24000f0b4192c9c00041f4031039000b418ccbc400102f000ba90d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a20012802242903304200200241146a2802002202ad4200108804200128022c220342002003290308220b427f200429032020042903284200521b7d220c200c200b56200c507222031b37030820030d0e024002402002450d0020024100480d0a200210222203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e108304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e10102205417e460d0020050d0a2003450d1120044180016a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1083041a20044180016a200320051084041a200d0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d00200310200b200441106a200141246a28020029033042002008ad42001088042001412c6a280200220242002002290308220b427f200429031020042903184200521b7d220c200c200b56200c507222021b37030820020d112008450d0120084100480d0b200810222202450d0e2002210541002103024020084102490d00200241002008417f6a220310830420036a21050b200541003a0000200341016a21030c020b2002450d10200310200c100b4100210841012102410021030b024002400240200141286a28020028020820072002200310102205417e460d0020050d0d2002450d112004420037038801200442003703800120044180016a20022003411020034110491b1084041a2003410f4d0d0020044188016a290300210f200429038001211002402008450d00200210200b2004200141246a2802002903304200200aad42001088042001412c6a280200220242002002290308220b427f200429030020042903084200521b7d220c200c200b56200c507222021b37030820020d11200a450d01200a4100480d0b200a10222202450d1041012103200221050240200a4102490d0020024100200a417f6a220310830420036a2105200a21030b200541003a00000c020b2008450d10200210200c100b4100210a41012102410021030b02400240024002400240200141286a28020028020820092002200310102205417e460d0020050d112002450d13200141206a41003602002001411c6a280200210e20012802182108200142013702182001412c6a2802002205290308220b210c2006500d012006210c200b20065a0d0141012103200e450d0220081020200a0d030c040b200a450d12200210200c120b2005200b200c7d3703082005290310210b200441d0006a41186a200541186a2903003703002004200c3703582004200c3703502004200b3703602001280200280218210720044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a8012004200e3602a401200420083602a001200441f0006a200720044180016a2010200f200441d0006a20022003200441a0016a108802200441f0006a41086a290300210c2004280274210e200428027021082005200429035820052903087c3703084101210320084101460d00200e450d0002402001411c6a2203280200450d00200141186a28020010200b2003200c370200200141186a200e360200410021030b200a450d010b200210200b2000410036020020002003360204200441b0016a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b1024000b200241011023000b418ccbc400102f000b200841011023000b418ccbc400102f000b200a41011023000b20004105360200200441b0016a24000b971006027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a20012802242903304200200241146a2802002202ad4200108804200128022c220342002003290308220b427f200429032820042903304200521b7d220c200c200b56200c507222031b37030820030d13024002402002450d0020024100480d0a200210222203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e108304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e10102205417e460d0020050d0a2003450d16200441f8006a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1083041a200441f8006a200320051084041a200d0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d00200310200b200441186a200141246a28020029033042002008ad42001088042001412c6a280200220242002002290308220b427f200429031820042903204200521b7d220c200c200b56200c507222021b37030820020d162008450d0120084100480d0b200810222202450d0e2002210541002103024020084102490d00200241002008417f6a220310830420036a21050b200541003a0000200341016a21030c020b2002450d15200310200c150b4100210841012102410021030b024002400240200141286a28020028020820072002200310102205417e460d0020050d0d2002450d16200442003703c001200442003703b801200441b8016a20022003411020034110491b1084041a2003410f4d0d00200441c0016a290300210f20042903b801211002402008450d00200210200b200441086a200141246a2802002903304200200aad42001088042001412c6a280200220242002002290308220b427f200429030820042903104200521b7d220c200c200b56200c507222021b37030820020d16200a450d01200a4100480d0b200a10222202450d1041012103200221050240200a4102490d0020024100200a417f6a220310830420036a2105200a21030b200541003a00000c020b2008450d15200210200c150b4100210a41012102410021030b02400240200141286a28020028020820092002200310102205417e460d0020050d0e2002450d15200141206a41003602002001412c6a2802002205290308220b210c02402006500d004101210e2006210c200b2006540d130b2005200b200c7d3703082005290310210b20044198016a41186a200541186a2903003703002004200c3703a0012004200c370398012004200b3703a801200441b8016a20012802002802182010200f20044198016a200441386a200220031086024101210e20042d00b8014101470d01200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200541086a220320044198016a41086a29030020032903007c37030020042004290378370358200a0d130c140b200a450d14200210200c140b200441f8006a41186a2203200441d1016a290000370300200441f8006a41106a220e200441c9016a290000370300200441f8006a41086a2208200441c1016a290000370300200420042900b901370378200441d8006a41086a22072008290300370300200441d8006a41106a2208200e290300370300200441d8006a41186a220e2003290300370300200541086a220320044198016a41086a29030020032903007c37030020042004290378370358200441b8016a41186a200e290300370300200441b8016a41106a2008290300370300200441b8016a41086a2007290300370300200420042903583703b8010240024002402001411c6a2802002205200141206a28020022036b41204f0d00200341206a220e2003490d0b20054101742203200e200e2003491b22034100480d0b2005450d01200141186a2802002005200310212205450d020c110b200141186a28020021050c110b2003102222050d0f0b200341011023000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b1024000b200241011023000b418ccbc400102f000b200841011023000b418ccbc400102f000b200a41011023000b2001411c6a2003360200200141186a2005360200200141206a28020021030b200141206a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210e0b200a450d010b200210200b200041003602002000200e360204200441e0016a24000f0b20004105360200200441e0016a24000bd30403027f027e057f230041106b22042400024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903184200200241146a2802002202ad4200108804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b37030820030d09200128020c21032001410036020c2003450d02200141106a29020022074280808080105a0d03024002400240024020022007422088a722084d0d002007a7220920086b200220086b220a4f0d012008200a6a220b2008490d082009410174220c200b200b200c491b220b4100480d082009450d0220032009200b10212203450d030c090b2002200820022008491b21020c0b0b2003200822096a210b200a4102490d090c080b200b102222030d060b200b41011023000b4192c9c00041f4031039000b4192c9c00041f4031039000b4186cdc00041fd001039000b4198a1c300102f000b1024000b20074220882106200bad210720032006a722096a210b200a4102490d010b200b410020022008417f7322086a1083041a2003200920026a20086a22096a210b0b200b41003a0000200941016a21020b0240200128022828020820052003200210102208417e460d0020080d022007a72108024020012802302205450d00200141346a280200450d00200510200b200141386a2002360200200141346a2008360200200141306a20033602000c010b2007a7450d00200310200b20004105360200200441106a24000f0b418ccbc400102f000b900101027f200128020021040240412010222205450d002005200429001c370000200541186a200441346a290000370000200541106a2004412c6a290000370000200541086a200441246a29000037000002402001411c6a2204280200450d00200141186a28020010200b20004104360200200442a08080808004370200200141186a20053602000f0b412041011023000b960101027f200128020028021821040240412010222205450d002005200429004c370000200541186a200441e4006a290000370000200541106a200441dc006a290000370000200541086a200441d4006a29000037000002402001411c6a2204280200450d00200141186a28020010200b20004104360200200442a08080808004370200200141186a20053602000f0b412041011023000b7703017f027e017f200128022c220441186a2903002105200429031021060240411010222204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010200b20004104360200200742908080808002370200200141186a20043602000f0b411041011023000b6202017e027f200128022c29030821040240410810222205450d002005200437000002402001411c6a2206280200450d00200141186a28020010200b20004104360200200642888080808001370200200141186a20053602000f0b410841011023000bc103020b7f027e230041106b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120108604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d002006280200450d00200641106a290300210f200641086a29030021100c010b20042005411c6a2802002007200541206a28020028021c110100200441086a290300210f200528020c2108200429030021100b2005410c6a2008417f6a360200411010222206450d01200620103700002006200f37000802402001411c6a220d280200450d00200141186a28020010200b20004104360200200d42908080808002370200200141186a2006360200200441106a24000f0b10d101000b411041011023000b7703017f027e017f2001280200220441086a2903002105200429030021060240411010222204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010200b20004104360200200742908080808002370200200141186a20043602000f0b411041011023000b930101027f200128020021040240412010222205450d002005200429003c370000200541186a200441d4006a290000370000200541106a200441cc006a290000370000200541086a200441c4006a29000037000002402001411c6a2204280200450d00200141186a28020010200b20004104360200200442a08080808004370200200141186a20053602000f0b412041011023000b6202017e027f200128020029031021040240410810222205450d002005200437000002402001411c6a2206280200450d00200141186a28020010200b20004104360200200642888080808001370200200141186a20053602000f0b410841011023000bd80a04027f027e027f047e23004180036b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802242903304200200241146a2802002202ad4200108804200128022c2203420020032903082206427f200429032820042903304200521b7d220720072006562007507222031b37030820030d0a024002402002450d0020024100480d05200210222203450d062003210841002109024020024102490d00200341002002417f6a220910830420096a21080b200841003a0000200941016a21090c010b4100210241012103410021090b02400240200128022828020820052003200910102205417e460d0020050d042003450d0c2004200936029c01200420033602980120044180026a20044198016a10b9012004280280022205410f470d010b2002450d0b200310200c0b0b200441a0016a20044180026a41047241dc001084041a20042005360238200441386a410472200441a0016a41dc001084041a02402002450d00200310200b20044100360288022004420137038002200441386a20044180026a10950120042802880221030240200428028402450d0020042802800210200b4200210720044180026a41086a22024200370300200442003703800241afe4c200411b20044180026a1002200441a0016a41086a2205200229030037030020042004290380023703a00102400240200441a0016a411041c8d7c400410041001001417f460d0020044200370388022004420037038002200441a0016a411020044180026a4110410010012209417f460d072009410f4d0d0720044188026a2903002106200429038002210a0c010b4200210a420021060b20024200370300200442003703800241cae4c200411b20044180026a10022005200229030037030020042004290380023703a00102400240200441a0016a411041c8d7c400410041001001417f460d0020044200370388022004420037038002200441a0016a411020044180026a4110410010012202417f460d082002410f4d0d0820044188026a290300210b20042903800221070c010b4200210b0b2001412c6a2802002202290310220c200241186a290300220d844200510d07200441186a2007200b2003ad4200108804200441086a20042903182207200a7c220a200441186a41086a29030020067c200a200754ad7c200c200d108704200242002002290308220620042903087d220720072006562007507222031b37030802402003450d00200441386a1092010c0b0b20012802002102200441a0016a200441386a41e0001084041a20044198026a2002280218220241e4006a29000037030020044190026a200241dc006a29000037030020044180026a41086a200241d4006a2900003703002004200229004c37038002200441a0026a200441a0016a41e0001084041a2002413c6a22032802002201200241386a280200470d09200141016a22052001490d0320014101742209200520052009491b2205ad4207862207422088a70d032007a722094100480d03024002402001450d00200241346a2802002001410774200910212201450d010c0a0b2009102222010d090b200941081023000b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b1024000b200241011023000b419a88c00041331039000b419a88c00041331039000b418caec200102f000b200241386a2005360200200241346a20013602002002413c6a28020021010b200241346a28020020014107746a20044180026a4180011084041a2003200328020041016a360200410421020c010b410521020b2000200236020020044180036a24000b1600200041003602002000200141086a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141086a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128022429033842002005ad4200108804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510112202417e460d0020020d04410421030b20002003360200200441106a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b419cccc400102f000b1600200041003602002000200141206a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141206a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021821082004200128022429033842002005ad4200108804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510112202417e460d0020020d04410421030b20002003360200200441106a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b419cccc400102f000ba60703037f037e057f230041f0006b220424000240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441106a200128022422032903204200200241146a2802002206ad22074200108804200128022c2102427f2108024020042903184200520d00427f2004290310220820032903287c220920092008541b21080b200242002002290308220920087d220820082009562008507222031b37030841052102024020030d002004200141246a2802002903304200200742001088042001412c6a2802002203420020032903082209427f200429030020042903084200521b7d220820082009562008507222031b37030820030d00024002402006450d0020064100480d05200610222203450d074101210a2003210b024020064102490d00200341002006417f6a220a108304200a6a210b2006210a0b200b41003a00000c010b4100210a41012103420021070b0240024002400240200128022828020820052003200a10102206417e460d0020060d082003450d04200441d0006a41186a22052001280200280218220241e4006a290000370300200441d0006a41106a220b200241dc006a290000370300200441d0006a41086a220c200241d4006a2900003703002004200229004c370350200241306a220628020022012002412c6a280200470d03200141016a220d2001490d072001410174220e200d200d200e491b220dad42d8007e2208422088a70d072008a7220e4100480d072001450d01200241286a280200200141d8006c200e102122010d020c0a0b2007500d03200310200c030b200e10222201450d080b2002412c6a200d360200200241286a2001360200200241306a28020021010b200241286a280200200141d8006c6a22022004290350370001200241053a0000200220042f004d3b002120022007200aad422086843700282002200336002420022004290320370330200241096a200c290300370000200241116a200b290300370000200241196a2005290300370000200241236a200441cf006a2d00003a0000200241d0006a200441c0006a290300370300200241c8006a200441206a41186a290300370300200241c0006a200441206a41106a290300370300200241386a200441206a41086a2903003703002006200628020041016a360200410421020b20002002360200200441f0006a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b1024000b418ccbc400102f000b200641011023000b200e41081023000bb60a03027f027e057f230041a00c6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903304200200241146a2802002202ad4200108804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b3703084105210820030d09024002402002450d0020024100480d05200210222203450d06410121092003210a024020024102490d00200341002002417f6a220910830420096a210a200221090b200a41003a00000c010b4100210241012103410021090b024002400240200128022828020820052003200910102205417e460d0020050d052003450d0c200442003703a801200442003703a001200441a0016a20032009411020094110491b1084041a2009410f4d0d00200441a8016a290300210720042903a001210602402002450d00200310200b2001280200280218220328020c0d082003410c6a417f36020020044180016a200341e4006a290000370300200441e8006a41106a200341dc006a290000370300200441f0006a200341d4006a2900003703002004200329004c370368200341106a220b28020022014180e5c200460d01200341146a280200210a0c020b2002450d0b200310200c0b0b41880b10222201450d074100210a200141003b010620014100360200200141086a200441a0016a41800b1084041a200341146a4100360200200341106a20013602000b02400240034020012f0106220c410574210541002102417f2108024002400240034020052002460d01200841016a2108417f4101200441e8006a200120026a41086a412010860422094100481b410020091b2209450d05200241206a210220094101460d000b200a0d010c020b200c2108200a450d010b200a417f6a210a200120084102746a41880b6a28020021010c010b0b200441106a41186a200441e8006a41186a290300370300200441106a41106a200441e8006a41106a290300370300200441106a41086a200441e8006a41086a29030037030020042004290368370310200341186a21024100210a41000d010c090b200341186a21024101450d080b200441b8016a4200370300200441b4016a4180e5c200360200200441003602c001200441003602b001200442003703a80120044180e5c2003602a401200441003602a0012001200841e0006c6a41e8026a2102200441a0016a10420c080b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b1024000b200241011023000b10d701000b41880b41081023000b20044184016a200441106a41086a2903003702002004418c016a200441106a41106a29030037020020044194016a200441106a41186a29030037020020042002360278200420083602742004200b3602702004200136026c2004200a3602682004200429031037027c200441d4016a4200370200200441c0016a2004290358370300200441c8016a200441d8006a41086a290300370300200441dd016a2004290035370000200441e5016a200441356a41086a290000370000200441ed016a200441356a41106a290000370000200441f5016a200441356a41186a290000370000200441fc016a200441d4006a280000360000200442003703b801200442003703a00120044180e5c2003602d001200441003a00dc01200441e8006a200441a0016a104121020b200241286a2007370300200241206a2006370300200242013703182003410c6a2202200228020041016a360200410421080b20002008360200200441a00c6a24000bda03020b7f027e230041206b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120108604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d00200641186a280200220d450d00200641286a290300210f200641206a29030021100c010b200441086a2005411c6a2802002007200541206a280200280214110100200441186a290300210f200528020c2108200429031021102004280208210d0b2005410c6a2008417f6a360200411010222206450d0120062010427f200d1b3700002006200f427f200d1b37000802402001411c6a220d280200450d00200141186a28020010200b20004104360200200d42908080808002370200200141186a2006360200200441206a24000f0b10d101000b411041011023000bfe0203027f027e037f230041206b22042400024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903304200200241146a2802002202ad4200108804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222081b37030841052103024020080d00024002402002450d0020024100480d06200210222208450d07410121092008210a024020024102490d00200841002002417f6a220910830420096a210a200221090b200a41003a00000c010b4100210241012108410021090b0240200128022828020820052008200910102201417e460d0020010d042008450d01200441106a200820091052024020042802100d002004280214200441186a280200100f0b410421030b2002450d00200810200b20002003360200200441206a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b1024000b200241011023000b870603027f017e087f230041c0006b220424002004200136020c2004200041c8d7c40020011b3602082004200441086a10bc0102400240024002400240024002402004280200450d000240024002400240024020042802042205ad2206421c88a70d002006420486a72201417f4c0d00024002402001450d00200110222207450d032005450d010c040b4108210720050d030b410021014100210b2007450d050c030b1031000b200141081023000b200441206a4104722108410021094100210a410021002005210b0340200441206a200441086a1077200441306a41086a220c200841086a280200360200200420082902003703302004280220220d4104460d02200041016a2101200441106a41086a220e200c2802003602002004200429033037031002402000200b470d002009200120012009491b220bad4204862206422088a70d052006a7220c4100480d0502402000450d002007200a200c102122070d010c070b200c10222207450d060b2007200a6a2200200d3602002000410c6a200e280200360200200041046a2004290310370200200941026a2109200a41106a210a2001210020012005490d000b2007450d020b200441206a20022007200120031102002004410036023820044201370330200428022021004101102221010240024020004105470d002001450d06200141013a0000200442818080801037023420042001360230420121060c010b2001450d06200141003a000020044281808080103702342004200136023020014101410210212101024020004104470d002001450d08200141003a0001200442828080802037023420042001360230420221060c010b2001450d08200141013a0001200442828080802037023420042001360230200441206a200441306a109f02200441386a3502002106200428023021010b2001ad42208620068421060240200b450d00200710200b200441c0006a240020060f0b200b450d00200710200b4191f0c00041f0001039000b1024000b200c41081023000b410141011023000b410141011023000b410241011023000b410241011023000b0700200010eb030bcb0401057f230041106b22022400200241003a0008200241086a200128020022032001280204220441004722051084041a024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002402004450d0020022d0008417f6a220441034b0d04024020040e0400030204000b20024100360208200241086a20052006410420064104491b22041084041a200141046a200620046b3602002001200520046a360200200641034d0d052000200228020836020420004100360200200241106a24000f0b20004104360200200241106a24000f0b20024100360208200241086a20052006410420064104491b22041084041a200141046a200620046b3602002001200520046a360200200641034d0d042000200228020836020420004102360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041084041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004101360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041084041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004103360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20052004102d000bb10201027f200128023021030240024002400240200241ff017122024103470d0020030d0320004100360200200128020c22000d010c020b200141346a2802002104024020024102470d002003450d00200141386a2802002102200041013602002000410c6a2002360200200041086a2004360200200041046a2003360200200128020c22000d010c020b20004102360200200041086a4110360200200041046a41b7c7c00036020002402003450d002004450d00200310200b200128020c2200450d010b200141106a280200450d00200010200b02402001411c6a280200450d00200128021810200b200128022822012001280200417f6a22003602000240024020000d002001280208100520012001280204417f6a22003602042000450d010b0f0b200110200f0b41c8c7c000102f000b0a0041d48ac000102f000b130020004102360204200041f8cdc4003602000b130020004100360204200041c8d7c4003602000b130020004109360204200041f8a1c0003602000b130020004101360204200041dca0c0003602000b130020004107360204200041bc99c0003602000b130020004101360204200041d480c0003602000b130020004103360204200041c8e5c0003602000b13002000410136020420004190abc2003602000b13002000410336020420004184cbc3003602000b130020004109360204200041b0e9c0003602000b130020004104360204200041e4c5c1003602000b130020004102360204200041bca8c2003602000b130020004105360204200041eca9c0003602000b1300200041013602042000418c92c2003602000b130020004105360204200041cca2c3003602000b130020004106360204200041d4dbc2003602000b130020004102360204200041acb1c2003602000bb2860107067f037e017f027e057f037e057f230041b0096b22022400200241003a00d00820012802002001280204200241d0086a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00d0082203410e4b0d07024020030e0f000b0709040c0e0a10060f03050d02000b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450db60120022d00d008450d110cb6010b2000410f360200200241b0096a24000f0b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d1220022d00d00822034101460d1120030d12200241d0086a2001108b0120022802d0082103200241f0076a200241d0086a41047241dc001084041a2003410f460d1220024190076a200241f0076a41dc001084041a41e00010222201450d990120012003360200200141046a20024190076a41dc001084041a200141087621044101210341002105410021060c1e0b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450db20120022d00d008450d0d0cb2010b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d1a20022d00d00822034102460d1820034101460d1720030d1a200241d0086a41186a22054200370300200241d0086a41106a22064200370300200241d0086a41086a22074200370300200242003703d008200141086a220341002001280200200141046a280200200241d0086a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d1a200241f0076a41186a2005290300370300200241f0076a41106a2006290300370300200241f0076a41086a2007290300370300200220022903d0083703f00720022900f7072208422088a72103200241ff076a290000210920022d008f082101200229008708210a20022800f307210420022f00f107210520022d00f00721062008a721074101210b0c190b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d2320022d00d008220341044b0d23024020030e0500211e1f1d000b200241e0046a2001108c0120022903e004a7450d23200241f0046a290300210920022903e804210a200241d0086a2001108d0120022d00d00822034102460d23200241f0086a2802002101200241ec086a3502002108200241dc086a290200210c20022f00d108210420022d00d308210520022902d408210d2002200241e4086a290200370380082002200c3703f8072002200d3703f00720042005411074722104410121050c220b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d1120022d00d00822034101460d0f20030d11200241b8046a2001108e0120022802b804450d1120022802bc042104200241d0086a2001108b0120022802d0082101200241f0076a200241d0086a41047241dc001084041a2001410f460d1120024190076a200241f0076a41dc001084041a41e00010222203450d990120032001360200200341046a20024190076a41dc001084041a410121014100210642002109410021054100210e0c100b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22012001280200200341016a41014b6a3602002000410f360200200241b0096a24000f0b2000410f360200200241b0096a24000f0b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d1120022d00d00822034101460d0f20030d11200241d0086a2001108d0120022d00d00822044102460d1120022d00d308210620022f00d1082107200241f0086a2802002105200241ec086a2802002103200241e4086a2902002109200241dc086a290200210a20022902d4082108200241d0006a2001108c012002290350a7450d1120072006411074722101200241d0006a41106a290300210c2002290358210d20034110762106200341087621074101210b0c100b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6120022d00d008220341094b0d61024020030e0a0036333431393a353c32000b200241d0086a2001108f0120022802d0082203450d6120022902d408210920024198036a2001108e012009a72104200228029803450d60200228029c0321012004410876210f2003410876210e20094220882109410121100c360b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d840120022d00d008220541064b0d840141022106024020050e0700aa012c2d2b2e2f000b200241106a2001108e012002280210450d840120022802142204417f4c0d8a012004450d67200410762203450d9601200141086a2205200441002001280200200141046a280200200320042005280200100122012001417f461b2201200120044b1b220120052802006a36020020012004470d680ca8010b200241003a00d008410421052001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22063602002003450d7e20022d00d008220f410e4b0d7e0240200f0e0f0051527b4e5558535c505a4d4f564c000b200241d0086a2001108d0120022d00d00822044102460d7e20022d00d308210520022f00d1082106200241ee086a2f0100210f200241ed086a2d0000210e200241ec086a2d00002110200241e4086a290200210d200241dc086a290200210920022902d408210a200241f0086a2802002107200241a8016a2001108c0120022903a801a7450d7e200241a8016a41106a290300210c20022903b0012108200241003a00d0082001280200200141046a280200200241d0086a4101200141086a22012802001001210320012001280200200341016a41014b22036a3602002003450d7e20022d00d008220b41024b0d7e20062005411074722103200220093703f8072002200a3703f007200f411074200e4108747220107221112002200d37038008200d422088a72110200da7210e410121050c7a0b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d870120022d00d008220341044b0d8701024020030e0500241f211d000b200241d0086a2001109001200241f0076a41086a2204200241f8086a290300370300200241f0076a41106a220620024180096a290300370300200241f0076a41186a220720024188096a290300370300200220022903f0083703f00720022d009c0922014102460d870120022802ec08210320022f01ea08210b20022d00e908210f20022d00e808210520022903e008210a20022903d808210920022903d0082108200241d0066a41086a2004290300370300200241d0066a41106a2006290300370300200241d0066a41186a2007290300370300200220022903f0073703d0062002419e096a2f0100210e200229039009210c200228029809211020022d009d092111410121120ca3010b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d5b20022d00d0082205410b4b0d5b41092106024020050e0c0041423f444543499d0140483e000b200241d0086a2001108b0120022802d0082104200241f0076a200241d0086a41047241dc001084041a2004410f460d5b20024190076a200241f0076a41dc001084041a41e00010222203450d970120032004360200200341046a20024190076a41dc001084041a200241c8026a2001108c0120022903c802a7450d5a200241d8026a290300210a20022903d0022209422088a7210b2009a7211241012106410021110c450b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450da30120022d00d008450d030ca3010b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d2420022d00d008220341044b0d24024020030e0500221d1f1b000b200241d0086a2001108b0120022802d0082101200241f0076a200241d0086a41047241dc001084041a2001410f460d2420024190076a200241f0076a41dc001084041a41e00010222203450d900120032001360200200341046a20024190076a41dc001084041a200228028c07210120022f018a07210620022d008907210f20022d0088072104200229038007210a20022903f806210820022903f0062109410121070c220b200241d8046a2001108e0120022802d804450da40120022802dc042203417f4c0d84012003450d38200310762204450d8c01200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d390ca0010b200220011091012002290300a7450da4012002290308210920004100360200200041086a2009370300200041106a200241d0086a41d0001084041a200241b0096a24000f0b200241c8046a200110910120022903c804a7450d9f0120022903d00421092000410a360200200041086a2009370300200041106a200241d0086a41d0001084041a200241b0096a24000f0b200241d0086a2001108d014102210320022d00d00822014102470d0b0b2000410f360200200241b0096a24000f0b200241d0086a41186a4200370300200241d0086a41106a4200370300200241d0086a41086a4200370300200242003703d008200141086a220541002001280200200141046a280200200241d0086a41202004100122032003417f461b2203412020034120491b20052802006a3602002003411f4d0d0120022d00d008210320022f00d108210420022800d308210520022900e708210920022d00ef08210620022900d708210a200241f0076a410f6a200241d0086a410f6a2900003700002002200a3700f70720024190076a41086a200241f0076a41086a290300370300200220063a008f08200220093700870820024190076a41186a200241f0076a41186a29030037030020024190076a41106a200241f0076a41106a290300370300200220053600f307200220043b00f107200220033a00f007200220022903f00737039007200241c0046a2001108e0120022802c004450d0120022802c4042105200241003a00d0082001280200200141046a280200200241d0086a4101200141086a22012802001001210320012001280200200341016a41014b22036a3602002003450d0120022d00d008210e2002290097072208422088a7210f2002419f076a290000210920022d00af07210620022900a707210a200228009307210420022f009107210720022d009007210b2008a72103410221010b200041003b01262000200e3a0025200020073b00062000200b3a0005200020013a000420004109360200200041286a2005360200200041246a20063a00002000411c6a200a370200200041146a2009370200200041106a200f3602002000410c6a2003360200200041086a20043602002000412c6a20022902d008370200200041346a200241d0086a41086a2902003702002000413c6a200241d0086a41106a290200370200200041c4006a200241e8086a290200370200200041cc006a200241f0086a290200370200200041d4006a200241d0086a41286a290200370200200041dc006a20024180096a280200360200200241b0096a24000f0b2000410f360200200241b0096a24000f0b200241d0086a2001108d0120022d00d00822044102460d0120022d00d308210620022f00d1082107200241f0086a2802002105200241ec086a2802002103200241e4086a2902002109200241dc086a290200210a20022902d408210820024180016a2001108c01200229038001a7450d0120024180016a41106a290300210c200229038801210d200241e8006a2001108c012002290368a7450d01200720064110747221012003411076210620034108762107200241f8006a2903002113200229037021144102210b0b200020013b000d200020063b002a200020073a0029200041033602002000410f6a20014110763a0000200041c8006a2013370200200041c0006a2014370200200041386a200c370200200041306a200d3702002000412c6a2005360000200041286a20033a0000200041206a2009370000200041186a200a370000200041106a20083700002000410c6a20043a0000200041086a200b360200200041d0006a20022903d008370300200041d8006a200241d0086a41086a290300370300200241b0096a24000f0b2000410f360200200241b0096a24000f0b20024198016a2001109101200229039801a7450d0220022903a0012209422088a721032009a721074102210b0c010b41002103200241003a00d0082001280200200141046a280200200241d0086a4101200410012104200141086a22012001280200200441016a41014b22016a3602002001450d0120022d00d00821064103210b0b200020053b000a200020063a000920004104360200200041286a20013a0000200041206a200a370200200041186a2009370200200041146a2003360200200041106a20073602002000410c6a2004360200200041086a200b3a0000200041306a20022903d008370300200041386a200241d0086a41086a290300370300200041c0006a200241d0086a41106a290300370300200041c8006a200241d0086a41186a290300370300200041d0006a200241d0086a41206a290300370300200041d8006a200241d0086a41286a290300370300200241b0096a24000f0b2000410f360200200241b0096a24000f0b20022f00d10820022d00d308411074722104200241e4086a2902002109200241f0086a2802002105200241dc086a290200210a200241ec086a280200210620022902d40821080b200020033602042000410e360200200041286a2005360200200041246a20063602002000411c6a2009370200200041146a200a3702002000410c6a20083702002000412c6a20022902d008370200200041086a2004410874200141ff017172360200200041346a200241d0086a41086a2902003702002000413c6a200241e0086a290200370200200041c4006a200241e8086a290200370200200041cc006a200241f0086a290200370200200041d4006a200241d0086a41286a290200370200200041dc006a20024180096a280200360200200241b0096a24000f0b200241d0056a2001108e0120022802d005450d0620022802d40522034108762104410521050c020b200241c0056a2001108e0120022802c005450d0520022802c4052103200241a8056a2001108c0120022903a805a7450d05200241b8056a290300210920022903b005210a20024198056a2001109101200229039805a7450d0520022903a005210820024190056a2001108e01200228029005450d05200228029405210120024180086a20093703002002200a3703f807200220013602f007200341087621042008422088a72101410321050c030b200241c8056a2001108e0120022802c805450d0420022802cc0522034108762104410421050b42002108410021010c010b200241f8046a2001108c0120022903f804a7450d0220024188056a290300210920022002290380053703f007200220093703f8074102210542002108410021010b0b200241d0086a41106a2206200241f0076a41106a290300220c370300200241d0086a41086a2207200241f0076a41086a290300220d37030020024190076a41086a220b200d37030020024190076a41106a220f200c370300200220022903f007220c370390072002200c3703d008200041386a2009370200200041306a200a3702002000410c6a2004410874200341ff017172360200200041086a20053602002000410c360200200041286a2001ad422086200842ffffffff0f8384370200200041106a200229039007370200200041186a200b290300370200200041206a200f290300370200200041c0006a20022903d008370300200041c8006a2007290300370300200041d0006a2006290300370300200041d8006a200241d0086a41186a290300370300200241b0096a24000f0b200241d0086a41106a200241f0076a41106a290300370300200241d0086a41086a200241f0076a41086a290300370300200220022903f0073703d0082000410f360200200241b0096a24000f0b20024188086a420037030020024180086a4200370300200241f0076a41086a4200370300200242003703f007200141086a220341002001280200200141046a220b280200200241f0076a41202004100122042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d6a200241ff076a290000210920022900f707210820022d008f082105200229008708210a20022800f307210420022f00f107210720022d00f0072106200241003a00d0082001280200200b280200200241d0086a4101200f1001210b20032003280200200b41016a41014b220b6a220f360200200b450d6a20022d00d0082203450d5d20034101470d6a4200210c200241f0076a41186a420037030020024180086a4200370300200241f0076a41086a4200370300200242003703f007200141086a220341002001280200200141046a280200200241f0076a4120200f100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d6a20022900f707221442ffffffff0f83210d201442808080807083211420022800f3072201411876210320022f00f107220b410876210e200241ff076a2900002113200241f0076a411f6a2d0000211020024187086a290000211520022d00f00721114101210f0c5e0b200241a8046a200110910120022903a804a7450d0920022903b0042109410521070c040b200241d0086a2001108d0120022d00d00822044102460d6820022d00d308210720022f00d108210e200241f0086a2802002103200241ec086a2802002105200241e4086a290200210a200241dc086a290200210920022902d408210820024188066a2001108c01200229038806a7450d6820024188066a41106a290300210d2002290390062114200241f8056a200110910120022903f805a7450d68200229038006210c200241f0056a2001108e0120022802f005450d6820022802f4052206417f4c0d692006450d64200610762210450d7b200141086a220b200641002001280200200141046a28020020102006200b280200100122012001417f461b2201200120064b1b2201200b2802006a36020020012006470d650c83010b200241d0086a41186a22054200370300200241d0086a41106a22064200370300200241d0086a41086a22074200370300200242003703d008200141086a220341002001280200200141046a280200200241d0086a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d07200241f0076a41186a22012005290300370300200241f0076a41106a22032006290300370300200241f0076a41086a22042007290300370300200220022903d0083703f00720024190076a41186a200129030037030020024190076a41106a200329030037030020024190076a41086a2004290300370300200220022903f00737039007200229009707220942ffffffff0f83210c2002419f076a290000210820022d009007210520022900a707210a20022d00af07210420022f009107210b2002280093072103410321070c060b200241b8066a2001108c0120022903b806a7450d66200241c8066a290300210c20022903c006210d200241a8066a200110910120022903a806a7450d6620022903b006211420024188086a420037030020024180086a4200370300200241f0076a41086a4200370300200242003703f00741002105200141086a220341002001280200200141046a280200200241f0076a41202003280200100122042004417f461b2204412020044120491b20032802006a3602002004411f4d0d3e20022800f307220441ffffff0771210520022f00f107220641ff017121032004418080807871210420064180fe03712106200241ff076a290000210a20022900f707210820022d008f082107200229008708210920022d00f007210b4101210f0c3f0b20024198046a2001109101200229039804a7450d0520022903a0042109410421070b2009210c0c030b200241e0056a200110910120022903e005a7450d6320022903e8052109200241d8056a2001108e0120022802d805450d6320022802dc052203417f4c0d642003450d4b200310762204450d73200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d4c0c7c0b200241d0086a41186a22054200370300200241d0086a41106a22074200370300200241d0086a41086a220b4200370300200242003703d008200141086a220641002001280200200141046a220f280200200241d0086a41202004100122032003417f461b2203412020034120491b20062802006a220e3602002003411f4d0d02200241f0076a41186a2005290300370300200241f0076a41106a2007290300370300200241f0076a41086a200b290300370300200220022903d0083703f007200241ff076a290000210820022900f707210920022d008f082104200229008708210a20022800f307210320022d00f007210520022f00f1072107200241003a00d0082001280200200f280200200241d0086a4101200e1001210120062006280200200141016a41014b22016a3602002001450d0220074180fe0371200741ff017172210b20022d00d008210f410221070b2009210c0b200020063b012a2000200f3a00292000200b3b000a200020053a0009200041083602002000412c6a2001360200200041286a20043a0000200041206a200a370200200041186a2008370200200041146a20094220883e0200200041106a200c3e02002000410c6a2003360200200041086a20073a0000200041306a20022903d008370300200041386a200241d0086a41086a290300370300200041c0006a200241d0086a41106a290300370300200041c8006a200241d0086a41186a290300370300200041d0006a200241d0086a41206a290300370300200041d8006a200241d0086a41286a290300370300200241b0096a24000f0b2000410f360200200241b0096a24000f0b200241206a2001108e012002280220450d5920022802242204417f4c0d5f2004450d38200410762203450d6c200141086a2205200441002001280200200141046a280200200320042005280200100122012001417f461b2201200120044b1b220120052802006a36020020012004470d390c760b200241186a2001108e012002280218450d58200228021c2204417f4c0d5e2004450d39200410762203450d6c200141086a2205200441002001280200200141046a280200200320042005280200100122012001417f461b2201200120044b1b220120052802006a36020020012004470d3a0c740b200242003703d00841042106200141086a220341002001280200200141046a280200200241d0086a41082004100122012001417f461b2201410820014108491b20032802006a360200200141074d0d5720022903d00821090c7c0b200241386a2001108e012002280238450d56200228023c2216ad42187e2209422088a70d5c2009a72204417f4c0d5c2004450d3b2004102222030d3c200441041023000b200241c8006a2001108e012002280248450d55200228024c2211ad420c7e2209422088a70d5b2009a72204417f4c0d5b2004450d3c2004102222030d3d200441041023000b200241c8036a2001108e0120022802c803450d3020022802cc032203410876210e410521100c090b20024188046a2001109101200229038804a7450d2f200229039004220a4220882109200aa72204410876210f410a21100c0a0b200241b8036a2001108e0120022802b803450d2e20022802bc032103200241d0086a2001108d0120022d00d00822044102460d2e20022d00d308210620022f00d108210f200241f0086a2802002107200241ec086a2802002105200241e4086a290200210a200241dc086a290200210c20022902d4082109200241b0036a2001108e0120022802b003450d2e20022802b403210b200241a8036a2001108e0120022802a803450d2e200f200641107472210f20022802ac0321102003410876210e2002200a37038008200a422088a72106200220093703f0072009422088a721012002200c3703f80720022902fc07210a2010ad2108200ca721114200210c410321100c0b0b200241c0036a2001108e0120022802c003450d2d20022802c4032203410876210e410421100c060b200241d0086a2001108d0120022d00d00822034102460d2c20022902d408220a422088210941082110200aa72204410876210f20022f00d10820022d00d30841107472210e200241dc086a2902002208422088a72111200241e4086a290200210a200241f0086a2802002105200241ec086a28020021062008a721010c020b200241d0086a2001108f0120022802d0082203450d2b20022902d4082109200241a0036a2001108e012009a7210420022802a003450d2a20022802a40321012004410876210f2003410876210e20094220882109410221100b0b0c060b200241d0086a2001108d0120022d00d00822034102460d2820022d00d308210420022f00d1082107200241f0086a2802002105200241ec086a2802002106200241e4086a290200210a200241dc086a290200210d20022902d4082114200241d8036a2001108c0120022903d803a7450d28200241d8036a41106a290300210c20022903e0032108200241d0036a2001108e0120022802d003450d282007200441107472210e20022802d4032107201442208821092014a72204410876210f200d422088a72111200da72101410621100c050b200241f0036a2001108e0120022802f003450d2720022802f4032203410876210e410721100b420021094100210f0c020b200241f8036a200110910120022903f803a7450d25200229038004220a4220882109200aa72204410876210f410921100b0b0b20004107360200200041c0006a200c370200200041386a2008370200200041346a200b360200200041306a20073602002000412c6a2005360200200041286a2006360200200041206a200a3702002000411c6a2011360200200041186a2001360200200041086a2010360200200041c8006a20022903d0083703002000410c6a200e410874200341ff017172360200200041d0006a200241d0086a41086a290300370300200041d8006a200241d0086a41106a290300370300200041106a2009422086200fad42ffffff07834208862004ad42ff01838484370200200241b0096a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d670b2003450d6a200410200c6a0b410c21060c080b200241f0026a2001108e0120022802f002450d1c20022802f4022103200241003a00f007410421062001280200200141046a280200200241f0076a4101200141086a22012802001001210420012001280200200441016a41014b22046a3602002004450d1c20022d00f007210720022903d0082208422088a7210b200241d0086a41086a290300210a20022802ec08211120022f01ea08211020022d00e908211720022d00e808210e20022903e00821092008a721120c5d0b200241d0086a41186a22054200370300200241d0086a41106a22064200370300200241d0086a41086a22074200370300200242003703d008200141086a220341002001280200200141046a280200200241d0086a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d1b200241f0076a41186a2005290300370300200241f0076a41106a2006290300370300200241f0076a41086a2007290300370300200220022903d0083703f00720022900f7072208422088a7210b200241ff076a290000210a20022d008f08210e200229008708210920022800f307210320022f00f107210f20022d00f00721072008a72112410a21060c5c0b200241e0026a2001108e0120022802e002450d1a410221064200210a4100210b20022802e40221030c040b200241e8026a2001108e0120022802e802450d1920022802ec0221034100210b200241003a00d0082001280200200141046a280200200241d0086a4101200141086a22012802001001210420012001280200200441016a41014b22046a3602002004450d1920022d00d0082107410321064200210a0c5a0b20024188036a2001109101200229038803a7450d18200229039003210920024180036a2001108e01200228028003450d1820022802840321032009422088a7210b2009a72112410721060c020b200241d0086a2001108b0120022802d0082104200241f0076a200241d0086a41047241dc001084041a2004410f460d1720024190076a200241f0076a41dc001084041a41e00010222203450d5420032004360200200341046a20024190076a41dc001084041a200241003a00d0082001280200200141046a280200200241d0086a4101200141086a22042802001001210520042004280200200541016a41014b22056a22063602002005450d1620022d00d008220741034f0d16200242003703d008200141086a220441002001280200200141046a280200200241d0086a41082006100122012001417f461b2201410820014108491b20042802006a360200200141074d0d1620022903d0082209422088a7210b2009a72112410521060c580b200241f8026a2001108e0120022802f802450d16410621064200210a4100210b20022802fc022103410021120b0b0c550b200241d0086a41186a22064200370300200241d0086a41106a22074200370300200241d0086a41086a220b4200370300200242003703d008200141086a220541002001280200200141046a2210280200200241d0086a41202004100122032003417f461b2203412020034120491b20052802006a22043602002003411f4d0d13200241f0076a41186a2006290300370300200241f0076a41106a2007290300370300200241f0076a41086a200b290300370300200220022903d0083703f007200241ff076a290000210a20022900f707210820022d008f08210e200229008708210920022800f307210320022f00f107210f20022d00f0072107200241003a00d00820012802002010280200200241d0086a410120041001210120052005280200200141016a41014b22016a3602002001450d132008422088a7210b20022d00d00821172008a72112410b21060c540b200241d0086a41186a22054200370300200241d0086a41106a2207420037030041082106200241d0086a41086a220b4200370300200242003703d008200141086a220341002001280200200141046a280200200241d0086a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d12200241f0076a41186a2005290300370300200241f0076a41106a2007290300370300200241f0076a41086a200b290300370300200220022903d0083703f00720022900f7072208422088a7210b200241ff076a290000210a20022d008f08210e200229008708210920022800f307210320022f00f107210f20022d00f00721072008a721120c530b200241d0086a2001103820022802d0082204450d322004410876210320022902d408210a410f21050c2a0b200241b8026a2001108e0120022802b802450d3120022802bc0222044108762103410c21050c090b20024188026a2001108e01200228028802450d30200228028c02210e200241f0016a2001108c0120022903f001a7450d3020024180026a290300210920022903f801210a41052105410021030c2b0b41002103200241003a00d0082001280200200141046a280200200241d0086a4101200610012104200141086a22012001280200200441016a41014b22016a3602002001450d2f20022d00d008210b410d21050c040b20024198026a2001109101200229039802a7450d2e20022903a002210a410a21050c0a0b200241c0016a2001108c0120022903c001a7450d2d200241d0016a290300210920022903c801210a20024188086a290300210c200229038008210820022802fc07210720022802f807211120022802f407211020022802f007210e41022105410021030c280b200241d8016a2001108c0120022903d801a7450d2c200241e8016a290300210920022903e001210a200241e8086a290300210c20022903e008210820022802dc08210720022802d808211120022802d408211020022802d008210e41032105410021030c270b41002103200241003a00d0082001280200200141046a280200200241d0086a410120061001210441082105200141086a22012001280200200441016a41014b22016a3602002001450d2b20022d00d008220b41034f0d2b0b420021090c260b20024190026a2001108e01200228029002450d292002280294022217ad42247e2209422088a70d342009a72203417f4c0d342003450d1f2003102222040d20200341041023000b200241c0026a2001108e0120022802c002450d2820022802c40222044108762103410e21050b420021090c010b410721050b0c1f0b200241a8026a200110910120022903a802a7450d2420022903b002210a410b21050b410021030c1c0b200241d0086a2001108d0120022d00d00822044102460d2220022f00d10820022d00d308411074722103200241e4086a2902002208422088a72110200241ec086a2802002111200241f0086a2802002107200241dc086a290200210920022902d408210a2008a7210e42002108410921054200210c0c1d0b2003109201200310200b2000410f360200200241b0096a24000f0b2004450d00200310200b2000410f360200200241b0096a24000f0b4100210441002103410021064100210f0b2002419f076a200a3700002002200837009707200220073a00af072002200b3a0090072002200420057236009307200220062003723b009107200220093700a707200f450d2620024198076a290300210820022802ac07210720022903a0072113200229039007210a200241a0066a2001108e0120022802a006450d2620022802a4062205417f4c0d272005450d24200510762203450d3a200141086a2204200541002001280200200141046a280200200320052004280200100122012001417f461b2201200120054b1b220120042802006a36020020012005470d250c3b0b410121032001280200200141046a28020041014100200141086a28020010011a41002004460d3d0b20040d1e0c1f0b410121032001280200200141046a28020041014100200141086a28020010011a41002004460d3a0b20040d1c0c1d0b410121032001280200200141046a28020041014100200141086a28020010011a41002004460d400b20040d1a0c1b0b410421030b2016450d0242002109200141086a210b200141046a21124100210e4100210441002107201621170340200241306a2001108e012002280230450d1820022802342206417f4c0d20024002402006450d00200610762210450d2b200b200641002001280200201228020020102006200b280200100122052005417f461b2205200520064b1b2205200b2802006a36020020052006460d010c190b410121102001280200201228020041014100200b28020010011a41002006470d180b200241286a2001108e012002280228450d17200228022c2205417f4c0d20024002402005450d00200510762211450d29200b200541002001280200201228020020112005200b2802001001220f200f417f461b220f200f20054b1b220f200b2802006a360200200f2005460d010c180b410121112001280200201228020041014100200b28020010011a41002005470d170b200741016a210f024020072017470d00200e200f200f200e491b2217ad42187e220a422088a70d22200aa722184100480d2202402007450d00200320042018102122030d010c270b201810222203450d260b200320046a22072010360200200741146a2005360200200741106a20053602002007410c6a2011360200200741046a2006ad220a422086200a8437020020094280808080107c2109200e41026a210e200441186a2104200f2107200f2016490d000c040b0b410421030b2011450d0242002109200141086a210e200141046a21124100210b4100210541002107201121100340200241c0006a2001108e012002280240450d0820022802442204417f4c0d1e024002402004450d0020041076220f450d22200e2004410020012802002012280200200f2004200e280200100122062006417f461b2206200620044b1b2206200e2802006a36020020062004460d010c090b4101210f2001280200201228020041014100200e28020010011a41002004470d080b200741016a2106024020072010470d00200b20062006200b491b2210ad420c7e220a422088a70d20200aa722174100480d2002402007450d00200320052017102122030d010c230b201710222203450d220b200320056a2207200f360200200741046a2004ad220a422086200a8437020020094280808080107c2109200b41026a210b2005410c6a21052006210720062011490d000c040b0b41002117420021090b2003450d1520092017ad842109410621060c3a0b41002110420021090b2003450d1320092010ad842109410721060c380b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d300b2003450d16200410200c160b2004450d00200f10200b02402007450d002003210103400240200141046a280200450d00200128020010200b2001410c6a2101200541746a22050d000b0b20100d0e0c0f0b410421040b024002402017450d0042002109200241ec086a2116200241e4086a2118200241dc086a2119410021074120210641002103201721120340200241d0086a2001108d0120022d00d008220b4102460d0a200341016a210520022d00d308210f20022f00d108210e200241f0086a2802002110201628020021112018290200210a2019290200210820022902d408210c024020032012470d002007200520052007491b2212ad42247e220d422088a70d18200da7221a4100480d1802402003450d002004200641606a201a102122040d010c1c0b201a10222204450d1b0b200420066a22032010360000200341636a200e200f41107472220f4110763a0000200341616a200f3b00002003417c6a2011360000200341746a200a3700002003416c6a2008370000200341646a200c370000200341606a200b3a000020094280808080107c2109200741026a2107200641246a21062005210320052017490d000c020b0b41002112420021090b2004450d0820092012ad84210a20044108762103410621050b0b0b0b0b2000200b3a000920004105360200200041386a200c370000200041306a2008370000200041186a2009370000200041106a200a3700002000412c6a2007360000200041286a2011360000200041246a2010360000200041206a200e360000200041086a20053a0000200041c0006a20022903d0083703002000410c6a2003410874200441ff017172360000200041c8006a200241d0086a41086a290300370300200041d0006a200241d0086a41106a290300370300200041d8006a200241d0086a41186a290300370300200241b0096a24000f0b4200210c4100210f420021134200210d420021140b200241ff066a2013370000200220103a008f072002201537008707200220033a00f6062002200e3a00f2062002200b3a00f106200220113a00f006200220013b00f306200220014110763a00f5062002200c2014200d84843700f706200241d8066a200241fe066a290100370300200241d0066a41106a20024186076a290100370300200241e8066a200241f0066a411e6a2f01003b0100200241d0066a411e6a200241d4086a2f01003b0100200220022901f6063703d006200220022801d0083601ea0620022801f206210320022f01f006210b410521120c270b2012450d00200410200b2000410f360200200241b0096a24000f0b2005450d00201110200b2006450d00201010200b02402007450d002003210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141186a2101200441686a22040d000b0b2017450d010b200310200b2000410f360200200241b0096a24000f0b410121102001280200200141046a28020041014100200141086a28020010011a41002006460d1e0b2006450d02201010200c020b410121032001280200200141046a28020041014100200141086a28020010011a41002005460d160b2005450d00200310200b200241f0076a41186a200241d0066a41186a290300370300200241f0076a41106a200241d0066a41106a290300370300200241f0076a41086a200241d0066a41086a290300370300200220022903d0063703f0072000410f360200200241b0096a24000f0b1031000b1024000b200441011023000b201741041023000b201a41041023000b201841041023000b41e00041081023000b200541011023000b200341011023000b200641011023000b41e00041081023000b41e00041081023000b200441011023000b200441011023000b200441011023000b200341011023000b41e00041081023000b41e00041081023000b200641011023000b200541011023000b200241d0066a41106a200c37030020022009421888a73b01ea0820022009421088a73a00e90820022009420888a73a00e808200220133703e00820022008423888a73a00df082002200d3703d8062002200a42388820084208868422083700d7082002200a421888a722043600d308200220143703e8062002200aa722063b01d008200220064110763a00d20820022005ad22094220862009843703d006200220073602ec082007411876210520064180feff0771410876210720022900e708210a20022900df08210941042112410021100c040b200020103b012a200020173a00292000200f3b000a200020073a0009200041063602002000412c6a2011360200200041286a200e3a0000200041206a2009370200200041186a200a370200200041146a200b360200200041106a20123602002000410c6a2003360200200041086a20063a0000200041306a20022903d008370300200041386a200241d0086a41086a290300370300200041c0006a200241d0086a41106a290300370300200041c8006a200241d0086a41186a290300370300200041d0006a200241d0086a41206a290300370300200041d8006a200241d0086a41286a290300370300200241b0096a24000f0b2004ad22094220862009842109410321060c080b2004ad22094220862009842109410521060c070b200241d0066a41186a200241d0086a41186a290300370300200241d0066a41106a200241d0086a41106a290300370300200241d0066a41086a200241d0086a41086a290300370300200220022903d0083703d0062003ad220a422086200a842108410221120b0c010b2005411076210b2005410876210f200241e8066a200d370300200220143703e006200220103602d00620022006ad220d422086200d843702d406200e2007411074724108742004722104410321120b200241f0076a41186a200241d0066a41186a290300220d370300200241f0076a41106a200241d0066a41106a2903002214370300200241f0076a41086a200241d0066a41086a2903002213370300200241d0086a41086a22172013370300200241d0086a41106a22162014370300200241d0086a41186a2218200d370300200220022903d006220d3703d0082002200d3703f0072000412c6a20033600002000200b3b002a2000200f3a0029200041286a20053a0000200041206a200a370000200041186a2009370000200041106a20083700002000410c6a2004360000200020073b000a200020063a0009200041086a20123a00002000410d360200200041306a20022903d008370000200041386a2017290300370000200041c0006a2016290300370000200041c8006a20182903003700002000200e3b005e200020113a005d200041dc006a20013a0000200041d8006a2010360000200041d0006a200c370000200241b0096a24000f0b2004450d03200020043602042000410b360200200041086a2003ad2209422086200984370200200041106a200241d0086a41d0001084041a200241b0096a24000f0b2000410f360200200241b0096a24000f0b2004ad22094220862009842109410121060b20004101360200200041106a20093702002000410c6a2003360200200041086a2006360200200041186a200241d0086a41c8001084041a200241b0096a24000f0b2000410f360200200241b0096a24000f0b2000410f360200200241b0096a24000bcc0603047f037e037f230041206b22022400200241003a001020012802002001280204200241106a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002402003450d000240024002400240024020022d0010220541037122034102460d0020034101460d0120030d022005410276ad21060c030b20024100360210200220053a0010200141086a220341002001280200200141046a280200200241106a41017241032004100122012001417f461b22014103200141034922011b20032802006a36020020010d042002280210410276ad21060c020b200241003b0110200220053a00102001280200200141046a280200200241106a4101724101200410012103200141086a22012001280200200341016a220141014b6a36020020014102490d0320022f0110410276ad21060c010b0240024020054102762203410c460d0020034104460d0120030d03200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100122012001417f461b22014104200141044922011b20052802006a36020020010d04200235021021060c020b420021072002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100122012001417f461b22014110200141104922011b20032802006a36020020010d04200241106a41086a290300210820022903102106420121070c050b4200210720024200370310200141086a220341002001280200200141046a280200200241106a41082004100122012001417f461b22014108200141084922011b20032802006a36020020010d03200229031021060b42002108420121070c030b200341046a220941104b0d00200141046a210a200141086a21054200210642002108410021030340200241003a00102001280200200a280200200241106a410120041001210420052005280200200441016a41014b220b6a2204360200200b450d01200220023100104200200341037441f80071108904200241086a29030020088421082002290300200684210642012107200341016a220341ff01712009490d000c030b0b420021070b0b2000200637030820002007370300200041106a2008370300200241206a24000bdd0801067f230041f0006b22022400200241003a005020012802002001280204200241d0006a410120012802081001210320012001280208200341016a41014b22036a220436020802400240024002402003450d0020022d0050220341ef014b0d010c020b200041023a0000200241f0006a24000f0b024002400240024002400240200341847e6a220341034b0d0002400240024020030e0400040102000b200141046a2802002103200241003b0150200141086a2205410020012802002003200241d0006a41022004100122012001417f461b2201410220014102491b20052802006a360200200141014d0d0620022f0150220341ef014b0d08200041023a0000200241f0006a24000f0b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a360200200041023a0000200241f0006a24000f0b200241d0006a41186a4200370300200241d0006a41106a4200370300200241d0006a41086a42003703002002420037035041002105200141086a220341002001280200200141046a280200200241d0006a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d022002412e6a20022d00523a0000200241106a41086a200241df006a290000370300200241106a41106a200241e7006a290000370300200241106a41186a200241d0006a411f6a2d00003a0000200220022f01503b012c2002200229005737031020022800532103410121050c030b200041023a0000200241f0006a24000f0b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d03410121012002280250220341ffff034b0d05200041023a0000200241f0006a24000f0b0b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2204200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c2002200229031037033002402005450d002002410c6a41026a20012d00003a0000200241d0006a41086a2004290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010c040b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b410121010b200020022f010c3b0001200020013a0000200041046a2003360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a280200360200200241f0006a24000bcc0301057f230041106b2202240041002103200241003a000f200128020020012802042002410f6a410120012802081001210420012001280208200441016a41014b22046a22053602080240024002402004450d0002400240024020022d000f220641037122044102460d0020044101460d0120040d0220064102762104410121030c050b20024100360208200220063a000841012103200141086a220441002001280200200141046a280200200241086a41017241032005100122012001417f461b22014103200141034922011b20042802006a36020020010d03200228020841027621040c040b41002103200241003b010c200220063a000c2001280200200141046a2802002002410c6a4101724101200510012104200141086a22012001280200200441016a220141014b6a36020020014102490d0120022f010c4102762104410121030c030b200641034b0d02200141046a28020021044100210320024100360204200141086a2206410020012802002004200241046a41042005100122012001417f461b22014104200141044922011b20062802006a36020020010d0020022802042104410121030c020b0c010b410021030b2000200436020420002003360200200241106a24000bf602010a7f230041106b2202240020022001108e01024002400240024002400240024002402002280200450d0020022802042203417f4c0d062003450d01200310222204450d07200141046a2105200141086a21064100210741002108200321090340200241003a000f200128020020052802002002410f6a410120062802001001210a20062006280200200a41016a41014b220a6a360200200a450d04200841016a210a20022d000f210b024020082009470d002007200a200a2007491b22094100480d0602402008450d00200420082009102122040d010c080b200910222204450d070b200420086a200b3a0000200741026a2107200a2108200a2003490d000c030b0b20004100360200200241106a24000f0b410121044100210a410021090b2000200936020420002004360200200041086a200a360200200241106a24000f0b2000410036020002402009450d00200410200b200241106a24000f0b1024000b200941011023000b1031000b200341011023000b9c0a05057f017e017f077e017f230041106b22022400200241003602082001410020012802002001280204200241086a41042001280208100122032003417f461b2203410420034104491b20012802086a2204360208024002400240024002400240024002400240024002400240200341034d0d002002280208210520024200370308200141086a220641002001280200200141046a280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d012002290308210720024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d022002290308210920024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d032002290308210a20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d042002290308210b20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d052002290308210c20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d062002290308210d20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d072002290308210e20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d082002290308210f2008280200210320024100360208200141086a2206410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0920022802082110200141046a22082802002103200241003602082006410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0a20022802082106200241003a000820012802002008280200200241086a4101200410012103200141086a22012001280200200341016a41014b22016a3602002001450d0b200020022d00083a004c2000200636024820002010360244200020053602402000200f3703382000200e3703302000200d3703282000200c3703202000200b3703182000200a3703102000200937030820002007370300200020022f00083b004d200041cf006a2002410a6a2d00003a0000200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000bb70503047f027e037f230041106b22022400200241003a000820012802002001280204200241086a410120012802081001210320012001280208200341016a41014b22046a22033602080240024002402004450d0002400240024020022d0008220541037122044102460d0020044101460d0120040d022005410276ad2106420121070c050b20024100360208200220053a0008200141086a220441002001280200200141046a280200200241086a41017241032003100122012001417f461b22014103200141034922011b20042802006a36020020010d022002280208410276ad2106420121070c040b200241003b0108200220053a00082001280200200141046a280200200241086a4101724101200310012103200141086a22012001280200200341016a220141014b6a36020020014102490d0120022f0108410276ad2106420121070c030b02400240200541027622044104460d0020040d01200141046a280200210420024100360208200141086a2205410020012802002004200241086a41042003100122012001417f461b22014104200141044922011b20052802006a36020020010d0220023502082106420121070c040b4200210720024200370308200141086a220441002001280200200141046a280200200241086a41082003100122012001417f461b22014108200141084922011b20042802006a36020020010d0220022903082106420121070c030b200441046a220841084b0d0042002106200141046a2109200141086a2105410021040340200241003a000820012802002009280200200241086a410120031001210320052005280200200341016a41014b220a6a2203360200200a450d0120023100082004410374413871ad86200684210642012107200441016a220441ff01712008490d000c030b0b420021070b0b2000200637030820002007370300200241106a24000ba80601027f024002400240024002400240024002400240024002400240024002400240024002400240024020002802002201410d4b0d0020010e0e1201121212020304050612071208120b20002802044101470d11200041086a2200280200109201200028020010200f0b200041086a280200220141064b0d0b024020010e071100110d110e0f110b200041106a280200450d102000410c6a28020010200f0b200041086a2d00002201410e4b0d0e20014106470d0f200041106a280200450d0f2000410c6a28020010200f0b200041086a2d000022014105460d0520014101470d0e2000410c6a2200280200109201200028020010200f0b200041086a28020022014102460d0520014101470d0d200041106a280200450d0d2000410c6a28020010200f0b200041086a2d00004101470d0c2000410c6a2200280200109201200028020010200f0b20002d00044101470d0b2000410c6a2200280200109201200028020010200f0b200041086a280200450d0a200028020410200f0b200041086a2d000022014104460d0220014103460d0320014102470d09200041106a280200450d092000410c6a28020010200f0b2000410c6a2200280200109201200028020010200f0b200041106a280200450d072000410c6a28020010200f0b200041306a280200450d062000412c6a28020010200f0b200041346a280200450d05200041306a28020010200f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010200b2001410c6a2101200241746a22020d000b0b200041106a280200450d042000410c6a28020010200f0b200041106a280200450d032000410c6a28020010200f0b200041106a280200450d022000410c6a28020010200f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141186a2101200241686a22020d000b0b200041106a280200450d012000410c6a28020010200f0b200041106a280200450d002000410c6a28020010200f0b0bef0301017f02400240024002400240024002400240024002400240024002400240024020002802002201410d4b0d0020010e0e0e010e0e0e02030405060e070e080e0b20002802044101470d0d200041086a2200280200109301200028020010200f0b200041086a1094010f0b200041086a2d00002201410e4b0d0a20014106470d0b200041106a280200450d0b2000410c6a28020010200f0b200041086a2d000022014105460d0520014101470d0a2000410c6a2200280200109301200028020010200f0b200041086a28020022014102460d0520014101470d09200041106a280200450d092000410c6a28020010200f0b200041086a2d00004101470d082000410c6a2200280200109301200028020010200f0b20002d00044101470d072000410c6a2200280200109301200028020010200f0b200041086a280200450d06200028020410200f0b200041086a2d000022014104460d0220014103460d0320014102470d05200041106a280200450d052000410c6a28020010200f0b2000410c6a2200280200109301200028020010200f0b200041106a280200450d032000410c6a28020010200f0b200041306a280200450d022000412c6a28020010200f0b200041346a280200450d01200041306a28020010200f0b200041106a280200450d002000410c6a28020010200f0b0bb70201027f0240024002400240024002402000280200220141064b0d0020010e0705010502050304050b02402000410c6a2802002202450d00200028020421012002410c6c210203400240200141046a280200450d00200128020010200b2001410c6a2101200241746a22020d000b0b200041086a280200450d04200041046a28020010200f0b200041086a280200450d03200028020410200f0b200041086a280200450d02200028020410200f0b200041086a280200450d01200028020410200f0b02402000410c6a2802002202450d0020002802042101200241186c210203400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141186a2101200241686a22020d000b0b200041086a280200450d00200041046a28020010200f0b0bd6c10103067f017e037f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000280200417f6a2203410d4b0d00024020030e0e00090607030a0c080e050d02040b000b200141046a280200200141086a2802002203470d16200341016a22042003490d7120034101742205200420042005491b22054100480d712003450d2d20012802002003200510212204450d2e0c620b200141046a280200200141086a2802002203470d0d200341016a22042003490d7020034101742205200420042005491b22054100480d702003450d1c20012802002003200510212204450d1d0c5f0b200141046a280200200141086a2802002203470d0d200341016a22042003490d5320034101742205200420042005491b22054100480d532003450d1d20012802002003200510212204450d1e0c510b200141046a2205280200200141086a22042802002203470d0d200341016a22062003490d6e20034101742207200620062007491b22074100480d6e2003450d1e20012802002003200710212206450d1f0c4e0b200141046a280200200141086a2802002203470d0d200341016a22042003490d5120034101742205200420042005491b22054100480d512003450d1f20012802002003200510212204450d200c4b0b200141046a280200200141086a2802002203470d0d200341016a22042003490d5020034101742205200420042005491b22054100480d502003450d2020012802002003200510212204450d210c480b200141046a280200200141086a2802002203470d0d200341016a22042003490d6b20034101742205200420042005491b22054100480d6b2003450d2120012802002003200510212204450d220c450b200141046a280200200141086a2802002203470d0d200341016a22042003490d6a20034101742205200420042005491b22054100480d6a2003450d2220012802002003200510212204450d230c420b200141046a280200200141086a2802002203470d0d200341016a22042003490d4d20034101742205200420042005491b22054100480d4d2003450d2320012802002003200510212204450d240c3f0b200141046a280200200141086a2802002200470d0e200041016a22032000490d6820004101742204200320032004491b22044100480d682000450d2620012802002000200410212203450d270c3c0b200141046a2206280200200141086a22042802002203470d0e200341016a22052003490d6720034101742207200520052007491b22074100480d672003450d2720012802002003200710212205450d280c390b200141046a280200200141086a2802002203470d0e200341016a22042003490d4a20034101742205200420042005491b22054100480d4a2003450d2820012802002003200510212204450d290c360b200141046a280200200141086a2802002203470d0e200341016a22042003490d6520034101742205200420042005491b22054100480d652003450d2920012802002003200510212204450d2a0c330b200141046a280200200141086a2802002203470d0e200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d2a20012802002003200510212204450d2b0c300b200141046a280200200141086a2802002203470d0e200341016a22042003490d4720034101742205200420042005491b22054100480d472003450d2b20012802002003200510212204450d2c0c2d0b200128020021040c520b200128020021040c440b200128020021060c410b200128020021040c3e0b200128020021040c3b0b200128020021040c380b200128020021040c350b200128020021040c320b200128020021040c4c0b200128020021030c2e0b200128020021050c2b0b200128020021040c280b200128020021040c250b200128020021040c220b200128020021040c1f0b2005102222040d420b200541011023000b2005102222040d330b200541011023000b2007102222060d2f0b200741011023000b2005102222040d2b0b200541011023000b2005102222040d270b200541011023000b2005102222040d230b200541011023000b2005102222040d1f0b200541011023000b2005102222040d1b0b200541011023000b2005102222040d340b200541011023000b2004102222030d150b200441011023000b2007102222050d110b200741011023000b2005102222040d0d0b200541011023000b2005102222040d090b200541011023000b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240024002400240024002400240200041046a22032d000022044102460d0020044101470d32200141046a280200200141086a2802002203470d01200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0320012802002003200510212204450d040c090b200141046a28020020052802002204470d01200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d0420012802002004200610212205450d050c060b200128020021040c080b200128020021050c050b2005102222040d050b200541011023000b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41013a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d1f20054101742204200620062004491b22044100480d1f2005450d0120012802002005200410212205450d020c030b200128020021050c030b2004102222050d010b200441011023000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a29000037000020042003290001370000200041286a2001103e02400240024002400240200141046a28020020062802002200470d00200041016a22042000490d1f20004101742205200420042005491b22054100480d1f2000450d0120012802002000200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a200341216a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001103e2000410c6a2802002001109501200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1b20034101742205200420042005491b22054100480d1b2003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041046a280200210620022000410c6a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200041086a280200417f6a220341094b0d2302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b200141046a280200200141086a2802002203470d0e200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d1d20012802002003200510212204450d1e0c390b200141046a280200200141086a2802002203470d08200341016a22042003490d4e20034101742205200420042005491b22054100480d4e2003450d1220012802002003200510212204450d130c360b200141046a280200200141086a2802002203470d08200341016a22042003490d4d20034101742205200420042005491b22054100480d4d2003450d1320012802002003200510212204450d140c330b200141046a280200200141086a2802002203470d08200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d1420012802002003200510212204450d150c300b200141046a280200200141086a2802002203470d08200341016a22042003490d4b20034101742205200420042005491b22054100480d4b2003450d1520012802002003200510212204450d160c2d0b200141046a280200200141086a2802002203470d08200341016a22042003490d4a20034101742205200420042005491b22054100480d4a2003450d1620012802002003200510212204450d170c2a0b200141046a280200200141086a2802002203470d09200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d1920012802002003200510212204450d1a0c270b200141046a280200200141086a2802002203470d09200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d1a20012802002003200510212204450d1b0c240b200141046a280200200141086a2802002203470d09200341016a22042003490d4720034101742205200420042005491b22054100480d472003450d1b20012802002003200510212204450d1c0c210b200141046a280200200141086a2802002203470d09200341016a22042003490d4620034101742205200420042005491b22054100480d462003450d1c20012802002003200510212204450d1d0c1e0b200128020021040c2e0b200128020021040c2b0b200128020021040c280b200128020021040c250b200128020021040c220b200128020021040c2b0b200128020021040c1e0b200128020021040c1b0b200128020021040c180b200128020021040c150b2005102222040d230b200541011023000b2005102222040d1f0b200541011023000b2005102222040d1b0b200541011023000b2005102222040d170b200541011023000b2005102222040d130b200541011023000b2005102222040d1b0b200541011023000b2005102222040d0d0b200541011023000b2005102222040d090b200541011023000b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a20011097012002200041386a36020c2002410c6a2001109801200041306a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001103e024002402007450d00200141046a210a03400240024002400240200a28020020052802002203470d00200341016a22062003490d272003410174220b20062006200b491b220b4100480d272003450d0120012802002003200b102122060d020c060b200128020021060c020b200b10222206450d040b20012006360200200a200b360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a2001103e200241106a24000f0b200b41011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a2001109701200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a2001103e200041106a2001109701200041346a2001103e200041386a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001103e024002402007450d00200141046a210a03400240024002400240200a28020020052802002203470d00200341016a22062003490d1b2003410174220b20062006200b491b220b4100480d1b2003450d0120012802002003200b102122060d020c060b200128020021060c020b200b10222206450d040b20012006360200200a200b360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a2001103e200241106a24000f0b200b41011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410e3a000002400240024002400240024002400240024002400240200028020422034102460d0020034101470d2c200141046a280200200141086a2802002203470d01200341016a22042003490d1d20034101742205200420042005491b22054100480d1d2003450d0320012802002003200510212204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d1c20034101742205200420042005491b22054100480d1c2003450d0420012802002003200510212204450d050c060b200128020021040c080b200128020021040c050b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a2001109701200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2802002001109501200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41063a0000200041086a22032d0000417f6a2205410b4b0d1f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0c00070405020809060b030a01000b200628020020042802002203470d11200341016a22042003490d7320034101742205200420042005491b22054100480d732003450d2320012802002003200510212204450d240c450b200628020020042802002200470d0a200041016a22032000490d7220004101742205200320032005491b22054100480d722000450d1620012802002000200510212203450d170c420b200628020020042802002203470d0a200341016a22052003490d7120034101742207200520052007491b22074100480d712003450d1720012802002003200710212205450d180c3f0b200628020020042802002200470d0a200041016a22052000490d7020004101742207200520052007491b22074100480d702000450d1820012802002000200710212205450d190c3c0b200628020020042802002205470d0a200541016a22062005490d6f20054101742207200620062007491b22074100480d6f2005450d1920012802002005200710212206450d1a0c390b200628020020042802002205470d0a200541016a22062005490d6e20054101742207200620062007491b22074100480d6e2005450d1a20012802002005200710212206450d1b0c360b200628020020042802002200470d0a200041016a22052000490d6d20004101742207200520052007491b22074100480d6d2000450d1b20012802002000200710212205450d1c0c330b200628020020042802002203470d0b200341016a22042003490d6c20034101742205200420042005491b22054100480d6c2003450d1e20012802002003200510212204450d1f0c300b200628020020042802002203470d0b200341016a22042003490d6b20034101742205200420042005491b22054100480d6b2003450d1f20012802002003200510212204450d200c2d0b200628020020042802002203470d0b200341016a22042003490d6a20034101742205200420042005491b22054100480d6a2003450d2020012802002003200510212204450d210c2a0b200628020020042802002200470d0b200041016a22052000490d6920004101742207200520052007491b22074100480d692000450d2120012802002000200710212205450d220c270b200628020020042802002200470d0b200041016a22032000490d6820004101742205200320032005491b22054100480d682000450d2220012802002000200510212203450d230c240b200128020021030c380b200128020021050c350b200128020021050c320b200128020021060c2f0b200128020021060c2c0b200128020021050c290b200128020021040c340b200128020021040c250b200128020021040c220b200128020021040c1f0b200128020021050c1c0b200128020021030c190b2005102222030d2b0b200541011023000b2007102222050d270b200741011023000b2007102222050d230b200741011023000b2007102222060d1f0b200741011023000b2007102222060d1b0b200741011023000b2007102222050d170b200741011023000b2005102222040d210b200541011023000b2005102222040d110b200541011023000b2005102222040d0d0b200541011023000b2005102222040d090b200541011023000b2007102222050d050b200741011023000b2005102222030d010b200541011023000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41083a0000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410a3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22072000490d4520054101742200200720072000491b22004100480d452005450d0120012802002005200010212205450d020c030b200128020021050c030b2000102222050d010b200041011023000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000002400240024002400240200628020020042802002200470d00200041016a22052000490d4520004101742206200520052006491b22064100480d452000450d0120012802002000200610212205450d020c030b200128020021050c030b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021000b2004200041016a360200200520006a200341216a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a0000200041106a20011096012000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a2001103e200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a41073a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d3d20054101742200200620062000491b22004100480d3d2005450d0120012802002005200010212205450d020c030b200128020021050c030b2000102222050d010b200041011023000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41033a00002000410c6a2001103e02400240024002400240200141046a28020020072802002200470d00200041016a22052000490d3b20004101742206200520052006491b22064100480d3b2000450d0120012802002000200610212205450d020c030b200128020021050c030b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021000b2004200041016a360200200520006a200341016a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41023a00002000410c6a2001103e02400240024002400240200141046a28020020072802002200470d00200041016a22052000490d3920004101742206200520052006491b22064100480d392000450d0120012802002000200610212205450d020c030b200128020021050c030b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021000b2004200041016a360200200520006a200341016a2d00003a0000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a41093a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d3720054101742200200620062000491b22004100480d372005450d0120012802002005200010212205450d020c030b200128020021050c030b2000102222050d010b200041011023000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200520036a41043a00002000410c6a2802002001109501024002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200628020020042802002203470d03200341016a22052003490d4220034101742207200520052007491b22074100480d422003450d0720012802002003200710212205450d080c0f0b200628020020042802002203470d01200341016a22052003490d4120034101742207200520052007491b22074100480d412003450d0420012802002003200710212205450d050c0c0b200628020020042802002203470d02200341016a22052003490d4020034101742207200520052007491b22074100480d402003450d0720012802002003200710212205450d080c090b200128020021050c0b0b200128020021050c0c0b200128020021050c070b2007102222050d070b200741011023000b2007102222050d070b200741011023000b2007102222050d010b200741011023000b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41003a00000c040b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41013a00000c020b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41023a00000b200041106a29030021080240024002400240024020062802002203200428020022006b41084f0d00200041086a22052000490d3520034101742200200520052000491b22004100480d352003450d0120012802002003200010212203450d020c030b200128020021030c030b2000102222030d010b200041011023000b20012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a2008370000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410b3a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a28020020011095012002200041106a36020c2002410c6a2001109801200241106a24000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041086a22032d0000417f6a220441044b0d1b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0f20012802002003200510212204450d100c1b0b200141046a280200200141086a2802002203470d03200341016a22042003490d2820034101742205200420042005491b22054100480d282003450d0820012802002003200510212204450d090c180b200141046a280200200141086a2802002200470d03200041016a22042000490d2720004101742205200420042005491b22054100480d272000450d0920012802002000200510212204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2620034101742205200420042005491b22054100480d262003450d0a20012802002003200510212204450d0b0c120b200141046a280200200141086a2802002200470d04200041016a22042000490d2520004101742205200420042005491b22054100480d252000450d0d20012802002000200510212204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102222040d0f0b200541011023000b2005102222040d0b0b200541011023000b2005102222040d070b200541011023000b2005102222040d0b0b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41013a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d1920044101742200200520052000491b22004100480d192004450d0120012802002004200010212204450d020c030b200128020021040c030b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a2205200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000002400240024002400240200141046a28020020052802002200470d00200041016a22042000490d1920004101742205200420042005491b22054100480d192000450d0120012802002000200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a200341216a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a0000200041106a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41023a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d1520044101742200200520052000491b22004100480d152004450d0120012802002004200010212204450d020c030b200128020021040c030b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041106a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a2802002001109501200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00000240024002400240024002400240024002400240024002400240024002400240200041086a22032d000022044103460d00024020044102460d0020044101470d2a200141046a280200200141086a2802002200470d04200041016a22042000490d3720004101742205200420042005491b22054100480d372000450d0920012802002000200510212204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d0420012802002003200510212204450d050c0c0b200141046a28020020052802002200470d01200041016a22042000490d3520004101742205200420042005491b22054100480d352000450d0520012802002000200510212204450d060c090b200128020021040c0b0b200128020021040c080b200128020021040c0b0b2005102222040d070b200541011023000b2005102222040d030b200541011023000b2005102222040d050b200541011023000b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41023a000002400240024002400240200141046a28020020052802002200470d00200041016a22042000490d2f20004101742205200420042005491b22054100480d2f2000450d0120012802002000200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a200341016a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041106a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41003a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d2b20044101742200200520052000491b22004100480d2b2004450d0120012802002004200010212204450d020c030b200128020021040c030b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240024002400240024002400240200041086a28020022034102460d0020034101470d22200141046a280200200141086a2802002203470d01200341016a22042003490d2f20034101742205200420042005491b22054100480d2f2003450d0320012802002003200510212204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d2e20034101742205200420042005491b22054100480d2e2003450d0420012802002003200510212204450d050c060b200128020021040c080b200128020021040c050b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a20011097012002200041306a36020c2002410c6a20011098012002200041c0006a36020c2002410c6a2001109801200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a20011097012002200041306a36020c2002410c6a2001109801200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410d3a0000200041086a22032d0000417f6a220441044b0d1302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0f20012802002003200510212204450d100c1b0b200141046a280200200141086a2802002200470d03200041016a22042000490d2020004101742205200420042005491b22054100480d202000450d0820012802002000200510212204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0920012802002003200510212204450d0a0c150b200141046a280200200141086a2802002204470d03200441016a22052004490d1e20044101742206200520052006491b22064100480d1e2004450d0a20012802002004200610212205450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d1d20034101742205200420042005491b22054100480d1d2003450d0d20012802002003200510212204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021050c0f0b200128020021040c140b200128020021040c0b0b2005102222040d0f0b200541011023000b2005102222040d0b0b200541011023000b2006102222050d070b200641011023000b2005102222040d0b0b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a20011096012000410c6a28020021062002200041146a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d1120044101742203200520052003491b22034100480d112004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000f0b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41033a00002002200041386a36020c2002410c6a2001109801200041c8006a200110960102400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d0120012802002005200410212205450d020c030b200128020021050c030b2004102222050d010b200441011023000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a290000370000200420032900013700002000412c6a28020021052002200041346a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200628020022036b20004f0d00200320006a22062003490d0f20044101742203200620062003491b22034100480d0f2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200520001084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a20011097012002200041c0006a36020c2002410c6a2001109801200041d0006a2001109601200041306a28020021062002200041386a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d0d20044101742203200520052003491b22034100480d0d2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41043a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0b20044101742200200520052000491b22004100480d0b2004450d0120012802002004200010212204450d020c030b200128020021040c030b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a2205200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000002400240024002400240024002400240024002400240200341216a2d00004101470d00200141046a28020020052802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d0320012802002000200510212204450d040c090b200141046a28020020052802002200470d01200041016a22032000490d1020004101742204200320032004491b22044100480d102000450d0420012802002000200410212203450d050c060b200128020021040c080b200128020021030c050b2005102222040d050b200541011023000b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41013a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0b20044101742200200520052000491b22004100480d0b2004450d0120012802002004200010212204450d020c030b200128020021040c030b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220141186a200341226a220041186a290000370000200141106a200041106a290000370000200141086a200041086a29000037000020012000290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041106a2001109901200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a0000200041086a2d0000417f6a2203410e4b0d1102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0f00090607030a0c080e050d02040b01000b200528020020042802002203470d16200341016a22062003490d7720034101742207200620062007491b22074100480d772003450d2d20012802002003200710212206450d2e0c570b200528020020042802002203470d0d200341016a22062003490d7620034101742207200620062007491b22074100480d762003450d1c20012802002003200710212206450d1d0c540b200528020020042802002203470d0d200341016a22042003490d7520034101742205200420042005491b22054100480d752003450d1d20012802002003200510212204450d1e0c510b200528020020042802002203470d0d200341016a22042003490d7420034101742205200420042005491b22054100480d742003450d1e20012802002003200510212204450d1f0c4e0b200528020020042802002203470d0d200341016a22062003490d7320034101742207200620062007491b22074100480d732003450d1f20012802002003200710212206450d200c4b0b200528020020042802002203470d0d200341016a22042003490d7220034101742205200420042005491b22054100480d722003450d2020012802002003200510212204450d210c480b200528020020042802002203470d0d200341016a22042003490d7120034101742205200420042005491b22054100480d712003450d2120012802002003200510212204450d220c450b200528020020042802002200470d0d200041016a22032000490d7020004101742205200320032005491b22054100480d702000450d2220012802002000200510212203450d230c420b200528020020042802002203470d0d200341016a22062003490d6f20034101742207200620062007491b22074100480d6f2003450d2320012802002003200710212206450d240c3f0b200528020020042802002203470d0e200341016a22042003490d6e20034101742205200420042005491b22054100480d6e2003450d2620012802002003200510212204450d270c3c0b200528020020042802002203470d0e200341016a22042003490d6d20034101742205200420042005491b22054100480d6d2003450d2720012802002003200510212204450d280c390b200528020020042802002203470d0e200341016a22042003490d6c20034101742205200420042005491b22054100480d6c2003450d2820012802002003200510212204450d290c360b200528020020042802002200470d0e200041016a22032000490d6b20004101742205200320032005491b22054100480d6b2000450d2920012802002000200510212203450d2a0c330b200528020020042802002203470d0e200341016a22042003490d6a20034101742205200420042005491b22054100480d6a2003450d2a20012802002003200510212204450d2b0c300b200528020020042802002203470d0e200341016a22042003490d6920034101742205200420042005491b22054100480d692003450d2b20012802002003200510212204450d2c0c2d0b200128020021060c470b200128020021040c440b200128020021040c410b200128020021060c3e0b200128020021040c3b0b200128020021040c380b200128020021030c350b200128020021060c320b200128020021060c410b200128020021040c2e0b200128020021040c2b0b200128020021040c280b200128020021030c250b200128020021040c220b200128020021040c1f0b2007102222060d370b200741011023000b2005102222040d330b200541011023000b2005102222040d2f0b200541011023000b2007102222060d2b0b200741011023000b2005102222040d270b200541011023000b2005102222040d230b200541011023000b2005102222030d1f0b200541011023000b2007102222060d1b0b200741011023000b2007102222060d290b200741011023000b2005102222040d150b200541011023000b2005102222040d110b200541011023000b2005102222040d0d0b200541011023000b2005102222030d090b200541011023000b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a2001109701200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041106a2001109601200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41063a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410d3a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a28020021032002200041146a280200220036020c2002410c6a2001103e2000450d25200041246c2100034020032001109701200341246a21032000415c6a22000d000c260b0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a2001109801200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200528020020042802002200470d03200041016a22032000490d3f20004101742205200320032005491b22054100480d3f2000450d0720012802002000200510212203450d080c0f0b200528020020042802002200470d01200041016a22032000490d3e20004101742205200320032005491b22054100480d3e2000450d0420012802002000200510212203450d050c0c0b200528020020042802002200470d02200041016a22032000490d3d20004101742205200320032005491b22054100480d3d2000450d0720012802002000200510212203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102222030d070b200541011023000b2005102222030d070b200541011023000b2005102222030d010b200541011023000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41033a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a36020c2002410c6a2001109801200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a2001109601200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a410c3a000002400240024002400240200528020020042802002203470d00200341016a22052003490d2b20034101742206200520052006491b22064100480d2b2003450d0120012802002003200610212205450d020c030b200128020021050c030b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a2001103e2002200041106a36020c2002410c6a2001109801200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a2001103e200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b200141086a220b200341016a360200200620036a410e3a00002000410c6a28020021032002200041146a280200220036020c2002410c6a2001103e2000450d1320004105742107200141046a210902400340024002400240024020052802002206200428020022006b41204f0d00200041206a220a2000490d2620064101742200200a200a2000491b22004100480d262006450d01200128020020062000102122060d020c050b200128020021060c020b200010222206450d030b2001200636020020092000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000c150b0b200041011023000b20012006360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200620036a41003a00002000410c6a20011097012002200041306a36020c2002410c6a200110980102400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200528020020042802002200470d03200041016a22032000490d2f20004101742205200320032005491b22054100480d2f2000450d0720012802002000200510212203450d080c0f0b200528020020042802002200470d01200041016a22032000490d2e20004101742205200320032005491b22054100480d2e2000450d0420012802002000200510212203450d050c0c0b200528020020042802002200470d02200041016a22032000490d2d20004101742205200320032005491b22054100480d2d2000450d0720012802002000200510212203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102222030d070b200541011023000b2005102222030d070b200541011023000b2005102222030d010b200541011023000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a00000c150b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a0000200041086a280200417f6a220341044b0d0f0240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d0f20012802002003200510212204450d100c1c0b200141046a280200200141086a2802002203470d03200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d0820012802002003200510212204450d090c190b200141046a280200200141086a2802002203470d03200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d0920012802002003200510212204450d0a0c160b200141046a280200200141086a2802002203470d03200341016a22042003490d1020034101742205200420042005491b22054100480d102003450d0a20012802002003200510212204450d0b0c130b200141046a280200200141086a2802002203470d04200341016a22042003490d0f20034101742205200420042005491b22054100480d0f2003450d0d20012802002003200510212204450d0e0c100b200128020021040c160b200128020021040c130b200128020021040c100b200128020021040c150b200128020021040c0c0b2005102222040d100b200541011023000b2005102222040d0c0b200541011023000b2005102222040d080b200541011023000b2005102222040d0c0b200541011023000b2005102222040d020b200541011023000b1024000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a2001109801200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a2001103e2002200041186a36020c2002410c6a2001109801200041286a2001109601200041106a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a36020c2002410c6a20011098012000410c6a2001109701200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a280200417f6a220341064b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0700040203010506000b200141046a280200200141086a2802002203470d09200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d1320012802002003200510212204450d140c2a0b200141046a280200200141086a2802002203470d05200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0c20012802002003200510212204450d0d0c270b200141046a280200200141086a2802002203470d05200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0d20012802002003200510212204450d0e0c240b200141046a280200200141086a2802002203470d05200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0e20012802002003200510212204450d0f0c210b200141046a280200200141086a2802002200470d06200041016a22032000490d2820004101742204200320032004491b22044100480d282000450d1120012802002000200410212203450d120c1e0b200141046a280200200141086a2802002203470d06200341016a22042003490d2720034101742205200420042005491b22044100480d272003450d1220012802002003200410212205450d130c180b200141046a280200200141086a2802002203470d06200341016a22042003490d2620034101742205200420042005491b22054100480d262003450d1320012802002003200510212204450d140c150b200128020021040c220b200128020021040c1f0b200128020021040c1c0b200128020021040c210b200128020021030c180b200128020021050c120b200128020021040c0f0b2005102222040d1a0b200541011023000b2005102222040d160b200541011023000b2005102222040d120b200541011023000b2005102222040d160b200541011023000b2004102222030d0c0b200441011023000b2004102222050d050b200441011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00002000410c6a28020021042002200041146a280200220036020c2002410c6a2001103e2000450d0220042000410c6c6a2109200141046a210a02400340200428020021072002200441086a280200220036020c2002410c6a2001103e0240024002400240200a2802002206200528020022036b20004f0d00200320006a220b2003490d1520064101742203200b200b2003491b22034100480d152006450d01200128020020062003102122060d020c050b200128020021060c020b200310222206450d030b20012006360200200a2003360200200528020021030b2005200320006a360200200620036a200720001084041a2004410c6a22042009470d000c040b0b200341011023000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41053a00002000410c6a28020021032002200041146a280200220036020c2002410c6a2001103e2000450d002003200041186c6a2109200141046a210603402003280200210a2002200341086a280200220036020c2002410c6a2001103e024002400240024020062802002207200428020022056b20004f0d00200520006a220b2005490d1220074101742205200b200b2005491b22054100480d122007450d01200128020020072005102122070d020c060b200128020021070c020b200510222207450d040b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200a20001084041a2003410c6a280200210a2002200341146a280200220036020c2002410c6a2001103e024002400240024020062802002207200428020022056b20004f0d00200520006a220b2005490d1220074101742205200b200b2005491b22054100480d122007450d01200128020020072005102122070d020c070b200128020021070c020b200510222207450d050b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200a20001084041a200341186a22032009470d000b0b200241106a24000f0b200541011023000b200541011023000b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041106a290300210802400240024002400240200141046a2802002203200528020022006b41084f0d00200041086a22042000490d0b20034101742200200420042000491b22004100480d0b2003450d0120012802002003200010212203450d020c030b200128020021030c030b2000102222030d010b200041011023000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200320006a2008370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d0920044101742203200520052003491b22034100480d092004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d0720044101742203200520052003491b22034100480d072004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001103e024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310212204450d020c040b200128020021040c040b2003102222040d020b200341011023000b1024000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000bc00903017f017e057f230041e0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002903002203423f560d00200141046a280200200141086a2802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d0520012802002000200510212204450d060c190b2003428080015a0d01200141046a2802002204200141086a28020022006b41024f0d02200041026a22052000490d1020044101742200200520052000491b22004100480d102004450d0820012802002004200010212204450d090c160b200128020021040c180b20034280808080045a0d01200141046a2802002204200141086a28020022006b41044f0d04200041046a22052000490d0e20044101742200200520052000491b22004100480d0e2004450d08200128020020042000102122040d090c120b200128020021040c140b4108200379a74103766b22064104490d0e200141046a280200200141086a2802002205470d03200541016a22042005490d0c20054101742207200420042007491b22044100480d0c2005450d09200128020020052004102122070d0a0c110b2005102222040d130b200541011023000b200128020021040c050b200128020021070c070b2000102222040d0d0b200041011023000b200010222204450d090b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a7410274410272360000200241e0006a24000f0b200410222207450d070b20012007360200200141046a2004360200200141086a28020021050b200141086a2204200541016a360200200720056a200641027441736a3a0000200220002903002203370308200141046a210703400240024002400240200728020020042802002200470d00200041016a22052000490d0520004101742208200520052008491b22084100480d052000450d01200128020020002008102122050d020c060b200128020021050c020b200810222205450d040b2001200536020020072008360200200428020021000b2004200041016a360200200520006a2003a73a0000200342088821032006417f6a22060d000b20022003370308200350450d03200241e0006a24000f0b1024000b200841011023000b41e8e4c200102f000b2002200241086a36024020024180e5c200360244200241c8006a41146a4100360200200241286a41146a4104360200200241346a411e360200200241106a41146a4103360200200241c8d7c4003602582002420137024c20024188e5c2003602482002411e36022c20024203370214200241fcd1c4003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a4190e5c2001048000b200041011023000b200441011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b0000200241e0006a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a0000200241e0006a24000b8e0a01037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00004101470d00200041046a280200220241ffff034d0d01200141046a280200200141086a2802002200470d03200041016a22032000490d1820004101742204200320032004491b22044100480d182000450d0920012802002000200410212203450d0a0c160b200141046a280200200141086a2802002202470d01200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0420012802002002200410212203450d050c130b200241ef014b0d02200141046a280200200141086a2802002200470d05200041016a22032000490d1620004101742204200320032004491b22044100480d162000450d09200128020020002004102122030d0a0c0f0b200128020021030c120b200128020021030c130b200141046a280200200141086a2802002200470d03200041016a22032000490d1320004101742204200320032004491b22044100480d132000450d09200128020020002004102122030d0a0c0d0b2004102222030d0e0b200441011023000b200128020021030c050b200128020021030c070b2004102222030d0c0b200441011023000b200410222203450d050b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b200410222203450d030b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a00000240024002400240200141046a2802002203200428020022006b41024f0d00200041026a22042000490d0b20034101742200200420042000491b22004100480d0b2003450d01200128020020032000102122030d020c060b200128020021030c020b200010222203450d040b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b200441011023000b200441011023000b200041011023000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240024002400240200141046a2802002203200428020022026b41204f0d00200241206a22042002490d0720034101742202200420042002491b22024100480d072003450d0120012802002003200210212203450d020c030b200128020021030c030b2002102222030d010b200241011023000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a0000024002400240200141046a2802002203200428020022006b41044f0d00200041046a22042000490d0320034101742200200420042000491b22004100480d032003450d0120012802002003200010212203450d020c040b200128020021030c040b2000102222030d020b200041011023000b1024000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000b960a03017f027e057f230041e0006b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d00200141046a280200200141086a2802002200470d01200041016a22052000490d1120004101742206200520052006491b22064100480d112000450d0520012802002000200610212205450d060c190b20034280800154410020051b450d01200141046a2802002205200141086a28020022006b41024f0d02200041026a22062000490d1020054101742200200620062000491b22004100480d102005450d0820012802002005200010212205450d090c160b200128020021050c180b200342808080800454410020051b450d01200141046a2802002205200141086a28020022006b41044f0d04200041046a22062000490d0e20054101742200200620062000491b22004100480d0e2005450d08200128020020052000102122050d090c120b200128020021050c140b411020047920037942c0007c20044200521ba74103766b22074104490d0e200141046a280200200141086a2802002206470d03200641016a22052006490d0c20064101742208200520052008491b22054100480d0c2006450d09200128020020062005102122080d0a0c110b2006102222050d130b200641011023000b200128020021050c050b200128020021080c070b2000102222050d0d0b200041011023000b200010222205450d090b20012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a7410274410272360000200241e0006a24000f0b200510222208450d070b20012008360200200141046a2005360200200141086a28020021060b200141086a2205200641016a360200200820066a200741027441736a3a0000200029030021032002200041086a290300220437030820022003370300200141046a210803400240024002400240200828020020052802002200470d00200041016a22062000490d0520004101742209200620062009491b22094100480d052000450d01200128020020002009102122060d020c060b200128020021060c020b200910222206450d040b2001200636020020082009360200200528020021000b2005200041016a360200200620006a2003a73a000020034208882004423886842103200442088821042007417f6a22070d000b2002200337030020022004370308200320048450450d03200241e0006a24000f0b1024000b200941011023000b41909dc300102f000b20022002360240200241a89dc300360244200241c8006a41146a4100360200200241286a41146a4104360200200241346a411f360200200241106a41146a4103360200200241c8d7c4003602582002420137024c20024188e5c2003602482002411f36022c20024203370214200241fcd1c4003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a41b89dc3001048000b200041011023000b200541011023000b20012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b0000200241e0006a24000f0b20012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a0000200241e0006a24000be01002047f017e2000280240210202400240024002400240024002400240200141046a2802002203200141086a28020022046b41044f0d00200441046a22052004490d0520034101742204200520052004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200320046a20023600002000290300210602400240024002400240200141046a2802002203200528020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290308210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290310210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290318210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290320210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290328210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290330210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290338210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000280244210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280248210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a2005360000024002400240200141046a28020020022802002204470d00200441016a22032004490d0320044101742202200320032002491b22024100480d032004450d0120012802002004200210212203450d020c040b200128020021030c040b2002102222030d020b200241011023000b1024000b20012003360200200141046a2002360200200141086a28020021040b200141086a200441016a360200200320046a200041cc006a2d00003a00000bdb0f03047f017e037f230041206b2202240002400240024020012d000022034101460d0020030d0241012103200141016a21010c010b2001410c6a2802002104200141046a2802002101410021030b200241106a20043602002002200136020c200220033602082000200241086a109b01200241206a24000f0b2002410036021020024201370308024002400240024002400240024002400240410110222203450d002002410136020c200241086a41086a22042004280200220541016a36020020022003360208200320056a41023a00000240024002400240024002400240200141086a2802004101470d00200228020c20042802002203470d01200341016a22042003490d0d20034101742205200420042005491b22054100480d0d2003450d0320022802082003200510212204450d040c0a0b200228020c20042802002203470d01200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d0420022802082003200510212204450d050c070b200228020821040c090b200228020821040c060b2005102222040d060b200541011023000b2005102222040d020b200541011023000b410141011023000b2002200536020c20022004360208200241106a28020021030b200241086a41086a2205200341016a360200200420036a41003a0000200141186a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0820044101742203200520052003491b22034100480d082004450d0120022802082004200310212204450d020c030b200228020821040c030b2003102222040d010b200341011023000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2207200341086a360200200420036a20063700002001410c6a28020021032002200141146a280200220136021c2002411c6a200241086a103e2001450d022003200141286c6a21080240024003400240024002400240200228020c2204200728020022096b41204f0d00200941206a22012009490d0a20044101742205200120012005491b22014100480d0a2004450d01200228020820042001102122050d020c050b200228020821050c020b200110222205450d030b2002200136020c2002200536020820072802002109200121040b2007200941206a2201360200200520096a220941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020092003290000370000200341206a29030021060240200420016b41074b0d00200141086a22092001490d0720044101742201200920092001491b22014100480d07024002402004450d00200520042001102122050d010c050b200110222205450d040b2002200136020c20022005360208200728020021010b2007200141086a360200200520016a20063700002008200341286a2203470d000c050b0b200141011023000b200141011023000b2002200536020c20022004360208200241106a28020021030b200241086a41086a2205200341016a360200200420036a41013a0000200141186a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0620044101742203200520052003491b22034100480d062004450d0120022802082004200310212204450d020c030b200228020821040c030b2003102222040d010b200341011023000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2205200341086a360200200420036a2006370000200141206a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0620044101742203200520052003491b22034100480d062004450d0120022802082004200310212204450d020c030b200228020821040c030b2003102222040d010b200341011023000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2207200341086a360200200420036a20063700002001410c6a28020021032002200141146a280200220136021c2002411c6a200241086a103e2001450d002003200141286c6a210803400240024002400240200228020c2204200728020022096b41204f0d00200941206a22012009490d0620044101742205200120012005491b22014100480d062004450d01200228020820042001102122050d020c070b200228020821050c020b200110222205450d050b2002200136020c2002200536020820072802002109200121040b2007200941206a2201360200200520096a220941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020092003290000370000200341206a29030021060240200420016b41074b0d00200141086a22092001490d0320044101742201200920092001491b22014100480d03024002402004450d00200520042001102122050d010c070b200110222205450d060b2002200136020c20022005360208200728020021010b2007200141086a360200200520016a20063700002008200341286a2203470d000b0b200228020c210120022802082103200241106a220420042802003602002002200336020c200241043602082000200241086a109b0102402001450d00200310200b200241206a24000f0b1024000b200141011023000b200141011023000bcd0f02077f017e230041106b22022400200241003602082002420137030002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220341034b0d00024020030e0400040203000b20012802042101410110222203450d1120024101360204200241086a22042004280200220541016a36020020022003360200200320056a41023a000020022802042205200428020022036b41204f0d06200341206a22042003490d1c20054101742203200420042003491b22034100480d1c2005450d0c20022802002005200310212204450d0d0c1f0b200141086a280200210320012802042101410110222204450d11200241086a22052005280200220541016a3602002002410136020420022004360200200420056a41013a00002002200336020c2002410c6a2002103e2003450d2020034105742106200241086a220728020021042002280204210503400240024002400240200520046b41204f0d00200441206a22032004490d2020054101742204200320032004491b22044100480d202005450d01200228020020052004102122080d020c140b20022802002108200421030c020b200410222208450d120b200220043602042002200836020020072802002103200421050b2007200341206a2204360200200820036a220341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a29000037000020032001290000370000200141206a2101200641606a22060d000c210b0b2001410c6a2802002103200141086a280200210820012802042106410110222201450d1120024101360204200241086a22042004280200220541016a36020020022001360200200120056a41043a000020022802042205200428020022016b41044f0d02200141046a22042001490d1a20054101742201200420042001491b22014100480d1a2005450d0620022802002005200110212204450d070c180b200141086a280200210320012802042108410110222201450d1120024101360204200241086a22042004280200220541016a36020020022001360200200120056a41003a00002002200336020c2002410c6a2002103e20022802042205200428020022016b20034f0d02200120036a22042001490d1920054101742201200420042001491b22014100480d192005450d0720022802002005200110212204450d080c150b200141086a280200210320012802042105410110222201450d1120024101360204200241086a22042004280200220841016a36020020022001360200200120086a41033a00002005290300210920022802042205200428020022016b41084f0d03200141086a22042001490d1820054101742201200420042001491b22014100480d182005450d0a20022802002005200110212204450d0b0c120b200228020021040c160b200228020021040c130b200228020021040c190b200228020021040c0f0b2001102222040d110b200141011023000b2001102222040d0d0b200141011023000b2003102222040d120b200341011023000b2001102222040d070b200141011023000b200441011023000b410141011023000b410141011023000b410141011023000b410141011023000b410141011023000b2002200136020420022004360200200241086a28020021010b200241086a2205200141086a360200200420016a20093700000240024002400240024020022802042204200528020022016b41c0004f0d00200141c0006a22052001490d0920044101742201200520052001491b22014100480d092004450d0120022802002004200110212204450d020c030b200228020021040c030b2001102222040d010b200141011023000b2002200136020420022004360200200241086a28020021010b200241086a200141c0006a360200200420016a220141086a200341086a290000370000200141106a200341106a290000370000200141186a200341186a290000370000200141206a200341206a290000370000200141286a200341286a290000370000200141306a200341306a290000370000200141386a200341386a290000370000200120032900003700000c090b2002200136020420022004360200200241086a28020021010b200241086a200120036a360200200420016a200820031084041a0c070b2002200136020420022004360200200241086a28020021010b200241086a2205200141046a360200200420016a20062800003600002002200336020c2002410c6a2002103e02400240024020022802042204200528020022016b20034f0d00200120036a22052001490d0320044101742201200520052001491b22014100480d032004450d0120022802002004200110212204450d020c040b200228020021040c040b2001102222040d020b200141011023000b1024000b2002200136020420022004360200200241086a28020021010b200241086a200120036a360200200420016a200820031084041a0c020b2002200336020420022004360200200241086a28020021030b200241086a200341206a360200200420036a220341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a290000370000200320012900003700000b20002002290300370200200041086a200241086a280200360200200241106a24000bac0201027f230041206b2202240002400240410610222203450d00200341046a41002f00b48c403b0000200341002800b08c4036000020034106410c10212203450d01200320013600060240024002402003410a41c8d7c400410041001001417f460d00200241186a4200370300200241106a4200370300200241086a4200370300200242003703002003410a20024120410010012201417f460d022001411f4d0d0220002002290300370000200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b20031020200241206a24000f0b419a88c00041331039000b410641011023000b410c41011023000b820303047f017e017f230041206b220124000240024002400240410610222202450d00200241046a41002f00b48c403b0000200241002800b08c4036000020024106410c10212202450d01200241086a41002d00a293423a0000200241002f00a093423b00060240024002402002410941c8d7c400410041001001417f460d00200141003602004101210320024109200141044100100141016a41044d0d0220012802002104200210202004450d012004ad4205862205422088a70d052005a722024100480d05200210222203450d064100210620032102034020012006109c01200241186a200141186a290000370000200241106a200141106a290000370000200241086a200141086a29000037000020022001290000370000200241206a21022004200641016a2206470d000c020b0b2002102041012103410021040b200020043602082000200436020420002003360200200141206a24000f0b419a88c00041331039000b410641011023000b410c41011023000b1024000b200241011023000b840803037f017e067f230041c0006b22012400200141206a41086a220242003703002001420037032041b68cc000411d200141206a1002200141086a2002290300370300200120012903203703000240024002400240024002400240024002402001411041c8d7c400410041001001417f460d002001421037021420012001360210200141206a200141106a103820012802202202450d0102402001280224450d00200210200b20002802002202450d08200041046a280200450d0820021020200141c0006a24000f0b024002400240024020002802002203450d00200029020421040c010b410610222200450d05200041046a41002f00b48c403b0000200041002800b08c4036000020004106410c10212200450d06200041086a41002d00a293423a0000200041002f00a093423b0006024002402000410941c8d7c400410041001001417f460d00200141003602204101210320004109200141206a41044100100141016a41044d0d0620012802202105200010202005450d012005ad4205862204422088a70d032004a722004100480d03200010222203450d0941002102200321000340200141206a2002109c01200041186a200141206a41186a290000370000200041106a200141206a41106a290000370000200041086a200141206a41086a29000037000020002001290020370000200041206a21002005200241016a2202470d000c020b0b2000102041012103410021050b2005ad220442208620048421040b200141206a41086a220042003703002001420037032041b68cc000411d200141206a1002200141086a200029030037030020012001290320370300200141003602282001420137032020012004422088a72202360210200141106a200141206a103e02402002450d00200241057421064100200028020022026b210720012802202108200128022421092003210003400240200920076a411f4b0d00200241206a22052002490d032009410174220a20052005200a491b22054100480d03024002402009450d00200820092005102122080d010c060b200510222208450d050b200521090b200820026a22052000290000370000200541186a200041186a290000370000200541106a200041106a290000370000200541086a200041086a290000370000200741606a2107200241206a2102200041206a2100200641606a22060d000b200141286a20023602002001200936022420012008360220200141102008200210032009450d090c080b2001280224210220014110200128022022082000280200100320020d070c080b1024000b200541011023000b419a88c00041331039000b419a88c00041331039000b410641011023000b410c41011023000b200041011023000b200810200b2004a7450d00200310200b200141c0006a24000bd91705017f017e037f017e067f23004180066b22042400200441b8036a200141e8011084041a200441a0026a200441b8036a10a00102400240024020042802a0024101470d00200041086a20042902a4023702002000420137020020032802002200450d020c010b200441a0026a41086a290300210520044198016a200441a0026a41106a4188011084041a20042005370308200441086a41086a20044198016a418801108404210620044198016a41086a22014200370300200442003703980141a0c7c000411720044198016a1002200441b8036a41086a200129030037030020042004290398013703b80341002101024002400240024002400240024002400240024002400240024002400240200441b8036a411041c8d7c400410041001001417f460d00200441003602a002200441b8036a4110200441a0026a41044100100141016a41044d0d0120042802a00221010b41042107200120026a41808080024b0d0d410021080240200441106a410020042903084201511b2201450d002001450d00024002400240200110a101220520012903202209520d00410321072001200210a2010d11411310222207450d0d2007410f6a410028008ec940360000200741086a4100290087c940370000200741002900ffc84037000020074113413310212207450d0e200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441b8036a41186a220a4200370300200441b8036a41106a220b4200370300200441b8036a41086a220c4200370300200442003703b80320074133200441b8036a1000200441a0026a41186a200a290300370300200441a0026a41106a200b290300370300200441a0026a41086a200c290300370300200420042903b8033703a002200441a0026a412041c8d7c400410041001001417f460d01200442003703b803200441a0026a4120200441b8036a41084100100141016a41084d0d0820042903b80342017c2105200710204113210a4113102222070d020c0f0b4101410220092005541b21070c100b42012105200710204113210a411310222207450d0d0b2007410f6a410028008ec940360000200741086a4100290087c940370000200741002900ffc8403700002007200a413310212207450d0d200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441b8036a41186a22014200370300200441b8036a41106a220a4200370300200441b8036a41086a220b4200370300200442003703b80320074133200441b8036a1000200441a0026a41186a2001290300370300200441a0026a41106a200a290300370300200441a0026a41086a200b290300370300200420042903b8033703a002200420053703b803200441a0026a4120200441b8036a41081003200710200b024020032802002207450d00200341086a28020021012003280204210d4100210b024041cec6c000411041c8d7c400410041001001417f460d00200441003602b80341cec6c0004110200441b8036a41044100100141016a41044d0d0520042802b803210b0b411410222208450d06200841106a41002800bcc840360000200841086a41002900b4c840370000200841002900acc8403700002008411441281021220a450d07200a200b360014200441b8036a41186a22084200370300200441b8036a41106a220b4200370300200441b8036a41086a220c4200370300200442003703b803200a4118200441b8036a1000200441a0026a41186a2008290300370300200441a0026a41106a200b290300370300200441a0026a41086a200c290300370300200420042903b8033703a002200441003602c003200442013703b803200420013602980120044198016a200441b8036a103e024002400240024020042802bc03220c20042802c003220b6b20014f0d00200b20016a2208200b490d0c200c410174220e20082008200e491b220e4100480d0c200c450d0120042802b803200c200e102122080d020c0d0b20042802b80321080c020b200e10222208450d0b0b2004200e3602bc03200420083602b803200e210c0b2008200b6a200720011084041a200441a0026a41202008200b20016a10030240200c450d00200810200b200a102041012108200d450d00200710200b20042903082105200441b8036a200441306a41e8001084041a200441a0026a200441b8036a41086a41e0001084041a20044198016a41186a220a200641186a29030037030020044198016a41106a220b200641106a29030037030020044198016a41086a220c200641086a290300370300200420062903003703980141002101024020054201520d00200441c0056a41186a200a290300370300200441c0056a41106a200b290300370300200441c0056a41086a200c29030037030020042004290398013703c005410121010b20044198016a200441a0026a41e0001084041a200441e0056a41186a2206200441c0056a41186a220a290300370300200441e0056a41106a220b200441c0056a41106a220c290300370300200441e0056a41086a220d200441c0056a41086a220e290300370300200420042903c0053703e005200441a0026a20044198016a41e0001084041a200441a0056a41186a220f2006290300370300200441a0056a41106a2206200b290300370300200441a0056a41086a220b200d290300370300200420042903e0053703a005200441b8036a200441a0026a41e0001084041a200a200f290300370300200c2006290300370300200e200b290300370300200420042903a0053703c0054102210602402001450d00200441e0056a41186a200441c0056a41186a290300370300200441e0056a41106a200441c0056a41106a290300370300200441e0056a41086a200441c0056a41086a290300370300200420042903c0053703e005410121060b200441a2016a200441e0056a41086a290300370100200441aa016a200441e0056a41106a290300370100200441b2016a200441f8056a290300370100200420063a009901200441003a009801200420042903e00537019a012004200441b8036a20044198016a10a3012004280204210620042802002101200441003a00b803200420014100473a00b903200441b8036a103d0240024041cec6c000411041c8d7c400410041001001417f460d00200441003602b80341cec6c0004110200441b8036a41044100100141016a41044d0d0320042802b80341016a210a0c010b4101210a0b20044198016a41086a220b4200370300200442003703980141a0c7c000411720044198016a1002200441b8036a41086a200b29030037030020042004290398013703b80302400240200441b8036a411041c8d7c400410041001001417f460d002004410036029801200441b8036a411020044198016a41044100100141016a41044d0d04200428029801210b0c010b4100210b0b2004200a3602b80341cec6c0004110200441b8036a4104100320044198016a41086a220a4200370300200442003703980141a0c7c000411720044198016a1002200441b8036a41086a200a29030037030020042004290398013703b8032004417f2002200b6a220a200a2002491b36029801200441b8036a411020044198016a410410030240024002402001450d0002402006411b470d00200141e2acc200460d02200141e2acc200411b108604450d020b200041086a2006360200200041046a200136020020004100360200200745200872450d020c120b20004100360204200041086a200636020020004100360200200745200872450d010c110b200041046a4104360200200041013602002007452008720d100b200341046a280200450d0f200710200c0f0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411441011023000b412841011023000b1024000b200e41011023000b411341011023000b413341011023000b200a41011023000b413341011023000b2000410136020020002007360204200441386a10930120032802002200450d010b200341046a280200450d002000102020044180066a24000f0b20044180066a24000bea1607017f027e037f017e017f037e047f23004180046b2202240002400240200129037022034202520d00200241086a20014188016a41e0001084041a420021030c010b20024186016a2001410b6a2d00003a0000200241e8006a41086a2001411c6a290200370300200241e8006a410d6a200141216a290000370000200220012f00093b018401200220012902143703682001410c6a280200210520012d0008210620012802102107200241c0016a200141e4006a290000370300200241b8016a200141dc006a290000370300200241b0016a200141d4006a290000370300200241a8016a200141cc006a290000370300200241a0016a200141c4006a29000037030020024188016a41106a2001413c6a29000037030020024188016a41086a200141346a2900003703002002200129002c3703880120012903002108200241c8016a41106a200141f0006a220941106a290300370300200241c8016a41086a200941086a290300370300200220092903003703c80120014180016a290300210a2001290378210b4200210c200241a8026a41086a22094200370300200242003703a80241cdc8c000410d200241a8026a1002200241086a41086a2009290300370300200220022903a80237030842002104024002400240024002400240024002400240024002400240200241086a411041c8d7c400410041001001417f460d00200242003703a802200241086a4110200241a8026a41084100100141016a41084d0d0120022903a80221040b024020034201520d00200b500d022004200a200a2004541b22032003200a7d200b827d210c0b200241a8026a200c10dd01200241fc016a41026a20022d00aa023a0000200241086a41086a2209200241bb026a290000370300200241086a410d6a220d200241c0026a290000370000200220022f01a8023b01fc01200220022900b30237030820022800ab02210e20022800af02210f200241e0016a410d6a200d290000370000200241e0016a41086a2009290300370300200220022903083703e001200241ec036a41026a220920024184016a41026a2d00003a0000200241a8026a41086a220d200241e8006a41086a290300370300200241a8026a410d6a2210200241e8006a410d6a290000370000200220022f0184013b01ec03200220022903683703a8020240024002400240024002400240200641ff01714101470d00200241f0036a2005410676103720022802f003210920022802f8032005413f7122054d0d01200241e8036a41026a200920054105746a220541026a2d00003a0000200241d0036a200541136a290000370300200241d5036a200541186a290000370000200220052f00003b01e8032002200529000b3703c80320052800072107200528000321054101210620022802f4030d020c030b200241e8036a41026a20092d00003a0000200241c8036a41086a200d290300370300200241c8036a410d6a2010290000370000200220022f01ec033b01e803200220022903a8023703c8030c030b4100210620022802f403450d010b200910200b2006450d010b200241f0036a41026a200241e8036a41026a2d00003a0000200241a8026a41086a200241c8036a41086a290300370300200241a8026a410d6a200241c8036a410d6a290000370000200220022f01e8033b01f003200220022903c8033703a802410021090c010b41012109411521074195a9c00021050b200241a4026a41026a2206200241f0036a41026a2d00003a0000200241086a41086a220d200241a8026a41086a2210290300370300200241086a41106a200241a8026a41106a290300370300200220022f01f0033b01a402200220022903a80237030802402009450d002000200536020420004101360200200041086a200736020020014188016a10920120024180046a24000f0b20024193026a200d29030037000020024198026a200241086a410d6a290000370000200220022f01a4023b018002200220073600870220022005360083022002200229030837008b02200220062d00003a008202200220083703a802201020014188016a41e000108404210d200241af036a200f360000200241ab036a200e360000200241a0036a200241c8016a41106a29030037030020024198036a2201200241c8016a41086a290300370300200241aa036a200241fc016a41026a2d00003a0000200241b3036a20022903e001370000200241bb036a200241e0016a41086a290300370000200241c0036a200241e0016a410d6a290000370000200220022903c80137039003200220022f01fc013b01a8032002410036021020024201370308200241a8026a200241086a109601200d200241086a1095010240024002400240024002402002290390034201520d0020012903002203420c882204420120044201561b22044200510d08200241a0036a2903002004802104200228020c2205200241106a28020022016b41024f0d01200141026a22092001490d0e20054101742201200920092001491b22014100480d0e2005450d0420022802082005200110212205450d050c0b0b0240200228020c200241106a2802002201470d00200141016a22052001490d0e20014101742209200520052009491b22094100480d0e2001450d0220022802082001200910212205450d030c090b200228020821050c090b200228020821050c0a0b2009102222050d060b200941011023000b2001102222050d060b200141011023000b419a88c00041331039000b41b0d0c400102f000b41f0c9c100102f000b2002200936020c20022005360208200241106a28020021010b200241106a200141016a360200200520016a41003a00000c020b2002200136020c20022005360208200241106a28020021010b200241106a200141026a360200200520016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b024002400240200228020c2206200241106a28020022016b41204f0d00200141206a22052001490d0320064101742201200520052001491b22094100480d032006450d0120022802082006200910212205450d020c040b200228020821050c040b2009102222050d020b200941011023000b1024000b2002200936020c20022005360208200241106a2802002101200921060b200520016a2209200241a8036a2207290000370000200941186a200741186a290000370000200941106a200741106a290000370000200941086a200741086a2900003700000240024002400240200141206a2201418102490d00200241086a41186a22094200370300200241086a41106a22074200370300200241086a41086a220e42003703002002420037030820052001200241086a1000200241c8036a41186a2009290300370300200241c8036a41106a2007290300370300200241c8036a41086a200e290300370300200220022903083703c803200241c8036a412020024188016a20024180026a100d450d01200241c8036a412020024188016a20024180026a100e45210120060d020c030b2005200120024188016a20024180026a100d450d002005200120024188016a20024180026a100e45210120060d010c020b410121012006450d010b200510200b02402001450d00200241c8036a41186a20024180026a41186a290300370300200241c8036a41106a20024180026a41106a290300370300200241c8036a41086a20024180026a41086a29030037030020022002290380023703c80320022903a8022104200241086a200d41e0001084041a420121030c010b200041b4c0c00036020420004101360200200041086a411a360200200d10920120024180046a24000f0b200041086a2003370300200041306a2004370300200041106a20022903c803370300200041186a200241c8036a41086a290300370300200041206a200241c8036a41106a290300370300200041286a200241c8036a41186a290300370300200041386a200241086a41e0001084041a2000410036020020024180046a24000bec0203027f017e027f230041c0006b2201240002400240411310222202450d002002410f6a410028008ec940360000200241086a4100290087c940370000200241002900ffc84037000020024113413310212202450d01200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a29000037000042002103200141206a41186a22004200370300200141206a41106a22044200370300200141206a41086a220542003703002001420037032020024133200141206a1000200141186a2000290300370300200141106a2004290300370300200141086a200529030037030020012001290320370300024002402001412041c8d7c400410041001001417f460d002001420037032020014120200141206a41084100100141016a41084d0d01200129032021030b20021020200141c0006a240020030f0b419a88c00041331039000b411341011023000b413341011023000b9e0604017f017e037f047e230041c0006b2202240042002103200241186a41086a220442003703002002420037031841c0eec000411b200241186a1002200241306a41086a220520042903003703002002200229031837033002400240024002400240200241306a411041c8d7c400410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012206417f460d022006410f4d0d02200241206a2903002107200229031821080c010b42002108420021070b200442003703002002420037031841dbeec000411b200241186a1002200520042903003703002002200229031837033002400240200241306a411041c8d7c400410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012204417f460d032004410f4d0d03200241206a2903002109200229031821030c010b420021090b4200210a200241086a200320092001ad4200108804200241186a20002002290308220320087c2208200241086a41086a29030020077c2008200354ad7c410110aa02024020022802184101470d00200228021c2104200241c0006a240020040f0b200241186a41106a2903002108200241186a41086a220429030021072004420037030020024200370318418feec0004116200241186a1002200241306a41086a20042903003703002002200229031837033002400240200241306a411041c8d7c400410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012204417f460d042004410f4d0d04200241206a29030021032002290318210a0c010b420021030b200241186a41086a2204420037030020024200370318418feec0004116200241186a1002200241306a41086a20042903003703002002200229031837033020024200200320087d200a200754ad7d2208200a20077d2207200a56200820035620082003511b22041b37032020024200200720041b370318200241306a4110200241186a41101003200241c0006a240041000f0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000bdcc8010b027f017e097f047e017f027e017f017e207f077e027f23004190086b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2204410d4b0d00024002400240024002400240024020040e0e004505090d0c0608040b030a0102000b200341c0036a41086a200141106a2903003703002003200141086a29030022053703c0032005a72206417f6a220441064b0d49200241096a2800002107200241056a280000210820022d0001210920022d00002102024020040e0700201e1f1d2122000b4101210a200341c8036a280200210620032802c403210b200241ff017145200941ff0171410146712202450d2a02402006450d00200b10200b410021094101210c41012108410121060c310b200341a0076a200141086a41d8001084041a200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c00320034188026a200341a0076a200341c0036a10a401200328028c0221072003280288022104410021094101210d41012106410121084101210b4101210e4101210a4101210c0ca0010b200341d0026a41086a2001411c6a2902003703002003200141146a2902003703d002200141106a28020021072001410c6a2802002104200141086a2802002106200141246a3502002105200141286a310000210f20012802042109200341e0056a41086a22082002410a6a290100370300200341e0056a41106a220b200241126a290100370300200341e0056a41186a220e2002411a6a2901003703002003200241026a2901003703e00520022d0001210a20022d0000210220094101460d0c20094102470d48200341f0026a41086a200341d0026a41086a290300370300200320032903d0023703f00220034190036a41186a200341e0056a41186a29030037030020034190036a41106a200341e0056a41106a29030037030020034190036a41086a200341e0056a41086a290300370300200320032903e00537039003200241ff01710d0e200341b0036a41086a20034190036a41136a2900003703002003200329009b033703b003200a41ff01714101470d0e20032d009203210820032f019003210b20034190036a411f6a310000211020033500ab032111200328009703210e200328009303210a20034180056a41086a220c200341b0036a41086a2202290300370300200320032903b00337038005200341a0076a41086a2209200c29030037030020032003290380053703a007200341c0036a41136a20092903003700002003201120104220868422103e00db03200341c0036a411f6a20104220883c00002003200e3600c7032003200a3600c303200320032903a0073700cb032003200b20084110747222083b01c003200320084110763a00c20320024200370300200342003703b00341ead2c2004108200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f460d35200341a8036a420037030020034190036a41106a420037030020034190036a41086a42003703002003420037039003200341c0026a411020034190036a4120410010012202417f460d4f2002411f4d0d4f200341b0036a41086a220220034190036a41136a2900003703002003200329009b033703b00320034190036a411f6a3100002110200329009303211120033500ab03211220032f019003210920032d0092032108200341a0046a41086a220b2002290300370300200320083a00a207200320093b01a007200320032903b0033703a004200341a0076a411f6a20103c0000200341a0076a41136a200b290300370000200320123e00bb07200320113700a307200320032903a0043700ab070c360b200141086a28020021092001280204210620022d00000d0a4101210d20022d00014101470d0a200241096a280000210702402009450d00200610200b4100210c41012106410121084101210b4101210e4101210a41012109410121134100210420012802002202410d4d0d9f010ca0010b200341a0076a41206a200141246a290200370300200341a0076a41186a2001411c6a290200370300200341a0076a41106a200141146a290200370300200341a0076a41086a2001410c6a290200370300200320012902043703a007200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c003200341d8016a200341a0076a200341c0036a10a50120032802dc01210720032802d80121044100210a4101210d41012106410121084101210b4101210e0c9b010b200341d0026a41086a220b200141206a2902003703002003200141186a2902003703d002200141386a2903002110200141306a2903002111200141c8006a2903002112200141c0006a2903002114200141146a2802002107200141106a28020021042001410c6a2d00002113200141086a28020021092001410f6a2d00002106200141286a35020021052001412c6a310000210f20012f000d2108200341e0056a41086a220e2002410a6a290100370300200341e0056a41106a220a200241126a290100370300200341e0056a41186a220c2002411a6a2901003703002003200241026a2901003703e0052005200f4220868421052008200641107472210820022d0001210620022d0000210220094101460d0a20094102470d46200341c0066a41086a2209200341d0026a41086a290300370300200320032903d0023703c006200620027241ff01710d1420034190036a41086a2009290300370300200320032903c00637039003201341ff01714101470d1e200341c0036a2004410676103720032802c003210920032802c8032004413f7122024d0d2e200341b8036a200920024105746a220241136a2900003703002003200229000b3703b003200235001b2002411f6a31000042208684210520022f0000200241026a2d000041107472210820022800072107200228000321044101210220032802c403450d90010c8f010b200341a0076a41386a200141c0006a290300370300200341a0076a41306a200141386a290300370300200341a0076a41286a200141306a290300370300200341a0076a41206a200141286a290300370300200341a0076a41186a200141206a290300370300200341a0076a41106a200141186a290300370300200341a0076a41086a200141106a2903003703002003200141086a2903003703a007200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c003200341c8016a200341a0076a200341c0036a10a60120032802cc01210720032802c80121044100210b4101210d41012106410121080c97010b41dec6c0002104412d21074101210d20022d00000d930120022d000141ff01714102470d9301200141086a2903002105200341a0076a41086a22024200370300200342003703a00741f691c2004113200341a0076a1002200341c0036a41086a22042002290300370300200320032903a0073703c003200341c0036a411041c8d7c400410041001001417f470d4720024200370300200342003703a00741da95c200410d200341a0076a100220042002290300370300200320032903a0073703c003200341c0036a411041c8d7c400410041001001417f460d6f200342003703a007200341c0036a4110200341a0076a41084100100141016a41084d0d3e20032903a007500d6f200341a0076a41086a22024200370300200342003703a00741da95c200410d200341a0076a1002200341c0036a41086a22042002290300370300200320032903a0073703c0034200210f0240200341c0036a411041c8d7c400410041001001417f460d00200342003703a007200341c0036a4110200341a0076a41084100100141016a41084d0d4120032903a007210f0b20024200370300200342003703a00741fc95c2004117200341a0076a100220042002290300370300200320032903a0073703c003200341c0036a411041c8d7c400410041001001417f460d1f200342003703a007200341c0036a4110200341a0076a41084100100141016a41084d0d4120032903a007200f7c2005560d200c6f0b200341a0076a41206a200141286a290300370300200341a0076a41186a200141206a290300370300200341a0076a41106a200141186a290300370300200341a0076a41086a200141106a2903003703002003200141086a2903003703a007200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c003200341d0016a200341a0076a200341c0036a10a70120032802d401210720032802d00121044100210e4101210d41012106410121084101210b0c96010b200341d4026a22082001410e6a2f01003b0100200341c0066a41086a220b200141206a290300370300200341c0066a41106a220e200141286a2903003703002003200128010a3602d0022003200141186a2903003703c006200141106a2903002105200141086a2d0000210420012d00092106200341c0036a41086a22072002410a6a290100370300200341c0036a41106a220a200241126a290100370300200341c0036a41186a220c2002411a6a2901003703002003200241026a2901003703c00320022d0001210920022d0000210220044101460d0b20044102460d0a20044103470d43200920027241ff01710d10200320063a00a007200341b0036a41086a22024200370300200342003703b00341a3a8c2004119200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a4110200341a0076a410110030c1c0b200341a0026a41086a200141186a290300370300200341a0026a41106a200141206a2903003703002003200141106a2903003703a002200141386a2903002110200141306a290300210f2001410c6a2802002108200141286a2903002105200141086a2802002104200341d0026a41086a200241106a290200370300200341d0026a41106a200241186a290200370300200341d0026a41186a200241206a2802003602002003200241026a2f01003b019e022003200241086a2902003703d0022004417f6a220441044b0d43200241046a280200210920022d0001210620022d00002102024020040e05000f0d0e0c000b200341e0056a41086a200341a0026a41106a290300370300200320032903a8023703e00520032802a402210720032802a0022104200341fe026a200341d0026a41086a29030037010020034186036a200341d0026a41106a2903003701002003418e036a200341e8026a2f01003b0100200320093601f202200320032f019e023b01f002200320032903d0023701f602200241ff01710d10200341b0036a41086a200341f0026a41136a290000370300200320032900fb023703b003200641ff01714101470d1020032d00f202210220032f01f0022109200341f0026a411f6a3100002111200335008b03211220032800f702210620032800f302210b200341a0076a41086a220e200341b0036a41086a220c290300370300200320032903b0033703a00720034180056a41086a220a200e290300370300200320032903a00737038005200341c0036a41136a200a2903003700002003201220114220868422113e00db03200341c0036a411f6a20114220883c0000200320063600c7032003200b3600c30320032003290380053700cb032003200920024110747222023b01c003200320024110763a00c20320034190036a41086a2202200341e0056a41086a290300370300200320032903e00537039003200841ff01714101470d34200341a0076a2004410676103720032802a007210620032802a8072004413f7122024d0d38200341b8036a200620024105746a220241136a2900003703002003200229000b3703b003200235001b2002411f6a31000042208684210520022f0000200241026a2d000041107472210920022800072107200228000321044101210220032802a407450d690c680b41dec6c0002104412d21074101210d20022d00000d8f0120022d000141ff01714102470d8f01200141086a29030021054200210f200341b0036a41086a22024200370300200342003703b00341b7b0c0004110200341b0036a1002200341c0026a41086a22042002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f470d4420024200370300200342003703b00341cdc8c000410d200341b0036a100220042002290300370300200320032903b0033703c0020240200341c0026a411041c8d7c400410041001001417f460d00200342003703a007200341c0026a4110200341a0076a41084100100141016a41084d0d3c20032903a007210f0b200f2005540d45200341b0036a41086a22024200370300200342003703b00341b7b0c0004110200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200320053703a007200341c0026a4110200341a0076a41081003410021040c8f010b200341a0076a41206a200141286a290300370300200341a0076a41186a200141206a290300370300200341a0076a41106a200141186a290300370300200341a0076a41086a200141106a2903003703002003200141086a2903003703a007200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c003200341c0016a200341a0076a200341c0036a10a80120032802c401210720032802c0012104410021084101210d410121060c90010b200341a0076a41306a200141386a290300370300200341a0076a41286a200141306a290300370300200341a0076a41206a200141286a290300370300200341a0076a41186a200141206a290300370300200341a0076a41106a200141186a290300370300200341a0076a41086a200141106a2903003703002003200141086a2903003703a007200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c003200341b8016a200341a0076a200341c0036a10a90120032802bc01210720032802b8012104410021064101210d0c8e010b41a4c6c0002104412a21074100210c4101210d02402009450d00200610200b41012106410121084101210b4101210e4101210a0c92010b20034190036a41186a200e29030037030020034190036a41106a200b29030037030020034190036a41086a2008290300370300200320032903e00537039003200241ff01710d02200341b0036a41086a220220034190036a41136a2900003703002003200329009b033703b003200a41ff01714101470d0220032d009203210420032f019003210920034190036a411f6a310000210520033500ab03210f2003280097032108200328009303210b20034180056a41086a220e2002290300370300200320032903b00337038005200341a0046a41086a2207200e29030037030020032003290380053703a004200341c0066a41136a20072903003700002003200f20054220868422053e00db06200341c0066a411f6a20054220883c0000200320083600c7062003200b3600c306200320032903a0043700cb062003200920044110747222043b01c006200320044110763a00c20620024200370300200342003703b00341ead2c2004108200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f460d2a200341a8036a420037030020034190036a41106a420037030020034198036a42003703002003420037039003200341c0026a411020034190036a4120410010012202417f460d432002411f4d0d43200341b0036a41086a220220034190036a41136a2900003703002003200329009b033703b00320034190036a411f6a3100002105200329009303210f20033500ab03211020032f019003210420032d0092032109200341c0036a41086a22082002290300370300200320093a00a207200320043b01a007200320032903b0033703c003200341a0076a411f6a20053c0000200341a0076a41136a2008290300370000200320103e00bb072003200f3700a307200320032903c0033700ab070c2b0b200341a0046a41086a200b290300370300200320032903d0023703a004200341f0026a41186a200c290300370300200341f0026a41106a200a290300370300200341f0026a41086a200e290300370300200320032903e0053703f002200241ff01710d02200341b0036a41086a2202200341f0026a41136a290000370300200320032900fb023703b003200641ff01714101470d0220032d00f202210920032f01f0022106200341f0026a411f6a310000210f200335008b03211220032800f702210b20032800f302210e200341a0076a41086a220a2002290300370300200320032903b0033703a00720034180056a41086a2202200a290300370300200320032903a00737038005200341c0066a41136a200229030037000020032012200f42208684220f3e00db06200341c0066a411f6a200f4220883c00002003200b3600c7062003200e3600c30620032003290380053700cb062003200620094110747222023b01c006200320024110763a00c20620034190036a41086a200341a0046a41086a290300370300200320032903a00437039003201341ff01714101470d24200341a0076a2004410676103720032802a007210920032802a8072004413f7122024d0d2b200341b8036a200920024105746a220241136a2900003703002003200229000b3703b003200235001b2002411f6a31000042208684210520022f0000200241026a2d000041107472210820022800072107200228000321044101210220032802a407450d5f0c5e0b200341a0076a41086a20034180056a41086a29020037030020032003290280053703a007412a210741a4c6c00021040c5c0b200341a0046a41086a20034180056a41086a29020037030020032003290280053703a004412a210741a4c6c00021040c5a0b20034180056a41086a200341a0076a41086a290300370300200320032903a007370380050c080b200920027241ff01710d05200341b0036a41086a22024200370300200342003703b0034198d0c2004119200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200320053703a007200341c0026a4110200341a0076a410810030c110b200341e5056a20082f01003b0000200341f7056a200b290300370000200341e0056a411f6a200e2d00003a0000200320063a00e005200320053700e705200320032802d0023600e105200320032903c0063700ef05200341f0026a41186a200c290300370300200341f0026a41106a200a290300370300200341f0026a41086a2007290300370300200320032903c0033703f0020240200241ff01710d00200341b0036a41086a220220034183036a290000370300200320032900fb023703b003200941ff01714101470d0020032d00f202210920032f01f0022106200341f0026a411f6a3100002105200335008b03210f20032800f702210720032800f302210820034180056a41086a22042002290300370300200320032903b00337038005200341a0076a41086a2202200429030037030020032003290380053703a007200341a0046a41086a220b2002290300370300200320032903a0073703a0042004200b290300370300200320032903a00437038005200341a0076a41186a200341e0056a41186a290000370300200341a0076a41106a200341e0056a41106a2900003703002002200341e0056a41086a290000370300200320032900e0053703a007411210222202450d45200241106a41002f00efad423b0000200241086a41002900e7ad42370000200241002900dfad4237000020024112413210212202450d462002200620094110747222043b00122002200f20054220868422053e002d2002200736001920022008360015200220032903800537001d200241146a20044110763a0000200241316a20054220883c0000200241256a20034180056a41086a29030037000020034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002413220034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002412010222204450d47200420032903a007370000200441186a200341a0076a41186a290300370000200441106a200341a0076a41106a290300370000200441086a200341a0076a41086a290300370000200341f0026a41202004412010032004102020021020410021040c85010b200341a0076a41086a20034180056a41086a29030037030020032003290380053703a0070c060b41aaa9c000210441c0002107200241ff0171450d830120094104490d8301411210222202450d3d200241106a41002f0098a7433b0000200241086a4100290090a74337000020024100290088a74337000020024112412410212202450d3e2002200836001220034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002411620034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002200341f0026a412041c8d7c4004100410010012104200210202004417f460d20200341b0036a41086a22024200370300200342003703b0034194c9c3004112200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c00241002104200341c0026a411041c8d7c400410041001001417f460d26200342103702c4032003200341c0026a3602c003200341a0076a200341c0036a10aa0120032802a007220c450d48200341a8076a280200210420032902a4072205422088a722022005a7460d2720032802a40721130c4a0b200620027241ff01710d02200341b0026a290300210f20032903a802211020032802a0022106200341b0036a41086a22024200370300200342003703b00341afcac3004115200341b0036a1002200341c0026a41086a22042002290300370300200320032903b0033703c002410410222209450d4020092008360000200341c0026a41102009410410032009102020024200370300200342003703b0034193cac300411c200341b0036a100220042002290300370300200320032903b0033703c0022003200f3703a807200320103703a007200341c0026a4110200341a0076a4110100320024200370300200342003703b00341e8c8c3004114200341b0036a100220042002290300370300200320032903b0033703c002200320053703a007200341c0026a4110200341a0076a4108100320024200370300200342003703b00341a6c9c300410d200341b0036a100220042002290300370300200320032903b0033703c002410410222202450d4120022006360000200341c0026a4110200241041003200210200c0e0b41aaa9c000210441c0002107200241ff0171450d810120094102490d8101411210222202450d3d200241106a41002f0098a7433b0000200241086a4100290090a74337000020024100290088a74337000020024112412410212202450d3e2002200836001220034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002411620034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002200341f0026a412041c8d7c400410041001001417f460d1d20034220370294032003200341f0026a36029003200341a0076a20034190036a10ab0120032903a0074201520d4420032802a8072104200341c0066a200341ac076a41dc001084041a200341f0026a41201009200341e0056a200341c0066a41dc001084041a20034180056a200341e0056a41dc001084041a20021020200341a0046a20034180056a41dc001084041a200320043602c003200341c0036a410472200341a0046a41dc001084041a200341f8016a200341c0036a41206a20032903d003200341d8036a29030010ac0120032903f80120034180026a29030010ad010c0d0b200620027241ff0171450d0b0b41fcc5c0002104412821070c7f0b20034180056a41086a200341a0076a41086a290300370300200320032903a007370380050b412a210741a4c6c00021040c7d0b200341c8036a280200210620032802c4032108200920027241ff0171450d0e41fcc5c0002104412821072006450d4e200810200c4e0b4101210a200341c8036a280200210b20032802c403210e200241ff017145200941ff0171410146712202450d0a0240200b450d00200e10200b410021064101210c41012108410121090c130b200920027241ff0171450d0d0c4b0b41dec6c000410041dec6c000200941ff01714102461b200241ff01711b2104412d21074101210a4101210c41012108410121060c090b200341cc036a2802002108200341c8036a280200210e20032802c403210b200920027241ff0171450d0c02402008450d00200841186c2104200b210203400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241186a2102200441686a22040d000b0b410021094101210a200e450d010c470b200341c0036a410c6a2802002108200341c8036a280200210e20032802c403210b200920027241ff0171450d0c02402008450d002008410c6c2104200b210203400240200241046a280200450d00200228020010200b2002410c6a2102200441746a22040d000b0b410121094100210a200e0d460b4100210e0c460b200341b0036a41086a20034190036a41086a29030037030020032003290390033703b0030c720b200341a0026a41086a290300210520032903a002210f200341b0036a41086a22024200370300200342003703b00341fca6c300410c200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200320053703a8072003200f3703a007200341c0026a4110200341a0076a411010030b410021040c730b4203200f7c2005580d4f0b41f494c200102f000b200841a4c6c00020021b2104412a2107410021060240200b450d00200e10200b4101210c410121080b410121090c080b200841a4c6c00020021b2104412a21074100210902402006450d00200b10200b4101210c41012108410121060c070b41baa3c00041052008200341cc036a28020010034101210a02402006450d00200810200b410021084101210c0c040b200341c0036a41086a2903002105410810222202450d302002200537000041b0a3c000410a20024108100320021020410021044101210a4101210c4101210841012106410121090c050b0240200841186c2202450d00200b20026a2104200b210203402002280200200241086a2802002002410c6a280200200241146a2802001003200241186a22022004470d000b0b02402008450d00200841186c2104200b210203400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241186a2102200441686a22040d000b0b4101210a0240200e450d00200b10200b4100210c0c010b02402008410c6c2202450d00200b20026a2104200b210203402002280200200241086a28020010092002410c6a22022004470d000b0b02402008450d002008410c6c2104200b210203400240200241046a280200450d00200228020010200b2002410c6a2102200441746a22040d000b0b4101210c0240200e450d00200b10200b4100210a0b410121080b41012106410121090b410021040b02400240024020032802c003417f6a220241064b0d0002400240024020020e07003e0103040502000b2009450d3d200341c8036a280200450d3d20032802c40310200c3d0b2006450d3c200341c8036a280200450d3c20032802c40310200c3c0b200a450d3b0240200341c0036a410c6a2802002209450d0020032802c40321022009410c6c210903400240200241046a280200450d00200228020010200b2002410c6a2102200941746a22090d000b0b200341c8036a280200450d3b20032802c40310200c3b0b200341c0036a1094010c3a0b2008450d39200341c8036a280200450d3920032802c40310200c390b200c450d380240200341c0036a410c6a2802002209450d0020032802c4032102200941186c210903400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241186a2102200941686a22090d000b0b200341c8036a280200450d3820032802c40310200c380b4100210220032802c4030d600c610b200341b0036a41086a20034190036a41086a29030037030020032003290390033703b0030c3b0b200341e0056a200341c0066a41dc001084041a200210200b41dacac3002104411921070c620b200341b8076a4200370300200341a0076a41106a420037030020094200370300200342003703a0070b0240200341c0036a200341a0076a4120108604450d0041f2d2c2002104413121070c350b20034190036a41086a2202200341f0026a41086a290300370300200320032903f00237039003200641ff01714101470d06200341a0076a2004410676103720032802a007210620032802a8072004413f7122024d0d0a200341b8036a200620024105746a220241136a2900003703002003200229000b3703b003200235001b2002411f6a31000042208684210520022f0000200241026a2d000041107472210920022800072107200228000321044101210220032802a407450d290c280b200341b8076a4200370300200341b0076a4200370300200341a8076a4200370300200342003703a0070b0240200341c0066a200341a0076a4120108604450d0041c8d2c2002104412221070c320b200341a0076a200641e0001084041a41002104200341003b01c00320034190026a200341a0076a200341c0036a10a3012003200328029002453a00a2072003410c3b01a007200341a0076a103d200610200c2a0b4100210220032802a4070d320c330b4104210c410021020b200241016a22092002490d3920024101742206200920092006491b2213ad4202862205422088a70d392005a722094100480d392002450d02200c200241027420091021220c450d030c210b200c200229030037030020032003290390033703b003200841087621090c350b2005200f422086842105200341b0036a41086a200229030037030020032003290390033703b003200641087621090c230b20091022220c0d1e0b200941041023000b4100210220032802a4070d2f0c300b4100210220032802a4070d1d0c1e0b1046000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b200341b4076a4101360200200341033602c406200341eca1c4003602c006200342013702a407200341f4a1c4003602a0072003200341c0066a3602b007200341a0076a41c0a3c0001048000b200341b4076a41013602002003410336028405200341eca1c40036028005200342013702a407200341f4a1c4003602a007200320034180056a3602b007200341a0076a41a4d3c2001048000b200341b4076a41013602002003410336028405200341eca1c40036028005200342013702a407200341f4a1c4003602a007200320034180056a3602b007200341a0076a41a0c1c1001048000b200341b4076a41013602002003410336028405200341eca1c40036028005200342013702a407200341f4a1c4003602a007200320034180056a3602b007200341a0076a41b4d3c2001048000b200341b4076a41013602002003410336028405200341eca1c40036028005200342013702a407200341f4a1c4003602a007200320034180056a3602b007200341a0076a41f4cac3001048000b41ac94c200102f000b41dcb0c000102f000b41f0b1c000102f000b419a88c00041331039000b419a88c00041331039000b411241011023000b412441011023000b411241011023000b412441011023000b410441011023000b410441011023000b411241011023000b413241011023000b412041011023000b419a88c00041331039000b410841011023000b419a88c00041331039000b200421020b200c20024102746a2008360200200341b0036a41086a22024200370300200342003703b0034194c9c3004112200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341003602a807200342013703a0072003200441016a22023602c003200341c0036a200341a0076a103e0240024002402002450d00200441027441046a210e4100200341a0076a41086a220a28020022026b210420032802a4072106200c21090340200928020021070240024002400240200620046a41044f0d00200241046a22082002490d1e2006410174220b20082008200b491b220b4100480d1e2006450d0120032802a0072006200b102122080d020c070b20032802a00721080c020b200b10222208450d050b2003200b3602a407200320083602a007200b21060b200941046a2109200a200241046a220b360200200820026a20073600002004417c6a2104200b2102200e417c6a220e0d000c020b0b200341a0076a41086a280200210b20032802a407210620032802a00721080b200341c0026a41102008200b100302402006450d00200810200b4100210402402013450d00200c10200b0c390b200b41011023000b200610200b20020d0041012102411521074195a9c00021040c010b200341a0076a41086a200341b0036a41086a290300370300200320032903b0033703a007410021020b200341a0046a41086a2206200341a0076a41086a290300370300200320032903a0073703a00420020d0820034180056a41086a2006290300370300200320032903a004370380054200210f200341b0036a41086a22024200370300200342003703b00341ead2c2004108200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c0024100210202400240200341c0026a411041c8d7c400410041001001417f460d00200341a8036a420037030020034190036a41106a420037030020034198036a42003703002003420037039003200341c0026a411020034190036a4120410010012202417f460d032002411f4d0d03200341b0036a41086a2202200341a3036a2900003703002003200329009b033703b00320034190036a411f6a310000210f2003280097032108200328009303210b20033500ab03211020032f019003210620032d009203210e200341a0076a41086a2002290300370300200320032903b0033703a0072006200e4110747221022010200f42208684210f0c010b200341a8076a4200370300200342003703a0074100210b410021080b200341c0066a41086a220e200341a0076a41086a2206290300370300200320032903a0073703c006200341c1076a200f4220883c0000200341bd076a200f3e0000200341a9076a2008360000200341ad076a20032903c006370000200341b5076a200e2903003700002003200b3600a5072003418c023b01a007200320023b01a207200320024110763a00a407200341a0076a103d200620034180056a41086a29030037030020032003290380053703a007200341b0036a41086a22024200370300200342003703b00341ead2c2004108200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002412010222202450d02200220093b0000200220053e001b2002200736000720022004360003200220032903a00737000b200241026a20094110763a00002002411f6a20054220883c0000200241136a2006290300370000200341c0026a411020024120100320021020410021040b0c070b419a88c00041331039000b412041011023000b200b10200b2006417f6a220241064b0d0041fcc5c00021044128210702400240024020020e0702040203020100020b200a450d032008450d012008410c6c2109200b210203400240200241046a280200450d00200228020010200b2002410c6a2102200941746a22090d000c020b0b2009450d022008450d00200841186c2109200b210203400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241186a2102200941686a22090d000b0b200e450d01200b10200c010b200341c0036a10940141fcc5c0002104412821070b410121064100210d0c2f0b2006109201200610200b410021134101210d41012106410121084101210b4101210e4101210a4101210c4101210920012802002202410d4d0d340c350b200910200b20020d00410121024195a9c0002104411521070c010b200341a0076a41086a200341b0036a41086a290300370300200320032903b0033703a007410021020b20034180056a41086a2209200341a0076a41086a290300370300200320032903a0073703800520020d27200320053e00db03200341df036a20054220883c0000200341d3036a2009290300370000200320073600c703200320043600c30320032003290380053700cb03200320083b01c003200320084110763a00c203024002400240411410222202450d00200241106a41002800a5ef40360000200241086a410029009def4037000020024100290095ef4037000020024114413410212202450d01200220032903c0063700142002412c6a200341c0066a41186a290300370000200241246a200341c0066a41106a2903003700002002411c6a200341c0066a41086a2903003700004200210520034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002413420034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002024002400240200341f0026a412041c8d7c400410041001001417f460d00200342003703a807200342003703a007200341f0026a4120200341a0076a4110410010012204417f460d022004410f4d0d02200341a8076a290300210f20032903a00721052002102041142104411410222202450d010c050b4200210f20021020411421044114102222020d040b200441011023000b419a88c00041331039000b411441011023000b413441011023000b200241106a41002800a5ef40360000200241086a410029009def4037000020024100290095ef403700000240024002400240024020022004413410212202450d00200220032903c0033700142002412c6a200341c0036a41186a290300370000200241246a200341c0036a41106a2903003700002002411c6a200341c0036a41086a29030037000020034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002413420034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002024002400240200341f0026a412041c8d7c400410041001001417f460d00200342003703a807200342003703a007200341f0026a4120200341a0076a4110410010012204417f460d022004410f4d0d02200341a8076a290300211420032903a00721170c010b42002117420021140b20021020200341b0036a41086a22024200370300200342003703b0030240024002400240201720148422384200510d0041e3c0c1004114200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f460d02200342003703a807200342003703a007200341c0026a4110200341a0076a4110410010012202417f460d062002410f4d0d06200341a8076a29030021390c010b41cfc0c1004114200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f460d01200342003703a807200342003703a007200341c0026a4110200341a0076a4110410010012202417f460d062002410f4d0d06200341a8076a29030021390b20032903a007213a0c010b4200213a420021390b02402011203a7c223c2011542202201020397c2002ad7c221220105420122010511b450d004128210741f7c0c10021040c2e0b02402005203c7d223b200556200f20127d2005203c54ad7d2205200f562005200f511b450d00411d2107419aaac30021040c2e0b20384200520d05200341b0036a41086a22024200370300200342003703b00341a5eec000411b200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f460d05200342003703a807200342003703a007200341c0026a4110200341a0076a4110410010012202417f460d042002410f4d0d0420032903a007201156200341a8076a290300220f201056200f2010511b450d05411f210741b7aac30021040c2d0b419a88c00041331039000b413441011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b200341b0016a200341c0066a4102203b200510ae01024020032802b0012204450d0020032802b40121070c280b0240201720117c22122017542202201420107c2002ad7c220f201454200f2014511b450d00412d210741d6aac30021040c280b200341c0066a200341c0036a4120108604450d26200341c0066a203b200510af0102400240411410222202450d00200241106a41002800a5ef40360000200241086a410029009def4037000020024100290095ef4037000020024114413410212202450d01200220032903c0033700142002412c6a200341c0036a41186a2208290300370000200241246a200341c0036a41106a2903003700002002411c6a200341c0036a41086a2903003700004200210520034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002413420034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002200341f0026a412041c8d7c40041004100100121042002102002402004417f470d00200341c0036a103a200341d8076a200f370300200341d0076a2012370300200341a0076a41086a41003a0000200341a9076a20032903c003370000200341b1076a200341c0036a41086a290300370000200341b9076a200341d0036a290300370000200341c1076a2008290300370000200341023a00a007200341a0076a103d0b200341c0036a2012200f10af01200341b0036a41086a22024200370300200342003703b003418feec0004116200341b0036a1002200341c0026a41086a22042002290300370300200320032903b0033703c002024002400240200341c0026a411041c8d7c400410041001001417f460d00200342003703a807200342003703a007200341c0026a4110200341a0076a4110410010012209417f460d022009410f4d0d02200341a8076a290300210f20032903a00721050c010b4200210f0b20024200370300200342003703b003418feec0004116200341b0036a100220042002290300370300200320032903b0033703c00220034200200f20397d2005203a54ad7d22122005203a7d22142005562012200f562012200f511b22021b3703a80720034200201420021b3703a007200341c0026a4110200341a0076a41101003200341a0076a41086a41023a0000200341a9076a20032903c006370000200341b1076a200341c0066a41086a290300370000200341b9076a200341c0066a41106a290300370000200341c1076a200341c0066a41186a290300370000200341c9076a20032903c003370000200341d1076a200341c0036a41086a290300370000200341d9076a200341c0036a41106a290300370000200341e1076a200341c0036a41186a290300370000200341023a00a00720034188086a203937030020034180086a203a370300200341f8076a2010370300200341f0076a2011370300200341a0076a103d0c290b419a88c00041331039000b411441011023000b413441011023000b200610200b20020d0041012102411521074195a9c00021040c010b200341a0076a41086a200341b0036a41086a290300370300200320032903b0033703a007410021020b20034180056a41086a2206200341a0076a41086a290300370300200320032903a0073703800520020d23200341a0046a41086a200629030037030020032003290380053703a004200341b0036a41086a22024200370300200342003703b0034193cac300411c200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002024002400240024002400240024002400240200341c0026a411041c8d7c400410041001001417f460d00200342003703a807200342003703a007200341c0026a4110200341a0076a4110410010012202417f460d022002410f4d0d02200341a8076a290300211120032903a00721120c010b42002112420021110b200341b0036a41086a22024200370300200342003703b00341afcac3004115200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002024002400240200341c0026a411041c8d7c400410041001001417f460d00200341003602a007200341c0026a4110200341a0076a41044100100141016a41044d0d0220033502a00721140c010b420021140b200341e0016a200f420020144200108804200341f0016a200341c0036a201242edeb82bdef980420032903e00142c0843d8020032903e8014200521b2214201420125420114200522011501b22021b22122011420020021b221110b001024020032802f001450d0041f9c9c3002104411a21070c2c0b200341b0036a41086a22024200370300200342003703b00341c4cac3004116200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002410021060240200341c0026a411041c8d7c400410041001001417f460d00200341003602a007200341c0026a4110200341a0076a41044100100141016a41044d0d0320032802a00721060b200341b0036a41086a22024200370300200342003703b00341c4cac3004116200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c0022003200641016a3602a007200341c0026a4110200341a0076a41041003200341a0076a41186a200341c0036a41186a290300370300200341a0076a41106a200341c0036a41106a290300370300200341a0076a41086a200341c0036a41086a290300370300200341c0066a41086a200341a0046a41086a290300370300200320032903c0033703a007200320032903a0043703c006411210222202450d03200241106a41002f0098a7433b0000200241086a4100290090a74337000020024100290088a74337000020024112412410212208450d042008200636001220034190036a41186a2202420037030020034190036a41106a220b420037030020034190036a41086a220e420037030020034200370390032008411620034190036a1000200341f0026a41186a2002290300370300200341f0026a41106a200b290300370300200341f0026a41086a200e29030037030020032003290390033703f002412010222202450d05200220032903a007370000200241186a200341a0076a41186a290300370000200241106a200341a0076a41106a290300370000200241086a200341a0076a41086a2903003700002002412041c00010212202450d062002200f370020200241286a2010370000200241c00041800110212202450d07200220093b0030200220053e004b200220123700502002200736003720022004360033200220032903c00637003b200241326a20094110763a0000200241cf006a20054220883c0000200241d8006a2011370000200241c3006a200341c0066a41086a290300370000200341f0026a4120200241e00010032002102020081020200341ac076a200636020041002104200341a0076a41086a41003a00002003410a3a00a007200341a0076a103d0c2b0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411241011023000b412441011023000b412041011023000b41c00041011023000b41800141011023000b200341a0076a41086a22024200370300200342003703a00741da95c200410d200341a0076a1002200341c0036a41086a22042002290300370300200320032903a0073703c003200320053703a007200341c0036a4110200341a0076a41081003200341013a00c00620024200370300200342003703a00741f691c2004113200341a0076a100220042002290300370300200320032903a0073703c003200341c0036a4110200341c0066a4101100320024200370300200342003703a00741fc95c2004117200341a0076a1002200341b0036a41086a2002290300370300200320032903a0073703b00302400240200341b0036a411041c8d7c400410041001001417f460d00200342003703a007200341b0036a4110200341a0076a41084100100141016a41084d0d0a20032903a007210f0c010b4203210f0b200341a0076a41086a22024200370300200342003703a0074195b0c0004112200341a0076a1002200341c0026a41086a22092002290300370300200320032903a0073703c002410021044101210d02400240200341c0026a411041c8d7c400410041001001417f460d00200342003703a007200341c0026a4110200341a0076a41084100100141016a41084d0d0b20032903a0072110410021060c010b410121060b20024200370300200342003703a0074195b0c0004112200341a0076a100220092002290300370300200320032903a0073703c002200320053703a007200341c0026a4110200341a0076a410810032010500d2320060d23427f200f200f7c22112011200f541b220f4200510d182005200f8022052010200f80220f580d192005200f42017c2210510d2342002115200341a0076a41086a22024200370300200342003703a00741cdadc2004112200341a0076a1002200341c0026a41086a2002290300370300200320032903a0073703c00202400240200341c0026a411041c8d7c400410041001001417f460d00200342103702c4032003200341c0026a3602c003200341a0076a200341c0036a103820032802a0072216450d1e20032902a40721150c010b410121160b02402005200f427f857ca72218450d002015422088a7221920184d0d002010a7211a200341a0076a41096a211b200341c0066a410472211c200341c0036a41286a211d200341c0036a41206a211e200341c0036a41246a211f200341d8076a2120200341a0076a412c6a2121410021220340200341a0026a41186a20162022201a6a2019704105746a220241186a290000370300200341a0026a41106a200241106a290000370300200341a0026a41086a200241086a290000370300200320022900003703a002200341c0036a200341a0026a10b1010240201e2802002240450d00200341c0066a41086a201d41086a290300370300200341c0066a41106a201d41106a290300370300200341c0066a41186a201d41186a290300370300200341c0066a41206a201d41206a2802003602002003201d2903003703c006201f280200213f200341d0026a41186a2223201c41186a290000370300200341d0026a41106a2224201c41106a290000370300200341d0026a41086a2225201c41086a2900003703002003201c2900003703d002200341a0076a41086a22084200370300200342003703a00741e5ecc3004115200341a0076a1002200341b0036a41086a222d2008290300370300200320032903a0073703b0030240024002400240200341b0036a411041c8d7c400410041001001417f470d0041014100200341d0026a105c0d020c010b200342103702e4052003200341b0036a3602e005200341a0076a200341e0056a103820032802a0072202450d1520022008280200200341d0026a105c2104024020032802a407450d00200210200b20040d010b411210222202450d15200241106a41002f008aed4322043b0000200241086a4100290082ed432205370000200241002900faec43220f37000020024112413210212202450d16200220032903d0023700122002412a6a2023290300370000200241226a20242903003700002002411a6a2025290300370000200341e0056a41186a22264200370300200341e0056a41106a22274200370300200341e0056a41086a22284200370300200342003703e00520024132200341e0056a1000200341a0076a41186a22292026290300370300200341a0076a41106a222a202729030037030020082028290300370300200320032903e0053703a00702400240200341a0076a412041c8d7c400410041001001417f460d00200341003602e005200341a0076a4120200341e0056a41044100100141016a41044d0d1120032802e005212b200210204112102222020d010c190b4100212b20021020411210222202450d180b200241106a20043b0000200241086a20053700002002200f37000020024112413210212202450d18200220032903d0023700122002412a6a2023290300370000200241226a20242903003700002002411a6a2025290300370000202642003703002027420037030020284200370300200342003703e00520024132200341e0056a100020292026290300370300202a202729030037030020082028290300370300200320032903e0053703a0072003202b41016a222c3602e005200341a0076a4120200341e0056a410410032002102020084200370300200342003703a007418cedc3004119200341a0076a1002202d2008290300370300200320032903a0073703b00302400240200341b0036a411041c8d7c400410041001001417f460d00200341003602a007200341b0036a4110200341a0076a41044100100141016a41044d0d1220032802a007212e0c010b4100212e0b200341a0046a41186a22022023290300370300200341a0046a41106a22042024290300370300200341a0046a41086a22092025290300370300200320032903d0023703a0044200211120084200370300200342003703a00741cdc8c000410d200341a0076a1002202d2008290300370300200320032903a0073703b0030240200341b0036a411041c8d7c400410041001001417f460d00200342003703a007200341b0036a4110200341a0076a41084100100141016a41084d0d0d20032903a00721110b20034180056a41186a222f200229030037030020034180056a41106a2230200429030037030020034180056a41086a22312009290300370300200320032903a0043703800520084200370300200342003703a00741a5edc3004117200341a0076a1002202d2008290300370300200320032903a0073703b003024002400240024002400240200341b0036a411041c8d7c400410041001001417f460d00200342103702a4072003200341b0036a3602a007200341a8016a200341a0076a108e0120032802a801450d0d20032802ac012232ad42307e2205422088a70d182005a72202417f4c0d182002450d012002102222130d020c250b2026202f2903003703002027203029030037030041082113200341e0056a41086a220220034180056a41086a29030037030020032003290380053703e00520292026290300370300202a2027290300370300200341a0076a41086a2002290300370300200320032903e0053703a0074100210b420021100c020b410821130b024002402032450d00200828020021064100210b20032802a407210e20032802a007210a4100210941002102203221330340202642003703002027420037030020284200370300200342003703e00520084100200a200e200341e0056a41202006100122042004417f461b220441202004412049220c1b20066a2204360200200c0d0c20034190036a41186a2234202629030037030020034190036a41106a2235202729030037030020034190036a41086a22362028290300370300200320032903e00537039003200342003703e00520084100200a200e200341e0056a41082004100122062006417f461b2206410820064108491b20046a2204360200200641074d0d0c20032903e0052105200341003602e00520084100200a200e200341e0056a41042004100122062006417f461b220c4104200c4104491b20046a2206360200200c41034d0d0c200241016a210420032802e005210c200341f0026a41186a22372034290300370300200341f0026a41106a22342035290300370300200341f0026a41086a2235203629030037030020032003290390033703f002024020022033470d00200b20042004200b491b2233ad42307e220f422088a70d0c200fa722364100480d0c02402002450d00201320092036102122130d010c130b203610222213450d120b201320096a22022005370300200241206a2037290300370300200241186a2034290300370300200241106a2035290300370300200241086a20032903f002370300200241286a200c360200200b41026a210b200941306a21092004210220042032490d000c020b0b41002104410021330b2013450d0a2026202f290300370300202720302903003703002028203129030037030020032003290380053703e00502402004ad4220862033ad842210422088a7220b4120490d0041302102200b41306c21062013ad422086210f4201210520132109034002402009290300201320026a2204290300580d002004ad422086200584210f200421090b200542017c21052006200241306a2202470d000b2009450d1f200f42ffffffff0f580d1f20292026290300370300202a202729030037030020082028290300370300200320032903e0053703a007200b200fa722024d0d242013200241306c6a22022011370300200241206a2029290300370300200241186a202a290300370300200241106a2008290300370300200220032903a007370308200241013602280c030b20292026290300370300202a202729030037030020082028290300370300200320032903e0053703a0072010a7200b470d010b200b4101742202200b41016a220420042002491bad220542307e220f422088a70d07200fa722024100480d0702400240200b450d002013200b41306c2002102122130d010c200b200210222213450d1f0b2010422088a7210b200521100b2013200b41306c6a22022011370300200241206a2029290300370300200241186a202a290300370300200241106a2008290300370300200220032903a00737030820024101360228201042ffffffff0f83200b41016aad4220868421100b20084200370300200342003703a00741a5edc3004117200341a0076a1002202d2008290300370300200320032903a0073703b00320084100360200200342013703a00720032010422088a722023602e005200341e0056a200341a0076a103e024002402002450d00200241306c210a4158200828020022026b210b2002412c6a210220032802a407210920132104034002400240024002402009200b6a41286a41204f0d00200241546a220e41206a2206200e490d0c2009410174220e20062006200e491b220e4100480d0c2009450d0120032802a0072009200e102122060d020c0f0b20032802a00721060c020b200e10222206450d0d0b2003200e3602a407200320063602a007200e21090b2008200241746a220c360200200620026a220e416c6a200441206a290000370000200e41646a200441186a290000370000200e415c6a200441106a290000370000200e41546a200441086a2900003700002004290300210502400240024002402009200b6a220e41086a200e4f0d00200c41086a220e200c490d0c2009410174220c200e200e200c491b220e4100480d0c2009450d0120062009200e102122060d020c100b2009210e0c020b200e10222206450d0e0b2003200e3602a407200320063602a0070b20082002417c6a2209360200200620026a41746a2005370000200441286a280200210c0240024002400240200e200b6a41034b0d00200941046a22342009490d0c200e4101742209203420342009491b22094100480d0c200e450d012006200e2009102122060d020c110b200e21090c020b200910222206450d0f0b200320093602a407200320063602a0070b200441306a210420082002360200200620026a417c6a200c360000200b41546a210b2002412c6a2102200a41506a220a0d000c020b0b20032802a407210920032802a00721060b200341b0036a411020062008280200100302402009450d00200610200b02402010a7450d00201310200b411210222202450d19200241106a41002f00cdcf433b0000200241086a41002900c5cf43370000200241002900bdcf4337000020024112413210212202450d1a200220032903d0023700122002412a6a2023290300370000200241226a20242903003700002002411a6a2025290300370000202642003703002027420037030020284200370300200342003703e00520024132200341e0056a100020292026290300370300202a202729030037030020082028290300370300200320032903e0053703a007024002400240200341a0076a412041c8d7c400410041001001417f460d00200342203702e4052003200341a0076a3602e005200341a0016a200341e0056a108e0120032802a001450d1620032802a401210420034188016a200341e0056a108c01200328028801450d1620021020410a2102200441094d0d010c020b20021020410321040b200421020b0240024002400240202c2002202e6a4d0d00200341a0076a200341d0026a10b2012008290300210520032903a007210f0240200341a0076a41246a2206280200450d00200341a0076a41206a28020010200b20084200370300200342003703a00741e0edc3004114200341a0076a1002202d2008290300370300200320032903a0073703b003200341b0036a411041c8d7c400410041001001417f460d01200341003602a007200341b0036a4110200341a0076a41044100100141016a41044d0d1520033502a00721100c020b202620232903003703002027202429030037030020282025290300370300200320032903d0023703e005410121020c020b42c0843d21100b200341c8006a200f420020104200108804200341d8006a4289f48bdcc4002003290348428094ebdc038020032903504200521b42002002108904200341d8006a41086a290300211020032903582111200341a0076a200341d0026a10b201200341e8006a200341d0026a20032903a0072238200f2011200241ff004b200f201154200520105420052010511b7222021b22392038203954200829030022172005201020021b223a542017203a511b22021b2211202a290300223b203b2011562029290300223c2017203a20021b221056203c2010511b22021b22122010203c20021b221410b301200341e8006a41086a29030021052003290368210f02402003290378223d20127d223e20117c2211200341e8006a41186a29030020147d203d201254ad7d20107c2011203e54ad7c221284500d002038203b7d22142017203c7d2038203b54ad7d221784500d00200341a0076a41286a2802002204450d00200341a0076a41206a2802002202200441306c6a21090340200341186a2002290300200241086a29030020112012108804200341086a2003290318200341186a41086a29030020142017108704200341286a200241106a2003290308200341086a41086a29030010b301427f2005200341286a41086a2903007c200f20032903287c2210200f542204ad7c220f2004200f200554200f2005511b22041b2105427f201020041b210f200241306a22022009470d000b0b200f200510ad0102402006280200450d00200341a0076a41206a28020010200b200341d0026a10b40120084200370300200342003703a00741f4edc3004115200341a0076a1002202d2008290300370300200320032903a0073703b003200341b0036a411041c8d7c40041001003200341003a00e00520084200370300200342003703a00741a3a8c2004119200341a0076a1002202d2008290300370300200320032903a0073703b003200341b0036a4110200341e0056a41011003202620232903003703002027202429030037030020282025290300370300200320032903d0023703e005410221020b2020203a370300200341a0076a41306a2039370300200820023a0000201b20032903e0053700002021202b360200201b41086a2028290300370000201b41106a2027290300370000201b41186a2026290300370000200341043a00a007200341a0076a103d203f0d010c020b203f450d010b204010200b202241016a22222018470d000b0b410021042015a7450d23201610200c230b1024000b2033450d00201310200b419a88c00041331039000b200e41011023000b200e41011023000b200941011023000b203641081023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b1031000b419a88c00041331039000b419a88c00041331039000b411241011023000b413241011023000b411241011023000b413241011023000b411241011023000b413241011023000b41bcedc30041131039000b200241081023000b41ecb5c000102f000b41e8b6c000102f000b200241081023000b41d0edc3002002200b10b501000b419a88c00041331039000b200910200b20020d0041012102411521074195a9c00021040c010b200341c0036a41086a200341b0036a41086a290300370300200320032903b0033703c003410021020b20034180056a41086a2209200341c0036a41086a290300370300200320032903c0033703800520020d01200320053e00bb07200341bf076a20054220883c0000200341b3076a2009290300370000200320073600a707200320043600a30720032003290380053700ab07200320083b01a007200320084110763a00a207200341a0076a2011201010af01200341a0076a2014201210b6010b410021044101210d41012106410121084101210b4101210e4101210a4101210c410121094101211320012802002202410d4d0d090c0a0b4101210d0b410121060b410121080b4101210b0b4101210e0b4101210a0b4101210c0b410121090b4101211320012802002202410d4b0d010b024002400240024002400240024002400240024002400240024020020e0e0e050e0e0e03070206000e010e040e0b200a450d0d20012d00044101470d0d2001410c6a2201280200109301200128020010200c0d0b200c450d0c200141086a280200450d0c200128020410200c0c0b200b450d0b200141086a28020022024102460d0520024101470d0b200141106a280200450d0b2001410c6a28020010200c0b0b2006450d0a200141086a2d00002202410e4b0d0820024106470d0a200141106a280200450d0a2001410c6a28020010200c0a0b2009450d09200141086a2d000022024104460d0620024103460d0520024102470d09200141106a280200450d092001410c6a28020010200c090b200d450d08200141086a1094010c080b200e450d07200141086a2d00004101470d072001410c6a2201280200109301200128020010200c070b2008450d06200141086a2d000022024105460d0120024101470d062001410c6a2201280200109301200128020010200c060b200141106a280200450d052001410c6a28020010200c050b2001410c6a2201280200109301200128020010200c040b200141346a280200450d03200141306a28020010200c030b200141306a280200450d022001412c6a28020010200c020b200141106a280200450d012001410c6a28020010200c010b2013450d0020012802044101470d00200141086a2201280200109301200128020010200b200020073602042000200436020020034190086a24000be26607097f037e047f017e017f057e047f23004190076b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441044b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200341d8036a41386a2205200141c0006a290300370300200341d8036a41306a2206200141386a29030037030041282104200341d8036a41286a200141306a290300370300200341d8036a41206a2207200141286a290300370300200341d8036a41186a2208200141206a290300370300200341d8036a41106a2209200141186a290300370300200341d8036a41086a220a200141106a290300370300200341e8016a41086a220b200141d4006a2802003602002003200141086a2903003703d8032003200141cc006a2902003703e80120022d000120022d000072450d0b41fcc5c00021050c420b200341a8056a41186a200141196a290000370300200341a8056a41106a200141116a290000370300200341a8056a41086a200141096a290000370300200320012900013703a805200341d8036a41206a200141c1006a2d00003a0000200341d8036a41186a200141396a290000370300200341d8036a41106a200141316a290000370300200341d8036a41086a200141296a2900003703002003200141216a2900003703d803200341a8026a41086a2204200241096a290000370300200341a8026a41106a2205200241116a290000370300200341a8026a41186a2206200241196a290000370300200341a8026a41206a2207200241216a2d00003a0000200320022900013703a80220022d0000450d03200341033a00880641f09ec300210541e90021040c320b200141c0006a290300210c200141386a290300210d200141c8006a290300210e2003418c016a41026a200141076a2d00003a000020034190016a41086a200141186a29020037030020034190016a410d6a2001411d6a2900003700002003200141056a2f00003b018c012003200141106a29020037039001200141046a2d00002109200141086a28020021062001410c6a2802002108200141286a280200210f2001412c6a2802002110200141306a2802002111200241096a2800002104200241056a280000210520022d0001210a20022d00002107200341f0046a41086a220b200241156a290000370300200341f0046a410d6a22122002411a6a2900003700002003200241046a2d00003a00a2052003200241026a2f01003b01a00520032002410d6a2900003703f0042007450d03410121020c040b200141386a290300210d200141306a2903002113200141c0006a290300210e200341a8016a200141196a290000370300200341a0016a200141116a29000037030020034190016a41086a200141096a2900003703002003200129000137039001200141246a2802002114200141286a280200210f2001412c6a280200210a200241096a2800002104200241056a280000210520022d0001210720022d00002106200341f0046a41086a2208200241156a290000370300200341f0046a410d6a22092002411a6a2900003700002003200241046a2d00003a00a2052003200241026a2f01003b01a00520032002410d6a2900003703f0042006450d05410121020c060b2001410c6a2802002108200141086a2802002107200141046a2802002109200141106a290300210e200241096a2800002104200241056a280000210520022d0001210a20022d00002106200341f0046a41086a220b200241156a290000370300200341f0046a410d6a22122002411a6a2900003700002003200241046a2d00003a00a2052003200241026a2f01003b01a00520032002410d6a2900003703f0042006450d08410121020c090b20034188066a41206a20072d00003a000020034188066a41186a200629030037030020034188066a41106a200529030037030020034188066a41086a2004290300370300200320032903a802220e3703880641f09ec300210541e9002104200ea741ff017122024102460d1020024101470d2e20032d00d8034101460d2e4200210e200341f0046a41086a22024200370300200342003703f00441d99fc300411c200341f0046a1002200341c8046a41086a2002290300370300200320032903f0043703c8040240200341c8046a411041c8d7c400410041001001417f460d00200342003703a802200341c8046a4110200341a8026a41084100100141016a41084d0d2220032903a802210e0b20034188066a41017221020c110b200341c8016a41086a200b290300370300200341c8016a410d6a2012290000370000200320032d00a2053a009a05200320032f01a0053b019805200320032903f0043703c80141012102200a41ff01714101470d00200341da036a20032d009a053a0000200341a8026a41086a200341c8016a41086a290300370300200341a8026a410d6a200341c8016a410d6a290000370000200320032f0198053b01d803200320032903c8013703a802410021020c010b412a210441a4c6c00021050b200341a8056a41026a2207200341d8036a41026a2d00003a000020034188066a41086a220a200341a8026a41086a220b29030037030020034188066a41106a200341a8026a41106a290300370300200320032f01d8033b01a805200320032903a8023703880620020d342003419b026a200a290300370000200341a0026a20034188066a410d6a290000370000200320032f01a8053b0188022003200436008f022003200536008b02200320032903880637009302200320072d00003a008a02200341c8016a41026a2003418c016a41026a2d00003a0000200b20034190016a41086a290300370300200341a8026a410d6a220220034190016a410d6a290000370000200320032f018c013b01c80120032003290390013703a802200941ff01714101470d07200341a8056a2006410676103720032802a805210420032802b0052006413f7122024d0d0f200341f0046a41026a200420024105746a220241026a2d00003a0000200341e0036a200241136a290000370300200341e5036a200241186a290000370000200320022f00003b01f0042003200229000b3703d80320022800072108200228000321064101210220032802ac05450d300c2f0b200341c8016a41086a2008290300370300200341c8016a410d6a2009290000370000200320032d00a2053a009a05200320032f01a0053b019805200320032903f0043703c80141012102200741ff01714101470d00200341da036a20032d009a053a0000200341a8026a41086a200341c8016a41086a290300370300200341a8026a410d6a200341c8016a410d6a290000370000200320032f0198053b01d803200320032903c8013703a802410021020c010b412a210441a4c6c00021050b200341c8046a41026a2206200341d8036a41026a2d00003a000020034188066a41086a2207200341a8026a41086a29030037030020034188066a41106a200341a8026a41106a290300370300200320032f01d8033b01c804200320032903a8023703880620020d29200341fb016a2007290300370000200341e8016a41186a220220034195066a290000370000200320032f01c8043b01e801200320043600ef01200320053600eb0120032003290388063700f301200320062d00003a00ea01200341a8026a200341e8016a200e10ff0220032802a8024101470d0520032802b002210420032802ac022105200f0d2a0c2b0b200141c8006a280200210420034188066a41386a200529030037030020034188066a41306a200629030037030020034188066a41286a200341d8036a41286a29030037030020034188066a41206a200729030037030020034188066a41186a200829030037030020034188066a41106a200929030037030020034188066a41086a200a29030037030020034188026a41086a200b280200360200200320032903d80337038806200320032903e80137038802200341f0046a41086a22024200370300200342003703f00441a39ec3004118200341f0046a1002200341c8046a41086a2002290300370300200320032903f0043703c804410021020240200341c8046a411041c8d7c400410041001001417f460d00200342103702ac052003200341c8046a3602a805200341a8026a200341a8056a10900120032d00f40222054102460d1d200341c8016a41026a2206200341f7026a22072d00003a0000200320032f00f5023b01c80120032903a802210e20032903b002210c20032903b802210d20032903c002211320032903c802211520032903d002211620032903d802211720032903e002211820032802e802210220032902ec022119200720062d00003a0000200320053a00f402200320193702ec02200320023602e802200320183703e002200320173703d802200320163703d002200320153703c802200320133703c0022003200d3703b8022003200c3703b0022003200e3703a802200320032f01c8013b00f5020b41bb9ec30021050240200220044f0d00200341b4026a2004360200200341a8026a41086a220241033a00002003410b3a00a802200341a8026a103d200341a8026a41386a20034188066a41386a290300370300200341a8026a41306a20034188066a41306a290300370300200341a8026a41286a20034188066a41286a290300370300200341a8026a41206a20034188066a41206a290300370300200341a8026a41186a20034188066a41186a290300370300200341a8026a41106a20034188066a41106a290300370300200220034188066a41086a290300370300200341f4026a20034188026a41086a280200360200200320043602e80220032003290388063703a80220032003290388023702ec02200341f0046a41086a22024200370300200342003703f00441a39ec3004118200341f0046a1002200341c8046a41086a2002290300370300200320032903f0043703c80441002105200341003602b005200342013703a805200341a8026a200341a8056a10990120032802ac052102200341c8046a411020032802a805220420032802b00510032002450d00200410200b413521040c270b200341c8016a41086a200b290300370300200341c8016a410d6a2012290000370000200320032d00a2053a009a05200320032f01a0053b019805200320032903f0043703c80141012102200a41ff01714101470d00200341da036a20032d009a053a0000200341a8026a41086a200341c8016a41086a290300370300200341a8026a410d6a200341c8016a410d6a290000370000200320032f0198053b01d803200320032903c8013703a802410021020c010b412a210441a4c6c00021050b200341c8046a41026a2206200341d8036a41026a2d00003a000020034188066a41086a220a200341a8026a41086a29030037030020034188066a41106a200341a8026a41106a290300370300200320032f01d8033b01c804200320032903a8023703880620020d04200341bb056a200a290300370000200341a8056a41186a20034195066a290000370000200320032f01c8043b01a805200320043600af05200320053600ab0520032003290388063700b305200320062d00003a00aa05200341f0046a41086a22024200370300200342003703f00441a39ec3004118200341f0046a1002200341c8046a41086a2002290300370300200320032903f0043703c804200341c8046a411041c8d7c400410041001001417f460d02200342103702dc032003200341c8046a3602d803200341a8026a200341d8036a10900120032d00f40222024102460d18200341c8016a41026a2204200341a8026a41cf006a220b2d00003a0000200320032f00f5023b01c80120032903a802210c20032903b002210d20032903b802211320032903c002211520032903c802211620032903d002211720032903d802211820032903e002211920032802e802210520032802ec02210620032802f002210a200b20042d00003a0000200320023a00f4022003200a3602f002200320063602ec02200320053602e802200320193703e002200320183703d802200320173703d002200320163703c802200320153703c002200320133703b8022003200d3703b0022003200c3703a802200320023a00d4062003200a3602d006200320063602cc06200320053602c806200320193703c006200320183703b806200320173703b006200320163703a806200320153703a00620032013370398062003200d370390062003200c37038806200320032f01c8013b00f50220034188066a41cf006a20042d00003a0000200320032f01c8013b00d5060c030b200341f0046a41026a200341c8016a41026a2d00003a0000200341d8036a41086a200341a8026a41086a290300370300200341d8036a410d6a2002290000370000200320032f01c8013b01f004200320032903a8023703d8030c290b200341a8026a41306a290300210c200341a8026a41286a290300210e20034188026a41186a200341a8026a41206a29030037030020034188026a41106a200341a8026a41186a29030037030020034188026a41086a200341a8026a41106a290300370300200320032903b00237038802200341a8026a1095032003200341a8026a3602d4032003200341a8026a3602b801200341a8056a41186a2002290300370300200341a8056a41106a2205200341e8016a41106a290300370300200341a8056a41086a2206200341e8016a41086a290300370300200320032903e8013703a80520034188066a200341a8056a10c7014100210420032d00880622074102460d1120034188066a41306a28020021022007450d0a410021040c110b200341003a00d406200341103602d006200342013703c006200342013703b806200342013703b006200342013703a806200342013703a006200342013703980620034201370390062003420137038806200342808080808080c0003703c8060b200341a8026a200341a8056a200e10ff0220032802a8024101470d0120032802b002210420032802ac0221050b41002108410121062007450d1e200910200c1e0b200341c8026a2903002115200341c0026a2903002116200341d8026a290300210c200341d0026a290300210e200341b8026a290300210d20032903b0022117200341286a20032903880642002008ad4200108804200d427f200329032820032903304200521b7d2213200d56201350722205450d0341ffe0c0002106412c21044101210220070d040c1c0b20032d00d8034101470d1d200341d8036a41017221024200210e0b4100210541012106200341a8056a200e410010f10241ff01714101470d084200210e200341f0046a41086a22044200370300200342003703f00441f59fc3004118200341f0046a1002200341c8046a41086a2004290300370300200320032903f0043703c804200341c8046a411041c8d7c400410041001001417f460d06200342003703f804200342003703f004200341c8046a4110200341f0046a4110410010012204417f460d122004410f4d0d12200341f8046a290300210c20032903f004210e0c070b4100210220032802ac050d1f0c200b200341a8026a2009200820034188066a10980220032802a8024101470d01200341b0026a280200210420032802ac022106410121022007450d180b200910200c170b200341c8046a41186a220a200341a8026a410472220241186a280200360200200341c8046a41106a220b200241106a290200370300200341c8046a41086a2212200241086a290200370300200320022902003703c804200341a8026a41186a22024200370300200341a8026a41106a4200370300200341a8026a41086a4200370300200342003703a80220092008200341a8026a100020034190016a41026a221120032d00aa023a0000200341e8016a41086a2210200341bb026a290000370300200341e8016a410d6a220f2002290000370000200320032f01a8023b019001200320032900b3023703e80120032800ab02210620032800af022104200341c8016a41026a20112d00003a000020034188026a41086a201029030037030020034188026a410d6a200f290000370000200320032f0190013b01c801200320032903e80137038802200341f0046a41186a200a280200360200200341f0046a41106a200b290300370300200341f0046a41086a2012290300370300200320032903c8043703f004411410222202450d0f200241106a41002800bce342360000200241086a41002900b4e342370000200241002900ace34237000020024114413410212202450d10200220032f01c8013b00142002200436001b20022006360017200220032903880237001f200241166a200341c8016a41026a220a2d00003a0000200241276a20034188026a41086a2903003700002002412c6a20034188026a410d6a290000370000200341a8026a41186a220b4200370300200341a8026a41106a22124200370300200341a8026a41086a22114200370300200342003703a80220024134200341a8026a1000200341d8036a41186a200b290300370300200341d8036a41106a2012290300370300200341d8036a41086a2011290300370300200320032903a8023703d803200341d8036a200341f0046a105b200210200240200341f0046a41106a280200450d0020032802fc0410200b200a20034190016a41026a2d00003a0000200341f0046a41086a200341e8016a41086a290300370300200341f0046a410d6a200341e8016a410d6a290000370000200320032f0190013b01c801200320032903e8013703f004411510222202450d112002410d6a41002900a4e342370000200241086a410029009fe34237000020024100290097e34237000020024115413510212202450d12200220032f01c8013b00152002200436001c20022006360018200220032903f004370020200241176a200341ca016a2d00003a0000200241286a200341f0046a41086a2903003700002002412d6a200341f0046a410d6a290000370000200341a8026a41186a220a4200370300200341a8026a41106a220b4200370300200341a8026a41086a22124200370300200342003703a80220024135200341a8026a1000200341d8036a41186a200a290300370300200341d8036a41106a200b290300370300200341d8036a41086a2012290300370300200320032903a8023703d803200341003602b002200342013703a802200320083602880220034188026a200341a8026a103e20032802ac02221220032802b002220b6b20084f0d01200b20086a220a200b490d1320124101742211200a200a2011491b22114100480d132012450d0820032802a802201220111021220a450d090c140b2002417f4c0d1f200341b4066a280200210820034188066a41286a28020021072002450d042002102222040d05200241011023000b20032802a802210a0c130b4200210c0b200341a8026a2002200e200c10a902024020032802a8024101470d0020032802b002210420032802ac0221050c150b200320032903b002370388022003200341b8026a2903003703900220034188026a10cf010b410121074101210820012d000022024104470d200c210b410121040b2004200720021084041a2008450d00200710200b20034194046a410036020020034184046a22074200370200200341d8036a41206a41a8a2c300360200200341f4036a41c8d7c400360200200341ec036a22084200370200200341d8036a41106a4180e5c200360200200341d8036a41086a2002360200200341bc046a200341a8056a41186a290300370200200341b4046a2005290300370200200341ac046a20062903003702002003420837028c042003428080808080013702fc03200341003602e403200320023602dc03200320043602d803200320032903a8053702a4042003200341b8016a3602a0042003200341d4036a36029c042003200341a8026a36029804200341c8046a200341d8036a2013200d20034188026a20034190016a2014200a1086024101211a024020032d00c804221b0d0020034188066a41086a22062008290200370300200341a8056a41086a20034194066a280200360200200320032902e403370388062003200329028c063703a80520034188076a200341a8056a10ca0120034180046a280200220820034188046a280200220441d8006c6a21052007280200210920082102024002402004450d0020034191066a2107200821020240034020022d00002104200341a8056a200241016a41d7001084041a20044106460d01200620043a00002003410b3a0088062007200341a8056a41d7001084041a20034188066a103d200241d8006a22022005470d000c030b0b200241d8006a21020b20022005460d00034020022d000022044106460d01024020044105490d00200241286a280000450d00200241246a28000010200b200241d8006a22022005470d000b0b4100211a2009450d00200810200b200341e8006a20032903980220034188026a41186a290300200329039002220d4200108804200329038802200d7d109403200341f8006a200341e8016a2003290368200341e8006a41086a29030010f80120034198066a200c200341f8006a41086a29030022137d200e2003290378220d54ad7d2013200c7d200d200e54ad7d200d200e582013200c582013200c5122021b22041b22153703002003200e200d7d200d200e7d20041b2216370390062003200d200e562013200c5620021b2202ad370388060240024020020d002016201510ad010c010b20034188066a41086a10cf010b2003418c046a280200221c20034194046a28020022044107746a210a20034190046a280200211d201c21020240024002402004450d0020034191066a2104200341f0046a410272210520034188066a410472210b200341b1066a2112201c210202400340200341c8016a41186a2207200241186a290300370300200341c8016a41106a2208200241106a290300370300200341c8016a41086a2209200241086a290300370300200320022903003703c801200241206a2802002106200341a8056a200241246a41dc001084041a2006410f460d012003200636028806200b200341a8056a41dc001084041a200520032903c801370000200541086a2009290300370000200541106a2008290300370000200541186a200729030037000020034180023b01f004200341e0006a20034188066a200341f0046a10a3012003280260210620034188066a41086a41043a000020122006453a0000200420032903c801370000200441086a2009290300370000200441106a2008290300370000200441186a20072903003700002003410b3a00880620034188066a103d20024180016a2202200a470d000b200a2202200a470d020c030b20024180016a21020b2002200a460d010b20034188066a41206a210820034188066a410b6a210520034188066a41246a2110200341f0046a410d6a2106200341f0046a41086a21070340200320022f01003b01a0052003200241026a2d00003a00a205200241036a2800002109200241076a280000210b2006200241186a2900003700002007200241136a29000037030020032002410b6a2900003703f004200241206a280200210420034188066a200241246a41dc001084041a2004410f460d01200341c8016a41086a22122007290300370300200341c8016a410d6a22112006290000370000200320032d00a2053a009a05200320032f01a0053b019805200320032903f0043703c801200341a8056a20034188066a41dc001084041a20082004360200200520032903c801370000200541086a20122903003700002005410d6a20112900003700002003200b36008f062003200936008b06200320032d009a053a008a06200320032f0198053b0188062010200341a8056a41dc001084041a200810920120024180016a2202200a470d000b0b0240201d450d00201c10200b200341d0046a2802002104410021050240201b4101470d0020032802cc0421050b024020032802d8032202450d0020032802dc03450d00200210200b201a450d11200341d8036a41186a2802002109200341e8036a280200210202400240200341d8036a41146a2802002207450d002007210820022106034020062802880b21062008417f6a22080d000b0340200220022f01064102746a41880b6a28020021022007417f6a22070d000c020b0b200221060b200341a4066a20022f010636020020034188066a41186a410036020020034188066a41146a2002360200200320093602a806200341003602980620034200370390062003200636028c06200341003602880620034188066a1054024020034188046a2802002206450d00200341d8036a41286a2802002102200641d8006c21060340024020022d00004105490d00200241286a280200450d00200241246a28020010200b200241d8006a2102200641a87f6a22060d000b0b20034184046a280200450d1120034180046a2802001020200f0d120c130b20111022220a0d0b0b201141011023000b200341bc026a41013602002003410336028c06200341eca1c40036028806200342013702ac02200341f4a1c4003602a802200320034188066a3602b802200341a8026a4190a0c3001048000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411441011023000b413441011023000b411541011023000b413541011023000b1024000b200320113602ac022003200a3602a802201121120b200a200b6a200920081084041a200341d8036a4120200a200b20086a100302402012450d00200a10200b2002102002402007450d00200910200b200341f0046a41026a220220034190016a41026a2d00003a0000200341d8036a41086a2207200341e8016a41086a290300370300200341d8036a410d6a2208200341e8016a410d6a290000370000200320032f0190013b01f004200320032903e8013703d803200341a8026a41086a41023a0000200341b8026a2004360200200341b4026a2006360200200341b1026a20032f01f0043b0000200341bc026a20032903d803370200200341c4026a2007290300370200200341c9026a200829000037000020022d000021022003410b3a00a802200341a8026a410b6a20023a0000200341a8026a103d410021020b200341086a201620154200201320051b220d42001088042017200d7d109403200341186a200341a8056a2003290308200341086a41086a29030010f801200341b8026a200c200341186a41086a29030022137d200e2003290318220d54ad7d2013200c7d200d200e54ad7d200d200e582013200c582013200c5122051b22071b22153703002003200e200d7d200d200e7d20071b22163703b0022003200d200e562013200c5620051b2205ad3703a80202400240024020050d002016201510ad0141002108410021052002450d020c010b200341a8026a41086a10cf0141002108410021052002450d010b200621050b410121060b4101210720012d000022024104470d0d0c0e0b41012106410121070c0b0b200f450d010b201410200b41002107410121060c080b200410200b20020d00410121024195a9c0002106411521080c010b200341a8056a41026a200341f0046a41026a2d00003a0000200341a8026a41086a200341d8036a41086a290300370300200341a8026a410d6a200341d8036a410d6a290000370000200320032f01f0043b01a805200320032903d8033703a802410021020b200341c8046a41026a2204200341a8056a41026a2d00003a000020034188066a41086a2205200341a8026a41086a29030037030020034188066a41106a200341a8026a41106a290300370300200320032f01a8053b01c804200320032903a8023703880602402002450d00200821042006210520100d030c040b200341b0016a41026a20042d00003a0000200341e8016a41086a2005290300370300200341e8016a410d6a20034188066a410d6a290000370000200320032f01c8043b01b00120032003290388063703e801200341a8026a20034188026a200e10ff02024020032802a8024101470d0020032802b002210420032802ac02210520100d030c040b200341a8026a41306a2903002113200341a8026a41286a290300210e200341c8046a41186a200341a8026a41206a290300370300200341c8046a41106a200341a8026a41186a290300370300200341c8046a41086a200341a8026a41106a290300370300200320032903b0023703c804200341a8026a1095032003200341a8026a3602b4012003200341a8026a3602d403200341a8056a41186a220520034188026a41186a290300370300200341a8056a41106a220720034188026a41106a290300370300200341a8056a41086a220920034188026a41086a29030037030020032003290388023703a80520034188066a200341a8056a10c70141002104024020032d008806220a4102460d0020034188066a41306a28020021020240200a450d00410021040c010b2002417f4c0d01200341b4066a280200210b20034188066a41286a280200210a024002402002450d002002102222040d01200241011023000b410121040b2004200a20021084041a200b450d00200a10200b20034194046a410036020020034184046a220a4200370200200341d8036a41206a41a8a2c300360200200341f4036a41c8d7c400360200200341ec036a220b4200370200200341d8036a41106a4180e5c200360200200341d8036a41086a2002360200200341bc046a2005290300370200200341b4046a2007290300370200200341ac046a20092903003702002003420837028c042003428080808080013702fc03200341003602e403200320023602dc03200320043602d803200320032903a8053702a4042003200341d4036a3602a0042003200341b4016a36029c042003200341a8026a360298042003419b066a200341e8016a41086a29030037000020034188066a41186a200341f5016a2900003700002003200836008f062003200636008b062003200341b0016a41026a2d00003a008a06200320032f01b0013b018806200320032903e80137009306200341003602b005200342013703a805200341b8016a200341d8036a20034188066a200d200c200341c8046a200f2011200341a8056a1088024101211a024020032802b801221b0d0020034188066a41086a2206200b290200370300200341a8056a41086a20034194066a280200360200200320032902e403370388062003200329028c063703a80520034188076a200341a8056a10ca0120034180046a280200220820034188046a280200220441d8006c6a2105200a280200210920082102024002402004450d0020034191066a2107200821020240034020022d00002104200341a8056a200241016a41d7001084041a20044106460d01200620043a00002003410b3a0088062007200341a8056a41d7001084041a20034188066a103d200241d8006a22022005470d000c030b0b200241d8006a21020b20022005460d00034020022d000022044106460d01024020044105490d00200241286a280000450d00200241246a28000010200b200241d8006a22022005470d000b0b4100211a2009450d00200810200b200341c0006a20032903d804200341e0046a29030020032903d004220c420010880420032903c804200c7d109403200341d0006a20034188026a2003290340200341c0006a41086a29030010f80120034198066a2013200341d0006a41086a290300220d7d200e2003290350220c54ad7d200d20137d200c200e54ad7d200c200e58200d201358200d20135122021b22041b22153703002003200e200c7d200c200e7d20041b2216370390062003200c200e56200d20135620021b2202ad370388060240024020020d002016201510ad010c010b20034188066a41086a10cf010b2003418c046a280200221c20034194046a28020022044107746a210a20034190046a280200211d201c21020240024002402004450d0020034191066a2104200341f0046a410272210520034188066a410472210b200341b1066a2112201c210202400340200341c8016a41186a2207200241186a290300370300200341c8016a41106a2208200241106a290300370300200341c8016a41086a2209200241086a290300370300200320022903003703c801200241206a2802002106200341a8056a200241246a41dc001084041a2006410f460d012003200636028806200b200341a8056a41dc001084041a200520032903c801370000200541086a2009290300370000200541106a2008290300370000200541186a200729030037000020034180023b01f004200341386a20034188066a200341f0046a10a3012003280238210620034188066a41086a41043a000020122006453a0000200420032903c801370000200441086a2009290300370000200441106a2008290300370000200441186a20072903003700002003410b3a00880620034188066a103d20024180016a2202200a470d000b200a2202200a470d020c030b20024180016a21020b2002200a460d010b20034188066a41206a210820034188066a410b6a210520034188066a41246a2114200341f0046a410d6a2106200341f0046a41086a21070340200320022f01003b01a0052003200241026a2d00003a00a205200241036a2800002109200241076a280000210b2006200241186a2900003700002007200241136a29000037030020032002410b6a2900003703f004200241206a280200210420034188066a200241246a41dc001084041a2004410f460d01200341c8016a41086a22122007290300370300200341c8016a410d6a22112006290000370000200320032d00a2053a009a05200320032f01a0053b019805200320032903f0043703c801200341a8056a20034188066a41dc001084041a20082004360200200520032903c801370000200541086a20122903003700002005410d6a20112900003700002003200b36008f062003200936008b06200320032d009a053a008a06200320032f0198053b0188062014200341a8056a41dc001084041a200810920120024180016a2202200a470d000b0b0240201d450d00201c10200b200341c0016a280200210420032802bc012102024002400240201b450d002002210520032802d80322020d010c020b2003200341c4016a280200360290062003200436028c0620032002360288064100210502402004450d00200210200b20032802d8032202450d010b20032802dc03450d00200210200b201a450d01200341d8036a41186a2802002109200341e8036a280200210202400240200341d8036a41146a2802002207450d002007210820022106034020062802880b21062008417f6a22080d000b0340200220022f01064102746a41880b6a28020021022007417f6a22070d000c020b0b200221060b200341a4066a20022f010636020020034188066a41186a410036020020034188066a41146a2002360200200320093602a806200341003602980620034200370390062003200636028c06200341003602880620034188066a1054024020034188046a2802002206450d00200341d8036a41286a2802002102200641d8006c21060340024020022d00004105490d00200241286a280200450d00200241246a28020010200b200241d8006a2102200641a87f6a22060d000b0b20034184046a280200450d0120034180046a280200102020100d020c030b1031000b2010450d010b200f10200b41012107410021060b4101210820012d000022024104460d010b024020024103460d0020024102470d022008450d02200141086a280200450d02200141046a28020010200c020b2006450d012001412c6a280200450d01200141286a28020010200c010b2007450d00200141286a280200450d00200141246a28020010200b200020043602042000200536020020034190076a24000b944d030f7f037e017f23004190046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022044101460d0020044102470d11200141216a2d00002105200141246a2802002106200341106a41186a200141196a290000370300200341106a41106a200141116a290000370300200341106a41086a200141096a2900003703002003200129000137031020022d0001210720022d0000210820034180036a41186a22092002411a6a29010037030020034180036a41106a200241126a29010037030020034180036a41086a2002410a6a2901003703002003200241026a290100370380032008450d01410121090c020b200141086a2802002104200141046a280200210520022d0001210820022d0000210120034198036a22092002411a6a29010037030020034190036a200241126a29010037030020034180036a41086a2002410a6a2901003703002003200241026a290100370380032001450d03410121010c040b200341d0006a41026a220a20032d0082033a0000200341b0016a41086a20034193036a290000370300200341b0016a410d6a220b2009290000370000200320032f0180033b01502003200329008b033703b00141012109200741ff01714101470d002003280083032102200328008703210820034180036a41026a200a2d00003a000020034190026a41086a200341b0016a41086a29030037030020034190026a410d6a200b290000370000200320032f01503b018003200320032903b00137039002410021090c010b41a4c6c0002102412a21080b20034180046a41026a220720034180036a41026a2d00003a0000200341a0036a41086a220a20034190026a41086a290300370300200341a0036a41106a20034190026a41106a290300370300200320032f0180033b01800420032003290390023703a00320090d24200341c3006a200a290300370000200341c8006a200341ad036a290000370000200320032f0180043b01302003200836003720032002360033200320032903a00337003b200320072d00003a0032200341306a108402450d03411510222202450d0e2002410d6a4100290085c540370000200241086a4100290080c540370000200241002900f8c44037000020024115413510212202450d0f200220032903103700152002412d6a200341106a41186a290300370000200241256a200341106a41106a2903003700002002411d6a200341106a41086a290300370000200341a0036a41186a22084200370300200341a0036a41106a22094200370300200341a0036a41086a22074200370300200342003703a00320024135200341a0036a100020034180036a41186a200829030037030020034180036a41106a200929030037030020034180036a41086a2007290300370300200320032903a0033703800320034180036a412041c8d7c400410041001001417f460d06200320034180036a3602b001200341203602b40120034100360290022003410020034180036a412020034190026a41044100100122082008417f461b22084104200841044922091b22083602b80120090d13200328029002210c2003410036029002200341b8016a410020034180036a412020034190026a41042008100122092009417f461b2209410420094104491b20086a360200200941034d0d13200328029002210d200341a0036a200341b0016a103820032802a003220b450d13200341a0036a41086a280200210a20032802a403210e20034190026a200341b0016a1038200328029002220f450d1220034190026a41086a28020021102003280294022111200210202006200c470d08200b200a4105746a2107200b2102410021090340200720026b41ff004d0d0b200341306a2002460d0c20092002200341306a412010860422084100476a21092008450d0c200241206a2208200341306a460d0c20092008200341306a412010860422084100476a21092008450d0c200241c0006a2208200341306a460d0c20092008200341306a412010860422084100476a21092008450d0c200241e0006a2208200341306a460d0c20024180016a210220092008200341306a412010860422084100476a210920080d000c0c0b0b200341d0006a41026a20032d0082033a0000200341b0016a41086a20034193036a290000370300200341b0016a410d6a22072009290000370000200320032f0180033b01502003200329008b033703b00141012101200841ff01714101470d002003280083032102200328008703210820034180036a41026a200341d0006a41026a2d00003a000020034190026a41086a200341b0016a41086a29030037030020034190026a410d6a2007290000370000200320032f01503b018003200320032903b00137039002410021010c010b41a4c6c0002102412a21080b20034180046a41026a220920034180036a41026a2d00003a0000200341a0036a41086a220720034190026a41086a290300370300200341a0036a41106a20034190026a41106a290300370300200320032f0180033b01800420032003290390023703a00320010d02200341c3006a2007290300370000200341306a41186a200341ad036a290000370000200320032f0180043b01302003200836003720032002360033200320032903a00337003b200320092d00003a0032200341306a108402450d0120034100360298022003420137039002200420034190026a109501200328029402210120032802980221082003280290022102200341a0036a41186a22094200370300200341a0036a41106a22074200370300200341a0036a41086a220a4200370300200342003703a00320022008200341a0036a1000200341d0006a41186a2009290300370300200341d0006a41106a22082007290300370300200341d0006a41086a2209200a290300370300200320032903a00337035002402001450d00200210200b20034190026a41186a200341d0006a41186a29030037030020034190026a41106a200829030037030020034190026a41086a20092903003703002003200329035037039002411910222202450d0d200241186a41002d00acc4403a0000200241106a41002900a4c440370000200241086a410029009cc44037000020024100290094c44037000020024119413910212202450d0e2002200329039002370019200241316a20034190026a41186a290300370000200241296a20034190026a41106a290300370000200241216a20034190026a41086a290300370000200341a0036a41186a22014200370300200341a0036a41106a22084200370300200341a0036a41086a22094200370300200342003703a00320024139200341a0036a100020034180036a41186a200129030037030020034180036a41106a200829030037030020034180036a41086a2009290300370300200320032903a0033703800320034180036a412041c8d7c4004100410010012101200210202001417f460d0441fed3c2002102411f21080c020b418dc5c00021024114210820044101460d210c220b41adc4c0002102411721080b2004109201200410200c200b2002102041a1c5c00021024113210820044101460d1e0c1f0b200541014b0d0120034190026a200441e0001084041a200341013a00a003200341013602a403200320034190026a200341a0036a10a301200341b5026a2003280200453a0000200341a5026a200341e0006a290300370000200341ad026a200341e8006a290300370000200341083a0090022003419d026a200341d0006a41086a290300370000200341043a009402200320032903503700950220034190026a103d0c120b41b4c5c000210241102108200e450d1a0c190b20034190026a41086a22024200370300200342003703900241c4c4c000411c20034190026a1002200341a0036a41086a200229030037030020032003290390023703a003410021100240200341a0036a411041c8d7c400410041001001417f460d002003410036029002200341a0036a411020034190026a41044100100141016a41044d0d0b20032802900221100b20034190026a41086a22024200370300200342003703900241c4c4c000411c20034190026a1002200341a0036a41086a200229030037030020032003290390023703a00302400240200341a0036a411041c8d7c400410041001001417f460d002003410036029002200341a0036a411020034190026a41044100100141016a41044d0d0d20032802900241016a21020c010b410121020b4200211220034190026a41086a22014200370300200342003703900241c4c4c000411c20034190026a1002200341a0036a41086a2208200129030037030020032003290390023703a0032003200236029002200341a0036a411020034190026a4104100320014200370300200342003703900241e0c4c000411820034190026a10022008200129030037030020032003290390023703a0034100210202400240024002400240200341a0036a411041c8d7c400410041001001417f460d00200342103702b4012003200341a0036a3602b00120034190026a200341b0016a1038200328029002220f450d11200329029402211220034190026a41186a200341d0006a41186a29030037030020034190026a41106a200341d0006a41106a29030037030020034190026a41086a200341d0006a41086a29030037030020032003290350370390022012422088a722022012a7470d0220034190026a210141012109200241016a220820024f0d010c160b20034190026a41186a200341d0006a41186a29030037030020034190026a41106a200341d0006a41106a2903003703002001200341d0006a41086a29030037030020032003290350370390024101210f20034190026a210141012109410041016a22084100490d150b20022009742209200820082009491bad22134205862214422088a70d142014a722084100480d142002450d01200f200241057420081021220f450d020c110b20034190026a21010c110b20081022220f0d0f0b200841011023000b20022007460d01200b200a4105746a21070340200341306a2002460d0120092002200341306a412010860422084100476a21092008450d01410021152007200241206a2202470d000c0d0b0b410121150c0b0b410021150c0a0b200341a4026a4101360200200341033602a403200341eca1c4003602a0032003420137029402200341f4a1c400360290022003200341a0036a3602a00220034190026a41ecc5c0001048000b411541011023000b413541011023000b411941011023000b413941011023000b200e450d00200b10200b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b200f20104105746a2106200f210241002108024002400240024002400240024002400240024002400240024002400240024002400340200620026b41ff004d0d01200341306a2002460d0220082002200341306a412010860422074100476a21082007450d02200241206a2207200341306a460d0220082007200341306a412010860422074100476a21082007450d02200241c0006a2207200341306a460d0220082007200341306a412010860422074100476a21082007450d02200241e0006a2207200341306a460d0220024180016a210220082007200341306a412010860422074100476a210820070d000c020b0b20022006460d02200f20104105746a21060340200341306a2002460d0120082002200341306a412010860422074100476a21082007450d01410021072006200241206a2202470d000c020b0b410121070b200541ff0171450d010c020b41002107200541ff01710d010b20070d0120034190026a41186a2208200341306a41186a29030037030020034190026a41106a2207200341306a41106a29030037030020034190026a41086a2206200341306a41086a2903003703002003200329033037039002024020112010470d00201041016a22022010490d1020104101742211200220022011491b2211ad4205862212422088a70d102012a722024100480d10024002402010450d00200f201041057420021021220f450d010c020b20021022220f0d010b200241011023000b200f20104105746a2202200329039002370000200241186a2008290300370000200241106a2007290300370000200241086a2006290300370000201041016a21102015450d030240200a20094d0d00200b200a417f6a220a4105746a220229000021122002290008211320022900102114200b20094105746a220841186a200241186a2900003700002008201437001020082013370008200820123700000c040b41dcc5c0002009200a10b501000b20150d0020034190026a41186a2209200341306a41186a29030037030020034190026a41106a2206200341306a41106a29030037030020034190026a41086a2215200341306a41086a2903003703002003200329033037039002200e200a470d01200a41016a2202200a490d0e200a410174220e20022002200e491b220ead4205862212422088a70d0e2012a722024100480d0e02400240200a450d00200b200a41057420021021220b450d010c030b20021022220b0d020b200241011023000b41c4c5c000210241162108200e0d140c150b200b200a4105746a2202200329039002370000200241186a2009290300370000200241106a2006290300370000200241086a2015290300370000200a41016a210a2007450d00201020084d0d01200f2010417f6a22104105746a220229000021122002290008211320022900102114200f20084105746a220841186a200241186a2900003700002008201437001020082013370008200820123700000b200341b5026a200329031037000020034190026a41156a200341306a41106a290300370000200341ad026a200341306a41186a290300370000200341c5026a200341106a41106a290300370000200341cd026a200341106a41186a290300370000200341083a0090022003419d026a200341306a41086a290300370000200341bd026a200341106a41086a290300370000200341013a0094022003200329033037009502200341dc026a2010360200200341d8026a200a360200200341d5026a20053a000020034190026a103d20034190026a41086a22024200370300200342003703900241dbc9c100411520034190026a1002200341a0036a41086a200229030037030020032003290390023703a003410021020240024002400240200341a0036a411041c8d7c400410041001001417f460d00200342103702b4012003200341a0036a3602b00120034190026a200341b0016a10f3012003280290022208450d012003290294022212422088a721022012a7450d00200810200b0240200a200d4f22090d004100200220106b2208200820024b1b200d490d00200341ac026a2010360200200341a8026a2011360200200341a0026a200a3602002003419c026a200e3602002003200f3602a4022003200b360298022003200d360294022003200c36029002411510222202450d022002410d6a4100290085c540370000200241086a4100290080c540370000200241002900f8c44037000020024115413510212202450d03200220032903103700152002412d6a200341106a41186a290300370000200241256a200341106a41106a2903003700002002411d6a200341106a41086a290300370000200341a0036a41186a22084200370300200341a0036a41106a22094200370300200341a0036a41086a22074200370300200342003703a00320024135200341a0036a100020034180036a41186a200829030037030020034180036a41106a200929030037030020034180036a41086a2007290300370300200320032903a00337038003200341203602a403200320034180036a3602a00320034190026a200341a0036a10850220021020200e450d0b0c0a0b024002402009450d00200341a5026a200341106a41106a290300370000200341ad026a200341106a41186a290300370000200341083a0090022003419d026a200341106a41086a290300370000200341023a009402200320032903103700950220034190026a103d411910222202450d06200241186a41002d00acc4403a0000200241106a41002900a4c440370000200241086a410029009cc44037000020024100290094c44037000020024119413910212202450d0720022003290310370019200241316a200341106a41186a290300370000200241296a200341106a41106a290300370000200241216a200341106a41086a290300370000200341a0036a41186a22084200370300200341a0036a41106a22094200370300200341a0036a41086a22074200370300200342003703a00320024139200341a0036a100020034180036a41186a200829030037030020034180036a41106a200929030037030020034180036a41086a2007290300370300200320032903a00337038003410f2108024020034180036a412041c8d7c400410041001001417f460d002003422037028404200320034180036a3602800420034190026a20034180046a108b012003280290022208410f460d09200341a0036a20034190026a41047241dc001084041a20034180036a412010090b200341b0016a200341a0036a41dc001084041a2008410f470d0120021020411521084115102222020d090c0a0b200341a5026a200341206a290300370000200341ad026a200341286a290300370000200341083a0090022003419d026a200341106a41086a290300370000200341033a009402200320032903103700950220034190026a103d41152108411510222202450d090c080b200341d0006a200341b0016a41dc001084041a20021020200320083602900220034190026a410472200341d0006a41dc001084041a200341013a00a0032003200d3602a403200341086a20034190026a200341a0036a10a301200341b5026a2003280208453a0000200341a5026a200341206a290300370000200341ad026a200341286a290300370000200341083a0090022003419d026a200341106a41086a290300370000200341043a009402200320032903103700950220034190026a103d411521084115102222020d070c080b419a88c00041331039000b411541011023000b413541011023000b41dcc5c0002008201010b501000b411941011023000b413941011023000b419a88c00041331039000b2002410d6a4100290085c540370000200241086a4100290080c540370000200241002900f8c4403700000240024020022008413510212202450d00200220032903103700152002412d6a200341106a41186a290300370000200241256a200341106a41106a2903003700002002411d6a200341106a41086a29030037000042002112200341a0036a41186a22094200370300200341a0036a41106a22074200370300200341a0036a41086a22084200370300200342003703a00320024135200341a0036a100020034180036a41186a200929030037030020034180036a41106a200729030037030020034180036a41086a2008290300370300200320032903a0033703800320034180036a412010092002102020034190026a41086a22024200370300200342003703900241e0c4c000411820034190026a10022008200229030037030020032003290390023703a00302400240200341a0036a411041c8d7c400410041001001417f460d00200342103702b4012003200341a0036a3602b00120034190026a200341b0016a1038200328029002220c450d0320032902940221120c010b4101210c0b4100210502400240024002402012422088a72207450d004100210a410021054100210802400340024002402005450d00200c20084105746a2102200c2008200a6a4105746a21090340200820074f0d06200341106a2002460d022002200341106a4120108604450d02200a20086a220620074f0d0720092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200241206a2102200941206a21092007200841016a2208470d000c050b0b200c20084105746a21020340200820074f0d05200341106a2002460d012002200341106a4120108604450d01200241206a21022007200841016a2208470d000c030b0b200a417f6a210a200541016a2105200841016a22082007470d000c020b0b410021050b20034190026a41086a22024200370300200342003703900241e0c4c000411820034190026a1002200341a0036a41086a200229030037030020032003290390023703a003200341003602980220034201370390022003200720056b22083602b001200341b0016a20034190026a103e024002402008450d00200741057420054105746b21064100200228020022086b21072003280290022105200328029402210a200c210203400240200a20076a411f4b0d00200841206a22092008490d0f200a4101742210200920092010491b22094100480d0f02400240200a450d002005200a2009102122050d010c080b200910222205450d070b2009210a0b200520086a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200741606a2107200841206a2108200241206a2102200641606a22060d000b20034198026a20083602002003200a3602940220032005360290020c010b20022802002108200328029402210a20032802900221050b200341a0036a41102005200810030240200a450d00200510200b02402012a7450d00200c10200b200e0d060c070b41ccc4c1002008200710b501000b41a4c5c1002006200710b501000b200941011023000b413541011023000b419a88c00041331039000b200841011023000b200b10200b02402011450d00200f10200b4100210220044101470d0e0c0d0b2012422088a72102201321120b200f200241057422096a22082001290000370000200841186a200141186a290000370000200841106a200141106a290000370000200841086a200141086a29000037000020034190026a41086a22014200370300200342003703900241e0c4c000411820034190026a1002200341a0036a41086a200129030037030020032003290390023703a003200341003602980220034201370390022003200241016a22023602b001200341b0016a20034190026a103e024002402002450d00200941206a210a4100200128020022016b210920032802900221062003280294022107200f210203400240200720096a411f4b0d00200141206a22082001490d052007410174220b20082008200b491b22084100480d05024002402007450d00200620072008102122060d010c080b200810222206450d070b200821070b200620016a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200941606a2109200141206a2101200241206a2102200a41606a220a0d000b20034198026a2001360200200320073602940220032006360290020c010b20012802002101200328029402210720032802900221060b200341a0036a411020062001100302402007450d00200610200b02402012a7450d00200f10200b200341b0016a41186a200341d0006a41186a290300370300200341b0016a41106a200341d0006a41106a290300370300200341b0016a41086a200341d0006a41086a290300370300200320032903503703b00120034190026a200441e0001084041a411910222202450d03200241186a41002d00acc4403a0000200241106a41002900a4c440370000200241086a410029009cc44037000020024100290094c44037000020024119413910212202450d04200220032903b001370019200241316a200341b0016a41186a2201290300370000200241296a200341b0016a41106a2208290300370000200241216a200341b0016a41086a2209290300370000200341a0036a41186a22074200370300200341a0036a41106a220a4200370300200341a0036a41086a22064200370300200342003703a00320024139200341a0036a100020034180036a41186a200729030037030020034180036a41106a200a29030037030020034180036a41086a2006290300370300200320032903a00337038003200341003602a803200342013703a00320034190026a200341a0036a10950120032802a403210720034180036a412020032802a003220a20032802a803100302402007450d00200a10200b2002102020034190026a1092012001200341d0006a41186a2903003703002008200341d0006a41106a2903003703002009200341d0006a41086a290300370300200320032903503703b001412010222202450d0520022003290330370000200341ac026a41003602002003419c026a428180808010370200200241186a200341306a41186a290300370000200241106a200341306a41106a290300370000200241086a200341306a41086a290300370000200342013702a402200320023602980220032005360294022003201036029002411510222201450d062001410d6a4100290085c540370000200141086a4100290080c540370000200141002900f8c44037000020014115413510212201450d07200120032903b0013700152001412d6a200341b0016a41186a290300370000200141256a200341b0016a41106a2903003700002001411d6a200341b0016a41086a290300370000200341a0036a41186a22084200370300200341a0036a41106a22094200370300200341a0036a41086a22074200370300200342003703a00320014135200341a0036a100020034180036a41186a200829030037030020034180036a41106a200929030037030020034180036a41086a2007290300370300200320032903a00337038003200341203602a403200320034180036a3602a00320034190026a200341a0036a108502200110202002102020034190026a410d6a200341306a41086a290300370000200341a5026a200341306a41106a29030037000020034190026a411d6a200341306a41186a29030037000020034190026a41256a200329035037000020034190026a412d6a200341d0006a41086a29030037000020034190026a41356a200341d0006a41106a290300370000200341cd026a200341d0006a41186a290300370000200341003a009402200341083a0090022003200329033037009502200341dc026a2005360200200341d8026a201036020020034190026a103d0b20041020410021020c0b0b1024000b200841011023000b411941011023000b413941011023000b412041011023000b411541011023000b413541011023000b200b10200b2011450d00200f102020044101470d020c010b20044101470d010b200141086a2802002201109201200110200b200020083602042000200236020020034190046a24000b8bb7010f087f017e057f027e087f027e037f017e067f027e097f037e027f027e407f230041c0036b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441094b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0a00060304010708050902000b2001410c6a2802002105200141086a2802002106200141106a28020021072001280204210820022d0001210920022d00002104200341c8016a220a2002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d134101210a0c140b2001280204210520022d0001210720022d00002104200341c8016a220a2002411a6a290100370300200341c0016a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d094101210a0c0a0b20022d000120022d0000720d07200141086a290300210b20034198036a41086a22024200370300200342003703980341f482c200411420034198036a100220034190016a41086a20022903003703002003200329039803370390012003200b3703b00120034190016a4110200341b0016a410810030c580b200141306a280200210c2001412c6a280200210d2001280204210e200341ac016a41026a2001410b6a2d00003a0000200341a0026a41086a2001411c6a290200370300200341a0026a410d6a200141216a290000370000200320012f00093b01ac012003200141146a2902003703a002200141086a2d000021072001410c6a280200210a200141106a280200210620022d0001210820022d00002104200341c8016a22052002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d0a410121050c0b0b2001280204210620022d0001210520022d00002104200341c8016a220a2002411a6a290100370300200341c0016a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d0c4101210a0c0d0b200341ac016a41026a2205200141076a2d00003a0000200341f0006a41086a220e200141186a290200370300200341f0006a410d6a220d2001411d6a290000370000200320012f00053b01ac012003200141106a29020037037020022d000120022d0000720d042001410c6a2802002104200141086a280200210220012d0004210f200341c4026a41026a20052d00003a0000200341b0016a41086a200e290300370300200341b0016a410d6a200d290000370000200320032f01ac013b01c402200320032903703703b001200f41ff01714101470d1e200341f0026a2002410676103720032802f002210520032802f8022002413f7122024d0d22200341c0026a41026a200520024105746a220241026a2d00003a0000200341a0036a200241136a290000370300200341a5036a200241186a290000370000200320022f00003b01c0022003200229000b3703980320022800072104200228000321024101210e20032802f402450d4b0c4a0b2001410c6a2802002109200141086a2802002106200141106a28020021102001280204210820022d0001210520022d00002104200341c8016a220a2002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d104101210a0c110b200141386a2903002111200141306a2903002112200141286a2802002113200341ac016a41026a200141076a2d00003a0000200341a0026a41086a200141186a290200370300200341a0026a410d6a2001411d6a290000370000200320012f00053b01ac012003200141106a2902003703a002200141086a28020021142001410c6a280200211520012d0004211620022d0001211720022d00002104200341b0016a41186a22182002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d12410121180c130b20022d000120022d0000720d012001280204210220034198036a41086a22044200370300200342003703980341cc82c200411420034198036a100220034190016a41086a2004290300370300200320032903980337039001200320023602b00120034190016a4110200341b0016a410410030c520b20022d000120022d000072450d130b41fcc5c0002102412821040c550b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2206200a290000370000200320032f01b0013b0170200320032900bb01370398034101210a200741ff01714101470d0020032800b301210220032800b7012104200341c8026a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a2006290000370000200320032f01703b01c80220032003290398033703b0014100210a0c010b41a4c6c0002102412a21040b200341a8016a41026a2207200341c8026a41026a2d00003a000020034190016a41086a2206200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01c8023b01a801200320032903b00137039001200a0d4920034183036a200629030037000020034188036a2003419d016a290000370000200320032f01a8013b01f002200320043600f702200320023600f30220032003290390013700fb02200320072d00003a00f202411610222202450d262002410e6a41002900d3c941370000200241086a41002900cdc941370000200241002900c5c94137000020024116413610212202450d27200220032903f0023700162002412e6a200341f0026a41186a290300370000200241266a200341f0026a41106a290300370000411e21042002411e6a200341f0026a41086a29030037000020034198036a41186a220a420037030020034198036a41106a2207420037030020034198036a41086a2206420037030020034200370398032002413620034198036a1000200341b0016a41186a200a290300370300200341b0016a41106a2007290300370300200341b0016a41086a200629030037030020032003290398033703b001200341b0016a412041c8d7c400410041001001210a2002102041fc89c2002102200a417f470d4920034198036a41086a22024200370300200342003703980341a284c200411620034198036a100220034190016a41086a200229030037030020032003290398033703900141002110024020034190016a411041c8d7c400410041001001417f460d00200341003602b00120034190016a4110200341b0016a41044100100141016a41044d0d2620032802b00121100b20034198036a41086a220242003703002003420037039803419084c200411220034198036a100220034190016a41086a20022903003703002003200329039803370390014100210c20034190016a411041c8d7c400410041001001417f460d1d2003421037029c03200320034190016a36029803200341b0016a20034198036a103820032802b001220e450d2a200341b8016a280200210a20032802b401210c20102005460d1e0c1f0b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2005290000370000200320032f01b0013b0170200320032900bb013703980341012105200841ff01714101470d0020032800b301210220032800b701210420034190016a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a20034198036a410d6a290000370000200320032f01703b01900120032003290398033703b001410021050c010b41a4c6c0002102412a21040b2003418c016a41026a220820034190016a41026a2d00003a0000200341f0026a41086a2209200341b0016a41086a2210290300370300200341f0026a41106a200341b0016a41106a290300370300200320032f0190013b018c01200320032903b0013703f00220050d46200341db026a2009290300370000200341e0026a200341f0026a410d6a290000370000200320032f018c013b01c802200320043600cf02200320023600cb02200320032903f0023700d302200320082d00003a00ca02200341c4026a41026a200341ac016a41026a2d00003a00002010200341a0026a41086a290300370300200341b0016a410d6a2202200341a0026a410d6a290000370000200320032f01ac013b01c402200320032903a0023703b001200741ff01714101470d0d200341f0006a200a4106761037200328027021042003280278200a413f7122024d0d16200341c0026a41026a200420024105746a220241026a2d00003a0000200341a0036a200241136a290000370300200341a5036a200241186a290000370000200320022f00003b01c0022003200229000b37039803200228000721062002280003210a410121022003280274450d3b0c3a0b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2207200a290000370000200320032f01b0013b0170200320032900bb01370398034101210a200541ff01714101470d0020032800b301210220032800b7012104200341c8026a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a2007290000370000200320032f01703b01c80220032003290398033703b0014100210a0c010b41a4c6c0002102412a21040b200341a8016a41026a2207200341c8026a41026a2d00003a000020034190016a41086a2205200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01c8023b01a801200320032903b00137039001200a0d4320034183036a200529030037000020034188036a2003419d016a290000370000200320032f01a8013b01f002200320043600f702200320023600f30220032003290390013700fb02200320072d00003a00f20220034198036a41086a22024200370300200342003703980341e082c200411420034198036a10022005200229030037030020032003290398033703900120034190016a411041c8d7c400410041001001417f460d0f419589c2002102411e21040c430b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2210200a290000370000200320032f01b0013b0170200320032900bb01370398034101210a200941ff01714101470d0020032800b301210220032800b7012104200341f0026a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a2010290000370000200320032f01703b01f00220032003290398033703b0014100210a0c010b41a4c6c0002102412a21040b200341a8016a41026a2209200341f0026a41026a2d00003a000020034190016a41086a2210200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01f0023b01a801200320032903b001370390010240200a450d0041002105410121072006450d42200810202001280200220a4102470d490c480b2003418c016a41026a220a20092d00003a0000200341a0026a41086a22092010290300370300200341a0026a410d6a221020034190016a410d6a290000370000200320032f01a8013b018c0120032003290390013703a002200341c3016a2009290300370000200341c8016a2010290000370000200320043600b701200320023600b3012003200a2d00003a00b201200320032f018c013b01b001200320032903a0023700bb01200320053602a0032003200636029c0320032008360298032003200341b0016a20034198036a200710e902200328020421042003280200210241002105410121072001280200220a4102470d480c470b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2207200a290000370000200320032f01b0013b0170200320032900bb01370398034101210a200541ff01714101470d0020032800b301210220032800b7012104200341c4026a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a2007290000370000200320032f01703b01c40220032003290398033703b0014100210a0c010b41a4c6c0002102412a21040b200341a8016a41026a2205200341c4026a41026a2d00003a000020034190016a41086a2207200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01c4023b01a801200320032903b00137039001200a0d07200341ab036a2007290300370000200341b0036a20034190016a410d6a290000370000200320032f01a8013b0198032003200436009f032003200236009b0320032003290390013700a303200320052d00003a009a03200341b0016a20034198036a10b2024101210a20032d00b0014101470d052003418e016a20032d00b3013a0000200341f0026a41086a200341c4016a290200370300200341f0026a410d6a200341c9016a290000370000200320032f00b1013b018c012003200341bc016a2902003703f002200341b0016a41086a28020021044100210a20032802b40121020c060b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2018290000370000200320032f01b0013b0170200320032900bb013703980341012118201741ff01714101470d0020032800b301210220032800b701210420034190016a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a20034198036a410d6a290000370000200320032f01703b01900120032003290398033703b001410021180c010b412a210441a4c6c00021020b2003418c016a41026a221720034190016a41026a2d00003a0000200341f0026a41086a2219200341b0016a41086a290300370300200341f0026a41106a200341b0016a41106a290300370300200320032f0190013b018c01200320032903b0013703f00220180d3a200341db026a2019290300370000200341e0026a200341f0026a410d6a290000370000200320032f018c013b01c802200320043600cf02200320023600cb02200320032903f0023700d302200320172d00003a00ca022012201184500d08200341c4026a41026a2202200341ac016a41026a2d00003a0000200341b0016a41086a2204200341a0026a41086a290300370300200341b0016a410d6a200341a0026a410d6a290000370000200320032f01ac013b01c402200320032903a0023703b001201641ff01714101470d09200341f0006a201441067610372003280270210420032802782014413f7122024d0d0c200341c0026a41026a200420024105746a220241026a2d00003a0000200341a0036a200241136a290000370300200341a5036a200241186a290000370000200320022f00003b01c0022003200229000b370398032002280007211520022800032114410121022003280274450d2b0c2a0b200141086a290300210b20034198036a41086a220242003703002003420037039803419883c200411c20034198036a100220034190016a41086a20022903003703002003200329039803370390012003200b3703b00120034190016a4110200341b0016a410810030c3d0b200341c0026a41026a200341c4026a41026a2d00003a000020034198036a41086a200341b0016a41086a29030037030020034198036a410d6a2002290000370000200320032f01c4023b01c002200320032903b001370398030c2e0b410b2104418887c20021020b200341c0026a41026a22052003418c016a41026a2d00003a0000200341c8026a41086a2207200341f0026a41086a290300370300200341c8026a41106a200341f0026a41106a290300370300200320032f018c013b01c002200320032903f0023703c802200a450d010b41012105410021072006450d36200810202001280200220a4102470d3d0c3c0b200341ac016a41026a220a20052d00003a0000200341a0026a41086a22052007290300370300200341a0026a410d6a2207200341c8026a410d6a290000370000200320032f01c0023b01ac01200320032903c8023703a002200341c3016a2005290300370000200341c8016a2007290000370000200320043600b701200320023600b3012003200a2d00003a00b201200320032f01ac013b01b001200320032903a0023700bb01200320093602a0032003200636029c032003200836029803200341086a200341b0016a20034198036a201010e902200328020c21042003280208210241012105410021072001280200220a4102470d3c0c3b0b411410222202450d12200241106a41002800a38742360000200241086a410029009b874237000020024100290093874237000020024114413410212202450d13200220032903f002370014411821042002412c6a200341f0026a41186a290300370000200241246a200341f0026a41106a2903003700002002411c6a200341f0026a41086a29030037000020034198036a41186a220a420037030020034198036a41106a2205420037030020034198036a41086a2207420037030020034200370398032002413420034198036a1000200341b0016a41186a200a290300370300200341b0016a41106a2005290300370300200341b0016a41086a200729030037030020032003290398033703b001200341b0016a412041c8d7c400410041001001210a20021020200a417f460d0620034198036a41086a22024200370300200342003703980341b483c200410e20034198036a100220034190016a41086a200229030037030020032003290398033703900120034190016a411041c8d7c400410041001001417f460d0a2003421037029c03200320034190016a36029803200341b0016a20034198036a103820032802b001220a450d1520032802b4012105200341b8016a280200220220064d0d0b200a20064105746a2204200341f0026a460d0d2004200341f0026a4120108604450d0d41e389c20021024119210420050d0c0c330b200341c0026a41026a200341c4026a41026a2d00003a000020034198036a41086a200341b0016a41086a29030037030020034198036a410d6a200341b0016a410d6a290000370000200320032f01c4023b01c002200320032903b001370398030c2d0b41ce8ac200210241d00021040c310b200341c0026a41026a20022d00003a000020034198036a41086a200429030037030020034198036a410d6a200341b0016a410d6a290000370000200320032f01c4023b01c002200320032903b001370398030c220b4100210220032802740d230c240b4100210e20032802f4020d270c280b4100210220032802740d1d0c1e0b41b389c20021020c2c0b4101210e4100210a20102005470d010b200a2005460d0e0b419a8ac200210241162104200a20054d0d0e200341c8016a4200370300200341c0016a4200370300200341b8016a4200370300200342003703b001200e20054105746a2207200341b0016a460d0d2007200341b0016a41201086040d0e0c0d0b41cb89c20021020c280b41cb89c2002102411821042005450d270b200a10200c260b200320023602b801200320053602b4012003200a3602b001200341f0026a2006200341b0016a10ea024200210b20034198036a41086a22024200370300200342003703980341f388c200411220034198036a100220034190016a41086a2002290300370300200320032903980337039001410021020240024020034190016a411041c8d7c400410041001001417f460d00200342003703b801200342003703b00120034190016a4110200341b0016a4110410010012204417f460d0a2004410f4d0d0a200341b8016a290300212020032903b001210b0c010b420021200b200341f0026a200b202010e5010c2a0b200341c4016a41013602002003410336029c03200341eca1c40036029803200342013702b401200341f4a1c4003602b001200320034198036a3602c001200341b0016a41f88dc2001048000b419a88c00041331039000b411641011023000b413641011023000b411441011023000b413441011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b4200210b20034198036a41086a22024200370300200342003703980341c984c200411520034198036a100220034190016a41086a20022903003703002003200329039803370390010240024020034190016a411041c8d7c400410041001001417f460d00200342003703b801200342003703b00120034190016a4110200341b0016a4110410010012202417f460d042002410f4d0d04200341b8016a290300210b20032903b00121200c010b420921200b200341306a200341f0026a2020200b10b0012003280230450d0141b08ac2002102411e21040b200c450d1a200e10200c1a0b20034198036a41086a22024200370300200342003703980341b884c200411120034198036a100220034190016a41086a200229030037030020032003290398033703900141002107024020034190016a411041c8d7c400410041001001417f460d00200341003602b00120034190016a4110200341b0016a41044100100141016a41044d0d0220032802b00121070b411610222202450d022002410e6a41002900d3c941370000200241086a41002900cdc941370000200241002900c5c94137000020024116413610212202450d03200220032903f0023700162002412e6a200341f0026a41186a290300370000200241266a200341f0026a41106a2903003700002002411e6a200341f0026a41086a29030037000020034198036a41186a2204420037030020034198036a41106a2206420037030020034198036a41086a2208420037030020034200370398032002413620034198036a1000200341b0016a41186a2004290300370300200341b0016a41106a2006290300370300200341b0016a41086a200829030037030020032003290398033703b001410410222204450d042004200736000020044104410810212204450d0520042005360004200341b0016a41202004410810032004102020021020024002400240200a2005470d00200341b0016a41186a2204200341f0026a41186a290300370300200341b0016a41106a220a200341f0026a41106a290300370300200341b0016a41086a2207200341f0026a41086a290300370300200320032903f0023703b001200c2005470d0a200541016a22022005490d1a20054101742206200220022006491b220cad420586220b422088a70d1a200ba722024100480d1a2005450d01200e200541057420021021220e450d020c0a0b200341b0016a41186a2204200341f0026a41186a290300370300200341b0016a41106a2207200341f0026a41106a290300370300200341b0016a41086a2206200341f0026a41086a290300370300200320032903f0023703b001200a20054d0d08200e20054105746a220220032903b001370000200241186a2004290300370000200241106a2007290300370000200241086a20062903003700000c0a0b20021022220e0d080b200241011023000b419a88c00041331039000b419a88c00041331039000b411641011023000b413641011023000b410441011023000b410841011023000b418084c2002005200a10b501000b200e20054105746a220220032903b001370000200241186a2004290300370000200241106a200a290300370000200241086a2007290300370000200541016a210a0b20034198036a41086a220242003703002003420037039803419084c200411220034198036a1002200341b0016a41086a200229030037030020032003290398033703b001200341003602a00320034201370398032003200a3602c802200341c8026a20034198036a103e024002400240200a450d00200e200a4105746a21084100200228020022046b21052003280298032106200328029c032107200e210203400240200720056a411f4b0d00200441206a220a2004490d1320074101742209200a200a2009491b220a4100480d13024002402007450d0020062007200a102122060d010c060b200a10222206450d050b200a21070b200620046a220a2002290000370000200a41186a200241186a290000370000200a41106a200241106a290000370000200a41086a200241086a290000370000200541606a2105200441206a2104200241206a220a21022008200a470d000b200341a0036a20043602002003200736029c0320032006360298030c010b20022802002104200328029c03210720032802980321060b200341b0016a411020062004100302402007450d00200610200b0240200c450d00200e10200b20034198036a41086a22024200370300200342003703980341a284c200411620034198036a100220034190016a41086a2002290300370300200320032903980337039001410121072003201041016a3602b00120034190016a4110200341b0016a410410030c090b200a41011023000b200410200b20020d00410121024195a9c0002114411521150c010b200341f0006a41026a200341c0026a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a20034198036a410d6a290000370000200320032f01c0023b017020032003290398033703b001410021020b200341a8016a41026a2218200341f0006a41026a2d00003a000020034190016a41086a2204200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01703b01a801200320032903b0013703900102402002450d0020152104201421020c0d0b20034183036a200429030037000020034188036a2003419d016a290000370000200320032f01a8013b01f002200320153600f702200320143600f30220032003290390013700fb02200320182d00003a00f20220034198036a41086a22024200370300200342003703980341b884c200411120034198036a100220042002290300370300200320032903980337039001410021020240024002400240024002400240024002400240024002400240024002400240024020034190016a411041c8d7c400410041001001417f460d00200341003602b00120034190016a4110200341b0016a41044100100141016a41044d0d0120032802b00121020b0240024002400240024002400240024020022013470d0020034198036a41086a22024200370300200342003703980341e082c200411420034198036a100220034190016a41086a22042002290300370300200320032903980337039001200341b0016a20034190016a105a20032802bc012216450d0120032903c001211b20024200370300200342003703980341c283c200411820034198036a1002200420022903003703002003200329039803370390014100211420034190016a411041c8d7c400410041001001417f460d022003421037029c03200320034190016a36029803200341e8006a20034198036a108e012003280268450d07200328026c2213ad221c421c88a70d0b201c420486a72202417f4c0d0b2002450d032002102222180d04200241081023000b41cb8bc2002102411121040c230b419e8bc2002102412d21040c220b410821184108212c4100212a0c020b410821180b024002402013450d0020034198036a41086a2802002115200328029c032131200328029803212b410021174100210441002102201321140340200342003703b801200342003703b0014100202b2031200341b0016a41102015100122192019417f461b2219411020194110491b20156a21152019410f4d0d04200241016a212a200341b0016a41086a290300211c20032903b0012132024020022014470d002017202a202a2017491b2214ad4204862233422088a70d212033a722194100480d2102402002450d00201820042019102122180d010c090b201910222218450d080b201820046a2202201c37030820022032370300201741026a2117200441106a2104202a2102202a2013490d000b200341a0036a201536020020180d010c040b4100212a410021142018450d030b2018212c0b20034198036a41086a22024200370300200342003703980341b483c200410e20034198036a100220034190016a41086a2002290300370300200320032903980337039001410021190240024020034190016a411041c8d7c400410041001001417f460d002003421037029c03200320034190016a36029803200341b0016a20034198036a103820032802b0012213450d0e200341b8016a280200212d20032802b40121190c010b410121134100212d0b4200211c20034198036a41086a22024200370300200342003703980341b78dc200411c20034198036a100220034190016a41086a20022903003703002003200329039803370390010240024020034190016a411041c8d7c400410041001001417f460d00200342003703b801200342003703b00120034190016a4110200341b0016a4110410010012202417f460d082002410f4d0d08200341b8016a290300211c20032903b00121320c010b420121320b200341d8006a2032201c202dad4200108804411410222202450d08200341d8006a41086a290300211c20032903582134200241106a41002800a5ef40360000200241086a410029009def4037000020024100290095ef4037000020024114413410212202450d09200220032903c8023700142002412c6a200341c8026a41186a290300370000200241246a200341c8026a41106a2903003700002002411c6a200341c8026a41086a2903003700004200213320034198036a41186a2204420037030020034198036a41106a2215420037030020034198036a41086a2217420037030020034200370398032002413420034198036a1000200341b0016a41186a2004290300370300200341b0016a41106a2015290300370300200341b0016a41086a201729030037030020032003290398033703b00102400240200341b0016a412041c8d7c400410041001001417f460d00200342003703a0032003420037039803200341b0016a412020034198036a4110410010012204417f460d092004410f4d0d09200341a0036a290300213220032903980321330c010b420021320b200210200240024002400240024020332034542032201c542032201c511b450d00418d8cc2002102412e210420190d010c020b20034198036a41086a22024200370300200342003703980341ec83c200411320034198036a100220034190016a41086a2002290300370300200320032903980337039001024002400240024020034190016a411041c8d7c400410041001001417f460d002003421037029c03200320034190016a36029803200341b0016a20034198036a10dc0220032802b0012215450d15200341b0016a41086a2802002217450d1620032802b401213141bb8cc2002102412321042015290300201254201541086a290300223220115420322011511b450d034108213020034198036a41086a22024200370300200342003703980341dbc9c100411520034198036a100220034190016a41086a20022903003703002003200329039803370390014100213520034190016a411041c8d7c400410041001001417f460d012003421037029c03200320034190016a36029803200341b0016a20034198036a10f30120032802b0012230450d17200341b8016a280200213620032802b40121350c020b41dc8bc20021024131210420190d030c040b410021360b2030203641286c6a212f203021024100212b02400240024002400340202f20026b419f014d0d012002200341f0026a460d02202b2002200341f0026a4120108604222e4100476a212b202e450d02200241286a222e200341f0026a460d02202b202e200341f0026a4120108604222e4100476a212b202e450d02200241d0006a222e200341f0026a460d02202b202e200341f0026a4120108604222e4100476a212b202e450d02200241f8006a222e200341f0026a460d02200241a0016a2102202b202e200341f0026a4120108604222e4100476a212b202e0d000c020b0b202f2002460d012030203641286c6a212f0340200341f0026a2002460d01202b2002200341f0026a4120108604222e4100476a212b202e450d01202f200241286a2202470d000c020b0b202b201b422088a74f0d010b02402035450d00203010200b200341b0016a200341f0026a10de0241948dc200210220032802b0014101470d01202a41ffffffff00712202202d41ffffff3f712204200420024b1b222f450d04200341b8016a280200213520032802b4012130201321044100212a42002137420021380340411410222202450d11200241106a41002800a38742360000200241086a410029009b874237000020024100290093874237000020024114413410212202450d12200220042900003700142002412c6a200441186a290000370000200241246a200441106a2900003700002002411c6a200441086a29000037000020034198036a41186a222b420037030020034198036a41106a222d420037030020034198036a41086a222e420037030020034200370398032002413420034198036a1000200341b0016a41186a202b290300370300200341b0016a41106a202d290300370300200341b0016a41086a222d202e29030037030020032003290398033703b001024002400240200341b0016a412041c8d7c400410041001001417f460d002003410036029803200341b0016a412020034198036a41044100100141016a41044d0d0e200328029803212e4100212b202a41016a212a20021020202e20304f0d010c020b4101212b202a41016a212a2002102041002030490d010b202b0d00200341b0016a200410eb0242002132420021330240202d28020020354d0d00202c41086a290300420020032802b00120356a2d000022021b2133202c290300420020021b21320b024020032802b401450d0020032802b00110200b203320387c203220377c2237203254ad7c21380b200441206a2104202c41106a212c202a202f490d000c060b0b41de8cc2002102413621042035450d00203010200b02402031450d00201510200b2019450d010b201310200b02402014450d00201810200b201ba7450d200c130b42002137420021380b2015201741306c6a212b201521020240024002400340202b20026b41bf014d0d014101212a200241106a2204200341f0026a460d022004200341f0026a4120108604450d02200241c0006a2204200341f0026a460d022004200341f0026a4120108604450d02200241f0006a2204200341f0026a460d022004200341f0026a4120108604450d02200241a0016a2204200341f0026a460d02200241c0016a21022004200341f0026a41201086040d000c020b0b02402002202b460d0003404101212a200241106a2202200341f0026a460d022002200341f0026a4120108604450d02200241206a2202202b470d000b0b4100212a20372012852038201185844200520d00200341f0026a41086a290300211c200341f0026a41106a2903002132200341f0026a41186a290300213320032903f00221342015201137030820152012370300200341b0016a41186a2033370300200341b0016a41106a2032370300200341b0016a41086a201c37030020152034370310201541186a201c370300201541206a2032370300201541286a2033370300200320343703b001201741144b0d014101213a201741014d0d1f417f213b2017417f6a213c4130213d2015201741306c6a213e4102213f41082140412821414118214241202143411021444103214541e80021464150214741782148417021494168214a4160214b4158214c4138214d410121020c1d0b200341386a200341c8026a2034201c10b3012003290338200341c0006a29030010ad0102402031450d00201510200b02402019450d00201310200b02402014450d00201810200b41d38dc20041e98dc200202a1b21024116410f202a1b2104201ba70d120c1f0b2017410176224ead42307e220b422088a70d05200ba72202417f4c0d054108210a024002402002450d0020021022224f450d12204f21500c010b4108214f410821500b41502110201541506a21514130210c201541306a2152201541f07e6a21534100215441042155417f215641012139420321204220210b4103215741022158417d21594158215a41282109412021084118210741102106417e215b4174215c4164215d41a87f215e41a07f215f4109216041e80021614178216241702163416821644160216541382166410a216741042168410021694100216a2017216b410221020c1b0b200341a0036a20153602002014450d00201810200b419a88c00041331039000b419a88c00041331039000b201941081023000b419a88c00041331039000b1031000b419a88c00041331039000b419a88c00041331039000b411441011023000b413441011023000b411441011023000b413441011023000b419a88c00041331039000b419a88c00041331039000b418883c2004100410010b501000b419a88c00041331039000b200241081023000b201610200c0c0b200410200b20020d00410121024195a9c000210a411521060c010b200341f0006a41026a200341c0026a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a20034198036a410d6a290000370000200320032f01c0023b017020032003290398033703b001410021020b200341a8016a41026a2205200341f0006a41026a2d00003a000020034190016a41086a2204200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01703b01a801200320032903b0013703900102402002450d00410121074101210520062104200a21022001280200220a4102470d110c100b20034183036a200429030037000020034188036a2003419d016a290000370000200320032f01a8013b01f002200320063600f7022003200a3600f30220032003290390013700fb02200320052d00003a00f20220034198036a41086a22024200370300200342003703980341e082c200411420034198036a100220042002290300370300200320032903980337039001024020034190016a411041c8d7c400410041001001417f460d0041a787c2002102412621040c090b02400240024002400240411410222202450d00200241106a41002800a38742360000200241086a410029009b874237000020024100290093874237000020024114413410212202450d01200220032903c802370014411821042002412c6a200341c8026a41186a290300370000200241246a200341c8026a41106a2903003700002002411c6a200341c8026a41086a29030037000020034198036a41186a220a420037030020034198036a41106a2205420037030020034198036a41086a2207420037030020034200370398032002413420034198036a1000200341b0016a41186a200a290300370300200341b0016a41106a2005290300370300200341b0016a41086a200729030037030020032003290398033703b0010240024002400240024002400240200341b0016a412041c8d7c400410041001001417f460d002003410036029803200341b0016a412020034198036a41044100100141016a41044d0d0420021020411410222202450d09200241106a41002800a38742360000200241086a410029009b874237000020024100290093874237000020024114413410212202450d0a200220032903f002370014412c21042002412c6a200341f0026a41186a290300370000200241246a200341f0026a41106a2903003700002002411c6a200341f0026a41086a29030037000020034198036a41186a220a420037030020034198036a41106a2205420037030020034198036a41086a2207420037030020034200370398032002413420034198036a1000200341b0016a41186a200a290300370300200341b0016a41106a2005290300370300200341b0016a41086a200729030037030020032003290398033703b001200341b0016a412041c8d7c400410041001001417f460d012003410036029803200341b0016a412020034198036a41044100100141016a41044d0d05200328029803210a2002102020034198036a41086a22024200370300200342003703980341b884c200411120034198036a100220034190016a41086a200229030037030020032003290398033703900120034190016a411041c8d7c400410041001001417f460d02200341003602b00120034190016a4110200341b0016a41044100100141016a41044d0d0620032802b001200c470d030c0b0b2002102041cd87c20021020c130b20021020419a88c20021020c120b4100200c460d080b41e587c2002102411621040c100b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411441011023000b413441011023000b411441011023000b413441011023000b20034198036a41086a22024200370300200342003703980341d888c200411b20034198036a100220034190016a41086a2002290300370300200320032903980337039001024002400240024020034190016a411041c8d7c400410041001001417f460d00200341003602b00120034190016a4110200341b0016a41044100100141016a41044d0d0220032802b001200a6a200c4f0d010c030b4101200a6a200c490d020b41fb87c2002102411f21040c0a0b419a88c00041331039000b20034198036a41086a22024200370300200342003703980341b483c200410e20034198036a100220034190016a41086a2002290300370300200320032903980337039001024002400240024002400240024002400240024020034190016a411041c8d7c400410041001001417f460d002003421037029c03200320034190016a36029803200341b0016a20034198036a103820032802b0012205450d0220032802b401210741c688c2002102411221040240200341b8016a2802002209200e4d0d0002402005200e4105746a2206200341c8026a460d002006200341c8026a41201086040d010b418589c2002102411021042009200d4d0d002005200d4105746a2206200341f0026a460d022006200341f0026a4120108604450d020b2007450d12200510200c120b41c688c2002102411221040c110b200341f0006a200341f0026a10eb02200328027821022003280270210620034198036a41086a220442003703002003420037039803419084c200411220034198036a100220034190016a41086a2004290300370300200320032903980337039001410021040240024020034190016a411041c8d7c400410041001001417f460d002003421037029c03200320034190016a36029803200341b0016a20034198036a103820032802b0012239450d03200341b8016a280200210420032802b40121180c010b41012139410021180b02400240200441ffffff3f7122042002200220044b1b2208450d0041002104200341c8016a2110200341c0016a210c200341b8016a210f2039210203400240200620046a2d0000450d0020104200370300200c4200370300200f4200370300200342003703b001200341b0016a2002460d002002200341b0016a4120108604450d00200341b0016a200210de024101212120032802b0014101470d0020032802b401200a4d0d030b200241206a2102200441016a22042008490d000b0b410021210b02402018450d00203910200b02402003280274450d00200610200b200320093602b801200320073602b401200320053602b001200341c8026a200341f0026a20211b200e200d20211b200341b0016a10ea024200210b20034198036a41086a22024200370300200342003703980341f388c200411220034198036a100220034190016a41086a200229030037030020032003290398033703900120034190016a411041c8d7c4004100410010012102024002400240024002402021450d002002417f460d01200342003703b801200342003703b00120034190016a4110200341b0016a4110410010012202417f460d072002410f4d0d07200341b8016a290300210b20032903b00121200c020b2002417f460d02200342003703b801200342003703b00120034190016a4110200341b0016a4110410010012202417f460d072002410f4d0d07200341b8016a290300212820032903b001210b0c030b420021204200210b0b200341106a200341c8026a2020200b10ac012003290310200341106a41086a29030010ad01200341bd016a200341c8026a41086a290300370000200341c5016a200341d8026a290300370000200341cd016a200341e0026a29030037000041012107200341013a00b401200341063a00b001200320032903c8023700b501200341b0016a103d0c0a0b420021280b200341206a200341c8026a103b0240024002402003290320200341286a29030084500d00411810222202450d08200241106a41002900b9ef40370000200241086a41002900b1ef40370000200241002900a9ef4037000020024118413810212202450d09200220032903f002370018200241306a200341f0026a41186a290300370000200241286a200341f0026a41106a290300370000200241206a200341f0026a41086a2903003700004200212020034198036a41186a2204420037030020034198036a41106a220a420037030020034198036a41086a2205420037030020034200370398032002413820034198036a1000200341b0016a41186a2004290300370300200341b0016a41106a200a290300370300200341b0016a41086a200529030037030020032003290398033703b001200341b0016a412041c8d7c400410041001001417f460d01200342003703a0032003420037039803200341b0016a412020034198036a4110410010012204417f460d072004410f4d0d07200341a0036a290300211b20032903980321202002102041142104411410222202450d020c0a0b41d5e8c0002102412221040c120b4200211b20021020411421044114102222020d080b200441011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411841011023000b413841011023000b200241106a41002800a5ef40360000200241086a410029009def4037000020024100290095ef40370000024020022004413410212202450d00200220032903c8023700142002412c6a200341c8026a41186a2204290300370000200241246a200341c8026a41106a2903003700002002411c6a200341c8026a41086a2903003700004200212720034198036a41186a220a420037030020034198036a41106a2205420037030020034198036a41086a2207420037030020034200370398032002413420034198036a1000200341b0016a41186a200a290300370300200341b0016a41106a2005290300370300200341b0016a41086a200729030037030020032003290398033703b001024002400240200341b0016a412041c8d7c400410041001001417f460d00200342003703a0032003420037039803200341b0016a412020034198036a411041001001220a417f460d02200a410f4d0d02200341a0036a290300211120032903980321270c010b420021110b20021020200341c8026a2027200b20202020200b56201b202856201b2028511b22021b220b7c221220112028201b20021b22287c2012202754ad7c10af01200341f0026a2020200b7d201b20287d2020200b54ad7d10b601200341bd016a200341f0026a41086a290300370000200341c5016a200341f0026a41106a290300370000200341cd016a200341f0026a41186a290300370000200341d5016a20032903c802370000200341dd016a200341c8026a41086a290300370000200341e5016a200341c8026a41106a290300370000200341ed016a200429030037000041002102200341003a00b401200341063a00b001200320032903f0023700b501200341b0016a103d0c0f0b419a88c00041331039000b413441011023000b410021020c0d0b200510200b200e0d00410121054195a9c0002102411521040c010b200341f0026a41026a200341c0026a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a20034198036a410d6a290000370000200320032f01c0023b01f00220032003290398033703b001410021050b200341a8016a41026a220d200341f0026a41026a2d00003a000020034190016a41086a220e200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01f0023b01a801200320032903b0013703900120050d03200341b3026a200e290300370000200341b8026a2003419d016a290000370000200320032f01a8013b01a002200320043600a702200320023600a30220032003290390013700ab022003200d2d00003a00a20220034198036a41086a22024200370300200342003703980341dbc9c100411520034198036a1002200e20022903003703002003200329039803370390014100211a0240024002400240024002400240024020034190016a411041c8d7c400410041001001417f460d002003421037029c03200320034190016a36029803200341b0016a20034198036a10f30120032802b001220e450d0620032802b401211a41282105200341b8016a280200220f41286c220d0d010c020b4108210e4100210f41282105410041286c220d450d010b410021040340200341b0016a41206a200e20046a220241206a290300370300200341b0016a41186a200241186a290300370300200341b0016a41106a200241106a290300370300200341b0016a41086a200241086a290300370300200320022903003703b001200341b0016a200341a0026a41201086040d02200d200420056a2204470d000b0b4108211d4100211e201a450d01200e10204100211f0c0b0b20034198036a41206a2205200341b0016a41206a29030037030020034198036a41186a220d200341b0016a41186a29030037030020034198036a41106a2221200341b0016a41106a29030037030020034198036a41086a2222200341b0016a41086a290300370300200320032903b00137039803200341f0026a41206a22232005290300370300200341f0026a41186a2205200d290300370300200341f0026a41106a220d2021290300370300200341f0026a41086a2221202229030037030020032003290398033703f002200341c8026a41206a22222023290300370300200341c8026a41186a22232005290300370300200341c8026a41106a2205200d290300370300200341c8026a41086a220d2021290300370300200320032903f0023703c80241281022221d450d03201d20032903c802370300201d41206a2022290300370300201d41186a2023290300370300201d41106a2005290300370300201d41086a200d290300370300200f41286c41586a2004460d01200241286a212441282122200e200f41286c6a222341586a21254101212641202105411821214110210f4108210d4228212742202128410021294101211e4101211f410021020c040b4100211f0c090b4101211e4101211f0c070b419a88c00041331039000b412841081023000b02400340024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000102020b2024210202400340200341b0016a20056a2204200220056a290300370300200341b0016a20216a222a200220216a290300370300200341b0016a200f6a222b2002200f6a290300370300200341b0016a200d6a222c2002200d6a290300370300200320022903003703b001200341b0016a200341a0026a20051086040d012023200220226a2202470d000c1a0b0b20034198036a20056a2224200429030037030020034198036a20216a222d202a29030037030020034198036a200f6a222e202b29030037030020034198036a200d6a222f202c290300370300200320032903b00137039803200341f0026a20056a22302024290300370300200341f0026a20216a2224202d290300370300200341f0026a200f6a222d202e290300370300200341f0026a200d6a222e202f29030037030020032003290398033703f00220042030290300370300202a2024290300370300202b202d290300370300202c202e290300370300200320032903f0023703b0010240201f201e470d00201e20266a221f201e490d15201e2026742224201f201f2024491b221fad20277e2211202888a70d152011a722242029480d150240201e450d00201d201e20226c20241021221d0d010c040b20241022221d450d030b200220226a2124201d201e20226c6a222d20032903b001370300202d20056a2004290300370300202d20216a202a290300370300202d200f6a202b290300370300202d200d6a202c290300370300201e20266a211e20252002470d070c180b2017203c2202203b6a223c490d0202402017203c6b222a203f490d0020152002203d6c6a22022903002015203c203d6c6a2204290300221c5a200220406a222b2903002212200420406a222c29030022115a20122011511b0d0020034198036a20426a222e200420416a222d29030037030020034198036a20446a222f200420436a223029030037030020034198036a20406a2235200420426a2236290300370300200320042903103703980320042002290300370300202c202b290300370300200420446a200220446a2903003703002036200220426a2903003703002030200220436a290300370300202d200220416a2903003703004101212b0240202a2045490d002004290360201c5a200420466a290300221220115a20122011511b0d004103212b203e212c02400340202c220220476a2002290300370300200220486a200220416a290300370300200220496a200220436a2903003703002002204a6a200220426a2903003703002002204b6a200220446a2903003703002002204c6a200220406a290300370300202b222d202a4f0d01202d203a6a212b2002203d6a222c290300201c5a2002204d6a290300221220115a20122011511b450d000b0b202d203b6a212b0b2002201c370300200220113703082004202b203d6c6a220220416a202e290300370300200220436a202f290300370300200220426a203529030037030020022003290398033703100b203e20476a213e203c0d070c140b206b216c4100216b4101216d206c20566a222e450d0702400240024002400240024002402015202e200c6c6a22022903002015206c200c6c222c6a2204205f6a2903002212542002200a6a290300221c2004205e6a290300221154201c2011511b450d002053202c6a21020340202e2039460d0220122002290300223254210420112002200a6a290300221c51212a2011201c54212b200220106a2102202e20566a212e20322112201c21112004202b202a1b0d000c030b0b206c205b6a212d2053202c6a21024100216b410021040340202d2004460d052012200229030022325a212a20112002200a6a290300221c51212b2011201c5a212c200220106a2102200420396a210420322112201c2111202a202c202b1b0d000b200420396a216d206c20046b20566a222e0d030c020b4100212e0b206c202e490d06206c20174b0d080240206c202e6b226d203976222a450d002051202c6a21022015202e200c6c6a21040340200341b0016a20096a222b200420096a222c290300370300200341b0016a20086a222d200420086a222f290300370300200341b0016a20076a2230200420076a2235290300370300200341b0016a20066a2236200420066a226e290300370300200341b0016a200a6a226f2004200a6a2270290300370300200320042903003703b0012002200a6a22712903002111200220066a22722903002112200220076a2273290300211c200220086a2274290300213220022903002133202c200220096a2275290300370300202f20323703002035201c370300206e201237030020702011370300200420333703002075202b2903003703002074202d29030037030020732030290300370300207220362903003703002071206f290300370300200220032903b0013703002004200c6a2104200220106a2102202a20566a222a0d000b0b202e0d010b202e216b2069206a460d0f0c100b206d20604b0d01206c20174b0d052052202e200c6c6a2176410021770c100b206c216d2069206a460d090c0a0b202e216b2069206a470d0b0c0a0b202441081023000b203c2017102d000b202e206c102d000b206c202e417f6a226b490d0d0b206c2017102e000b410021020c0a0b410121020c090b410021020c070b410121020c060b410221020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b2069206a470d10410121020c140b206920396a22022069490d1620692039742204200220022004491b2202ad2020862211200b88a70d162011a722042054480d16024002402069450d00206820692057742004102122680d010c030b200410222268450d020b20022169410221020c130b2068206a2057746a2202206d3602042002206b360200206a20396a2278216a20782058490d02410121770c110b200441041023000b0240024020770e020001010b206c202e20566a226b490d130240206c206b6b226d2058490d002015202e200c6c6a22022903002015206b200c6c6a2204290300221c5a2002200a6a222a29030022122004200a6a222b29030022115a20122011511b0d0020034198036a20076a222d200420096a222c29030037030020034198036a20066a222f200420086a223029030037030020034198036a200a6a2235200420076a2236290300370300200320042903103703980320042002290300370300202b202a290300370300200420066a200220066a2903003703002036200220076a2903003703002030200220086a290300370300202c200220096a2903003703004101212a0240206d2057490d002004290360201c5a200420616a290300221220115a20122011511b0d004103212a2076212b02400340202b220220106a2002290300370300200220626a200220096a290300370300200220636a200220086a290300370300200220646a200220076a290300370300200220656a200220066a2903003703002002205a6a2002200a6a290300370300202a222c206d4f0d01202c20396a212a2002200c6a222b290300201c5a200220666a290300221220115a20122011511b450d000b0b202c20566a212a0b2002201c370300200220113703082004202a200c6c6a220220096a202d290300370300200220086a202f290300370300200220076a203529030037030020022003290398033703100b206b450d0c207620106a2176206b212e206d2067490d0a410021020c110b024002400240024020682078223020566a22782057746a2202280200450d00206820302057746a222c205c6a280200222b200228020422044d0d004102216a203041024d0d042068203020596a22022057746a280204222a2004202b6a4d0d014103216a203041034d0d04202c205d6a280200202a202b6a4d0d010c050b20302057490d01200228020421042068203020596a22022057746a280204212a0b202a2004490d010b2030205b6a21020b2030200220396a22704d0d03203020024d0d04206820022057746a2236280204227120362802006a2202206820702057746a226e280200226f490d05200220174b0d06203620556a21722015206f200c6c6a222f206e2802042235200c6c22046a212a2002200c6c216a024002400240024002402002206f6b222c20356b220220354f0d00204f202a2002200c6c22041084041a205020046a212b20352039480d0120022039480d012051206a6a216a202a21020340206a200220106a222a202b20106a222c202c290300202a29030054202b205a6a29030022112002205a6a29030022125420112012511b222d1b2204290300370300206a20096a200420096a290300370300206a20086a200420086a290300370300206a20076a200420076a290300370300206a20066a200420066a290300370300206a200a6a2004200a6a290300370300202b202c202d1b212b202f202a2002202d1b22024f0d04206a20106a216a205021042050202b490d000c050b0b204f202f20041084041a205020046a212b20352039480d01202c20354c0d012015206a6a212d20502104202f210203402002202a2004202a290300200429030054202a200a6a29030022112004200a6a29030022125420112012511b222c1b226a290300370300200220096a206a20096a290300370300200220086a206a20086a290300370300200220076a206a20076a290300370300200220066a206a20066a2903003703002002200a6a206a200a6a29030037030020042004200c6a202c1b21042002200c6a2102202a200c6a202a202c1b222a202d4f0d04202b20044b0d000c040b0b202a21020c010b202f21020b205021040b20022004202b20046b226a206a200c706b1084041a2072207120356a3602002036206f360200206e206e200a6a207020567320306a2057741085041a2078216a207820394b0d0a0b206b0d060c010b2030216a206b0d060b02402069450d00206810200b204e450d11204f10200c110b41e896c2002070203010b501000b41e896c2002002203010b501000b206f2002102d000b20022017102e000b410221020c090b410221020c080b410021770c030b410121770c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b206b206c102d000b1024000b200320173602b801200320313602b401200320153602b00120034198036a41086a22024200370300200342003703980341ec83c200411320034198036a100220034190016a41086a20022903003703002003200329039803370390012003411036029c03200320034190016a36029803200341b0016a20034198036a10da0202402031450d00201510200b02402019450d00201310200b02402014450d00201810200b410021020240201ba7450d00201610200b0b41012107410121050b2001280200220a4102460d050c060b201a450d00200e10200b2003201e3602b8012003201f3602b4012003201d3602b00120034198036a41086a22024200370300200342003703980341dbc9c100411520034198036a100220034190016a41086a20022903003703002003200329039803370390012003411036029c03200320034190016a36029803200341b0016a20034198036a10db02201f450d00201d10200b410021020b410121070b410121052001280200220a4102470d010b2007450d01200141086a280200450d01200128020410200c010b200a4101470d002005450d00200141086a280200450d00200128020410200b2000200436020420002002360200200341c0036a24000b9286010f067f017e067f017e017f027e027f017e017f017e057f017e417f017e047f230041e0026b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a220541044b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e050005020301000b200141046a280200210620022d0001210720022d0000210520034188026a22082002411a6a29010037030020034180026a200241126a290100370300200341f0016a41086a2002410a6a2901003703002003200241026a2901003703f0012005450d09410121080c0a0b20022d000120022d0000720d02200141086a290300210920034198026a41086a22024200370300200342003703980241c4d3c200411a20034198026a1002200341f0016a41086a200229030037030020032003290398023703f00120032009370328200341f0016a4110200341286a410810030c500b200341186a200141196a290000370300200341106a200141116a290000370300200341086a200141096a2900003703002003200129000137030020022d0001210a20022d0000210b200341f0016a41186a220c2002411a6a290100370300200341f0016a41106a200241126a290100370300200341f0016a41086a2002410a6a2901003703002003200241026a2901003703f001200b450d034101210b0c040b20022d000120022d000072450d050b41fcc5c00021054128210220044101470d4f200141046a2802002201109201200110200c4f0b200141216a2d0000210d200341c0026a41186a200141196a290000370300200341c0026a41106a200141116a290000370300200341c0026a41086a200141096a290000370300200320012900013703c00220022d0001210a20022d0000210b200341f0016a41186a220c2002411a6a290100370300200341f0016a41106a200241126a290100370300200341f0016a41086a2002410a6a2901003703002003200241026a2901003703f001200b450d074101210b0c080b200341c4016a41026a20032d00f2013a0000200341a8016a41086a20034183026a290000370300200341a8016a410d6a220e200c290000370000200320032f01f0013b01c401200320032900fb013703a8014101210b200a41ff01714101470d0020032800f301210520032800f7012102200341f0016a41026a200341c4016a41026a2d00003a0000200341286a41086a200341a8016a41086a290300370300200341286a410d6a200e290000370000200320032f01c4013b01f001200320032903a8013703284100210b0c010b412a210241a4c6c00021050b200341246a41026a220a200341f0016a41026a2d00003a000020034198026a41086a220c200341286a41086a29030037030020034198026a41106a200341286a41106a290300370300200320032f01f0013b01242003200329032837039802200b0d342003419b016a200c290300370000200341a0016a200341a5026a290000370000200320032f01243b0188012003200236008f012003200536008b012003200329039802370093012003200a2d00003a008a0120034188016a108402450d07411c10222202450d22200241186a41002800c7d442360000200241106a41002900bfd442370000200241086a41002900b7d442370000200241002900afd4423700002002411c413c1021220b450d23200b200329030037001c200b41346a200341186a290300370000200b412c6a200341106a290300370000200b41246a200341086a29030037000020034198026a41186a2202420037030020034198026a41106a220a420037030020034198026a41086a220c42003703002003420037039802200b413c20034198026a1000200341f0016a41186a2002290300370300200341f0016a41106a200a290300370300200341f0016a41086a200c29030037030020032003290398023703f00141202102200341f0016a412041c8d7c400410041001001210a200b1020200a417f460d0b200341286a20031083032003280230220f450d104100210220032902342210422088a7220b450d110240200b4101460d004100210203402002200b410176220a20026a220c200f200c4105746a20034188016a412010860441004a1b2102200b200a6b220b41014b0d000b0b200f20024105746a20034188016a4120108604220b450d16200b411f7620026a21020c110b200141086a290300210920034198026a41086a22024200370300200342003703980241eed5c200411b20034198026a1002200341f0016a41086a200229030037030020032003290398023703f00120032009370328200341f0016a4110200341286a410810030c480b200341c4016a41026a20032d00f2013a0000200341a8016a41086a20034183026a290000370300200341a8016a410d6a22112008290000370000200320032f01f0013b01c401200320032900fb013703a80141012108200741ff01714101470d0020032800f301210520032800f7012102200341f0016a41026a200341c4016a41026a2d00003a0000200341286a41086a200341a8016a41086a290300370300200341286a410d6a2011290000370000200320032f01c4013b01f001200320032903a801370328410021080c010b41a4c6c0002105412a21020b200341246a41026a2211200341f0016a41026a2d00003a000020034198026a41086a2207200341286a41086a29030037030020034198026a41106a200341286a41106a290300370300200320032f01f0013b0124200320032903283703980220080d442003419b016a2007290300370000200341a0016a20034198026a410d6a290000370000200320032f01243b0188012003200236008f012003200536008b01200320032903980237009301200320112d00003a008a0120074200370300200342003703980241cdc8c000410d20034198026a1002200341f0016a41086a200729030037030020032003290398023703f001420021120240200341f0016a411041c8d7c400410041001001417f460d0020034200370328200341f0016a4110200341286a41084100100141016a41084d0d1b200329032821120b20034198026a41086a22024200370300200342003703980241c4d3c200411a20034198026a1002200341f0016a41086a200229030037030020032003290398023703f001200341f0016a411041c8d7c400410041001001417f460d0520034200370328200341f0016a4110200341286a41084100100141016a41084d0d1b200329032821130c060b200341c4016a41026a20032d00f2013a0000200341a8016a41086a20034183026a290000370300200341a8016a410d6a2214200c290000370000200320032f01f0013b01c401200320032900fb013703a8014101210b200a41ff01714101470d0020032800f301210520032800f7012102200341f0016a41026a200341c4016a41026a2d00003a0000200341286a41086a200341a8016a41086a290300370300200341286a410d6a2014290000370000200320032f01c4013b01f001200320032903a8013703284100210b0c010b41a4c6c0002105412a21020b200341246a41026a220a200341f0016a41026a2d00003a000020034198026a41086a220c200341286a41086a29030037030020034198026a41106a200341286a41106a290300370300200320032f01f0013b01242003200329032837039802200b0d2d200341db016a200c290300370000200341c8016a41186a220b200341a5026a290000370000200320032f01243b01c801200320023600cf01200320053600cb0120032003290398023700d3012003200a2d00003a00ca01200341c8016a108402450d01200341286a41186a200341c0026a41186a290300370300200341286a41106a200341c0026a41106a290300370300200341286a41086a200341c0026a41086a290300370300200341d0006a200341c8016a41086a290300370300200341d8006a200341c8016a41106a290300370300200341e0006a200b290300370300200320032903c002370328200320032903c801370348411b10222202450d1d200241176a4100280088ae42360000200241106a4100290081ae42370000200241086a41002900f9ad42370000200241002900f1ad423700002002411b413b10212202450d1e2002200329032837001b200241336a200341286a41186a2903003700002002412b6a200341286a41106a290300370000200241236a200341286a41086a2903003700002002413b41f60010212202450d1f2002200341c8006a220b29000037003b200241d3006a200b41186a290000370000200241cb006a200b41106a290000370000200241c3006a200b41086a29000037000020034198026a41186a220b420037030020034198026a41106a220a420037030020034198026a41086a220c42003703002003420037039802200241db0020034198026a1000200341f0016a41186a200b290300370300200341f0016a41106a200a290300370300200341f0016a41086a200c29030037030020032003290398023703f0014102210b0240200341f0016a412041c8d7c400410041001001417f460d00200341003a009802200341f0016a412020034198026a41014100100141016a41014d0d2320032d009802210b0b20021020200b41ff01714102470d2c200341286a41186a200341c0026a41186a290300370300200341286a41106a200341c0026a41106a290300370300200341286a41086a200341c0026a41086a290300370300200320032903c002370328411c10222202450d24200241186a41002800c7d442360000200241106a41002900bfd442370000200241086a41002900b7d442370000200241002900afd4423700002002411c413c10212202450d252002200329032837001c200241346a200341286a41186a2903003700002002412c6a200341286a41106a290300370000200241246a200341286a41086a2903003700004200210920034198026a41186a220b420037030020034198026a41106a220a420037030020034198026a41086a220c420037030020034200370398022002413c20034198026a1000200341f0016a41186a200b290300370300200341f0016a41106a200a290300370300200341f0016a41086a200c29030037030020032003290398023703f001200341f0016a412041c8d7c400410041001001417f460d0b2003422037028c012003200341f0016a3602880120034198026a20034188016a10382003280298022215450d26200329029c0221090c0c0b41a3d5c2002105412b210220044101460d420c430b41cbd4c2002105412e210220044101460d410c420b420321130b410821084200211620034198026a41086a22024200370300200342003703980241dbc9c100411520034198026a1002200341f0016a41086a200229030037030020032003290398023703f0010240200341f0016a411041c8d7c400410041001001417f460d002003421037029c022003200341f0016a36029802200341286a20034198026a10f30120032802282208450d17200329022c21160b201320127c211220082016422088a7221141286c6a2107200821020340200720026b419f014d0d02200220034188016a460d03200220034188016a4120108604450d03200241286a220520034188016a460d04200520034188016a4120108604450d04200241d0006a220520034188016a460d04200520034188016a4120108604450d04200241f8006a220520034188016a460d04200241a0016a2102200520034188016a41201086040d000c040b0b41ced5c200210520044101460d3e0c3f0b4102210520072002460d022008201141286c6a2107034020034188016a2002460d01200220034188016a4120108604450d012007200241286a2202470d000c030b0b200221050b200541206a29030020125621050b2005410247200571210202402016a7450d00200810200b024002402002450d0020034100360230200342013703282006200341286a109501200328022c2105200328023021072003280228210220034198026a41186a2208420037030020034198026a41106a2211420037030020034198026a41086a2217420037030020034200370398022002200720034198026a1000200341c0026a41186a22072008290300370300200341c0026a41106a22082011290300370300200341c0026a41086a2211201729030037030020032003290398023703c00202402005450d00200210200b200341286a41186a2007290300370300200341286a41106a2008290300370300200341286a41086a2011290300370300200320032903c002370328411810222202450d19200241106a41002900a0d142370000200241086a4100290098d14237000020024100290090d14237000020024118413810212202450d1a20022003290328370018200241306a200341286a41186a290300370000200241286a200341286a41106a290300370000200241206a200341286a41086a29030037000020034198026a41186a2205420037030020034198026a41106a2207420037030020034198026a41086a2208420037030020034200370398022002413820034198026a1000200341f0016a41186a2005290300370300200341f0016a41106a2007290300370300200341f0016a41086a200829030037030020032003290398023703f001200341f0016a412041c8d7c4004100410010012105200210202005417f460d0141fed3c2002105411f21020c3a0b41ded3c2002105412021020c390b200341286a200341c0026a108303024020032802302202450d0020032802342105200329032821134200211620034198026a41086a22074200370300200342003703980241cdc8c000410d20034198026a1002200341f0016a41086a200729030037030020032003290398023703f0010240200341f0016a411041c8d7c400410041001001417f460d002003420037039802200341f0016a411020034198026a41084100100141016a41084d0d1220032903980221160b02402005450d00200210200b201620135a0d00419dd4c2002105411221020c390b4108210820034198026a41086a22024200370300200342003703980241f9d0c200411720034198026a1002200341f0016a41086a200229030037030020032003290398023703f00141002107200341f0016a411041c8d7c400410041001001417f460d072003421037029c022003200341f0016a36029802200341286a20034198026a10f10120032802282208450d1e2003200329022c2216370204200320083602002016422088a721072016a721020c080b410021024101210f420021100b200341286a41186a20034188016a41186a290300370300200341286a41106a20034188016a41106a290300370300200341286a41086a20034188016a41086a290300370300200320032903880137032820022010422088a7220b4b0d18200b2010a7470d29200b41016a220a200b490d2c200b410174220c200a200a200c491bad22104205862218422088a70d2c2018a7220a4100480d2c200b450d02200f200b410574200a1021220f450d030c290b410121150b2002102020034198026a41186a220a200341c8016a41186a29030037030020034198026a41106a220c200341c8016a41106a29030037030020034198026a41086a2205200341c8016a41086a290300370300200320032903c8013703980202402009422088221ea7220b2009a7470d00200b41016a2202200b490d2b201ea7221f4101742214200220022014491bad221e4205862210422088a70d2b2010a722024100480d2b200b450d062015201f410574200210212215450d070c1e0b2009211e0c1e0b200a1022220f0d260b200a41011023000b41f9d4c2002105412a21022010a7450d1d200f102020044101460d330c340b2003410036020820034208370300410021020b20034198026a41186a2205200341c0026a41186a29030037030020034198026a41106a2211200341c0026a41106a29030037030020034198026a41086a2217200341c0026a41086a290300370300200320032903c0023703980220022007470d17200741016a22022007490d2520074101742226200220022026491b2202ad42287e2216422088a70d252016a722264100480d252007450d022008200741286c202610212208450d030c160b2002102222150d170b200241011023000b2026102222080d130b202641081023000b2003413c6a41013602002003410336029c02200341eca1c400360298022003420137022c200341f4a1c400360228200320034198026a360238200341286a418cd6c2001048000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411c41011023000b413c41011023000b411b41011023000b413b41011023000b41f60041011023000b411841011023000b413841011023000b419a88c00041331039000b41c0b8c400102f000b411c41011023000b413c41011023000b419a88c00041331039000b419a88c00041331039000b20032002360204200320083602000b2008200741286c6a220220123703002002200329039802370308200241206a2005290300370300200241186a2011290300370300200241106a2017290300370300200341086a200741016a22113602000240201141144b0d004102212b20114102490d0d4128212c2008201141286c6a212d417f212e4120212f41182130411021314108213241032133415821344178213541702136416821374160213841012139410121020c0c0b024002402011410176223bad42287e2209422088a70d002009a72202417f4c0d0041082114024002402002450d0020021022223c450d03203c213d0c010b4108213c4108213d0b4158213e200841586a213f41282140200841286a2141200841887f6a21424100214341042144417f2145410121464203211e422021094103214741022148417d21494120210d411821204110211f417e214a4174214b4164214c41b07f214d4109214e4178214f417021504168215141602152410a215341042154410021554100215620112157410221020c0d0b1031000b200241081023000b2009422088a7210b0b2015200b4105746a2202200329039802370000200241186a200a290300370000200241106a200c290300370000200241086a2005290300370000411c10222202450d06200241186a41002800c7d442360000200241106a41002900bfd442370000200241086a41002900b7d442370000200241002900afd4423700002002411c413c1021220e450d07200e200329032837001c200e41346a200341286a41186a290300370000200e412c6a200341286a41106a290300370000200e41246a200341286a41086a29030037000020034198026a41186a2202420037030020034198026a41106a220a420037030020034198026a41086a220c42003703002003420037039802200e413c20034198026a1000200341f0016a41186a2002290300370300200341f0016a41106a200a290300370300200341f0016a41086a200c29030037030020032003290398023703f001200341003602a00220034201370398022003200b41016a22023602880120034188016a20034198026a103e024002402002450d00200b41057441206a2114410020034198026a41086a280200220b6b210c200328029802211f200328029c02210520152102034002402005200c6a411f4b0d00200b41206a220a200b490d0f20054101742220200a200a2020491b220a4100480d0f024002402005450d00201f2005200a1021221f0d010c080b200a1022221f450d070b200a21050b201f200b6a220a2002290000370000200a41186a200241186a290000370000200a41106a200241106a290000370000200a41086a200241086a290000370000200c41606a210c200b41206a210b200241206a2102201441606a22140d000b200341a0026a200b3602002003200536029c022003201f360298020c010b200341a0026a280200210b200328029c022105200328029802211f0b200341f0016a4120201f200b100302402005450d00201f10200b200e1020201ea7450d00201510200b200341286a41186a200341c0026a41186a290300370300200341286a41106a200341c0026a41106a290300370300200341286a41086a200341c0026a41086a290300370300200341d0006a200341c8016a41086a290300370300200341d8006a200341c8016a41106a290300370300200341e0006a200341c8016a41186a290300370300200320032903c002370328200320032903c8013703482003200d3a008801411b10222202450d02200241176a4100280088ae42360000200241106a4100290081ae42370000200241086a41002900f9ad42370000200241002900f1ad423700002002411b413b10212202450d032002200329032837001b200241336a200341286a41186a2903003700002002412b6a200341286a41106a290300370000200241236a200341286a41086a2903003700002002413b41f60010212202450d042002200341c8006a220b29000037003b200241d3006a200b41186a290000370000200241cb006a200b41106a290000370000200241c3006a200b41086a29000037000020034198026a41186a220b420037030020034198026a41106a220a420037030020034198026a41086a220c42003703002003420037039802200241db0020034198026a1000200341f0016a41186a200b290300370300200341f0016a41106a200a290300370300200341f0016a41086a200c29030037030020032003290398023703f001200341f0016a412020034188016a4101100320021020410021050b20044101470d160c150b200a41011023000b411b41011023000b413b41011023000b41f60041011023000b411c41011023000b413c41011023000b200f20024105746a220a41206a200a200b20026b4105741085041a200a41186a200341286a41186a290300370000200a41106a200341286a41106a290300370000200a41086a200341286a41086a290300370000200a200329032837000020034198026a41086a22024200370300200342003703980241cdc8c000410d20034198026a1002200341f0016a41086a220a200229030037030020032003290398023703f001420021180240024002400240200341f0016a411041c8d7c400410041001001417f460d0020034200370328200341f0016a4110200341286a41084100100141016a41084d0d01200329032821180b20024200370300200342003703980241eed5c200411b20034198026a1002200a200229030037030020032003290398023703f00102400240200341f0016a411041c8d7c400410041001001417f460d0020034200370328200341f0016a4110200341286a41084100100141016a41084d0d03200329032821164101210a411c210c411c10222202450d010c040b42e80721164101210a411c210c411c102222020d030b200c200a1023000b419a88c00041331039000b419a88c00041331039000b200241186a41002800c0d142360000200241106a41002900b8d142370000200241086a41002900b0d142370000200241002900a8d14237000002400240024002402002200c413c10212219450d002019200329030037001c201941346a200341186a2903003700002019412c6a200341106a290300370000201941246a200341086a29030037000020034198026a41186a2202420037030020034198026a41106a220c420037030020034198026a41086a2205420037030020034200370398022019413c20034198026a1000200341f0016a41186a2002290300370300200341f0016a41106a200c290300370300200341f0016a41086a200529030037030020032003290398023703f0012003410036023020034201370328410810222202450d012002201620187c37000020034288808080800137022c200320023602282003200b200a6a22023602980220034198026a200341286a103e0240024002402002450d00200b41057441206a210e4100200341286a41086a280200220b6b210c20032802282115200328022c2105200f2102034002402005200c6a411f4b0d00200b41206a220a200b490d0b2005410174221a200a200a201a491b220a4100480d0b024002402005450d0020152005200a102122150d010c060b200a10222215450d050b200a21050b2015200b6a220a2002290000370000200a41186a200241186a290000370000200a41106a200241106a290000370000200a41086a200241086a290000370000200c41606a210c200b41206a210b200241206a2102200e41606a220e0d000b200341306a200b3602002003200536022c200320153602280c010b200341306a280200210b200328022c2105200328022821150b2010a72102200341f0016a41202015200b100302402005450d00201510200b2019102002402002450d00200f10200b4108211920034198026a41086a22024200370300200342003703980241f9d0c200411720034198026a1002200341f0016a41086a200229030037030020032003290398023703f0014100211b0240024002400240200341f0016a411041c8d7c400410041001001417f460d002003421037029c022003200341f0016a36029802200341286a20034198026a10f10120032802282219450d07200328022c211b4128210c200341306a280200220e41286c22050d010c020b4100210e4128210c410041286c2205450d010b200341286a41086a21024100210a0340200341286a41206a2019200a6a220b41206a290300370300200341286a41186a200b41186a290300370300200341286a41106a200b41106a2903003703002002200b41086a2903003703002003200b290300370328200341c0026a41186a200241186a290000370300200341c0026a41106a200241106a290000370300200341c0026a41086a200241086a290000370300200320022900003703c002200341c0026a200341201086040d022005200a200c6a220a470d000b0b4100211c20034100360230200342083703284108211d201b450d11201910200c110b200341c8016a41206a2202200341286a41206a290300370300200341c8016a41186a220c200341286a41186a290300370300200341c8016a41106a2205200341286a41106a290300370300200341c8016a41086a2215200341286a41086a290300370300200320032903283703c80120034198026a41206a221a200229030037030020034198026a41186a2202200c29030037030020034198026a41106a220c200529030037030020034198026a41086a22052015290300370300200320032903c80137039802200341f0016a41206a2215201a290300370300200341f0016a41186a221a2002290300370300200341f0016a41106a2202200c290300370300200341f0016a41086a220c200529030037030020032003290398023703f00141281022221d450d04201d20032903f001370300201d41206a2015290300370300201d41186a201a290300370300201d41106a2002290300370300201d41086a200c2903003703000240200e41286c41586a200a460d00200b41286a21214128211a2019200e41286c6a220f41586a212241082115200341286a41086a210b410121234120210e4118210c4110210a422821184220211041002124410121254101211c410021020c060b410121254101211c0c0f0b200a41011023000b413c41011023000b410841011023000b419a88c00041331039000b412841081023000b02400340024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000102020b2021210202400340200341286a200e6a22052002200e6a290300370300200341286a200c6a22172002200c6a290300370300200341286a200a6a22262002200a6a290300370300200b200220156a29030037030020032002290300370328200341f0016a200c6a200b200c6a290000370300200341f0016a200a6a200b200a6a290000370300200341f0016a20156a200b20156a2900003703002003200b2900003703f001200341f0016a2003200e1086040d01200f2002201a6a2202470d000c1f0b0b200341c8016a200e6a22212005290300370300200341c8016a200c6a22272017290300370300200341c8016a200a6a22282026290300370300200341c8016a20156a2229200b290300370300200320032903283703c80120034198026a200e6a222a202129030037030020034198026a200c6a2221202729030037030020034198026a200a6a2227202829030037030020034198026a20156a22282029290300370300200320032903c801370398022005202a2903003703002017202129030037030020262027290300370300200b202829030037030020032003290398023703280240201c2025470d00202520236a221c2025490d1620252023742221201c201c2021491b221cad20187e2216201088a70d162016a722212024480d1602402025450d00201d2025201a6c20211021221d0d010c080b20211022221d450d070b2002201a6a2121201d2025201a6c6a222720032903283703002027200e6a20052903003703002027200c6a20172903003703002027200a6a2026290300370300202720156a200b290300370300202520236a212520222002470d070c1d0b201120072202202e6a2207490d010240201120076b2217202b490d0020082002202c6c6a220229030020082007202c6c6a220529030022165a0d0020034198026a20306a22292005202f6a222629030037030020034198026a20316a222a200520306a222729030037030020034198026a20326a223a200520316a2228290300370300200320052903083703980220052002290300370300200520326a200220326a2903003703002028200220316a2903003703002027200220306a29030037030020262002202f6a29030037030041012126024020172033490d00200529035020165a0d0041032126202d2127024003402027220220346a2002290300370300200220356a2002202f6a290300370300200220366a200220306a290300370300200220376a200220316a290300370300200220386a200220326a2903003703002026222820174f0d01202820396a21262002202c6a22272903002016540d000b0b2028202e6a21260b2002201637030020052026202c6c6a22022003290398023703082002202f6a2029290300370300200220306a202a290300370300200220316a203a2903003703000b202d20346a212d20070d070c130b205721584100215741012159205820456a2229450d0702400240024002400240024002402008202920406c6a2903002008205820406c22276a204d6a29030022165a0d00204220276a2102034020292046460d02202920456a21292016200229030022125421052002203e6a21022012211620050d000c030b0b2058204a6a2126204220276a21054100215741002102034020262002460d05200220466a21022016200529030022125a21172005203e6a21052012211620170d000b200220466a2159205820026b20456a22290d030c020b410021290b20582029490d05205820114b0d070240205820296b22592046762217450d002008202920406c6a2102203f20276a21050340200341c8016a200d6a22262002200d6a2227290300370300200341c8016a20206a2228200220206a222a290300370300200341c8016a201f6a223a2002201f6a225a290300370300200341c8016a20146a225b200220146a225c290300370300200320022903003703c801200520146a225d29030021162005201f6a225e2903002112200520206a225f29030021132005290300216020272005200d6a2261290300370300202a2013370300205a2012370300205c20163703002002206037030020612026290300370300205f2028290300370300205e203a290300370300205d205b290300370300200520032903c801370300200220406a21022005203e6a2105201720456a22170d000b0b20290d010b2029215720552056460d0f0c100b2059204e4b0d01205820114b0d042041202920406c6a2162410021630c100b2058215920552056460d090c0a0b2029215720552056470d0b0c0a0b20072011102d000b20292058102d000b20582029417f6a2257490d0e0b20582011102e000b202141081023000b410021020c0a0b410121020c090b410021020c070b410121020c060b410221020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b20552056470d10410121020c140b205520466a22022055490d1720552046742205200220022005491b2202ad201e862216200988a70d172016a722052043480d17024002402055450d00205420552047742005102122540d010c030b200510222254450d020b20022155410221020c130b205420562047746a2202205936020420022057360200205620466a2264215620642048490d02410121630c110b200541041023000b0240024020630e020001010b2058202920456a2257490d130240205820576b22592048490d002008202920406c6a22022903002008205720406c6a220529030022165a0d0020034198026a20206a22282005200d6a221729030037030020034198026a201f6a222a200520206a222629030037030020034198026a20146a223a2005201f6a2227290300370300200320052903083703980220052002290300370300200520146a200220146a29030037030020272002201f6a2903003703002026200220206a29030037030020172002200d6a29030037030041012117024020592047490d00200529035020165a0d0041032117206221260240034020262202203e6a20022903003703002002204f6a2002200d6a290300370300200220506a200220206a290300370300200220516a2002201f6a290300370300200220526a200220146a2903003703002017222720594f0d01202720466a2117200220406a22262903002016540d000b0b202720456a21170b200220163703002005201720406c6a22022003290398023703082002200d6a2028290300370300200220206a202a2903003703002002201f6a203a2903003703000b2057450d0c2062203e6a21622057212920592053490d0a410021020c110b024002400240024020542064223a20456a22642047746a2202280200450d002054203a2047746a2227204b6a2802002226200228020422054d0d0041022156203a41024d0d042054203a20496a22022047746a2802042217200520266a4d0d0141032156203a41034d0d042027204c6a280200201720266a4d0d010c050b203a2047490d01200228020421052054203a20496a22022047746a28020421170b20172005490d010b203a204a6a21020b203a200220466a225e4d0d03203a20024d0d04205420022047746a225b280204225f205b2802006a22022054205e2047746a225c280200225d490d05200220114b0d06205b20446a21612008205d20406c6a222a205c280204225a20406c22056a2117200220406c2156024002400240024002402002205d6b2227205a6b2202205a4f0d00203c2017200220406c22051084041a203d20056a2126205a2046480d0120022046480d01203f20566a215620172102034020562002203e6a22172026203e6a2227202729030020172903005422281b22052903003703002056200d6a2005200d6a290300370300205620206a200520206a2903003703002056201f6a2005201f6a290300370300205620146a200520146a2903003703002026202720281b2126202a2017200220281b22024f0d042056203e6a2156203d2105203d2026490d000c050b0b203c202a20051084041a203d20056a2126205a2046480d012027205a4c0d01200820566a2128203d2105202a21020340200220172005201729030020052903005422271b22562903003703002002200d6a2056200d6a290300370300200220206a205620206a2903003703002002201f6a2056201f6a290300370300200220146a205620146a2903003703002005200520406a20271b2105200220406a2102201720406a201720271b221720284f0d04202620054b0d000c040b0b201721020c010b202a21020b203d21050b20022005202620056b225620562040706b1084041a2061205f205a6a360200205b205d360200205c205c20146a205e204573203a6a2047741085041a20642156206420464b0d0a0b20570d060c010b203a215620570d060b02402055450d00205410200b203b450d10203c10200c100b41e896c200205e203a10b501000b41e896c2002002203a10b501000b205d2002102d000b20022011102e000b410221020c090b410221020c080b410021630c030b410121630c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b20572058102d000b20034198026a41086a22024200370300200342003703980241f9d0c200411720034198026a1002200341f0016a41086a200229030037030020032003290398023703f0012003200341f0016a3602282003411036022c2003200341286a10f201200341c8016a41186a200341c0026a41186a290300370300200341c8016a41106a200341c0026a41106a290300370300200341c8016a41086a200341c0026a41086a290300370300200320032903c0023703c801200341286a200641e0001084041a411810222202450d01200241106a41002900a0d142370000200241086a4100290098d14237000020024100290090d14237000020024118413810212202450d02200220032903c801370018200241306a200341c8016a41186a290300370000200241286a200341c8016a41106a290300370000200241206a200341c8016a41086a29030037000020034198026a41186a2201420037030020034198026a41106a220b420037030020034198026a41086a220a420037030020034200370398022002413820034198026a1000200341f0016a41186a2001290300370300200341f0016a41106a200b290300370300200341f0016a41086a200a29030037030020032003290398023703f001200341003602a0022003420137039802200341286a20034198026a109501200328029c022101200341f0016a4120200328029802220b20032802a002100302402001450d00200b10200b20021020200341286a109201200341286a41186a200341c0026a41186a290300370300200341286a41106a200341c0026a41106a290300370300200341286a41086a200341c0026a41086a290300370300200320032903c002370328412010222202450d032002200329038801370000200241186a20034188016a41186a290300370000200241106a20034188016a41106a290300370000200241086a20034188016a41086a290300370000411c10222201450d04200141186a41002800c7d442360000200141106a41002900bfd442370000200141086a41002900b7d442370000200141002900afd4423700002001411c413c10212201450d052001200329032837001c200141346a200341286a41186a2903003700002001412c6a200341286a41106a290300370000200141246a200341286a41086a29030037000020034198026a41186a220b420037030020034198026a41106a220a420037030020034198026a41086a2214420037030020034200370398022001413c20034198026a1000200341f0016a41186a200b290300370300200341f0016a41106a200a290300370300200341f0016a41086a201429030037030020032003290398023703f001200341003602a0022003420137039802200341013602c801200341c8016a20034198026a103e200328029802210b200328029c02220a20032802a002220c6b411f4b0d07200c41206a2205200c490d00200a410174221f20052005201f491b22054100480d0002400240200a450d00200b200a20051021220b450d010c080b20051022220b0d070b200541011023000b1024000b411841011023000b413841011023000b412041011023000b411c41011023000b413c41011023000b2005210a0b200b200c6a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a2900003700002014200c41206a220c3602002003200a36029c022003200b36029802200341f0016a4120200b200c10030240200a450d00200b10200b2001102020021020200341286a41186a200341c0026a41186a290300370300200341286a41106a200341c0026a41106a290300370300200341286a41086a200341c0026a41086a290300370300200341d0006a20034188016a41086a290300370300200341d8006a20034188016a41106a290300370300200341e0006a20034188016a41186a290300370300200320032903c0023703282003200329038801370348200341013a00c801024002400240411b10222202450d00200241176a4100280088ae42360000200241106a4100290081ae42370000200241086a41002900f9ad42370000200241002900f1ad423700002002411b413b10212202450d012002200329032837001b200241336a200341286a41186a2903003700002002412b6a200341286a41106a290300370000200241236a200341286a41086a2903003700002002413b41f60010212202450d022002200341286a41206a220129000037003b200241d3006a200141186a290000370000200241cb006a200141106a290000370000200241c3006a200141086a29000037000020034198026a41186a2201420037030020034198026a41106a220b420037030020034198026a41086a220a42003703002003420037039802200241db0020034198026a1000200341f0016a41186a2001290300370300200341f0016a41106a200b290300370300200341f0016a41086a200a29030037030020032003290398023703f001200341f0016a4120200341c8016a410110032002102002402003280204450d00200328020010200b20061020410021050c080b411b41011023000b413b41011023000b41f60041011023000b0240201b450d00201910200b200320253602302003201c36022c2003201d3602280b20034198026a41086a22024200370300200342003703980241f9d0c200411720034198026a1002200341f0016a41086a200229030037030020032003290398023703f0012003411036029c022003200341f0016a36029802200341286a20034198026a10f2010240201c450d00201d10200b200341286a41186a200341186a290300370300200341286a41106a200341106a290300370300200341286a41086a200341086a2903003703002003200329030037032802400240024002400240411c10222202450d00200241186a41002800c7d442360000200241106a41002900bfd442370000200241086a41002900b7d442370000200241002900afd4423700002002411c413c10212202450d012002200329032837001c200241346a200341286a41186a220b2903003700002002412c6a200341286a41106a220a290300370000200241246a200341286a41086a220c29030037000020034198026a41186a2205420037030020034198026a41106a2214420037030020034198026a41086a221f420037030020034200370398022002413c20034198026a1000200341f0016a41186a2005290300370300200341f0016a41106a2014290300370300200341f0016a41086a201f29030037030020032003290398023703f001200341f0016a4120100920021020200b200341186a290300370300200a200341106a290300370300200c200341086a29030037030020032003290300370328411810222202450d02200241106a41002900a0d142370000200241086a4100290098d14237000020024100290090d14237000020024118413810212202450d0320022003290328370018200241306a200341286a41186a290300370000200241286a200341286a41106a290300370000200241206a200341286a41086a2903003700004200210920034198026a41186a220a420037030020034198026a41106a220c420037030020034198026a41086a220b420037030020034200370398022002413820034198026a1000200341f0016a41186a200a290300370300200341f0016a41106a200c290300370300200341f0016a41086a220a200b29030037030020032003290398023703f001200341f0016a4120100920021020200b4200370300200342003703980241dbc9c100411520034198026a1002200a200b29030037030020032003290398023703f001024002400240024002400240200341f0016a411041c8d7c400410041001001417f460d002003421037029c022003200341f0016a36029802200341286a20034198026a10f30120032802282215450d0a200329022c2209422088a722020d010c020b410821154200422088a72202450d010b200241286c210c200341286a41206a210a2015210b0340200a200b290000370000200341286a41186a2205200341186a290300370300200341286a41106a2214200341106a290300370300200341286a41086a221f200341086a290300370300200a41086a2220200b41086a290000370000200a41106a220d200b41106a290000370000200a41186a220e200b41186a29000037000020032003290300370328411b10222202450d02200241176a4100280088ae42360000200241106a4100290081ae42370000200241086a41002900f9ad42370000200241002900f1ad423700002002411b413b10212202450d032002200329032837001b200241336a20052903003700002002412b6a2014290300370000200241236a201f2903003700002002413b41f60010212202450d04200b41286a210b2002200a29000037003b200241d3006a200e290000370000200241cb006a200d290000370000200241c3006a202029000037000020034198026a41186a2205420037030020034198026a41106a2214420037030020034198026a41086a221f42003703002003420037039802200241db0020034198026a1000200341f0016a41186a2005290300370300200341f0016a41106a2014290300370300200341f0016a41086a201f29030037030020032003290398023703f001200341f0016a4120100920021020200c41586a220c0d000b0b2009a7450d09201510200c090b411b41011023000b413b41011023000b41f60041011023000b411c41011023000b413c41011023000b411841011023000b413841011023000b419a88c00041331039000b2006109201200610200c020b4100210520044101470d010b200141046a2802002201109201200110200b2000200236020420002005360200200341e0026a24000bc98b0105037f027e047f017e087f23004190056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410b4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0c00070405020809060c030b01000b200141106a2903002106200141086a2903002107200141046a280200210420022d0001210820022d0000210520034188056a22092002411a6a290100370300200341f0046a41106a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d1d410121090c1e0b20022d0001210920022d0000210520034188056a22042002411a6a29010037030020034180056a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d0c410121040c0d0b200141046a280200210420022d000120022d000072450d0e20041092012004102020012d00002104410021090c070b200341e0006a41186a200141196a290000370300200341e0006a41106a200141116a290000370300200341e0006a41086a200141096a2900003703002003200129000137036020022d0001210920022d00002105200341f0046a41186a22042002411a6a290100370300200341f0046a41106a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d0e410121040c0f0b200141046a280200210920012d0001210820022d0001210a20022d0000210520034188056a22042002411a6a29010037030020034180056a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d10410121040c110b200141046a280200210a20012d0001210b20022d0001210920022d0000210520034188056a22042002411a6a29010037030020034180056a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d12410121040c130b200341e8036a41186a200141196a290000370300200341e8036a41106a200141116a290000370300200341e8036a41086a200141096a290000370300200320012900013703e80320022d0001210920022d00002105200341f0046a41186a22042002411a6a290100370300200341f0046a41106a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d14410121040c150b200141046a280200210820022d0001210920022d0000210520034188056a22042002411a6a29010037030020034180056a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d19410121040c1a0b4101210920022d000120022d0000720d01200141046a28020010ee010c740b4101210920022d000120022d000072450d1a0b41fcc5c000210241282105200441ff017122044101460d0220044105470d772009450d77200141046a2201280200109201200128020010200c770b200141216a2d00002109200341206a41186a200141196a290000370300200341206a41106a200141116a290000370300200341206a41086a200141096a2900003703002003200129000137032020022d0001210820022d00002105200341f0046a41186a22042002411a6a290100370300200341f0046a41106a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d19410121040c1a0b20022d0001210920022d0000210520034188056a22042002411a6a29010037030020034180056a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d1b410121040c1c0b200141046a2201280200109201200128020010200c740b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a22082004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341e8036a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a2008290000370000200320032f01ec043b01e803200320032903d00437039802410021040c010b412a210541a4c6c00021020b20034190016a41026a2209200341e8036a41026a2d00003a0000200341a8036a41086a220820034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01e8033b01900120032003290398023703a80320040d302003418b026a200829030037000020034190026a200341a8036a410d6a290000370000200320032f0190013b01f801200320053600ff01200320023600fb01200320032903a80337008302200320092d00003a00fa01411510222202450d3d2002410d6a41002900ceef40370000200241086a41002900c9ef40370000200241002900c1ef4037000020024115413510212202450d3e200220032903f8013700152002412d6a200341f8016a41186a290300370000200241256a200341f8016a41106a2903003700002002411d6a200341f8016a41086a290300370000200341b0016a41186a22054200370300200341b0016a41106a22044200370300200341b0016a41086a22094200370300200342003703b00120024135200341b0016a1000200341f0046a41186a2005290300370300200341f0046a41106a2004290300370300200341f0046a41086a2009290300370300200320032903b0013703f004200341f0046a412041c8d7c4004100410010012105200210202005417f460d21411510222202450d4b2002410d6a41002900ceef40370000200241086a41002900c9ef40370000200241002900c1ef4037000020024115413510212202450d4c200220032903f8013700152002412d6a200341f8016a41186a290300370000200241256a200341f8016a41106a2903003700002002411d6a200341f8016a41086a2903003700004200210c200341b0016a41186a22054200370300200341b0016a41106a22044200370300200341b0016a41086a22094200370300200342003703b00120024135200341b0016a1000200341f0046a41186a2005290300370300200341f0046a41106a2004290300370300200341f0046a41086a2009290300370300200320032903b0013703f00420034198026a200341f0046a1059024020032d00b902220941024622050d00200341f0046a412010090b200341a8036a41086a2208200341c2026a290100370300200341a8036a41106a200341ca026a290100370300200341a8036a41186a200341d2026a29010037030020034188036a41086a220a200341e3026a29000037030020034188036a41106a200341eb026a29000037030020034188036a41186a200341f3026a290000370300200320032901ba023703a8032003200341db026a29000037038803200341da026a2d0000210420033000b80221062002102020050d6b200341e0006a41186a200341a8036a41186a290300370300200341e0006a41106a200341a8036a41106a290300370300200341e0006a41086a2008290300370300200341c8036a41086a200a290300370300200341c8036a41106a20034188036a41106a290300370300200341c8036a41186a20034188036a41186a290300370300200320032903a80337036020032003290388033703c803410021020240200441ff01714101470d00411510222202450d5e2002410d6a41002900ceef40370000200241086a41002900c9ef40370000200241002900c1ef4037000020024115413510212202450d5f200220032903c8033700152002412d6a200341e0036a290300370000200241256a200341d8036a2903003700002002411d6a200341c8036a41086a2903003700000b20094101470d2a411510222205450d5f2005410d6a41002900ceef40370000200541086a41002900c9ef40370000200541002900c1ef4037000020054115413510212205450d60200520032903603700152005412d6a200341e0006a41186a290300370000200541256a200341e0006a41106a2903003700002005411d6a200341e0006a41086a290300370000200341b0016a41186a22084200370300200341b0016a41106a220a4200370300200341b0016a41086a220b4200370300200342003703b00120054135200341b0016a1000200341f0046a41186a220d2008290300370300200341f0046a41106a220e200a290300370300200341f0046a41086a200b290300370300200320032903b0013703f00420034198026a200341f0046a105920032d00b9024102460d61200341e8036a20034198026a41c2001084041a200341e8036a41c2006a20043a0000200341ab046a20032903c803370000200341b3046a200341c8036a41086a290300370000200341bb046a200341c8036a41106a290300370000200341c3046a200341c8036a41186a29030037000020084200370300200a4200370300200341b0016a41086a22044200370300200342003703b00120054135200341b0016a1000200d2008290300370300200e200a290300370300200341f0046a41086a2004290300370300200320032903b0013703f004200341003602a0022003420137039802412010222204450d62200420032903e803370000200441086a200341e8036a41086a290300370000200441106a200341e8036a41106a290300370000200441186a200341e8036a41186a290300370000200342a0808080800437029c0220032004360298022004412041c00010212204450d632004200341e8036a41206a2d00003a0020200342c0808080900437029c02200320043602980220034189046a20034198026a10b702200328029c022104200341f0046a41202003280298022208200341a0026a280200100302402004450d00200810200b200510204101210b2002450d340c680b200141086a290300210720012d0001210220034198026a41086a22054200370300200342003703980241cdc8c000410d20034198026a1002200341b0016a41086a200529030037030020032003290398023703b001420021060240200341b0016a411041c8d7c400410041001001417f460d002003420037039802200341b0016a411020034198026a41084100100141016a41084d0d3a20032903980221060b20034198026a41086a22054200370300200342003703980241f9edc000411620034198026a1002200341b0016a41086a200529030037030020032003290398023703b001200341b0016a411041c8d7c400410041001001417f460d232003420037039802200341b0016a411020034198026a41084100100141016a41084d0d3a200329039802210c0c240b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a22082004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341b0016a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a2008290000370000200320032f01ec043b01b001200320032903d00437039802410021040c010b412a210541a4c6c00021020b200341f8016a41026a2209200341b0016a41026a2d00003a0000200341c8036a41086a220820034198026a41086a290300370300200341c8036a41106a20034198026a41106a290300370300200320032f01b0013b01f80120032003290398023703c80320040d2c200341fb036a200829030037000020034180046a200341c8036a410d6a290000370000200320032f01f8013b01e803200320053600ef03200320023600eb03200320032903c8033700f303200320092d00003a00ea0320034198026a200341e0006a10b2024101210420032d0098024101470d1820034192016a20032d009b023a0000200341a8036a41086a200341ac026a290200370300200341a8036a410d6a200341b1026a290000370000200320032f0099023b0190012003200341a4026a2902003703a80320034198026a41086a280200210541002104200328029c0221020c190b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a220b2004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200a41ff01714101470d0020032800f304210220032800f7042105200341e8036a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a200b290000370000200320032f01ec043b01e803200320032903d00437039802410021040c010b41a4c6c0002102412a21050b20034190016a41026a220a200341e8036a41026a2d00003a0000200341a8036a41086a220b20034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01e8033b01900120032003290398023703a80320040d29200341c0006a41026a2204200a2d00003a000020034188036a41086a220a200b29030037030020034188036a410d6a220b200341a8036a410d6a290000370000200320032f0190013b0140200320032903a80337038803200341ab026a200a290300370000200341b0026a200b2900003700002003200536009f022003200236009b02200320042d00003a009a02200320032f01403b01980220032003290388033700a302200341106a20034198026a2009200810b80220032802142105200328021021020c290b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a22082004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341e8036a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a2008290000370000200320032f01ec043b01e803200320032903d00437039802410021040c010b41a4c6c0002102412a21050b20034190016a41026a2209200341e8036a41026a2d00003a0000200341a8036a41086a220820034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01e8033b01900120032003290398023703a80320040d26200341fb036a200829030037000020034180046a200341a8036a410d6a290000370000200320032f0190013b01e803200320053600ef03200320023600eb03200320032903a8033700f303200320092d00003a00ea0320034198026a200341e8036a10b2024101210420032d0098024101470d14200341c2006a20032d009b023a0000200341b0016a41086a200341ac026a290200370300200341b0016a410d6a200341b1026a290000370000200320032f0099023b01402003200341a4026a2902003703b00120034198026a41086a280200210541002104200328029c0221020c150b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a22082004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341b0016a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a2008290000370000200320032f01ec043b01b001200320032903d00437039802410021040c010b41a4c6c0002102412a21050b20034190016a41026a2209200341b0016a41026a2d00003a0000200341a8036a41086a220820034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01b0013b01900120032003290398023703a80320040d23200341c0006a41026a20092d00003a000020034188036a41086a200829030037030020034188036a410d6a200341a8036a410d6a290000370000200320032f0190013b0140200320032903a80337038803410f10222204450d32200441076a410029008def4037000020044100290086ef403700002004410f412f10212204450d33200420032903e80337000f200441276a200341e8036a41186a220b2903003700002004411f6a200341e8036a41106a220d290300370000200441176a200341e8036a41086a220e290300370000200341b0016a41186a22094200370300200341b0016a41106a22084200370300200341b0016a41086a220a4200370300200342003703b0012004412f200341b0016a1000200341f0046a41186a2009290300370300200341f0046a41106a2008290300370300200341f0046a41086a200a290300370300200320032903b0013703f004200341f0046a412041c8d7c4004100410010012109200410202009417f460d1641c1bfc1002102410f21050c230b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a220a2009290000370000200320032f01f0043b01ec04200320032900fb043703d00441012109200841ff01714101470d0020032800f304210220032800f7042105200341b0016a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a200a290000370000200320032f01ec043b01b001200320032903d00437039802410021090c010b41a4c6c0002102412a21050b20034190016a41026a220a200341b0016a41026a2d00003a0000200341a8036a41086a220b20034198026a41086a2208290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01b0013b01900120032003290398023703a80320090d0b200341fb036a200b290300370000200341e8036a41186a200341b5036a290000370000200320032f0190013b01e803200320053600ef03200320023600eb03200320032903a8033700f3032003200a2d00003a00ea0320084200370300200342003703980241abbec100411820034198026a1002200341b0016a41086a200829030037030020032003290398023703b001200341b0016a411041c8d7c400410041001001417f460d0a200342003703a0022003420037039802200341b0016a411020034198026a4110410010012202417f460d2c2002410f4d0d2c200329039802200756200341a0026a290300220c200656200c2006511b450d0a41c3bec1002102410d21050c0b0b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a220a2004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341b0016a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a200a290000370000200320032f01ec043b01b001200320032903d00437039802410021040c010b41a4c6c0002102412a21050b20034190016a41026a2209200341b0016a41026a2d00003a0000200341a8036a41086a220a20034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01b0013b01900120032003290398023703a80320040d1d200341fb036a200a290300370000200341e8036a41186a200341b5036a290000370000200320032f0190013b01e803200320053600ef03200320023600eb03200320032903a8033700f303200320092d00003a00ea0320034198026a200810e30120032802a802220a450d0f200341b4026a280200210b20034198026a41186a280200210220032802ac022104200341086a200341e8036a200329029c022206422086200335029802842207200341a4026a350200422086200642208884220610b0012003280208450d1441a7bfc1002102411a21052004450d1d200a10200c1d0b200141046a2802002102200341e8036a200141086a290300220610ef01024020032802f003220520024d0d00024020032802e803200241e8006c6a2202280200410f460d0020021092010b2002410f360200200241046a20034198026a41e4001084041a0b411710222202450d342002410f6a410029009c9141370000200241086a410029009591413700002002410029008d914137000020024117412e10212202450d3520022006370017200341b0016a41186a22044200370300200341b0016a41106a22094200370300200341b0016a41086a22084200370300200342003703b0012002411f200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2009290300370300200341f0046a41086a2008290300370300200320032903b0013703f0042003412036029c022003200341f0046a36029802200341e8036a20034198026a10f0012002102020032802e803210402402005450d00200541e8006c210520042102034002402002280200410f460d0020021092010b200241e8006a2102200541987f6a22050d000b0b20032802ec03450d58200410200c580b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a220a2004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200841ff01714101470d0020032800f304210220032800f7042105200341e8036a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a200a290000370000200320032f01ec043b01e803200320032903d00437039802410021040c010b412a210541a4c6c00021020b20034190016a41026a2208200341e8036a41026a2d00003a0000200341a8036a41086a220a20034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01e8033b01900120032003290398023703a80320040d192003418b026a200a290300370000200341f8016a41186a2204200341a8036a410d6a290000370000200320032f0190013b01f801200320053600ff01200320023600fb01200320032903a80337008302200320082d00003a00fa0120034188036a41186a200429030037030020034188036a41106a200341f8016a41106a29030037030020034188036a41086a200341f8016a41086a290300370300200320032903f80137038803200341e0006a41186a200341206a41186a290300370300200341e0006a41106a200341206a41106a290300370300200341e0006a41086a200341206a41086a290300370300200320093a00800120032003290320370360411510222202450d2a2002410d6a41002900ceef40370000200241086a41002900c9ef40370000200241002900c1ef4037000020024115413510212202450d2b20022003290388033700152002412d6a20034188036a41186a290300370000200241256a20034188036a41106a2903003700002002411d6a20034188036a41086a290300370000200341b0016a41186a22044200370300200341b0016a41106a22094200370300200341b0016a41086a22084200370300200342003703b00120024135200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2009290300370300200341f0046a41086a2008290300370300200320032903b0013703f004200341e8036a200341f0046a105920032d00890422084102470d092004420037030020094200370300200341b0016a41086a22084200370300200342003703b00141b791c100411d200341b0016a100020034198026a41186a200429030037030020034198026a41106a200929030037030020034198026a41086a2008290300370300200320032903b0013703980220034198026a412041c8d7c400410041001001417f460d1220034188056a420037030020034180056a4200370300200341f0046a41086a4200370300200342003703f00420034198026a4120200341f0046a4120410010012204417f460d362004411f4d0d36200341ec046a41026a220420032d00f2043a0000200341d0046a41086a220920034183056a290000370300200341d0046a410d6a220820034188056a290000370000200320032f01f0043b01ec04200320032900fb043703d00420032800f304210a20032800f704210b200341ac016a41026a220d20042d00003a000020034190016a41086a220e200929030037030020034190016a410d6a220f2008290000370000200320032f01ec043b01ac01200320032903d004370390012004200d2d00003a00002009200e2903003703002008200f290000370000200320032f01ac013b01ec0420032003290390013703d004411510222204450d3a2004410d6a41002900ceef40370000200441086a41002900c9ef40370000200441002900c1ef4037000020044115413510212204450d3b200420032f01ec043b00152004200b36001c2004200a360018200420032903d004370020200441176a200341ec046a41026a2d00003a0000200441286a200341d0046a41086a2903003700002004412d6a200341dd046a290000370000200341b0016a41186a22094200370300200341b0016a41106a22084200370300200341b0016a41086a220d4200370300200342003703b00120044135200341b0016a1000200341f0046a41186a220e2009290300370300200341f0046a41106a220f2008290300370300200341f0046a41086a2210200d290300370300200320032903b0013703f00420034198026a200341f0046a105920032d00b9024102460d3c200e20034198026a41186a290300370300200f20034198026a41106a290300370300201020034198026a41086a29030037030020032003290398023703f00420032d00b8022111200341b0016a200341b9026a41c2001084041a200341a8036a41186a2212200e290300370300200341a8036a41106a2213200f290300370300200341a8036a41086a22142010290300370300200320032903f0043703a80320034198026a200341b0016a41c2001084041a200341c8036a41186a2012290300370300200341c8036a41106a2013290300370300200341c8036a41086a2014290300370300200320032903a8033703c80320032d00b90221122009420037030020084200370300200d4200370300200342003703b00120044135200341b0016a1000200e2009290300370300200f20082903003703002010200d290300370300200320032903b0013703f004412010222209450d3d200920032903c803370000200941186a200341c8036a41186a290300370000200941106a200341c8036a41106a290300370000200941086a200341c8036a41086a2903003700002009412041c00010212209450d3e200941013a0021200920113a0020200941c00041800110212209450d3f20092003290388033700222009413a6a20034188036a41186a290300370000200941326a20034188036a41106a2903003700002009412a6a20034188036a41086a290300370000200341ba026a410020124101461b2208450d15200941c2006a41013a0000200941db006a200841186a290000370000200941d3006a200841106a290000370000200941cb006a200841086a2900003700002009200829000037004341e30021080c160b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a22082004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341e8036a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a2008290000370000200320032f01ec043b01e803200320032903d00437039802410021040c010b412a210541a4c6c00021020b20034190016a41026a2209200341e8036a41026a22082d00003a0000200341a8036a41086a220a20034198026a41086a220b290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01e8033b01900120032003290398023703a80320040d16200341c0006a41026a220420092d00003a000020034188036a41086a2209200a29030037030020034188036a410d6a220a200341a8036a410d6a290000370000200320032f0190013b0140200320032903a80337038803200820042d00003a0000200b200929030037030020034198026a410d6a200a290000370000200320032f01403b01e803200320032903880337039802410f10222204450d29200441076a410029008def4037000020044100290086ef403700002004410f412f10212204450d2a200420032f01e8033b000f2004200536001620042002360012200420032903980237001a200441116a200341ea036a2d00003a0000200441226a20034198026a41086a290300370000200441276a200341a5026a290000370000200341b0016a41186a22024200370300200341b0016a41106a22054200370300200341b0016a41086a22094200370300200342003703b0012004412f200341b0016a1000200341f0046a41186a2002290300370300200341f0046a41106a2005290300370300200341f0046a41086a2009290300370300200320032903b0013703f004200341f0046a412010092004102041012109410121080c4d0b2003200341e8036a2007200610b0012003280200450d0b41d0bec1002102411a21050b200410920120041020410021084101210920012d000022044101470d540c530b410b2105418887c20021020b200341c0006a41026a220920034190016a41026a2d00003a0000200341b0016a41086a2208200341a8036a41086a290300370300200341b0016a41106a200341a8036a41106a290300370300200320032f0190013b0140200320032903a8033703b00120040d12200341ab026a200829030037000020034198026a41186a2204200341bd016a290000370000200320032f01403b0198022003200536009f022003200236009b02200320032903b0013700a302200320092d00003a009a0220034198026a200341e8036a4120108604450d0a41d0bfc1002102410b21050c120b410b2105418887c20021020b200341f8016a41026a2209200341c0006a41026a2d00003a0000200341c8036a41086a2208200341b0016a41086a290300370300200341c8036a41106a200341b0016a41106a290300370300200320032f01403b01f801200320032903b0013703c80320040d10200341e0006a41026a220420092d00003a000020034188036a41086a2209200829030037030020034188036a410d6a2208200341c8036a410d6a290000370000200320032f01f8013b0160200320032903c80337038803200341ab026a2009290300370000200341b0026a20082900003700002003200536009f022003200236009b02200320042d00003a009a02200320032f01603b01980220032003290388033700a302200341186a20034198026a200a200b10b802200328021c2105200328021821020c100b200341c0006a41186a200341a2046a290100370300200341c0006a41106a2003419a046a290100370300200341c0006a41086a20034192046a290100370300200341c8036a41026a200341ad046a2d00003a0000200341f0046a41086a200341be046a290100370300200341fd046a200341c3046a2900003700002003200329018a043703402003200341ab046a2f00003b01c8032003200341b6046a2901003703f004200341b2046a280100210b200341ae046a280100210a200341aa046a2d000021040c0e0b41dbbfc1002102410d21050c0e0b4183bfc1002102412421050c0d0b20034198026a41186a200b29030037030020034198026a41106a200d29030037030020034198026a41086a200e290300370300200320032903e80337039802200341c8036a41026a200341c0006a41026a2d00003a0000200341e0006a41086a20034188036a41086a290300370300200341e0006a410d6a20034188036a410d6a290000370000200320032f01403b01c8032003200329038803370360410f10222204450d2a200441076a410029008def4037000020044100290086ef403700002004410f412f10212209450d2b200920032903980237000f200941276a20034198026a41186a2903003700002009411f6a20034198026a41106a290300370000200941176a20034198026a41086a290300370000200341b0016a41186a22044200370300200341b0016a41106a22084200370300200341b0016a41086a220a4200370300200342003703b0012009412f200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2008290300370300200341f0046a41086a200a290300370300200320032903b0013703f004412010222204450d2c200420032f01c8033b000020042005360007200420023600032004200329036037000b200441026a200341c8036a41026a2d00003a0000200441136a200341e0006a41086a290300370000200441186a200341ed006a290000370000200341f0046a412020044120100320041020200910200c480b42e807210c0b20034198026a200441e0001084041a200341e8036a200c20067c20034198026a2002200710e601200341f0036a280200210520032802ec03210220032802e803210a20041020410121084100210920024100200a4101461b210220012d000022044101470d4a0c490b20034198026a41086a22024200370300200342003703980241eabec100411920034198026a1002200341b0016a41086a200229030037030020032003290398023703b001410021090240200341b0016a411041c8d7c400410041001001417f460d002003410036029802200341b0016a411020034198026a41044100100141016a41044d0d2120032802980221090b20034198026a41086a22054200370300200342003703980241eabec100411920034198026a1002200341b0016a41086a2208200529030037030020032003290398023703b0012003200941016a36029802200341b0016a411020034198026a41041003412010222202450d31200220032903e803370000200341ac026a428180808010370200200241186a200341e8036a41186a290300370000200241106a200341e8036a41106a290300370000200241086a200341e8036a41086a2903003700002003200737039802200320023602a802200320063703a002200920034198026a10b90220054200370300200342003703980241a490c100411520034198026a10022008200529030037030020032003290398023703b00141002102200341b0016a411041c8d7c400410041001001417f460d0a200342103702642003200341b0016a36026020034198026a200341e0006a10e2012003280298022208450d35200341a0026a2802002102200328029c02210a0c0b0b200341c0006a41186a2209200341e8036a41186a290300370300200341c0006a41106a220d200341e8036a41106a290300370300200341c0006a41086a220e200341e8036a41086a290300370300200320032903e80337034020042002470d03200441016a22052004490d222004410174220f20052005200f491b220fad420586220c422088a70d22200ca722054100480d222004450d0f200a200441057420051021220a0d100c3c0b2004200341e0006a41186a29030037030020034198026a41106a200341e0006a41106a29030037030020034198026a41086a200341e0006a41086a2903003703002003200329036037039802410f10222205450d3041002102200541076a410029008def4037000020054100290086ef403700002005410f412f10212205450d31200520032903980237000f200541276a20034198026a41186a2903003700002005411f6a20034198026a41106a290300370000200541176a20034198026a41086a290300370000200341b0016a41186a22044200370300200341b0016a41106a22094200370300200341b0016a41086a22084200370300200342003703b0012005412f200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2009290300370300200341f0046a41086a2008290300370300200320032903b0013703f004200341f0046a41201009200510200c440b200341b0016a41186a22044200370300200341b0016a41106a2209420037030020084200370300200342003703b00141b791c100411d200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2009290300370300200341f0046a41086a2008290300370300200320032903b0013703f004412010222204450d312004200329038803370000200441186a20034188036a41186a290300370000200441106a20034188036a41106a290300370000200441086a20034188036a41086a290300370000200341f0046a412020044120100320041020410021040c040b200341b0016a41186a22054200370300200341b0016a41106a22084200370300200341b0016a41086a220a4200370300200342003703b00141b791c100411d200341b0016a1000200341f0046a41186a2005290300370300200341f0046a41106a2008290300370300200341f0046a41086a200a290300370300200320032903b0013703f004200441ff01714101470d08412010222205450d3a200520032903c803370000200541186a200341c8036a41186a290300370000200541106a200341c8036a41106a290300370000200541086a200341c8036a41086a290300370000200341f0046a412020054120100320051020410021054100210b20020d3d0c090b2004210f0c0c0b200941c2006a41003a000041c30021080b200341f0046a41202009200810032009102020041020200341b0016a41186a22044200370300200341b0016a41106a22094200370300200341b0016a41086a22084200370300200342003703b00141b791c100411d200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2009290300370300200341f0046a41086a22092008290300370300200320032903b0013703f004412010222204450d292004200329038803370000200441186a20034188036a41186a290300370000200441106a20034188036a41106a290300370000200441086a20034188036a41086a290300370000200341f0046a412020044120100320041020200341c8036a41026a200341ec046a41026a2d00003a00002009200341d0046a41086a290300370300200341f0046a410d6a200341d0046a410d6a290000370000200320032f01ec043b01c803200320032903d0043703f004410121040b410021080b200341bd026a20043a0000200341c5026a200b360000200341c1026a200a36000020034198026a410d6a200341c0006a41086a290300370000200341ad026a200341c0006a41106a290300370000200341b5026a200341c0006a41186a290300370000200341be026a20032f01c8033b0100200341c0026a200341ca036a2d00003a0000200341c9026a20032903f004370000200341d1026a200341f0046a41086a290300370000200341d6026a200341f0046a410d6a290000370000200320083a009c022003200329034037009d022003200341e0006a36029802200341b0016a41186a22044200370300200341b0016a41106a22094200370300200341b0016a41086a22084200370300200342003703b00120024135200341b0016a1000200341e8036a41186a2004290300370300200341e8036a41106a2009290300370300200341e8036a41086a2008290300370300200320032903b0013703e803200341003602b801200342013703b001412010222204450d1520042003290360370000200441086a200341e0006a41086a290300370000200441106a200341e0006a41106a290300370000200441186a200341e0006a41186a290300370000200342a080808080043702b401200320043602b0012004412041c00010212204450d162004200341e0006a41206a2d00003a0020200342c080808090043702b401200320043602b00120034198026a410472200341b0016a10b70220032802b4012104200341e8036a412020032802b0012209200341b0016a41086a280200100302402004450d00200910200b20021020200342e4cab5fbb6ccdcb0e3003703880120034188016a200341f8016a427f10ed0120034198026a41086a41073a0000200341a1026a20032903f801370000200341a9026a200341f8016a41086a290300370000200341b1026a200341f8016a41106a290300370000200341b9026a200341f8016a41186a290300370000200341c1026a2003290320370000200341c9026a200341206a41086a290300370000200341d1026a200341206a41106a290300370000200341d9026a200341206a41186a290300370000200341053a00980220034198026a103d410021020b410121094101210820012d000022044101460d3e0c3f0b410821084100210a0b20034198026a200410b602200341c0006a41186a220b200341e8036a41186a290300370300200341c0006a41106a220d200341e8036a41106a290300370300200341c0006a41086a220e200341e8036a41086a290300370300200320032903e803370340200a2002470d33200241016a22052002490d172002410174220a20052005200a491b220aad4288017e220c422088a70d17200ca722054100480d172002450d02200820024188016c200510212208450d030c330b200341f0046a41201009410021054100210b20020d340b41002104200b20054572450d340c350b2005102222080d300b200541081023000b20051022220a450d2c0b200a20024105746a22052003290340370000200541186a2009290300370000200541106a200d290300370000200541086a200e2903003700004101210920034198026a41186a200241016a360200200341ac026a200f360200200320063703a00220032007370398022003200b3602b4022003200a3602a802200820034198026a10b902410021020c350b200341ac026a4101360200200341033602ec03200341eca1c4003602e8032003420137029c02200341f4a1c400360298022003200341e8036a3602a80220034198026a41e8bfc1001048000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411541011023000b413541011023000b410f41011023000b412f41011023000b411541011023000b413541011023000b410f41011023000b412f41011023000b412041011023000b41c00041011023000b419a88c00041331039000b411741011023000b412e41011023000b1024000b411541011023000b413541011023000b419a88c00041331039000b410f41011023000b412f41011023000b412041011023000b411541011023000b413541011023000b41b3a0c400419f011039000b412041011023000b41c00041011023000b41800141011023000b412041011023000b412041011023000b410f41011023000b412f41011023000b412041011023000b419a88c00041331039000b411541011023000b413541011023000b411541011023000b413541011023000b4189eec30041d3001039000b412041011023000b41c00041011023000b200541011023000b412041011023000b200820024188016c220f6a20034198026a41e00010840422052009360260200541fc006a200b290300370200200541f4006a200d290300370200200541ec006a200e290300370200200520032903403702642003200241016a22023602682003200a3602642003200836026020034198026a41086a22054200370300200342003703980241a490c100411520034198026a1002200341b0016a41086a200529030037030020032003290398023703b0012003411036029c022003200341b0016a36029802200341e0006a20034198026a10e40102402002450d00200f4188016a2105200821020340200210920120024188016a2102200541f87e6a22050d000b0b0240200a450d00200810200b200341b0026a2006370300200341a8026a2007370300200341a4026a200936020041002108200341a0026a41003a0000200341053a00980220034198026a103d200410920120041020410121090b4100210220012d000022044101470d080c070b200341b0016a41186a22044200370300200341b0016a41106a22084200370300200341b0016a41086a220a4200370300200342003703b00120024135200341b0016a1000200341f0046a41186a220d2004290300370300200341f0046a41106a220e2008290300370300200341f0046a41086a220f200a290300370300200320032903b0013703f00420034198026a200341f0046a105920032d00b9024102460d0b200341e8036a20034198026a41e3001084041a2003418a046a200329036037010020034192046a200341e0006a41086a2903003701002003419a046a200341e0006a41106a290300370100200341a2046a200341e0006a41186a290300370100200320093a0089042004420037030020084200370300200a4200370300200342003703b00120024135200341b0016a1000200d2004290300370300200e2008290300370300200f200a290300370300200320032903b0013703f004200341003602a0022003420137039802412010222204450d0c200420032903e803370000200441086a200341e8036a41086a290300370000200441106a200341e8036a41106a290300370000200441186a200341e8036a41186a290300370000200342a0808080800437029c0220032004360298022004412041c00010212204450d0d2004200341e8036a41206a2d00003a0020200342c0808080900437029c02200320043602980220034189046a20034198026a10b702200328029c022104200341f0046a4120200328029802220920034198026a41086a280200100302402004450d00200910200b2002102041012104200b200545720d010b200510200b02402002452004720d00200210200b2006210c0b4200210620034198026a41086a22024200370300200342003703980241cc90c100411520034198026a1002200341b0016a41086a200229030037030020032003290398023703b001420021070240200341b0016a411041c8d7c400410041001001417f460d002003420037039802200341b0016a411020034198026a41084100100141016a41084d0d0720032903980221070b20034198026a41086a22024200370300200342003703980241cdc8c000410d20034198026a1002200341b0016a41086a200229030037030020032003290398023703b0010240200341b0016a411041c8d7c400410041001001417f460d002003420037039802200341b0016a411020034198026a41084100100141016a41084d0d0820032903980221060b200342e4cab5fbb6ccdcb0e300370340200341c0006a200341f8016a427f427f200c20077e20067c410210b302200241083a0000200341a1026a20032903f801370000200341a9026a200341f8016a41086a290300370000200341b1026a20034188026a290300370000200341b9026a20034190026a290300370000200341053a00980220034198026a103d0b410021020b410121090b4101210820012d000022044101470d010b2008450d01200141046a2201280200109201200128020010200c010b20044105470d002009450d00200141046a2201280200109201200128020010200b200020053602042000200236020020034190056a24000f0b419a88c00041331039000b419a88c00041331039000b4189eec30041d3001039000b412041011023000b41c00041011023000b91e70109037f027e067f047e017f027e047f017e117f23004180056b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410e4b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0f00090607030a0c080f050d02040b01000b200141306a2903002106200141286a290300210720012d00012108200341a8026a41026a200141076a2d00003a0000200341c8006a41086a200141186a290200370300200341c8006a410d6a2001411d6a2900003700002003200141056a2f00003b01a8022003200141106a290200370348200141046a2d00002109200141086a280200210a2001410c6a280200210b20022d0001210c20022d00002105200341c8036a41186a22042002411a6a290100370300200341c8036a41106a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d1c410121040c1d0b200141086a2802002109200141046a280200210820022d000120022d000072450d0e4100210a2009450d0c2008102020012d000021040c0c0b4101210a20022d000120022d0000720d0b200141046a2802002102200341e8036a41086a22054200370300200342003703e803418f9bc4004116200341e8036a100220034190016a41086a2005290300370300200320032903e80337039001200320023602e80320034190016a4110200341e8036a410410030c8a010b200141106a2903002106200141086a2903002107200141186a280200210d20022d0001210a20022d00002105200341c8036a41186a22042002411a6a290100370300200341c8036a41106a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d0d410121040c0e0b4101210a20022d000120022d0000720d0920012d00012104200341e8036a41086a22054200370300200342003703e80341f4edc3004115200341e8036a100220034190016a41086a220a2005290300370300200320032903e803370390014100210220034190016a411041c8d7c40041001003200320043a00d80120054200370300200342003703e80341a3a8c2004119200341e8036a1002200a2005290300370300200320032903e803370390014101210a20034190016a4110200341d8016a410110034101210c20012d00002204410f4d0da3010ca4010b4101210a20022d000120022d0000720d08200141086a2903002106200341e8036a41086a22024200370300200342003703e80341f59ac400411a200341e8036a100220034190016a41086a2002290300370300200320032903e80337039001200320063703e80320034190016a4110200341e8036a410810030c87010b200141106a2903002106200141086a290300210e20022d0001210a20022d00002105200341e0036a22042002411a6a290100370300200341c8036a41106a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d0d410121040c0e0b20022d0001210a20022d00002105200341e0036a22042002411a6a290100370300200341d8036a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d0f410121040c100b20012d0001210d20022d0001210a20022d00002105200341e0036a22042002411a6a290100370300200341d8036a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d11410121040c120b200141106a2903002106200141086a290300210720022d0001210a20022d00002105200341e0036a22042002411a6a290100370300200341c8036a41106a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d16410121040c170b2001410c6a280200210a200141086a280200210b200141046a280200210d20022d0001210c20022d00002105200341e0036a22042002411a6a290100370300200341d8036a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d18410121040c190b4101210a20022d000120022d0000720d02200141046a2802002102200341e8036a41086a22054200370300200342003703e803418cedc3004119200341e8036a100220034190016a41086a2005290300370300200320032903e80337039001200320023602e80320034190016a4110200341e8036a410410030c81010b20022d0001210a20022d00002105200341e0036a22042002411a6a290100370300200341d8036a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d19410121040c1a0b4101210a20022d000120022d000072450d1b0b41fcc5c000210241282105200441ff01712204410f4b0d23410120047441beff01710d9b0120044106460d242004410f470d23200a450d9b01200141086a280200450d9b01200141046a28020010200c9b010b200341246a41026a200141076a2d00003a0000200341286a41086a200141186a290200370300200341286a410d6a2001411d6a2900003700002003200141056a2f00003b01242003200141106a290200370328200141046a2d00002109200141086a280200210d2001410c6a280200210b20022d0001210a20022d00002105200341c8036a41186a22042002411a6a290100370300200341c8036a41106a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d1a410121040c1b0b2001410c6a2802002102200341e8036a41086a22054200370300200342003703e80341e5ecc3004115200341e8036a100220034190016a41086a2005290300370300200320032903e80337039001200341003602f003200342013703e803200320023602d801200341d8016a200341e8036a103e2002450d262002410574210c200341e8036a41086a280200210520032802e803210d20032802ec03210a2008210203400240024002400240200a20056b41204f0d00200541206a22042005490d9401200a410174220b20042004200b491b220b4100480d9401200a450d01200d200a200b1021220d0d020c490b200541206a21040c020b200b1022220d450d470b200b210a0b200d20056a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a29000037000020042105200241206a2102200c41606a220c0d000b200341f0036a20043602002003200a3602ec032003200d3602e8030c270b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b412a210541a4c6c00021020b200341c4006a41026a220a200341d8016a41026a2d00003a0000200341d8046a41086a220c200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80420040d8401200341bb036a200c290300370000200341a8036a41186a200341e5046a290000370000200320032f01443b01a803200320053600af03200320023600ab03200320032903d8043700b3032003200a2d00003a00aa03200341e8036a200341a8036a10b1012003280288042202450d1b200341d8046a41086a2204200341e8036a41346a290200370300200341d8046a41106a220a200341e8036a413c6a290200370300200341d8046a41186a220c200341e8036a41c4006a2902003703002003200341e8036a412c6a2902003703d804200341b4046a280200210b200341e8036a41286a2802002109200341e8036a410c6a350200210f200341e8036a41186a290300210e20032802e803210820032902ec03211020032903f8032111200328028c04210520034190016a41186a2212200c29030037030020034190016a41106a220c200a29030037030020034190016a41086a220a2004290300370300200320032903d80437039001200341d8016a41186a200e370300200341d8016a410c6a200f3e0200200341d8016a41286a2009360200200341fc016a2005360200200341d8016a41346a200a290300370200200341d8016a413c6a200c290300370200200341d8016a41c4006a2012290300370200200320113703e801200320103702dc01200320023602f801200320083602d8012003200b3602a402200320032903900137028402200d410a4d0d2202402005450d00200210200b4198a0c4002102411b21050c84010b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b41a4c6c0002102412a21050b200341c4006a41026a220a200341d8016a41026a2d00003a0000200341d8046a41086a220c200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80420040d8101200341db006a200c290300370000200341c8006a41186a200341e5046a290000370000200320032f01443b01482003200536004f2003200236004b200320032903d8043700532003200a2d00003a004a200341e8036a200341c8006a10b1012003280288042204450d18200341d8046a41086a220a200341e8036a41346a290200370300200341d8046a41106a2205200341e8036a413c6a290200370300200341d8046a41186a220c200341e8036a41c4006a290200370300200320034194046a2902003703d804200341b4046a280200210d200341e8036a41286a280200210b200341e8036a410c6a3502002110200341e8036a41186a290300210720032802e803210920032902ec03211120032903f803210f200328028c04210220034190016a41186a2208200c29030037030020034190016a41106a220c200529030037030020034190016a41086a2205200a290300370300200320032903d80437039001200341d8016a41186a2007370300200341d8016a410c6a20103e0200200341d8016a41286a200b360200200341fc016a2002360200200341d8016a41346a2005290300370200200341d8016a413c6a200c290300370200200341d8016a41c4006a20082903003702002003200f3703e801200320113702dc01200320043602f801200320093602d8012003200d3602a402200320032903900137028402200f200e200f200e54200720065420072006511b22041b220e2007200620041b220684500d6b200341d8016a41106a200f200e7d370300200341f0016a200720067d200f200e54ad7d370300200341e8036a41086a22024200370300200342003703e80341a5eec000411b200341e8036a100220052002290300370300200320032903e80337039001024020034190016a411041c8d7c400410041001001417f460d00200342003703f003200342003703e80320034190016a4110200341e8036a4110410010012202417f460d472002410f4d0d47200341e8016a2202290300220f20032903e8035a200341f0016a22052903002207200341f0036a29030022105a20072010511b0d002005420037030020024200370300200720067c200f200e7c220e200f54ad7c21060b200341e8036a41086a22024200370300200342003703e80341e39ac4004112200341e8036a100220034190016a41086a22052002290300370300200320032903e8033703900142002107024020034190016a411041c8d7c400410041001001417f460d00200342003703e80320034190016a4110200341e8036a41084100100141016a41084d0d4120032903e80321070b20024200370300200342003703e8034181a0c4004117200341e8036a100220052002290300370300200320032903e8033703900120034190016a411041c8d7c400410041001001417f460d29200342003703e80320034190016a4110200341e8036a41084100100141016a41084d0d4120032903e803210f0c2a0b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf03210520034190016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b019001200320032903c8023703e803410021040c010b41a4c6c0002102412a21050b200341c4006a41026a220a20034190016a41026a2d00003a0000200341d8046a41086a220c200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f0190013b0144200320032903e8033703d80420040d7e200341eb016a200c290300370000200341d8016a41186a200341e5046a290000370000200320032f01443b01d801200320053600df01200320023600db01200320032903d8043700e3012003200a2d00003a00da01200341e8036a200341d8016a10b101200328028804220c450d15200341d8046a41086a22022003419c046a290200370300200341d8046a41106a2205200341a4046a290200370300200341d8046a41186a2204200341ac046a290200370300200320034194046a2902003703d804200341e8036a41186a290300211320034190046a280200210d200341f4036a350200210620032903f8032114200328028c04210920033502e803210f20032902ec03210720034188036a41186a200429030037030020034188036a41106a200529030037030020034188036a41086a2002290300370300200320032903d8043703880342002110200341e8036a41086a22024200370300200342003703e80341e39ac4004112200341e8036a100220034190016a41086a2002290300370300200320032903e80337039001024020034190016a411041c8d7c400410041001001417f460d00200342003703e80320034190016a4110200341e8036a41084100100141016a41084d0d3d20032903e80321100b200642208620074220888421062007422086200f8421070240200d41186c2202450d00200c20026a210a200241686a2105200c21020340200241086a290300210e2002290300210f2010200241106a2903002211540d2342002006200e7d2007200f54ad7d220e2007200f7d220f200756200e200656200e2006511b22041b21064200200f20041b2107200541686a2105200241186a2202200a470d000b0b410821044100210d2009450d23200c10204100210b0c2d0b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b412a210541a4c6c00021020b200341c4006a41026a220a200341d8016a41026a2d00003a0000200341d8046a41086a220c200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80420040d7b200341a3016a200c29030037000020034190016a41186a200341d8046a410d6a290000370000200320032f01443b01900120032005360097012003200236009301200320032903d80437009b012003200a2d00003a009201200341e8036a20034190016a10b1012003280288042205450d12200341d8046a41086a22022003419c046a290200370300200341d8046a41106a2204200341a4046a290200370300200341d8046a41186a220a200341ac046a290200370300200320034194046a2902003703d804200328028c04210c200341d8016a41186a200a290300370300200341d8016a41106a2004290300370300200341d8016a41086a2002290300370300200320032903d8043703d801410d10222202450d3e200241056a41002900fe9d44370000200241002900f99d443700002002410d412d10212202450d3f200220032903d80137000d200241256a200341d8016a41186a2903003700002002411d6a200341d8016a41106a290300370000200241156a200341d8016a41086a290300370000200341d8046a41186a22044200370300200341d8046a41106a220a4200370300200341d8046a41086a220b4200370300200342003703d8042002412d200341d8046a1000200341c8036a41186a2004290300370300200341c8036a41106a200a290300370300200341c8036a41086a200b290300370300200320032903d8043703c803200341203602ec032003200341c8036a3602e803200d200341e8036a10ac0320021020200c450d70200510200c700b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200c41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200341c8026a410d6a290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b41a4c6c0002102412a21050b200341e8026a41026a220c200341d8016a41026a2d00003a000020034188036a41086a220d200341e8036a41086a29030037030020034188036a41106a200341e8036a41106a290300370300200320032f01d8013b01e802200320032903e8033703880320040d78200341a3016a200d290300370000200341a8016a20034195036a290000370000200320032f01e8023b01900120032005360097012003200236009301200320032903880337009b012003200c2d00003a009201410e10222202450d39200241066a41002900a3cf433700002002410029009dcf433700002002410e412e10212202450d3a200220032903900137000e200241266a20034190016a41186a2903003700002002411e6a20034190016a41106a290300370000200241166a20034190016a41086a290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220c4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a2204200c290300370300200320032903d8043703c803200341c8036a412041c8d7c4004100410010012105200210202005417f460d1541d29fc4002102411421050c780b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf03210520034190016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b019001200320032903c8023703e803410021040c010b41a4c6c0002102412a21050b200341c8006a41026a220a20034190016a41026a2d00003a0000200341d8016a41086a220c200341e8036a41086a290300370300200341d8016a41106a200341e8036a41106a290300370300200320032f0190013b0148200320032903e8033703d80120040d75200341bb036a200c290300370000200341c0036a200341d8016a410d6a290000370000200320032f01483b01a803200320053600af03200320023600ab03200320032903d8013700b3032003200a2d00003a00aa03200341e8036a200341a8036a10f8024101210420032d00e8034101470d0a200341c6006a20032d00eb033a0000200341d8046a41086a200341fc036a290200370300200341d8046a410d6a20034181046a290000370000200320032f00e9033b01442003200341f4036a2902003703d804200341e8036a41086a28020021054100210420032802ec0321020c0b0b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a22092004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200c41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a2009290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b412a210541a4c6c00021020b200341c4006a41026a220c200341d8016a41026a2d00003a0000200341d8046a41086a2209200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80420040d7f200341db006a2009290300370000200341c8006a41186a200341e5046a290000370000200320032f01443b01482003200536004f2003200236004b200320032903d8043700532003200c2d00003a004a200341e8036a200341c8006a10b1012003280288042209450d0e200341d8046a41086a2202200341e8036a41346a290200370300200341d8046a41106a2205200341e8036a413c6a290200370300200341d8046a41186a2204200341e8036a41c4006a2902003703002003200341e8036a412c6a2902003703d804200341b4046a280200210c200341e8036a41286a2802002108200341e8036a410c6a3502002106200341e8036a41186a290300210720032802e803211520032902ec03210f20032903f803210e200328028c04211220034190016a41186a2216200429030037030020034190016a41106a2204200529030037030020034190016a41086a22052002290300370300200320032903d80437039001200341d8016a41186a2007370300200341d8016a410c6a20063e0200200341d8016a41286a2008360200200341d8016a41246a2012360200200341d8016a41346a2005290300370200200341d8016a413c6a2004290300370200200341d8016a41c4006a20162903003702002003200e3703e8012003200f3702dc01200320093602f801200320153602d8012003200c3602a402200320032903900137028402200a450d14200d200a41246c22026a21172002450d1820034188036a41026a2202200d41036a2d00003a0000200341e8036a41086a220c200d41146a290000370300200341e8036a410d6a2208200d41196a2900003700002003200d2f00013b0188032003200d29000c3703e803200d41246a2104200d2d000022154102460d19200d2800082118200d2800042105200341c8046a41026a20022d00003a0000200341c8036a41086a200c290300370300200341c8036a410d6a2008290000370000200320032f0188033b01c804200320032903e8033703c80320154101470d24200341d8046a2005410676103720032802d804210c20032802e0042005413f7122024d0d26200341fc046a41026a200c20024105746a220241026a2d00003a0000200228000321052002280007211820022f00002108200341b5036a200241186a290000370000200341b0036a200241136a290000370300200320083b01fc042003200229000b3703a8034101210220032802dc04450d740c730b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b412a210541a4c6c00021020b200341c4006a41026a220a200341d8016a41026a2d00003a0000200341d8046a41086a220c200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80420040d6f200341db006a200c290300370000200341c8006a41186a200341e5046a290000370000200320032f01443b01482003200536004f2003200236004b200320032903d8043700532003200a2d00003a004a200341e8036a200341c8006a10b1012003280288042202450d06200341d8046a41086a2204200341e8036a41346a290200370300200341d8046a41106a220a200341e8036a413c6a290200370300200341d8046a41186a220c200341e8036a41c4006a2902003703002003200341e8036a412c6a2902003703d804200341b4046a280200210d200341e8036a41286a280200210b200341e8036a410c6a3502002106200341e8036a41186a290300210720032802e803210920032902ec03210f20032903f803210e200328028c04210520034190016a41186a2208200c29030037030020034190016a41106a220c200a29030037030020034190016a41086a220a2004290300370300200320032903d80437039001200341d8016a41186a2007370300200341d8016a410c6a20063e0200200341d8016a41286a200b360200200341fc016a2005360200200341d8016a41346a200a290300370200200341d8016a413c6a200c290300370200200341d8016a41c4006a20082903003702002003200e3703e8012003200f3702dc01200320023602f801200320093602d8012003200d3602a402200320032903900137028402200341d8016a412c6a220410b401200410a4022005450d64200210200c640b200141086a2903002106200341e8036a41086a22024200370300200342003703e8034181a0c4004117200341e8036a100220034190016a41086a2002290300370300200320032903e80337039001200320063703e80320034190016a4110200341e8036a410810030c630b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf03210520034190016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200341c8026a410d6a290000370000200320032f01c8043b019001200320032903c8023703e803410021040c010b412a210541a4c6c00021020b200341c8006a41026a220a20034190016a41026a2d00003a0000200341d8016a41086a220c200341e8036a41086a290300370300200341d8016a41106a200341e8036a41106a290300370300200320032f0190013b0148200320032903e8033703d80120040d6b200341bb026a200c290300370000200341c0026a200341d8016a410d6a290000370000200320032f01483b01a802200320053600af02200320023600ab02200320032903d8013700b3022003200a2d00003a00aa02200341e8036a200341a8026a10f8024101210420032d00e8034101470d03200341ea026a20032d00eb033a000020034188036a41086a200341fc036a29020037030020034188036a410d6a20034181046a290000370000200320032f00e9033b01e8022003200341f4036a29020037038803200341e8036a41086a28020021054100210420032802ec0321020c040b410b210541e69fc40021020b200341e8026a41026a220a200341c4006a41026a2d00003a000020034188036a41086a220c200341d8046a41086a29030037030020034188036a41106a200341d8046a41106a290300370300200320032f01443b01e802200320032903d8043703880320040d69200341db006a200c290300370000200341c8006a41186a20034195036a290000370000200320032f01e8023b01482003200536004f2003200236004b20032003290388033700532003200a2d00003a004a200341e8036a200341c8006a10b1012003280288042205450d00200341d8046a41086a2204200341e8036a41346a290200370300200341d8046a41106a220a200341e8036a413c6a290200370300200341d8046a41186a220c200341e8036a41c4006a290200370300200320034194046a2902003703d804200341b4046a280200210d200341e8036a41286a280200210b200341e8036a410c6a350200210f200341e8036a41186a290300211020032802e803210920032902ec03210e20032903f8032111200328028c04210220034190016a41186a2208200c29030037030020034190016a41106a220c200a29030037030020034190016a41086a220a2004290300370300200320032903d80437039001200341d8016a41186a2010370300200341d8016a410c6a200f3e0200200341d8016a41286a200b360200200341fc016a22042002360200200341d8016a41346a200a290300370200200341d8016a413c6a200c290300370200200341d8016a41c4006a2008290300370200200320113703e8012003200e3702dc01200320053602f801200320093602d8012003200d3602a402200320032903900137028402200341106a200341a8036a10c40102402003290310220f20032903d80122137d2214200f56200341106a41086a290300220e200341d8016a41086a29030022197d200f201354ad7d220f200e56200f200e511b0d00200341d8016a41106a200720142014200756200f200656200f2006511b22021b220720117c220e370300200341f0016a2006200f20021b220620107c200e200754ad7c3703002003200720137c220f3703d8012003200620197c200f200754ad7c3703e001200341c8006a200341d8016a10bc03200428020021020b2002450d5e200341f8016a28020010200c5e0b41f19fc4002102411021050c680b410b210541e69fc40021020b200341c8006a41026a220a200341e8026a41026a2d00003a0000200341d8016a41086a220c20034188036a41086a290300370300200341d8016a41106a20034188036a41106a290300370300200320032f01e8023b014820032003290388033703d80120040d66200341db026a200c290300370000200341e0026a200341d8016a410d6a290000370000200320032f01483b01c802200320053600cf02200320023600cb02200320032903d8013700d3022003200a2d00003a00ca02200341c8046a41026a200341246a41026a2d00003a0000200341c8036a41086a200341286a41086a290300370300200341c8036a410d6a2202200341286a410d6a290000370000200320032f01243b01c804200320032903283703c803200941ff01714101470d07200341e8036a200d410676103720032802e803210520032802f003200d413f7122024d0d10200341fc046a41026a200520024105746a220241026a2d00003a00002002280003210d2002280007210b20022f00002104200341b5036a200241186a290000370000200341b0036a200241136a290000370300200320043b01fc042003200229000b3703a8034101210220032802ec03450d560c550b200141086a280200450d77200141046a28020010200c770b200141086a280200450d76200141046a28020010200c760b4110210541f19fc40021024100210c4101210a200b0d710c720b200341c8046a41026a2202200341a8026a41026a2d00003a00002004200341c8006a41086a290300370300200341c8036a410d6a2205200341c8006a410d6a290000370000200320032f01a8023b01c804200320032903483703c803200941ff01714101470d06200341e8036a200a410676103720032802e803210520032802f003200a413f7122024d0d0e200341fc046a41026a200520024105746a220241026a2d00003a00002002280003210a2002280007210b20022f00002104200341b5036a200241186a290000370000200341b0036a200241136a290000370300200320043b01fc042003200229000b3703a8034101210220032802ec03450d4e0c4d0b200341d8016a412c6a220510a402200320063703f002200320073703e8022003200d3602f802411210222202450d27200241106a41002f00cdcf433b0000200241086a41002900c5cf43370000200241002900bdcf4337000020024112413210212202450d28200220052900003700122002412a6a200541186a290000370000200241226a200541106a2900003700002002411a6a200541086a290000370000200341d8046a41186a22044200370300200341d8046a41106a220a4200370300200341d8046a41086a220c4200370300200342003703d80420024132200341d8046a1000200341c8036a41186a2004290300370300200341c8036a41106a200a290300370300200341c8036a41086a200c290300370300200320032903d8043703c803200341c8036a412041c8d7c400410041001001417f460d0c20034220370294012003200341c8036a36029001200341e8036a20034190016a10820320032d008004220a4102460d2b200341a0036a20034199046a29000037030020034198036a20034191046a29000037030020034188036a41086a20034189046a290000370300200341c4006a41026a200341a4046a2d00003a0000200341286a41086a200341b5046a290000370300200341356a200341ba046a2900003700002003200329008104370388032003200341a2046a2f01003b01442003200341ad046a290000370328200341a1046a2d0000210d200341a5046a280000210b200341a9046a28000021090c420b200341f0036a280200210420032802ec03210a20032802e803210d0b20034190016a4110200d200410030240200a450d00200d10200b4101210c02402009450d00200810200b4100210a0c660b200341fc046a41026a200341c8046a41026a2d00003a0000200341a8036a41086a200341c8036a41086a290300370300200341a8036a410d6a2002290000370000200320032f01c8043b01fc04200320032903c8033703a8030c4f0b41d2a1c400210241172105410121042012450d690c680b411810222204450d252004200f370300200420113703102004200e3703082005450d09200241186a2105200c200d41186c6a41686a21124101210d4101210b03402005210202400340200241086a290300210e2002290300210f2010200241106a2903002211540d0142002006200e7d2007200f54ad7d220e2007200f7d220f200756200e200656200e2006511b22051b21064200200f20051b2107200241186a2202200a470d000c0d0b0b0240200b200d470d00200d41016a2205200d490d66200d410174220b20052005200b491b220bad42187e2219422088a70d662019a722054100480d660240200d450d002004200d41186c2005102122040d010c270b200510222204450d260b200241186a21052004200d41186c6a2208200e3703082008200f37030020082011370310200d41016a210d20122002470d000c0b0b0b200341fc046a41026a20022d00003a0000200341a8036a41086a200341c8036a41086a290300370300200341a8036a410d6a2005290000370000200320032f01c8043b01fc04200320032903c8033703a8030c480b4100210b0c090b201721040b4100210c4101210241002115410021054100450d5c0c5d0b420c210f0b024020034180026a2802002202200341fc016a280200470d00200241016a22052002490d5f20024101742204200520052004491b2204ad42187e2210422088a70d5f2010a7220a4100480d5f2002450d07200341f8016a280200200241186c200a10212205450d080c3f0b200341f8016a28020021050c3f0b4100210220032802ec030d440c450b20044200370300200341d8046a41106a220a4200370300200341d8046a41086a220c4200370300200342003703d80441dceec300411a200341d8046a1000200341e8036a41186a2004290300370300200341e8036a41106a200a290300370300200341e8036a41086a200c290300370300200320032903d8043703e803200341e8036a412041c8d7c400410041001001417f460d07200341e0036a4200370300200341c8036a41106a4200370300200341c8036a41086a4200370300200342003703c803200341e8036a4120200341c8036a4120410010012204417f460d1f2004411f4d0d1f200341c8046a41026a220420032d00ca033a0000200341c8026a41086a220a200341db036a290000370300200341c8026a410d6a220c200341e0036a290000370000200320032f01c8033b01c804200320032900d3033703c80220032800cb03210b20032800cf032109200341fc046a41026a220d20042d00003a0000200341a8026a41086a2208200a290300370300200341a8026a410d6a2212200c290000370000200320032f01c8043b01fc04200320032903c8023703a8022004200d2d00003a0000200a2008290300370300200c2012290000370000200320032f01fc043b01c804200320032903a8023703c802411210222204450d20200441106a41002f00cdcf433b0000200441086a41002900c5cf43370000200441002900bdcf4337000020044112413210212204450d21200420032f01c8043b0012200420093600192004200b360015200420032903c80237001d200441146a200341c8046a41026a2d00003a0000200441256a200341c8026a41086a2903003700002004412a6a200341d5026a290000370000200341d8046a41186a220a4200370300200341d8046a41106a220c4200370300200341d8046a41086a220d4200370300200342003703d80420044132200341d8046a1000200341c8036a41186a200a290300370300200341c8036a41106a200c290300370300200341c8036a41086a200d290300370300200320032903d8043703c803200341c8036a412041c8d7c400410041001001417f460d222003422037024c2003200341c8036a360248200341e8036a200341c8006a10820320032d008004220a4102460d23200341e8036a41086a290300210620032802f803210c20032903e803210720034190016a20034181046a41c7001084041a200341c8006a20034190016a41c1001084041a2003200a3a00e803200341e8036a410172200341c8006a41c1001084041a200341ac016a2003418a046a410020032d0089044101461b36020020032006370398012003200737039001200320053602a8012003200c3602a001200341d8046a41186a220a4200370300200341d8046a41106a220c4200370300200341d8046a41086a220d4200370300200342003703d80420044132200341d8046a1000200341c8036a41186a200a290300370300200341c8036a41106a200c290300370300200341c8036a41086a200d290300370300200320032903d8043703c803200341003602502003420137034820034190016a41106a200341c8006a103e200320034190016a3602d804200341d8046a200341c8006a109801200328024c210a2003280250210c20032802a8012212450d09200a200c470d0a200c41016a220a200c490d5c200c410174220d200a200a200d491b220a4100480d5c200c450d0c2003280248200c200a1021220d450d0d0c270b4100210220032802ec030d3e0c3f0b4101210d4101210b0b2009450d00200c10200b200341e8036a41186a201337030020034190046a200d3602002003418c046a2202200b360200200341ac046a20034188036a41186a290300370200200341a4046a20034198036a2903003702002003419c046a20034190036a290300370200200320143703f803200320073703e8032003200329038803370294042003200436028804200320063703f003200341d8016a200341e8036a10bc032002280200450d4520034188046a28020010200c450b200a102222050d370b200a41081023000b200341fc046a41026a200341c8046a41026a2d00003a0000200341a8036a41086a200341c8036a41086a290300370300200341a8036a410d6a200341c8036a410d6a290000370000200320032f01c8043b01fc04200320032903c8033703a8030c500b200341d8046a41186a22044200370300200a4200370300200c4200370300200342003703d80441dceec300411a200341d8046a1000200341c8036a41186a2004290300370300200341c8036a41106a200a290300370300200341c8036a41086a200c290300370300200320032903d8043703c803412010222204450d1c20042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c8036a4120200441201003200410204100210d0c2c0b4100210220032802dc040d4c0c4d0b200a200c470d01200c41016a220a200c490d52200c410174220d200a200a200d491b220a4100480d52200c450d042003280248200c200a1021220d450d050c1b0b2003280248210d0c1d0b2003280248210d0c1a0b200a1022220d0d1a0b200a41011023000b200a1022220d0d160b200a41011023000b200341fc036a4101360200200341033602dc01200341eca1c4003602d801200342013702ec03200341f4a1c4003602e8032003200341d8016a3602f803200341e8036a41fca1c4001048000b200b41011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b410e41011023000b412e41011023000b410d41011023000b412d41011023000b419a88c00041331039000b411241011023000b413241011023000b200541081023000b411841081023000b419a88c00041331039000b419a88c00041331039000b411241011023000b413241011023000b41b3a0c400419f011039000b419a88c00041331039000b412041011023000b2003200a36024c2003200d3602480b200341d0006a200c41016a2208360200200d200c6a41003a0000200341ac016a280200220c0d020c030b2003200a36024c2003200d3602480b200341c8006a41086a2215200c41016a360200200d200c6a41013a000002400240024002400240200328024c22082015280200220c6b411f4b0d00200c41206a220a200c490d3820084101742216200a200a2016491b220a4100480d382008450d01200d2008200a1021220d450d020c030b2008210a0c030b200a1022220d0d010b200a41011023000b2003200a36024c2003200d3602480b2015200c41206a2208360200200d200c6a220c41086a201241086a290000370000200c41106a201241106a290000370000200c41186a201241186a290000370000200c2012290000370000200341ac016a280200220c450d010b200a2008470d08200a41016a2212200a490d32200a4101742215201220122015491b22124100480d32200a450d01200d200a20121021220d450d020c070b200a2008470d05200a41016a220c200a490d31200a4101742212200c200c2012491b220c4100480d31200a450d02200d200a200c1021220d450d030c040b20121022220d0d050b201241011023000b200c1022220d0d010b200c41011023000b2003200c36024c2003200d3602480b200341d0006a220a200841016a360200200d20086a41003a0000200a2802002112200328024c210d2003280248210a0c020b2003201236024c2003200d3602480b200341d0006a220a200841016a360200200d20086a41013a000002400240024002400240200328024c220d200a28020022086b41204f0d00200841206a220a2008490d2e200d4101742212200a200a2012491b22124100480d2e200d450d012003280248200d20121021220a450d020c030b2003280248210a0c030b20121022220a0d010b201241011023000b2003201236024c2003200a3602482012210d0b200341c8006a41086a200841206a2212360200200a20086a220841086a200c41086a290000370000200841106a200c41106a290000370000200841186a200c41186a2900003700002008200c2900003700000b200341c8036a4120200a201210030240200d450d00200a10200b20041020200341d8046a41186a22044200370300200341d8046a41106a220a4200370300200341d8046a41086a220c4200370300200342003703d80441dceec300411a200341d8046a1000200341c8036a41186a2004290300370300200341c8036a41106a200a290300370300200341c8036a41086a200c290300370300200320032903d8043703c803412010222204450d0220042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c8036a412020044120100320041020200341c4006a41026a200341c8046a41026a2d00003a0000200341286a41086a200341c8026a41086a290300370300200341286a410d6a200341c8026a410d6a290000370000200320032f01c8043b0144200320032903c8023703284101210d0b4100210a0b200341e8036a41186a20034188036a41186a290300370300200341e8036a41106a20034188036a41106a290300370300200341e8036a41086a20034188036a41086a290300370300200341c8026a41026a200341c4006a41026a2d00003a000020034190016a41086a200341286a41086a29030037030020034190016a410d6a200341286a410d6a29000037000020032003290388033703e803200320032f01443b01c8022003200329032837039001200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220c4200370300200342003703d80420024132200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200c290300370300200320032903d8043703c8032003410036025020034201370348200341e8026a41106a200341c8006a103e2003200341e8026a3602d804200341d8046a200341c8006a109801200328024c2105200328025021040240024002400240024002400240200a4101470d0020052004470d01200441016a22052004490d2d2004410174220a20052005200a491b22054100480d2d2004450d032003280248200420051021220a450d040c0a0b20052004470d01200441016a22052004490d2c2004410174220a20052005200a491b22054100480d2c2004450d042003280248200420051021220a450d050c070b2003280248210a0c090b2003280248210a0c060b20051022220a0d060b200541011023000b20051022220a0d020b200541011023000b412041011023000b2003200536024c2003200a3602480b200341d0006a200441016a220c360200200a20046a41003a00000c020b2003200536024c2003200a3602480b200341c8006a41086a2208200441016a360200200a20046a41013a000002400240024002400240200328024c220c200828020022046b411f4b0d00200441206a22052004490d26200c4101742212200520052012491b22054100480d26200c450d01200a200c20051021220a450d020c030b200c21050c030b20051022220a0d010b200541011023000b2003200536024c2003200a3602480b2008200441206a220c360200200a20046a220441086a200341e8036a41086a290300370000200441106a200341e8036a41106a290300370000200441186a200341e8036a41186a290300370000200420032903e8033700000b0240024002400240024002400240024002400240200d41ff01714101470d002005200c470d08200541016a22042005490d2a2005410174220d20042004200d491b22044100480d2a2005450d01200a200520041021220a450d020c070b2005200c470d05200541016a22042005490d292005410174220d20042004200d491b22044100480d292005450d02200a200520041021220a450d030c040b20041022220a0d050b200441011023000b20041022220a0d010b200441011023000b2003200436024c2003200a3602480b200341d0006a2205200c41016a360200200a200c6a41003a00002005280200210c200328024c210a200328024821040c020b2003200436024c2003200a3602480b200341d0006a2205200c41016a360200200a200c6a41013a000002400240024002400240200328024c220a200528020022056b41204f0d00200541206a22042005490d26200a410174220c20042004200c491b220c4100480d26200a450d012003280248200a200c10212204450d020c030b200328024821040c030b200c102222040d010b200c41011023000b2003200c36024c20032004360248200c210a0b200341c8006a41086a200541206a220c360200200341c8026a41026a2d0000210d20032f01c8022108200420056a220520093600072005200b360003200541026a200d3a0000200520083b0000200541186a2003419d016a290000370000200541136a20034190016a41086a290300370000200520032903900137000b0b200341c8036a41202004200c10030240200a450d00200410200b20021020200341fc016a280200450d0d200341f8016a28020010200c0d0b200341fc016a2004360200200341f8016a200536020020034180026a28020021020b2005200241186c6a220220063703082002200e3703002002200f20077c37031020034180026a2202200228020041016a360200200341c8006a200341d8016a10bc03200341fc016a28020021020b2002450d0a200341f8016a28020010200c0a0b200510200b20020d00410121024195a9c000210a4115210b0c010b200341c8036a41026a200341fc046a41026a2d00003a0000200341e8036a41086a200341a8036a41086a290300370300200341e8036a410d6a200341a8036a410d6a290000370000200320032f01fc043b01c803200320032903a8033703e803410021020b200341c4006a41026a2205200341c8036a41026a2d00003a0000200341d8046a41086a2204200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01c8033b0144200320032903e8033703d80402402002450d00200b2105200a21020c120b200341eb016a2004290300370000200341f0016a200341e5046a290000370000200320032f01443b01d8012003200b3600df012003200a3600db01200320032903d8043700e301200320052d00003a00da010240024002400240024002400240410e10222202450d00200241066a41002900d5cf43370000200241002900cfcf433700002002410e412e10212202450d01200220032903d80137000e200241266a200341d8016a41186a220c2903003700002002411e6a200341d8016a41106a220d290300370000200241166a200341d8016a41086a220b290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c803200341c8036a412041c8d7c4004100410010012105200210202005417f470d0b200341e8036a41186a200c290300370300200341e8036a41106a200d290300370300200341e8036a41086a200b290300370300200320032903d8013703e803410e10222202450d02200241066a41002900a3cf433700002002410029009dcf433700002002410e412e10212202450d03200220032903900137000e200241266a20034190016a41186a2903003700002002411e6a20034190016a41106a290300370000200241166a20034190016a41086a290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c803412010222205450d04200520032903e803370000200541186a200341e8036a41186a290300370000200541106a200341e8036a41106a290300370000200541086a200341e8036a41086a290300370000200341c8036a41202005412010032005102020021020410d10222202450d05200241056a41002900fe9d44370000200241002900f99d443700002002410d412d10212202450d06200220032903900137000d200241256a20034190016a41186a22052903003700002002411d6a20034190016a41106a2204290300370000200241156a20034190016a41086a220a290300370000200341d8046a41186a220c4200370300200341d8046a41106a220d4200370300200341d8046a41086a220b4200370300200342003703d8042002412d200341d8046a1000200341c8036a41186a200c290300370300200341c8036a41106a200d290300370300200341c8036a41086a200b290300370300200320032903d8043703c803200341203602ec032003200341c8036a3602e8032008200341e8036a10ac0320021020200320034190016a10c401200341086a290300210f2003290300210e20034190046a4100360200200341e8036a41186a200f2006200e200754200f200654200f2006511b22021b2206370300200341ac046a2005290300370200200341a4046a20042903003702002003419c046a200a29030037020020034208370388042003200e200720021b22073703f803200320063703f003200320073703e803200320032903900137029404200341d8016a200341e8036a10bc032003418c046a280200450d0d200341e8036a41206a28020010200c0d0b410e41011023000b412e41011023000b410e41011023000b412e41011023000b412041011023000b410d41011023000b412d41011023000b200510200b20020d00410121024195a9c000210d4115210b0c010b200341d8016a41026a200341fc046a41026a2d00003a0000200341e8036a41086a200341a8036a41086a290300370300200341e8036a410d6a200341a8036a410d6a290000370000200320032f01fc043b01d801200320032903a8033703e803410021020b200341c4006a41026a2205200341d8016a41026a2d00003a0000200341d8046a41086a2204200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80402402002450d004101210a4101210c200b2105200d210220012d00002204410f4d0d1e0c1f0b200341fb026a200429030037000020034180036a200341e5046a290000370000200320032f01443b01e8022003200b3600ef022003200d3600eb02200320032903d8043700f302200320052d00003a00ea02410e10222202450d03200241066a41002900d5cf43370000200241002900cfcf433700002002410e412e10212202450d04200220032903e80237000e200241266a200341e8026a41186a2903003700002002411e6a200341e8026a41106a290300370000200241166a200341e8026a41086a290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c803200341c8036a412041c8d7c4004100410010012105200210202005417f470d00200341e8026a200341c8026a4120108604450d02410e10222202450d05200241066a41002900a3cf433700002002410029009dcf433700002002410e412e10212202450d06200220032903a80237000e200241266a200341a8026a41186a2903003700002002411e6a200341a8026a41106a290300370000200241166a200341a8026a41086a290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c803412010222205450d07200520032903e802370000200541186a200341e8026a41186a290300370000200541106a200341e8026a41106a290300370000200541086a200341e8026a41086a290300370000200341c8036a41202005412010032005102020021020410e10222202450d0841002105200241066a41002900d5cf43370000200241002900cfcf433700002002410e412e10212202450d09200220032903c80237000e200241266a200341c8026a41186a2903003700002002411e6a200341c8026a41106a290300370000200241166a200341c8026a41086a290300370000200341d8046a41186a22044200370300200341d8046a41106a220a4200370300200341d8046a41086a220c4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2004290300370300200341c8036a41106a200a290300370300200341c8036a41086a200c290300370300200320032903d8043703c8030240200341c8036a412041c8d7c400410041001001417f460d00200342203702cc042003200341c8036a3602c804200341e8036a200341c8046a10b1032003280288042205450d0b200341d8046a41186a200341e8036a41186a290300370300200341d8046a41106a200341e8036a41106a290300370300200341d8046a41086a200341e8036a41086a290300370300200341d8016a41086a20034194046a290200370300200341d8016a41106a2003419c046a290200370300200341d8016a41186a200341a4046a290200370300200341d8016a41206a200341ac046a29020037030020034180026a200341b4046a280200360200200320032903e8033703d8042003200329028c043703d801200341c8036a412010090b200341a8036a41186a2004290300370300200341a8036a41106a200a290300370300200341a8036a41086a200c29030037030020034190016a41086a200341d8016a41086a29030037030020034190016a41106a200341d8016a41106a29030037030020034190016a41186a200341d8016a41186a29030037030020034190016a41206a200341d8016a41206a29030037030020034190016a41286a2204200341d8016a41286a280200360200200320032903d8043703a803200320032903d801370390012005450d0120034188036a41186a220a200341a8036a41186a29030037030020034188036a41106a220c200341a8036a41106a29030037030020034188036a41086a220d200341a8036a41086a290300370300200341c8006a41086a220b20034190016a41086a290300370300200341c8006a41106a220920034190016a41106a290300370300200341c8006a41186a220820034190016a41186a290300370300200341c8006a41206a221220034190016a41206a290300370300200341c8006a41286a22152004280200360200200320032903a80337038803200320032903900137034820021020200341e8036a41186a200a290300370300200341e8036a41106a200c290300370300200341e8036a41086a200d2903003703002003418c046a200329034837020020034194046a200b2903003702002003419c046a2009290300370200200341a4046a2008290300370200200341ac046a2012290300370200200341b4046a2015280200360200200320053602880420032003290388033703e803410e10222202450d0b200241066a41002900d5cf43370000200241002900cfcf433700002002410e412e10212202450d0c200220032903e80237000e200241266a200341e8026a41186a2903003700002002411e6a200341e8026a41106a290300370000200241166a200341e8026a41086a290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c803200341203602dc012003200341c8036a3602d801200341e8036a200341d8016a10ad03200210202003418c046a280200450d02200341e8036a41206a28020010200c020b41b99fc4002102411921050c0c0b200210200b410021024101210a4101210c0c190b410e41011023000b412e41011023000b410e41011023000b412e41011023000b412041011023000b410e41011023000b412e41011023000b419a88c00041331039000b410e41011023000b412e41011023000b4101210a4101210c20012d00002204410f4d0d0f0c100b200c10200b20020d004195a9c000210c4101210241002115410021054195a9c0000d020c010b200341e8026a41026a220c200341fc046a41026a2d00003a000020034190016a41086a2208200341a8036a41086a29030037030020034190016a410d6a2215200341a8036a410d6a290000370000200320032f01fc043b01e802200320032903a803370390010240024002400240412010222202450d00200220032f01e8023b00002002201836000720022005360003200220032903900137000b200241026a200c2d00003a0000200241136a2008290300370000200241186a20152900003700000240024020172004460d0020034188036a41026a2205200d41276a2d00003a0000200341e8036a41086a220c200d41386a290000370300200341e8036a410d6a2208200d413d6a2900003700002003200d2f00253b0188032003200d2900303703e803200d41c8006a2104200d41246a2d000022154102470d014100210c410121154101210541000d070c060b201721044100210c410121154101210541000d060c050b200d28002c211b200d2800282116200341c8046a41026a20052d00003a0000200341c8036a41086a200c290300370300200341c8036a410d6a2008290000370000200320032f0188033b01c804200320032903e8033703c8030240024020154101470d00200341d8046a2016410676103720032802d804210c20032802e0042016413f7122054d0d01200341fc046a41026a200c20054105746a220541026a2d00003a0000200528000321162005280007211b20052f00002108200341b5036a200541186a290000370000200341b0036a200541136a290000370300200320083b01fc042003200529000b3703a8034101210520032802dc04450d040c030b200341fc046a41026a200341c8046a41026a2d00003a0000200341a8036a41086a200341c8036a41086a290300370300200341a8036a410d6a200341c8036a410d6a290000370000200320032f01c8043b01fc04200320032903c8033703a8030c040b410021052018211b20032802dc040d010c020b412041011023000b200c10200b20050d004195a9c000210c41012115410121054195a9c0000d020c010b200341e8026a41026a221c200341fc046a41026a221d2d00003a000020034190016a41086a221e200341a8036a41086a221f29030037030020034190016a410d6a2220200341a8036a410d6a2221290000370000200320032f01fc043b01e802200320032903a80337039001200a41246c41b87f6a2122200341e3046a211a410221234120211841022115410021084101210502400240024002400340201a200329039001370000201a41086a201e290300370000201a410d6a20202900003700002003201b3600df04200320163600db04200320032f01e8023b01d8042003201c2d00003a00da0402402015417f6a2005470d002023201520152023491b2205ad4205862206422088a70d0a2006a7220c4100480d0a20022018200c10212202450d050b200220186a220c20032903d804370000200c41186a200341d8046a41186a290300370000200c41106a200341d8046a41106a290300370000200c41086a200341d8046a41086a2224290300370000200841f803460d02024020222008460d0020034188036a41026a2225200d20086a220c41cb006a2d00003a0000200341e8036a41086a2226200c41dc006a290000370300200341e8036a410d6a2227200c41e1006a2900003700002003200c41c9006a2f00003b0188032003200c41d4006a2900003703e803200c41c8006a2d000022284102460d02200c41d0006a2800002129200c41cc006a2800002116200341c8046a41026a222a20252d00003a0000200341c8036a41086a22252026290300370300200341c8036a410d6a22262027290000370000200320032f0188033b01c804200320032903e8033703c8030240024020284101470d00200341d8046a201641067610372016413f7121254100212620032802d80421270240202428020020254d0d00201d202720254105746a222541026a2d00003a0000202528000321162025280007211b20252f000021262021202541186a290000370000201f202541136a290000370300200320263b01fc042003202529000b3703a803410121260b024020032802dc04450d00202710200b20260d010c060b201d202a2d00003a0000201f202529030037030020212026290000370000200320032f01c8043b01fc04200320032903c8033703a8032029211b0b200441246a2104201c201d2d00003a0000201e201f29030037030020202021290000370000200320032f01fc043b01e802200320032903a80337039001202341026a2123201841206a2118201541016a2115200841246a21080c010b0b201721044100210c41000d050c040b200c41ec006a21040b4100210c41000d030c020b200c41ec006a21044195a9c000210c4195a9c0000d020c010b200c41011023000b410021160c010b4101211602402005450d00200210200b200c2102411521050b200341d8016a412c6a2108200d200a41246c6a210c02400340200c2004460d0120042d0000210a200441246a2104200a4102470d000b0b0240200b450d00200d10200b02402016450d004100210420120d050c060b200810b401200320153602b002200320053602ac02200320023602a802024002400240024002400240024002400240024002400240411210222202450d00200241106a41002f00bbcf433b0000200241086a41002900b3cf43370000200241002900abcf4337000020024112413210212212450d01201220082900003700122012412a6a200841186a290000370000201241226a200841106a2900003700002012411a6a200841086a290000370000200341d8046a41186a22024200370300200341d8046a41106a22054200370300200341d8046a41086a22044200370300200342003703d80420124132200341d8046a1000200341c8036a41186a2002290300370300200341c8036a41106a2005290300370300200341c8036a41086a2004290300370300200320032903d8043703c8030240200341c8036a412041c8d7c400410041001001417f460d0020034220370294012003200341c8036a36029001200341e8036a20034190016a10d90220032d00f40322024102460d0320034188036a41086a200341fd036a29000037030020034198036a20034185046a290000370300200341a0036a2003418d046a290000370300200341c4006a41026a20034198046a2d00003a0000200320032900f50337038803200320034196046a2f01003b014420034195046a2d0000210520034199046a28000021152003419d046a280000211620032802ec03210420032802e803210a200341356a200341ae046a290000370000200341286a41086a200341a9046a2900003703002003200341a1046a2900003703282004450d0c200a10200c0c0b20024200370300200341d8046a41106a22054200370300200341d8046a41086a22044200370300200342003703d80441c29bc400411a200341d8046a1000200341e8036a41186a2002290300370300200341e8036a41106a2005290300370300200341e8036a41086a2004290300370300200320032903d8043703e8030240024002400240200341e8036a412041c8d7c400410041001001417f460d00200341e0036a4200370300200341c8036a41106a4200370300200341c8036a41086a4200370300200342003703c803200341e8036a4120200341c8036a4120410010012202417f460d072002411f4d0d07200341c8046a41026a220220032d00ca033a0000200341c8026a41086a2205200341db036a290000370300200341c8026a410d6a2204200341e0036a290000370000200320032f01c8033b01c804200320032900d3033703c80220032800cb03211520032800cf032116200341fc046a41026a220a20022d00003a0000200341e8026a41086a22022005290300370300200341e8026a410d6a22052004290000370000200320032f01c8043b01fc04200320032903c8023703e802200341c8026a41026a200a2d00003a0000200341a8036a41086a2002290300370300200341a8036a410d6a2005290000370000200320032f01fc043b01c802200320032903e8023703a803411210222202450d08200241106a41002f00bbcf433b0000200241086a41002900b3cf43370000200241002900abcf4337000020024112413210212209450d09200920032f01c8023b00122009201636001920092015360015200920032903a80337001d200941146a200341c8026a41026a2d00003a0000200941256a200341a8036a41086a2903003700002009412a6a200341b5036a290000370000200341d8046a41186a22024200370300200341d8046a41106a22054200370300200341d8046a41086a22044200370300200342003703d80420094132200341d8046a1000200341c8036a41186a2002290300370300200341c8036a41106a2005290300370300200341c8036a41086a2004290300370300200320032903d8043703c803200341c8036a412041c8d7c400410041001001417f460d0a200342203702dc042003200341c8036a3602d804200341e8036a200341d8046a10d90220032d00f40322054102460d0b20032802ec03211720032802e803211820032802f003210220034190016a200341f5036a41c3001084041a200320053a00e803200341e8036a41017220034190016a41c1001084041a20032d008904211a200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d80420094132200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c80320034201370390012003410036029801200320023602d804200341d8046a20034190016a103e20032802980121052002450d012002410574210b410020056b2104200328029401210a2018210203400240024002400240200a20046a41204f0d00200541206a220c2005490d16200a410174220d200c200c200d491b220d4100480d16200a450d01200328029001200a200d1021220c0d020c080b200328029001210c0c020b200d1022220c450d060b2003200d360294012003200c36029001200d210a0b20034190016a41086a200541206a220d360200200c20056a220541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a29000037000020052002290000370000200441606a2104200d2105200241206a2102200b41606a220b0d000c030b0b200341d8046a41186a220242003703002005420037030020044200370300200342003703d80441c29bc400411a200341d8046a1000200341c8036a41186a2002290300370300200341c8036a41106a2005290300370300200341c8036a41086a2004290300370300200320032903d8043703c803412010222202450d0b20022008290000370000200241186a200841186a290000370000200241106a200841106a290000370000200241086a200841086a290000370000200341c8036a41202002412010032002102041002105410021020c0e0b2005210d0b024002400240200328029401200d470d00200d41016a2202200d490d11200d4101742205200220022005491b22054100480d11200d450d01200328029001200d200510212202450d020c0d0b20032802900121020c0d0b2005102222020d0b0b200541011023000b200d41011023000b411241011023000b413241011023000b419a88c00041331039000b419a88c00041331039000b411241011023000b413241011023000b41b3a0c400419f011039000b419a88c00041331039000b412041011023000b200320053602940120032002360290010b20034190016a41086a220a200d41016a3602002002200d6a41013a000002400240024002400240200328029401220c200a28020022046b411f4b0d00200441206a22052004490d07200c410174220d20052005200d491b22054100480d07200c450d012002200c200510212202450d020c030b200c21050c030b2005102222020d010b200541011023000b200320053602940120032002360290010b200a200441206a220d360200200220046a220a41086a200841086a290000370000200a41106a200841106a290000370000200a41186a200841186a290000370000200a20082900003700000240024002400240024002400240024002400240024002402003418a046a4100201a4101461b220a450d002005200d470d01200541016a220c2005490d0e2005410174220b200c200c200b491b220c4100480d0e2005450d0320022005200c10212202450d040c090b2005200d470d01200541016a220a2005490d0d2005410174220c200a200a200c491b220b4100480d0d2005450d0420022005200b10212202450d050c060b2005210c0c080b2005210b0c050b200c102222020d050b200c41011023000b200b102222020d010b200b41011023000b2003200b3602940120032002360290010b20034198016a200441216a22043602002002200d6a41003a00000c020b2003200c3602940120032002360290010b20034190016a41086a221a200441216a22053602002002200d6a41013a000002400240024002400240200c20056b411f4b0d00200541206a220d2005490d08200c410174220b200d200d200b491b220b4100480d08200c450d012002200c200b10212202450d020c030b200c210b0c030b200b102222020d010b200b41011023000b2003200b3602940120032002360290010b201a200441c1006a2204360200200220056a220541086a200a41086a290000370000200541106a200a41106a290000370000200541186a200a41186a2900003700002005200a2900003700000b200341c8036a41202002200410030240200b450d00200210200b02402017450d00201810200b20091020200341d8046a41186a22024200370300200341d8046a41106a22054200370300200341d8046a41086a22044200370300200342003703d80441c29bc400411a200341d8046a1000200341c8036a41186a2002290300370300200341c8036a41106a2005290300370300200341c8036a41086a2004290300370300200320032903d8043703c803412010222202450d0420022008290000370000200241186a200841186a290000370000200241106a200841106a290000370000200241086a200841086a290000370000200341c8036a412020024120100320021020200341c4006a41026a200341c8026a41026a2d00003a0000200341286a41086a200341a8036a41086a290300370300200341286a410d6a200341a8036a410d6a290000370000200320032f01c8023b0144200320032903a80337032841012105410021020b2003418d046a20053a00002003418e046a20032f01443b010020034195046a201636000020034191046a201536000020034199046a2003290328370000200341e8036a410d6a20034188036a41086a290300370000200341fd036a20034188036a41106a29030037000020034185046a20034188036a41186a29030037000020034190046a200341c6006a2d00003a0000200341a1046a200341286a41086a290300370000200341a6046a200341286a410d6a290000370000200320023a00ec0320032003290388033700ed032003200341a8026a3602e803200341d8046a41186a22024200370300200341d8046a41106a22054200370300200341d8046a41086a22044200370300200342003703d80420124132200341d8046a1000200341c8036a41186a2002290300370300200341c8036a41106a2005290300370300200341c8036a41086a2004290300370300200320032903d8043703c8032003410036029801200342013703900120032802a80221022003200341a8026a41086a28020022053602d804200341d8046a20034190016a103e02402005450d002005410574210d410020034190016a41086a28020022056b210a200328029001210b200328029401210c03400240200c200a6a411f4b0d00200541206a22042005490d04200c4101742209200420042009491b22044100480d0402400240200c450d00200b200c20041021220b0d010c070b20041022220b450d060b2004210c0b200b20056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200a41606a210a200541206a2105200241206a2102200d41606a220d0d000b20034198016a20053602002003200c360294012003200b360290010b200341e8036a41047220034190016a10b7022003280294012102200341c8036a4120200328029001220520034190016a41086a280200100302402002450d00200510200b20121020024020032802ac02450d0020032802a80210200b0240200341fc016a280200450d00200341f8016a28020010200b4100210c4101210a0b4100210220012d00002204410f4d0d080c090b1024000b200441011023000b412041011023000b200910200b20040d004100210c4101210a20012d00002204410f4d0d030c040b4100210c4101210a200b450d010b200d102020012d00002204410f4d0d010c020b20012d00002204410f4b0d010b410120047441beff01710d01024020044106460d002004410f470d01200a450d02200141086a280200450d02200141046a28020010200c020b200c450d01200141086a280200450d01200141046a28020010200c010b200141086a280200450d00200141046a28020010200b200020053602042000200236020020034180056a24000bc60303027f017e097f230041106b2202240020022001108e0102400240024002400240024002400240024002402002280200450d0020022802042203ad2204421e88a70d032004420286a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241106a24000f0b4104210620030d030b410021054100210b0c030b1031000b200541041023000b200141086a210741002108410021094100210a2003210b0340200141046a28020021052007280200210c2002410036020c20074100200128020020052002410c6a4104200c100122052005417f461b2205410420054104491b20072802006a360200200541034d0d02200a41016a2105200228020c210c0240200a200b470d002008200520052008491b220bad4202862204422088a70d042004a7220d4100480d040240200a450d0020062009200d102122060d010c060b200d10222206450d050b200620096a200c360200200841026a2108200941046a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610200b200241106a24000f0b1024000b200d41041023000bd60904067f027e027f027e230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200141002001280200200128020420024180016a41202001280208100122062006417f461b2206412020064120491b20012802086a220736020802400240024002402006411f4d0d00200241e0006a41186a22062003290300370300200241e0006a41106a22032004290300370300200241e0006a41086a220420052903003703002002200229038001370360200241c0006a41186a22052006290300370300200241c0006a41106a22062003290300370300200241c0006a41086a2203200429030037030020022002290360370340200241186a2005290300370300200241106a2006290300370300200241086a20032903003703002002200229034037030020024200370388012002420037038001200141086a220341002001280200200141046a220428020020024180016a41102007100122062006417f461b2206411020064110491b20032802006a22033602002006410f4d0d0120024180016a41086a22072903002108200229038001210920024180016a41186a220a420037030020024180016a41106a220b4200370300200742003703002002420037038001200141086a220541002001280200200428020020024180016a41202003100122062006417f461b2206412020064120491b20052802006a22033602002006411f4d0d02200241e0006a41186a2206200a290300370300200241e0006a41106a2204200b290300370300200241e0006a41086a220a20072903003703002002200229038001370360200241c0006a41186a22072006290300370300200241c0006a41106a22062004290300370300200241c0006a41086a2204200a29030037030020022002290360370340200241206a41186a2007290300370300200241206a41106a2006290300370300200241206a41086a20042903003703002002200229034037032020024200370388012002420037038001200541002001280200200141046a28020020024180016a41102003100122012001417f461b2201411020014110491b20052802006a3602002001410f4d0d0320024180016a41086a2201290300210c200229038001210d20024180016a41186a2206200241186a29030037030020024180016a41106a2203200241106a2903003703002001200241086a290300370300200241e0006a41086a2204200241206a41086a290300370300200241e0006a41106a2205200241206a41106a290300370300200241e0006a41186a2207200241206a41186a290300370300200220022903003703800120022002290320370360200041206a200c370300200041186a200d370300200041106a200837030020002009370308200041286a200229038001370300200041306a2001290300370300200041386a2003290300370300200041c0006a2006290300370300200041c8006a2002290360370300200041d0006a2004290300370300200041d8006a2005290300370300200041e0006a200729030037030020004201370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000bce0304027f017e037f017e230041c0006b2204240002400240411810222205450d00200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef4037000020054118413810212205450d0120052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1000200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041c8d7c400410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a200429032021060c010b4200210a0b2005102020012006200220062006200256200a200356200a2003511b22051b22027d200a2003200a20051b22037d2006200254ad7d10b6012000200337030820002002370300200441c0006a24000f0b419a88c00041331039000b411841011023000b413841011023000bb70202047f027e230041206b22022400200241106a41086a2203420037030020024200370310418feec0004116200241106a1002200241086a22042003290300370300200220022903103703000240024002402002411041c8d7c400410041001001417f460d00200242003703182002420037031020024110200241106a4110410010012205417f460d022005410f4d0d02200241186a2903002106200229031021070c010b42002107420021060b2003420037030020024200370310418feec0004116200241106a1002200420032903003703002002200229031037030020024200200620017d2007200054ad7d2201200720007d2200200756200120065620012006511b22031b37031820024200200020031b37031020024110200241106a41101003200241206a24000f0b419a88c00041331039000bff0304027f017e027f017e230041d0006b220524000240024002400240200241ff017122064102460d0020064104470d02200541106a200110a2022005290310200356200541186a290300220720045620072004511b0d010c020b2005200110a2022005290300200358200541086a290300220720045820072004511b0d010b41fee7c0002101412621060c010b200541206a200110a8020240024002400240024020052802282201450d0042002107200541c0006a41086a220642003703002005420037034041cdc8c000410d200541c0006a1002200541306a41086a2006290300370300200520052903403703300240200541306a411041c8d7c400410041001001417f460d0020054200370340200541306a4110200541c0006a41084100100141016a41084d0d03200529034021070b200141286c210620052802242108200528022022092101034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d030b200141286a2101200641586a22060d000b410021012008450d040c030b02402005280224450d00200528022010200b410021010c040b41a4e8c000210120080d010c020b419a88c00041331039000b200910200b413121060b2000200636020420002001360200200541d0006a24000ba52105017f017e017f017e067f230041f0016b2203240042002104200341206a41086a220542003703002003420037032041a5eec000411b200341206a1002200341d0016a41086a2005290300370300200320032903203703d0010240024002400240200341d0016a411041c8d7c400410041001001417f460d002003420037032820034200370320200341d0016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441142107411410222205450d010c030b42002106411421074114102222050d020b200741011023000b419a88c00041331039000b200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef403700000240024002400240024002400240024002400240024002400240024020052007413410212205450d00200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413420034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200320013703d001200320023703d801200341206a4120200341d0016a41101003200510202004200158200620025820062002511b0d0c411410222205450d02200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d03200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341086a2005413410a302200341086a41106a2903002101200329031021022003280208210a20051020410e10222205450d04200541066a41002900f6ef40370000200541002900f0ef403700002005410e412e10212205450d052005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a412010092005102002402002200184500d00200a450d00200341206a41086a2205420037030020034200370320418feec0004116200341206a1002200341d0016a41086a22072005290300370300200320032903203703d00102400240200341d0016a411041c8d7c400410041001001417f460d002003420037032820034200370320200341d0016a4110200341206a4110410010012208417f460d0b2008410f4d0d0b200341286a2903002106200329032021040c010b42002104420021060b2005420037030020034200370320418feec0004116200341206a100220072005290300370300200320032903203703d00120034200200620017d2004200254ad7d2201200420027d2202200456200120065620012006511b22051b37032820034200200220051b370320200341d0016a4110200341206a411010030b410e10222205450d06200541066a41002900a3cf433700002005410029009dcf433700002005410e412e10212205450d072005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1000200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a200929030037030020032003290390013703d00102400240200341d0016a412041c8d7c400410041001001417f460d00200341206a41186a4200370300200341206a41106a4200370300200341206a41086a420037030020034200370320200341d0016a4120200341206a4120410010012207417f460d032007411f4d0d03200341b0016a41186a2207200341206a41186a290300370300200341b0016a41106a2208200341206a41106a290300370300200341b0016a41086a2209200341206a41086a290300370300200320032903203703b001200341d0016a4120100920051020200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a2009290300370300200320032903b0013703d001410e10222205450d0b200541066a41002900d5cf43370000200541002900cfcf433700002005410e412e10212205450d0c200520032903d00137000e200541266a200341d0016a41186a2903003700002005411e6a200341d0016a41106a290300370000200541166a200341d0016a41086a29030037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100920051020410d2107410d10222205450d010c0d0b20051020410d2107410d102222050d0c0b200741011023000b413441011023000b419a88c00041331039000b411441011023000b413441011023000b410e41011023000b412e41011023000b410e41011023000b412e41011023000b419a88c00041331039000b410e41011023000b412e41011023000b200541056a41002900fe9d44370000200541002900f99d44370000024002400240024002400240024002400240024020052007412d10212205450d002005200029000037000d200541256a200041186a2900003700002005411d6a200041106a290000370000200541156a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412d20034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100920051020411210222205450d01200541106a41002f008aed433b0000200541086a4100290082ed43370000200541002900faec4337000020054112413210212205450d02200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100920051020200010b401200010a402200341206a200010c701024002400240024020032d002022054103714102460d0020050d01200341cc006a2802002105200341c8006a2802002207200341d0006a28020010152005450d0220071020411721074117102222050d030c070b20050d01200341cc006a280200450d01200341c8006a2802001020411721074117102222050d020c060b20050d00200341cc006a280200450d00200341c8006a28020010200b41172107411710222205450d040b2005410f6a41002900cfe342370000200541086a41002900c8e342370000200541002900c0e34237000020052007413710212205450d04200520002900003700172005412f6a200041186a290000370000200541276a200041106a2900003700002005411f6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413720034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100920051020411210222205450d05200541106a41002f00efad423b0000200541086a41002900e7ad42370000200541002900dfad4237000020054112413210212205450d06200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100920051020411810222205450d07200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef4037000020054118413810212205450d0820052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413820034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a2009290300370300200320032903900137032002400240200341206a412041c8d7c400410041001001417f460d00200342003703d801200342003703d001200341206a4120200341d0016a4110410010012207417f460d012007410f4d0d01200341d8016a290300210220032903d001210141002107200510202001200284504101710d0d0c0b0b41012107200510204100410171450d0a0c0c0b419a88c00041331039000b412d41011023000b411241011023000b413241011023000b200741011023000b413741011023000b411241011023000b413241011023000b411841011023000b413841011023000b20070d010b200341f0016a24000f0b02400240411310222205450d002005410f6a410028008ec940360000200541086a4100290087c940370000200541002900ffc84037000020054113413310212205450d01200520002900003700132005412b6a200041186a2208290000370000200541236a200041106a22092900003700002005411b6a200041086a220a290000370000200341206a41186a220b4200370300200341206a41106a220c4200370300200341206a41086a220742003703002003420037032020054133200341206a100020034190016a41186a200b29030037030020034190016a41106a200c29030037030020034190016a41086a2007290300370300200320032903203703900120034190016a4120100920051020200741013a0000200341296a2000290000370000200341316a200a290000370000200341396a2009290000370000200341c1006a2008290000370000200341023a0020200341206a103d200341f0016a24000f0b411341011023000b413341011023000ba80704027f017e037f037e230041d0006b2204240002400240024002400240411410222205450d00200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1000200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310024002400240200441106a412041c8d7c400410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d022007410f4d0d02200441386a290300210a200429033021060c010b4200210a0b200510200240024020062002542205200a200354200a2003511b450d0041debcc1002105411521010c010b200441086a20014104200620027d2206200a20037d2005ad7d220a10ae01024020042802082205450d00200428020c21010c010b411810222205450d05200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef4037000020054118413810212205450d0620052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a2900003700004200210b200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054138200441306a1000200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a20092903003703002004200429033037031002400240200441106a412041c8d7c400410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d062007410f4d0d06200441386a290300210c2004290330210b0c010b4200210c0b200510202001200b20027c2202200c20037c2002200b54ad7c10b60120012006200a10af01410021050b2000200136020420002005360200200441d0006a24000f0b419a88c00041331039000b411441011023000b413441011023000b419a88c00041331039000b411841011023000b413841011023000b8a0501077f230041b0016b22022400024002400240410e10222203450d00200341066a41002900d5cf43370000200341002900cfcf433700002003410e412e10212203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241e0006a41186a22014200370300200241e0006a41106a22044200370300200241e0006a41086a22054200370300200242003703602003412e200241e0006a1000200241306a41186a2001290300370300200241306a41106a2004290300370300200241306a41086a20052903003703002002200229036037033002400240200241306a412041c8d7c400410041001001417f460d00200242203702542002200241306a360250200241e0006a200241d0006a10b1032002280280012201450d0420002002290360370300200041186a200241e0006a41186a290300370300200041106a200241e0006a41106a290300370300200041086a200241e0006a41086a290300370300200241086a2204200241e0006a412c6a290200370300200241106a2205200241e0006a41346a290200370300200241186a2206200241e0006a413c6a290200370300200241206a2207200241e0006a41c4006a290200370300200241286a2208200241e0006a41cc006a280200360200200220022902840137030020002001360220200020022903003702242000412c6a2004290300370200200041346a20052903003702002000413c6a2006290300370200200041c4006a2007290300370200200041cc006a20082802003602000c010b200041003602200b20031020200241b0016a24000f0b410e41011023000b412e41011023000b419a88c00041331039000baa0906047f047e017f017e097f037e230041c0016b220224000240024002400240024002400240024002400240410f10222203450d00200341076a41002900fdee43370000200341002900f6ee433700002003410f412f10212204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a29000037000020024180016a41186a2201420037030020024180016a41106a2203420037030020024180016a41086a2205420037030020024200370380012004412f20024180016a1000200241d0006a41186a2001290300370300200241d0006a41106a2003290300370300200241d0006a41086a200529030037030020022002290380013703500240024002400240200241d0006a412041c8d7c400410041001001417f460d00200242203702742002200241d0006a360270200241386a200241f0006a108c012002290338a7450d0b200241386a41106a290300210620022903402107200241206a200241f0006a108c012002290320a7450d0b200241306a290300210820022903282109200241186a200241f0006a108e012002280218450d0b200228021c220aad42307e220b422088a70d03200ba72201417f4c0d032001450d0120011022220c450d06200a450d020c070b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000c080b4108210c200a0d050b4100210f4200210b200c450d080c050b1031000b410f41011023000b412f41011023000b200141081023000b20024180016a41186a210320024180016a41106a21054200210b4100210d4100210e41002101200a210f0340200342003703002005420037030020024180016a41086a221042003703002002420037038001200241f0006a41086a22112011280200221141002002280270200228027420024180016a41202011100122112011417f461b2211412020114120491b6a3602002011411f4d0d03200241a0016a41186a22122003290300370300200241a0016a41106a22132005290300370300200241a0016a41086a2214201029030037030020022002290380013703a0012002200241f0006a108c012002290300a7450d03200141016a2111200241106a290300211520022903082116200320122903003703002005201329030037030020102014290300370300200220022903a0013703800102402001200f470d00200d20112011200d491b220fad42307e2217422088a70d062017a722124100480d0602402001450d00200c200e20121021220c0d010c080b20121022220c450d070b200c200e6a2201201537030820012016370300200141286a2003290300370300200141206a2005290300370300200141186a2010290300370300200141106a200229038001370300200b4280808080107c210b200d41026a210d200e41306a210e201121012011200a490d000b200c450d030b200020093703102000200637030820002007370300200041246a200b200fad843702002000200c360220200041186a20083703000b20041020200241c0016a24000f0b200f450d00200c10200b419a88c00041331039000b1024000b201241081023000bd30704027f017e037f057e230041c0006b2204240002400240024002400240411410222205450d00200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054134200441206a1000200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041c8d7c400410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a2004290320210b0c010b4200210b4200210a0b200510202001200b2002200b200b200256200a200356200a2003511b22051b220c7d200a2003200a20051b220d7d200b200c54ad7d10af0102400240024002402002200c7d220b2003200d7d2002200c54ad7d220e84500d00411810222205450d08200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef4037000020054118413810212205450d0920052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002102200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1000200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703002004412041c8d7c400410041001001417f460d01200442003703282004420037032020044120200441206a4110410010012207417f460d072007410f4d0d07200441286a2903002103200429032021020c020b4200210e0c020b420021030b2005102020012002200b20022002200b562003200e562003200e511b22051b220a7d2003200e200320051b22067d2002200a54ad7d10b601200e20067d200b200a54ad7d210e2006200d7c200a200c7c2202200a54ad7c2103200b200a7d21060b2000200637031020002002370300200041186a200e37030020002003370308200441c0006a24000f0b419a88c00041331039000b411441011023000b413441011023000b419a88c00041331039000b411841011023000b413841011023000ba11501077f230041c0036b220124000240024002400240024002400240024002400240024002400240024002400240411210222202450d00200241106a41002f00cdcf433b0000200241086a41002900c5cf43370000200241002900bdcf4337000020024112413210212202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e0026a41186a22004200370300200141e0026a41106a22034200370300200141e0026a41086a22044200370300200142003703e00220024132200141e0026a1000200141b0026a41186a2000290300370300200141b0026a41106a2003290300370300200141b0026a41086a2004290300370300200120012903e0023703b00202400240200141b0026a412041c8d7c400410041001001417f460d002001422037026c2001200141b0026a360268200141e0026a200141e8006a10820320012d00f80222034102460d0420014188016a41186a20014191036a29000037030020014188016a41106a20014189036a29000037030020014188016a41086a20014181036a290000370300200141e8016a41086a200141a2036a290100370300200141e8016a41106a200141aa036a290100370300200141e8016a41186a200141b2036a290100370300200120012900f9023703880120012001419a036a2901003703e80120014199036a2d00002104200141b0026a412010090c010b410221030b200141286a41186a20014188016a41186a290300370300200141286a41106a220020014188016a41106a290300370300200141286a41086a220520014188016a41086a290300370300200141086a41086a2206200141e8016a41086a290300370300200141086a41106a2207200141e8016a41106a290300370300200141086a41186a200141e8016a41186a2903003703002001200129038801370328200120012903e8013703082002102020034102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2000290300370300200141e8006a41086a2005290300370300200141c8006a41086a2006290300370300200141c8006a41106a2007290300370300200141c8006a41186a200141086a41186a2903003703002001200129032837036820012001290308370348410021020240200441ff01714101470d00411210222202450d06200241106a41002f00cdcf433b0000200241086a41002900c5cf43370000200241002900bdcf4337000020024112413210212202450d07200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d00411210222200450d09200041106a41002f00cdcf433b0000200041086a41002900c5cf43370000200041002900bdcf4337000020004112413210212200450d0a200020012903683700122000412a6a200141e8006a41186a290300370000200041226a200141e8006a41106a2903003700002000411a6a200141e8006a41086a290300370000200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220004132200141e0026a1000200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041c8d7c400410041001001417f460d0b200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a10820320012d00f80222074102460d0c20014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001084041a200120073a00a00120014188016a41196a200141e8016a41c7001084041a200141c1016a20043a0000200141c2016a2001290348370100200141ca016a200141c8006a41086a290300370100200141d2016a200141c8006a41106a290300370100200141da016a200141c8006a41186a290300370100200141e0026a41186a220442003703002005420037030020064200370300200142003703e00220004132200141e0026a1000200141b0026a41186a2004290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a10ae03200010204101210420020d010c0e0b200141e0026a41186a22004200370300200141e0026a41106a22054200370300200141e0026a41086a22064200370300200142003703e00241dceec300411a200141e0026a1000200141b0026a41186a2000290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b0020240200441ff01714101470d00412010222200450d0d20002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141b0026a412020004120100320001020410021004100210420020d010c0e0b200141b0026a4120100941002100410021042002450d0d0b200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220024132200141e0026a1000200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041c8d7c400410041001001417f460d03200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a10820320012d00f8024102460d0420014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001084041a20014188016a41196a200141e8016a41c7001084042001290368370000200141a9016a200141e8006a41086a290300370000200141b1016a200141e8006a41106a290300370000200141b9016a200141e8006a41186a290300370000200120033a00a001200141e0026a41186a220342003703002005420037030020064200370300200142003703e00220024132200141e0026a1000200141b0026a41186a2003290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a10ae0320021020410121032004200045720d0e0c0d0b411241011023000b413241011023000b419a88c00041331039000b4189eec30041d3001039000b419a88c00041331039000b411241011023000b413241011023000b411241011023000b413241011023000b4189eec30041d3001039000b419a88c00041331039000b412041011023000b410021032004200045720d010b200010200b2002452003720d00200210200b200141c0036a24000b6c01017f230041306b2203240020032002360204200320013602002003412c6a41023602002003411c6a4102360200200341023602242003420237020c200341b8d7c400360208200320033602282003200341046a3602202003200341206a360218200341086a20001048000bc10e05017f017e017f017e067f230041b0016b2203240042002104200341206a41086a220542003703002003420037032041a5eec000411b200341206a100220034190016a41086a20052903003703002003200329032037039001024002400240024020034190016a411041c8d7c400410041001001417f460d00200342003703282003420037032020034190016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441182107411810222205450d010c030b42002106411821074118102222050d020b200741011023000b419a88c00041331039000b200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef40370000024002400240024002400240024002400240024020052007413810212205450d0020052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413820034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a2009290300370300200320032903900137032020032001370390012003200237039801200341206a412020034190016a41101003200510202004200158200620025820062002511b0d08411810222205450d02200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef4037000020054118413810212205450d0320052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341086a2005413810a302200341086a41106a290300210120032802082107200329031021022005102002402002200184500d002007450d00200341206a41086a2205420037030020034200370320418feec0004116200341206a100220034190016a41086a2207200529030037030020032003290320370390010240024020034190016a411041c8d7c400410041001001417f460d00200342003703282003420037032020034190016a4110200341206a4110410010012208417f460d092008410f4d0d09200341286a2903002106200329032021040c010b42002104420021060b2005420037030020034200370320418feec0004116200341206a100220072005290300370300200320032903203703900120034200200620017d2004200254ad7d2201200420027d2202200456200120065620012006511b22051b37032820034200200220051b37032020034190016a4110200341206a411010030b411410222205450d04200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d05200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413420034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a200929030037030020032003290390013703200240200341206a412041c8d7c400410041001001417f460d0020034200370398012003420037039001200341206a412020034190016a4110410010012207417f460d022007410f4d0d0220034198016a2903002102200329039001210141002107200510202001200284504101710d0a0c080b41012107200510204100410171450d070c090b413841011023000b419a88c00041331039000b411841011023000b413841011023000b411441011023000b413441011023000b419a88c00041331039000b20070d010b200341b0016a24000f0b02400240411310222205450d002005410f6a410028008ec940360000200541086a4100290087c940370000200541002900ffc84037000020054113413310212205450d01200520002900003700132005412b6a200041186a2208290000370000200541236a200041106a22092900003700002005411b6a200041086a220a290000370000200341206a41186a220b4200370300200341206a41106a220c4200370300200341206a41086a220742003703002003420037032020054133200341206a100020034190016a41186a200b29030037030020034190016a41106a200c29030037030020034190016a41086a2007290300370300200320032903203703900120034190016a4120100920051020200741013a0000200341296a2000290000370000200341316a200a290000370000200341396a2009290000370000200341c1006a2008290000370000200341023a0020200341206a103d200341b0016a24000f0b411341011023000b413341011023000b9f0803037f017e077f0240024002400240024002400240024002400240024002402001280200417f6a220241064b0d0002400240024002400240024002400240024002400240024002400240024020020e0700040203010506000b2001410c6a2802002202417f4c0d17200128020421034101210102402002450d00200210222201450d100b20012003200210840421012000410c6a2002360200200041086a200236020020002001360204200041013602000f0b2001410c6a2802002202417f4c0d16200128020421012002450d052002102222030d06200241011023000b2001410c6a2802002202417f4c0d15200128020421012002450d062002102222030d07200241011023000b20004104360200200041086a200141086a2903003703000f0b200041023602000f0b2001410c6a2802002204ad42187e2205422088a70d122005a72203417f4c0d12200128020421022003450d05200310222206450d0b2004450d060c100b2001410c6a2802002207ad420c7e2205422088a70d112005a72202417f4c0d11200128020421032002450d06200210222204450d0b410c21092007450d070c0c0b410121030b20032001200210840421012000410c6a2002360200200041086a200236020020002001360204200041053602000f0b410121030b20032001200210840421012000410c6a2002360200200041086a200236020020002001360204200041033602000f0b4104210620040d0a0b410021080c0a0b41042104410c210920070d050b410021080c050b41d48cc000102f000b200241011023000b200341041023000b200241041023000b2003200720096c6a210c41002108200421020340200341086a2802002201417f4c0d052003280200210a024002402001450d0020011022220b0d010c040b4101210b0b200b200a2001108404210a200241086a2001360200200241046a20013602002002200a360200200220096a2102200841016a2108200320096a2203200c470d000b0b2000200436020420004107360200200020096a2008360200200041086a20073602000f0b200141011023000b2002200441186c6a210741002108200621010340200241086a2802002203417f4c0d0220022802002109024002402003450d0020031022220a0d010c050b4101210a0b200a20092003108404210a200241146a2802002209417f4c0d022002410c6a280200210b024002402009450d0020091022220c0d010c060b4101210c0b200c200b2009108404210b200141146a2009360200200141106a20093602002001410c6a200b360200200141086a2003360200200141046a20033602002001200a360200200141186a2101200841016a2108200241186a22022007470d000b0b20002006360204200041063602002000410c6a2008360200200041086a20043602000f0b1031000b200341011023000b200941011023000bc3d10105067f017e017f017e027f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a2203410b4b0d0002400240024020030e0c0008050602090a070c040b01000b200141046a280200200141086a2802002203470d13200341016a22042003490d5220034101742205200420042005491b22054100480d522003450d2720012802002003200510212204450d280c500b200141046a280200200141086a2802002203470d0b200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d1820012802002003200510212204450d190c4a0b200141046a2205280200200141086a22042802002203470d0b200341016a22062003490d5020034101742207200620062007491b22074100480d502003450d1920012802002003200710212206450d1a0c450b200141046a280200200141086a2802002203470d0b200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d1a20012802002003200510212204450d1b0c420b200141046a280200200141086a2802002203470d0b200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d1b20012802002003200510212204450d1c0c3f0b200141046a280200200141086a2802002203470d0b200341016a22042003490d4d20034101742205200420042005491b22054100480d4d2003450d1c20012802002003200510212204450d1d0c3c0b200141046a280200200141086a2802002203470d0b200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d1d20012802002003200510212204450d1e0c390b200141046a280200200141086a2802002203470d0b200341016a22042003490d4620034101742205200420042005491b22054100480d462003450d1e20012802002003200510212204450d1f0c360b200141046a280200200141086a2802002203470d0c200341016a22042003490d4a20034101742205200420042005491b22054100480d4a2003450d2120012802002003200510212204450d220c330b200141046a280200200141086a2802002203470d0c200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d2220012802002003200510212204450d230c300b200141046a280200200141086a2802002203470d0c200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d2320012802002003200510212204450d240c2d0b200141046a280200200141086a2802002203470d0c200341016a22042003490d4220034101742205200420042005491b22054100480d422003450d2420012802002003200510212204450d250c2a0b200141046a280200200141086a2802002203470d0c200341016a22042003490d4120034101742205200420042005491b22054100480d412003450d2520012802002003200510212204450d260c270b200128020021040c3f0b200128020021060c3a0b200128020021040c370b200128020021040c340b200128020021040c310b200128020021040c2e0b200128020021040c2b0b200128020021040c3d0b200128020021040c270b200128020021040c240b200128020021040c210b200128020021040c1e0b200128020021040c1b0b2005102222040d310b200541011023000b2007102222060d2b0b200741011023000b2005102222040d270b200541011023000b2005102222040d230b200541011023000b2005102222040d1f0b200541011023000b2005102222040d1b0b200541011023000b2005102222040d170b200541011023000b2005102222040d280b200541011023000b2005102222040d110b200541011023000b2005102222040d0d0b200541011023000b2005102222040d090b200541011023000b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1d20034101742205200420042005491b22044100480d1d2003450d0120012802002003200410212205450d020c030b200128020021050c030b2004102222050d010b200441011023000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200041046a280200210320022000410c6a280200220036020c2002410c6a2001103e2000450d142003200041286c6a2109200141046a2105024002400340024002400240024020052802002206200428020022006b41204f0d00200041206a22072000490d1f20064101742200200720072000491b22004100480d1f2006450d01200128020020062000102122060d020c050b200128020021060c020b200010222206450d030b2001200636020020052000360200200428020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2903002108024002400240024020052802002206200428020022006b41084f0d00200041086a22072000490d1f20064101742200200720072000491b22004100480d1f2006450d01200128020020062000102122060d020c060b200128020021060c020b200010222206450d040b2001200636020020052000360200200428020021000b2004200041086a360200200620006a20083700002009200341286a2203470d000c170b0b200041011023000b200041011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341044b0d000240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d08200341016a22042003490d3920034101742205200420042005491b22054100480d392003450d1120012802002003200510212204450d120c210b200141046a280200200141086a2802002203470d04200341016a22042003490d3820034101742205200420042005491b22054100480d382003450d0a20012802002003200510212204450d0b0c1e0b200141046a280200200141086a2802002203470d04200341016a22042003490d3720034101742205200420042005491b22054100480d372003450d0b20012802002003200510212204450d0c0c1b0b200141046a280200200141086a2802002203470d04200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d0c20012802002003200510212204450d0d0c180b200141046a280200200141086a2802002203470d05200341016a22042003490d3520034101742205200420042005491b22054100480d352003450d0f20012802002003200510212204450d100c150b200141046a28020020052802002203470d05200341016a22042003490d3420034101742205200420042005491b22054100480d342003450d1020012802002003200510212204450d110c120b200128020021040c1a0b200128020021040c170b200128020021040c140b200128020021040c190b200128020021040c100b200128020021040c0d0b2005102222040d130b200541011023000b2005102222040d0f0b200541011023000b2005102222040d0b0b200541011023000b2005102222040d0f0b200541011023000b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2520044101742203200520052003491b22034100480d252004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2520044101742203200520052003491b22034100480d252004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002108200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d2520044101742203200020002003491b22034100480d252004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2320044101742203200520052003491b22034100480d232004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2120044101742203200520052003491b22034100480d212004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041296a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1f20044101742203200520052003491b22034100480d1f2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a28020021062002200041346a280200220336020c2002410c6a2001103e02400240024002400240200141046a2802002200200528020022046b20034f0d00200420036a22052004490d1d20004101742204200520052004491b22044100480d1d2000450d0120012802002000200410212200450d020c030b200128020021000c030b2004102222000d010b200441011023000b20012000360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200020046a200620031084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a0000200041056a2104200141046a28020021062005280200210302400240024002400240024002400240024002400240200041046a2d00004101470d0020062003470d01200341016a22052003490d2420034101742206200520052006491b22064100480d242003450d0320012802002003200610212205450d040c090b20062003470d01200341016a22052003490d2320034101742206200520052006491b22064100480d232003450d0420012802002003200610212205450d050c060b200128020021050c080b200128020021050c050b2006102222050d050b200641011023000b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41003a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d2020054101742203200620062003491b22034100480d202005450d0120012802002005200310212205450d020c030b200128020021050c030b2003102222050d010b200341011023000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041286a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d2020044101742203200620062003491b22034100480d202004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a20053600002000412c6a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d2020044101742203200620062003491b22034100480d202004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041306a280200210002400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41013a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d1920054101742203200620062003491b22034100480d192005450d0120012802002005200310212205450d020c030b200128020021050c030b2003102222050d010b200341011023000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041286a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d1920044101742203200620062003491b22034100480d192004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a20053600002000412c6a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d1920044101742203200620062003491b22034100480d192004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041306a280200210002400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22052003490d1920044101742203200520052003491b22034100480d192004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2e20034101742205200420042005491b22054100480d2e2003450d0b20012802002003200510212204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2d20034101742205200420042005491b22054100480d2d2003450d0620012802002003200510212204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d0720012802002003200510212204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0a20012802002003200510212204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005102222040d0b0b200541011023000b2005102222040d070b200541011023000b2005102222040d090b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2220044101742203200520052003491b22034100480d222004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2220044101742203200520052003491b22034100480d222004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041086a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041086a28020021032002200041106a280200220436020c2002410c6a2001103e0240024002402004450d0020044105742107200141046a21090340024002400240024020092802002206200528020022046b41204f0d00200441206a220b2004490d1f20064101742204200b200b2004491b22044100480d1f2006450d01200128020020062004102122060d020c060b200128020021060c020b200410222206450d040b2001200636020020092004360200200528020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200041146a280200210320022000411c6a280200220436020c2002410c6a2001103e2004450d1020044105742106200141086a2100200141046a21070340024002400240024020072802002205200028020022046b41204f0d00200441206a22092004490d1e20054101742204200920092004491b22044100480d1e2005450d01200128020020052004102122050d020c060b200128020021050c020b200410222205450d040b2001200536020020072004360200200028020021040b2000200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200641606a22060d000c110b0b200441011023000b200441011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00000240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034102460d00024020034101460d0020030d1d200141046a280200200141086a2802002203470d04200341016a22042003490d2620034101742205200420042005491b22054100480d262003450d0920012802002003200510212204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d2520034101742205200420042005491b22054100480d252003450d0420012802002003200510212204450d050c0c0b200141046a28020020052802002203470d01200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0520012802002003200510212204450d060c090b200128020021040c0b0b200128020021040c080b200128020021040c0b0b2005102222040d070b200541011023000b2005102222040d030b200541011023000b2005102222040d050b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002108200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320083700082003200a370000200041e8006a2903002108200041e0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1e20044101742203200020002003491b22034100480d1e2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1a20044101742203200520052003491b22034100480d1a2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1a20044101742203200020002003491b22034100480d1a2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0f20012802002003200510212204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0820012802002003200510212204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0920012802002003200510212204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2820034101742205200420042005491b22054100480d282003450d0a20012802002003200510212204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0d20012802002003200510212204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102222040d0f0b200541011023000b2005102222040d0b0b200541011023000b2005102222040d070b200541011023000b2005102222040d0b0b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1920044101742203200520052003491b22034100480d192004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041256a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1720044101742203200520052003491b22034100480d172004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041c8006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a200636000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041256a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041cc006a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1320044101742203200520052003491b22034100480d132004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1320044101742203200520052003491b22034100480d132004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041256a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a200041c5006a2d00003a0000200041c8006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1320044101742203200520052003491b22034100480d132004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041cc006a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1320044101742203200520052003491b22034100480d132004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d0020034102470d01200141046a280200200141086a2802002203470d03200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0720012802002003200510212204450d080c0f0b200141046a28020020052802002203470d01200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0420012802002003200510212204450d050c0c0b200141046a280200200141086a2802002203470d02200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0720012802002003200510212204450d080c090b200128020021040c0b0b200128020021040c0c0b200128020021040c070b2005102222040d070b200541011023000b2005102222040d070b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1a20044101742203200020002003491b22034100480d1a2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1820044101742203200520052003491b22034100480d182004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1820044101742203200520052003491b22034100480d182004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1620044101742203200520052003491b22034100480d162004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1620044101742203200020002003491b22034100480d162004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041086a290300210802400240024002400240200141046a2802002204200528020022036b41084f0d00200341086a22002003490d1420044101742203200020002003491b22034100480d142004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341086a360200200420036a2008370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2520034101742205200420042005491b22054100480d252003450d0f20012802002003200510212204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0820012802002003200510212204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0920012802002003200510212204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0a20012802002003200510212204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0d20012802002003200510212204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102222040d0f0b200541011023000b2005102222040d0b0b200541011023000b2005102222040d070b200541011023000b2005102222040d0b0b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000412c6a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320083700082003200a37000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1320044101742203200020002003491b22034100480d132004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1120044101742203200020002003491b22034100480d112004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d0d20044101742203200020002003491b22034100480d0d2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a28020021042005280200210302400240024002400240024002400240024002400240200041016a2d00004101470d0020042003470d01200341016a22042003490d1620034101742200200420042000491b22004100480d162003450d0320012802002003200010212204450d040c090b20042003470d01200341016a22042003490d1520034101742200200420042000491b22004100480d152003450d0420012802002003200010212204450d050c060b200128020021040c080b200128020021040c050b2000102222040d050b200041011023000b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341074b0d000240024002400240024002400240024020030e080005020301060704000b200528020020042802002203470d0c200341016a22062003490d3e20034101742207200620062007491b22074100480d3e2003450d1920012802002003200710212206450d1a0c330b200528020020042802002203470d07200341016a22062003490d3d20034101742207200620062007491b22074100480d3d2003450d1020012802002003200710212206450d110c300b200528020020042802002203470d07200341016a22062003490d3c20034101742207200620062007491b22074100480d3c2003450d1120012802002003200710212206450d120c2d0b200528020020042802002203470d07200341016a22062003490d3b20034101742207200620062007491b22074100480d3b2003450d1220012802002003200710212206450d130c2a0b200528020020042802002203470d07200341016a22062003490d3a20034101742207200620062007491b22074100480d3a2003450d1320012802002003200710212206450d140c270b200528020020042802002203470d08200341016a22062003490d3920034101742207200620062007491b22074100480d392003450d1620012802002003200710212206450d170c240b200528020020042802002203470d08200341016a22062003490d3820034101742207200620062007491b22074100480d382003450d1720012802002003200710212206450d180c210b200528020020042802002203470d08200341016a22062003490d3720034101742207200620062007491b22074100480d372003450d1820012802002003200710212206450d190c1e0b200528020020042802002203470d08200341016a22062003490d3620034101742207200620062007491b22074100480d362003450d1920012802002003200710212206450d1a0c1b0b200128020021060c290b200128020021060c260b200128020021060c230b200128020021060c200b200128020021060c270b200128020021060c1c0b200128020021060c190b200128020021060c160b200128020021060c130b2007102222060d1f0b200741011023000b2007102222060d1b0b200741011023000b2007102222060d170b200741011023000b2007102222060d130b200741011023000b2007102222060d190b200741011023000b2007102222060d0d0b200741011023000b2007102222060d090b200741011023000b2007102222060d050b200741011023000b2007102222060d010b200741011023000b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41003a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1e20064101742203200920092003491b22034100480d1e2006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041186a2903002108200041106a290300210a0240024002400240024020052802002200200428020022036b41104f0d00200341106a22052003490d1e20004101742203200520052003491b22034100480d1e2000450d0120012802002000200310212200450d020c030b200128020021000c030b2003102222000d010b200341011023000b20012000360200200141046a2003360200200141086a28020021030b2004200341106a360200200020036a220120083700082001200a370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d1c20064101742203200720072003491b22034100480d1c2006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1c20054101742203200620062003491b22034100480d1c2005450d0120012802002005200310212205450d020c030b200128020021050c030b2003102222050d010b200341011023000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41063a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1a20064101742203200920092003491b22034100480d1a2006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240200528020020042802002203470d00200341016a22052003490d1a20034101742206200520052006491b22064100480d1a2003450d0120012802002003200610212205450d020c030b200128020021050c030b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41023a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1820064101742203200920092003491b22034100480d182006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200528020020042802002203470d03200341016a22002003490d2420034101742205200020002005491b22054100480d242003450d0720012802002003200510212200450d080c0f0b200528020020042802002203470d01200341016a22002003490d2320034101742205200020002005491b22054100480d232003450d0420012802002003200510212200450d050c0c0b200528020020042802002203470d02200341016a22002003490d2220034101742205200020002005491b22054100480d222003450d0720012802002003200510212200450d080c090b200128020021000c0b0b200128020021000c0c0b200128020021000c070b2005102222000d070b200541011023000b2005102222000d070b200541011023000b2005102222000d010b200541011023000b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41003a00000c0e0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41013a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41083a00000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1620054101742203200620062003491b22034100480d162005450d0120012802002005200310212205450d020c030b200128020021050c030b2003102222050d010b200341011023000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41043a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1420004101742203200520052003491b22034100480d142000450d0120012802002000200310212200450d020c030b200128020021000c030b2003102222000d010b200341011023000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41033a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1220004101742203200520052003491b22034100480d122000450d0120012802002000200310212200450d020c030b200128020021000c030b2003102222000d010b200341011023000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1020004101742203200520052003491b22034100480d102000450d0120012802002000200310212200450d020c030b200128020021000c030b2003102222000d010b200341011023000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41013a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d0e20064101742203200920092003491b22034100480d0e2006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041286a2903002108200041206a290300210a0240024002400240024020052802002206200428020022036b41104f0d00200341106a22072003490d0e20064101742203200720072003491b22034100480d0e2006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200620036a220320083700082003200a370000200041106a28020021032002200041186a280200220036020c2002410c6a2001103e2000450d0020004105742107200141046a210c0340024002400240024020052802002206200428020022006b41204f0d00200041206a22092000490d0e20064101742200200920092000491b22004100480d0e2006450d01200128020020062000102122060d020c060b200128020021060c020b200010222206450d040b20012006360200200c2000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000b0b200241106a24000f0b200041011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a0000200041026a2104200141046a2802002106200528020021030240024002400240024002400240024002400240024020002d00014101470d0020062003470d01200341016a22002003490d0b20034101742205200020002005491b22054100480d0b2003450d0320012802002003200510212200450d040c090b20062003470d01200341016a22002003490d0a20034101742205200020002005491b22054100480d0a2003450d0420012802002003200510212200450d050c060b200128020021000c080b200128020021000c050b2005102222000d050b200541011023000b2005102222000d010b200541011023000b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22002003490d0720034101742205200020002005491b22054100480d072003450d0120012802002003200510212200450d020c030b200128020021000c030b2005102222000d010b200541011023000b20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a20042d00003a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a0000024002400240200141046a2802002200200528020022036b41204f0d00200341206a22052003490d0320004101742203200520052003491b22034100480d032000450d0120012802002000200310212200450d020c040b200128020021000c040b2003102222000d020b200341011023000b1024000b20012000360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200020036a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a29000037000020012004290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a2802002100024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310212204450d020c040b200128020021040c040b2003102222040d020b200341011023000b1024000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000b9d8d0109057f037e027f027e017f017e077f027e047f230041d0096b22022400200241003a00f008200241f0086a200128020022032001280204220441004722051084041a02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d00f0082204410e4b0d07024020040e0f000b0709040c0e0a10060f03050d02000b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8b01200141046a200620046b3602002001200520046a3602002006450dd10120022d00f008450d110cd1010b2000410f360200200241d0096a24000f0b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b3602002001200520046a3602002006450d1220022d00f00822044101460d1120040d12200241f0086a200110b90120022802f008210420024190086a200241f0086a41047241dc001084041a2004410f460d12200241b0076a20024190086a41dc001084041a41e00010222201450d9e0120012004360200200141046a200241b0076a41dc001084041a2001410876210541012104420021070c1e0b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b3602002001200520046a3602002006450dcd0120022d00f008450d0d0ccd010b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b22033602002001200520046a22043602002006450d1a20022d00f00822054102460d1820054101460d1720050d1a200241f0086a2003412020034120491b22056a41004100412020056b2005411f4b1b1083041a200241f0086a200420051084041a200141046a200320056b3602002001200420056a3602002003411f4d0d1a20024190086a41186a200241f0086a41186a29030037030020024190086a41106a200241f0086a41106a29030037030020024190086a41086a200241f0086a41086a290300370300200220022903f008370390082002290097082208422088a721012002419f086a290000210720022d00af08210420022900a7082109200228009308210520022f009108210620022d00900821032008a7210a4101210b0c190b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b3602002001200520046a3602002006450d2120022d00f008220441044b0d21024020040e0500201e1f1d000b200241d8046a200110ba0120022903d804a7450d21200241e8046a290300210720022903e0042109200241f0086a200110bb0120022d00f00822044102460d212002418c096a2902002108200241fc086a290200210c20022f00f108210120022d00f308210520022902f408210d200220024184096a2902003703a0082002200c370398082002200d3703900820012005411074722101410121050c200b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b22033602002001200520046a22043602002006450d1120022d00f00822054101460d0f20050d11200241b0046a200110bc0120022802b004450d1120022802b4042105200241f0086a200110b90120022802f008210420024190086a200241f0086a41047241dc001084041a2004410f460d11200241b0076a20024190086a41dc001084041a41e00010222201450da10120012004360200200141046a200241b0076a41dc001084041a4101210441002103410021064100210e0c100b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b3602002001200520046a3602002000410f360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b3602002001200520046a3602002006450d1120022d00f00822044101460d0f20040d11200241f0086a200110bb0120022d00f00822044102460d1120022d00f308210520022f00f10821062002418c096a290200210f20024184096a2902002107200241fc086a290200210920022902f4082108200241c0006a200110ba012002290340a7450d1120062005411074722101200241c0006a41106a290300210c2002290348210d200f422088a72105200fa72106410121030c100b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b3602002001200520046a3602002006450d5d20022d00f008220441094b0d5d024020040e0a00322f302d353631382e000b200241f0086a200110bd0120022802f0082204450d5d20022902f408210720024190036a200110bc012007a72105200228029003450d5c2002280294032101200541087621032004410876210a200742208821074101210b0c320b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b22033602002001200520046a220a3602002006450d7920022d00f008220541064b0d7941022106024020050e0700c5012829272a2b000b200241106a200110bc012002280210450d7920022802142205417f4c0d8f012005450d63200510762204450da30120042001280200200141046a22032802002206200520062005491b22061084041a2003280200220a2006490da4012003200a20066b3602002001200128020020066a36020020062005470d640cc3010b200241003a00f008200241f0086a2005200641004722041084041a20062004490d890141042103200141046a200620046b220a3602002001200520046a22103602002006450db70120022d00f0082205410e4b0db701024020050e0f004d4e724a51544f584c56494b5248000b200241f0086a200110bb0120022d00f00822044102460db70120022d00f308210b20022f00f108211120024184096a290200210f200241fc086a290200210920022902f40821082002418c096a290200210720024198016a200110ba01200229039801a7450db70120024198016a41106a290300210d20022903a001210c200141046a22032802002105200241003a00f008200241f0086a2001280200220a200541004722061084041a20052006490db0012003200520066b3602002001200a20066a3602002005450db70120022d00f008220641024b0db7012011200b41107472210e20022009370398082002200837039008200220073703a8082002200f3703a008200f422088a72111200fa7210b410121030c710b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b22033602002001200520046a22043602002006450d7c20022d00f008220541044b0d7c024020050e0500221d1f1b000b200241003602f008200241f0086a20042003410420034104491b22051084041a200141046a220a200320056b22063602002001200420056a2204360200200341034d0d7c20022802f008210b200242003703f008200241f0086a20042006410820064108491b22051084041a200a200620056b22033602002001200420056a2204360200200641074d0d7c20022903f0082109200242003703f008200241f0086a20042003410820034108491b22051084041a200141046a220a200320056b22063602002001200420056a2204360200200341074d0d7c20022903f0082107200242003703f008200241f0086a20042006410820064108491b22051084041a200a200620056b22033602002001200420056a2204360200200641074d0d7c20022903f0082108200242003703f008200241f0086a20042003410820034108491b22051084041a200141046a220a200320056b22063602002001200420056a2204360200200341074d0d7c20022802f408210520022802f0082111200242003703f008200241f0086a20042006410820064108491b22031084041a200a200620036b220e3602002001200420036a2204360200200641074d0d7c20022802f408211220022802f0082113200242003703f008200241f0086a2004200e4108200e4108491b22061084041a200141046a220a200e20066b22033602002001200420066a2204360200200e41074d0d7c20022903f008210c200242003703f008200241f0086a20042003410820034108491b22061084041a200a200320066b220e3602002001200420066a2204360200200341074d0d7c20022903f008210d200242003703f008200241f0086a2004200e4108200e4108491b22061084041a200141046a220a200e20066b22033602002001200420066a2204360200200e41074d0d7c20022903f008210f200241003602f008200241f0086a20042003410420034104491b22061084041a200a200320066b220e3602002001200420066a2204360200200341034d0d7c20022802f0082106200241003602f008200241f0086a2004200e4104200e4104491b22031084041a200141046a200e20036b220a3602002001200420036a2204360200200e41034d0d7c20022802f0082110200241003a00f008200241f0086a2004200a41004722031084041a200a2003490db401200141046a200a20036b3602002001200420036a360200200a450d7c20022d00f00821012002200f3703e0062002200d3703d8062002200c3703d006200220123602cc06200220133602c80620114110762112201141807e712104410121140cbe010b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b22033602002001200520046a22053602002006450d5720022d00f0082206410b4b0d574109210e024020060e0c003d3e3b40413f45b8013c443a000b200241f0086a200110b90120022802f008210520024190086a200241f0086a41047241dc001084041a2005410f460d57200241b0076a20024190086a41dc001084041a41e00010222204450daa0120042005360200200441046a200241b0076a41dc001084041a200241c0026a200110ba0120022903c002a7450d56200241d0026a290300210920022903c8022207422088a721152007a721164101210e410021130c410b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b3602002001200520046a3602002006450dbe0120022d00f008450d030cbe010b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b22033602002001200520046a22043602002006450d2020022d00f008220541044b0d20024020050e0500201b1d19000b200241f0086a200110b90120022802f008210120024190086a200241f0086a41047241dc001084041a2001410f460d20200241b0076a20024190086a41dc001084041a41e00010222204450d990120042001360200200441046a200241b0076a41dc001084041a200228028407210a20022f018207210b20022d008107211120022d008007210520022903f806210920022903f006210820022903e8062107410121010cb9010b200241d0046a200110bc0120022802d004450dbf0120022802d4042204417f4c0d89012004450d34200410762206450d920120062001280200200141046a22032802002205200420052004491b22051084041a2003280200220a2005490d93012003200a20056b3602002001200128020020056a36020020052004470d350cbb010b2002200110572002290300a7450dbf012002290308210720004100360200200041086a2007370300200041106a200241f0086a41d0001084041a200241d0096a24000f0b200241c0046a2001105720022903c004a7450dba0120022903c80421072000410a360200200041086a2007370300200041106a200241f0086a41d0001084041a200241d0096a24000f0b200241f0086a200110bb014102210420022d00f00822014102470d0b0b2000410f360200200241d0096a24000f0b200241f0086a2003412020034120491b22056a41004100412020056b2005411f4b1b1083041a200241f0086a200420051084041a200141046a200320056b3602002001200420056a3602002003411f4d0d0120022d00f008210420022f00f108210520022800f3082106200229008709210720022d008f09210320022900f708210920024190086a410f6a200241f0086a410f6a2900003700002002200937009708200241b0076a41086a20024190086a41086a290300370300200220033a00af08200220073700a708200241b0076a41186a20024190086a41186a290300370300200241b0076a41106a20024190086a41106a2903003703002002200636009308200220053b009108200220043a00900820022002290390083703b007200241b8046a200110bc0120022802b804450d0120022802bc042106200141046a22032802002104200241003a00f008200241f0086a2001280200220a200441004722051084041a20042005490d92012003200420056b3602002001200a20056a3602002004450d0120022d00f008210e20024190076a2201200241bf076a29000037030020024198076a2204200241c7076a290000370300200241a0076a2205200241cf076a2d00003a0000200220022800b3073600ab07200220022802b0073602a807200220022900b7073703880720052d000021032004290300210720012903002109200228028c072111200228028807210120022800ab07210520022f00a907210a20022d00a807210b410221040b200041003b01262000200e3a00252000200a3b00062000200b3a0005200020043a000420004109360200200041286a2006360200200041246a20033a00002000411c6a2007370200200041146a2009370200200041106a20113602002000410c6a2001360200200041086a20053602002000412c6a20022902f008370200200041346a200241f0086a41086a2902003702002000413c6a200241f0086a41106a290200370200200041c4006a20024188096a290200370200200041cc006a20024190096a290200370200200041d4006a200241f0086a41286a290200370200200041dc006a200241a0096a280200360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b200241f0086a200110bb0120022d00f00822044102460d0120022d00f308210520022f00f10821062002418c096a290200211720024184096a2902002107200241fc086a290200210920022902f4082108200241f0006a200110ba012002290370a7450d01200241f0006a41106a290300210c2002290378210d200241d8006a200110ba012002290358a7450d0120062005411074722101200241e8006a29030021182002290360210f2017422088a721052017a72106410221030b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2018370200200041c0006a200f370200200041386a200c370200200041306a200d3702002000412c6a2005360000200041286a2006360000200041206a2007370000200041186a2009370000200041106a20083700002000410c6a20043a0000200041086a2003360200200041d0006a20022903f008370300200041d8006a200241f0086a41086a290300370300200241d0096a24000f0b2000410f360200200241d0096a24000f0b20024188016a20011057200229038801a7450d022002290390012207422088a721012007a7210a4102210b0c010b200241003a00f008200241f0086a2004200341004722051084041a20032005490d7f200141046a200320056b3602002001200420056a3602002003450d0120022d00f00821034103210b410021010b200020063b000a200020033a000920004104360200200041286a20043a0000200041206a2009370200200041186a2007370200200041146a2001360200200041106a200a3602002000410c6a2005360200200041086a200b3a0000200041306a20022903f008370300200041386a200241f0086a41086a290300370300200041c0006a200241f0086a41106a290300370300200041c8006a200241f0086a41186a290300370300200041d0006a200241f0086a41206a290300370300200041d8006a200241f0086a41286a290300370300200241d0096a24000f0b2000410f360200200241d0096a24000f0b20022f00f10820022d00f30841107472210520024184096a29020021092002418c096a2902002107200241fc086a290200210820022902f408210c0b200020043602042000410e360200200041246a20073702002000411c6a2009370200200041146a20083702002000410c6a200c3702002000412c6a20022902f008370200200041086a2005410874200141ff017172360200200041346a200241f0086a41086a2902003702002000413c6a20024180096a290200370200200041c4006a20024188096a290200370200200041cc006a20024190096a290200370200200041d4006a20024198096a290200370200200041dc006a200241a0096a280200360200200241d0096a24000f0b200241c8056a200110bc0120022802c805450d0420022802cc052204410876210141052105420021080c030b200241b8056a200110bc0120022802b805450d0320022802bc052104200241a0056a200110ba0120022903a005a7450d03200241b0056a290300210720022903a805210920024190056a20011057200229039005a7450d03200229039805210820024188056a200110bc01200228028805450d03200228028c052101200241a0086a20073703002002200937039808200220013602900820044108762101410321050c020b200241c0056a200110bc0120022802c005450d0220022802c4052204410876210141042105420021080c010b200241f0046a200110ba0120022903f004a7450d0120024180056a2903002107200220022903f804370390082002200737039808410221050b200241f0086a41106a220620024190086a41106a290300220c370300200241f0086a41086a220320024190086a41086a290300220d370300200241b0076a41086a220a200d370300200241b0076a41106a220b200c3703002002200229039008220c3703b0072002200c3703f008200041386a2007370200200041306a20093702002000410c6a2001410874200441ff017172360200200041086a20053602002000410c360200200041286a2008370200200041106a20022903b007370200200041186a200a290300370200200041206a200b290300370200200041c0006a20022903f008370300200041c8006a2003290300370300200041d0006a2006290300370300200041d8006a200241f0086a41186a290300370300200241d0096a24000f0b200241f0086a41106a20024190086a41106a290300370300200241f0086a41086a20024190086a41086a29030037030020022002290390083703f0082000410f360200200241d0096a24000f0b20024190086a2003412020034120491b22056a41004100412020056b2005411f4b1b1083041a20024190086a200420051084041a200141046a200320056b22063602002001200420056a22043602002003411f4d0d612002419f086a2900002107200229009708210920022d00af08211120022900a7082108200228009308210320022f009108210e20022d009008210a200241003a00f008200241f0086a2004200641004722051084041a20062005490d8201200141046a200620056b220b3602002001200420056a22053602002006450d614100210641002104024020022d00f0082210450d0020104101470d6220024190086a200b4120200b4120491b22046a41004100412020046b2004411f4b1b1083041a20024190086a200520041084041a200141046a200b20046b3602002001200520046a360200200b411f4d0d6220024190086a41016a2f0000210120024190086a41036a280000210420024190086a411f6a2d0000210520024190086a41176a290000210c20024190086a41076a290000210d20022d009008210b200241f0086a410f6a20024190086a410f6a290000370000200241f0086a41076a200d370000200241f0086a41176a200c370000200241f0086a411f6a20053a0000200241f0086a41036a2004360000200241f0086a41016a20013b000020024188076a41086a200241f7086a220141086a29000037030020024188076a41106a200141106a29000037030020024188076a41186a200141186a2d00003a00002002200b3a00f008200220043600ab07200220022800f0083602a807200220012900003703880741800221040b200241f7066a20024188076a41086a290300370000200241ff066a20024188076a41106a29030037000020024187076a20024188076a41186a2d00003a0000200220022800ab073600eb06200220022802a8073602e80620022002290388073700ef06200241c8066a41086a200241f6066a290100370300200241c8066a41106a200241fe066a290100370300200241c8066a41186a200241e8066a411e6a2f01003b0100200241c8066a411e6a200241f4086a2f01003b0100200220022901ee063703c806200220022801f0083601e20620022801ea06210520022f01e8062112410521140ca3010b200241a0046a2001105720022903a004a7450d0720022903a8042107410521010c040b200241f0086a200110bb0120022d00f00822054102460d5f20022d00f308210620022f00f10821032002418c096a290200210c20024184096a2902002108200241fc086a290200210720022902f408210920024180066a200110ba01200229038006a7450d5f20024180066a41106a290300210d200229038806210f200241f0056a2001105720022903f005a7450d5f20022903f8052118200241e8056a200110bc0120022802e805450d5f20022802ec052204417f4c0d702004450d5b20041076220b450d9301200b2001280200200141046a2211280200220a2004200a2004491b220a1084041a2011280200220e200a490d94012011200e200a6b36020020012001280200200a6a360200200a2004470d5c0ca0010b200241f0086a2003412020034120491b22056a41004100412020056b2005411f4b1b1083041a200241f0086a200420051084041a200141046a200320056b3602002001200420056a3602002003411f4d0d0520024190086a41186a2201200241f0086a41186a29000037030020024190086a41106a2204200241f0086a41106a29000037030020024190086a41086a2205200241f0086a41086a290000370300200220022900f00837039008200241b0076a41106a2004290300370300200241b0076a41086a2005290300370300200241b0076a41186a20012903003703002002200229039008220c3703b007200241bf076a290000210820022900b707210720022f00b107210620022800b307210420022900c707210920022d00cf072105200ca72103410321010c9e010b200241b0066a200110ba0120022903b006a7450d5d200241c0066a290300210c20022903b806210d200241a0066a2001105720022903a006a7450d5d20022903a806210f200241a8086a4200370300200241a0086a420037030020024198086a4200370300200242003703900820024190086a20012802002206200141046a22032802002204412020044120491b22051084041a2003200420056b3602002001200620056a3602002004411f4d0d3c2002419f086a2900002109200229009708210820022d00af08210420022900a7082107200228009308210520022f009108210620022d00900821034101210a0c3d0b20024190046a20011057200229039004a7450d032002290398042107410421010b0c9b010b200241d8056a2001105720022903d805a7450d5a20022903e0052107200241d0056a200110bc0120022802d005450d5a20022802d4052204417f4c0d6b2004450d43200410762203450d870120032001280200200141046a22062802002205200420052004491b22051084041a2006280200220a2005490d88012006200a20056b3602002001200128020020056a36020020052004470d440c99010b200241f0086a2003412020034120491b22056a41004100412020056b2005411f4b1b1083041a200241f0086a200420051084041a200141046a200320056b220a3602002001200420056a220b3602002003411f4d0d0020024190086a41186a200241f0086a41186a29000037030020024190086a41106a200241f0086a41106a29000037030020024190086a41086a200241f0086a41086a290000370300200220022900f008370390082002419f086a2900002108200229009708210720022d00af08210520022900a7082109200228009308210420022f009108210620022d0090082103200241003a00f008200241f0086a200b200a41004722111084041a200a2011490d7b200141046a200a20116b3602002001200b20116a360200200a450d0020022d00f0082111410221010c99010b2000410f360200200241d0096a24000f0b200241206a200110bc012002280220450d5220022802242205417f4c0d682005450d38200510762204450d7e20042001280200200141046a22032802002206200520062005491b22061084041a2003280200220a2006490d7f2003200a20066b3602002001200128020020066a36020020062005470d390c95010b200241186a200110bc012002280218450d51200228021c2205417f4c0d672005450d39200510762204450d7f20042001280200200141046a22032802002206200520062005491b22061084041a2003280200220a2006490d80012003200a20066b3602002001200128020020066a36020020062005470d3a0c93010b200242003703f008200241f0086a200a2003410820034108491b22041084041a41042106200141046a200320046b3602002001200a20046a360200200341074d0d5020022903f00821070c9b010b200241386a200110bc012002280238450d4f200228023c2215ad42187e2207422088a70d652007a72205417f4c0d652005450d3b2005102222040d3c200541041023000b200241f0086a200110be0120022802f0082204450d4e20022902f4082107410721060c99010b200241c0036a200110bc0120022802c003450d3020022802c4032204410876210a4105210b0c090b20024180046a20011057200229038004a7450d2f200229038804220942208821072009a722054108762103410a210b0c0a0b200241b0036a200110bc0120022802b003450d2e20022802b4032104200241f0086a200110bb0120022d00f00822054102460d2e20022d00f308210320022f00f108210a2002418c096a290200210920024184096a2902002108200241fc086a290200210d20022902f4082107200241a8036a200110bc0120022802a803450d2e20022802ac032106200241a0036a200110bc0120022802a003450d2e200a200341107472210320022802a403210b200220083703a0082004410876210a200220093703a8082009422088a7211120022007370390082007422088a721012002200d3703980820022902a4082109200229029c082108200bad210c200da7210e4200210d4103210b0c0b0b200241b8036a200110bc0120022802b803450d2d20022802bc032204410876210a4104210b0c060b200241f0086a200110bb0120022d00f00822044102460d2c20022902f408220942208821074108210b2009a72205410876210320022f00f10820022d00f30841107472210a200241fc086a290200220c422088a7210e20024184096a29020021082002418c096a2902002109200ca721010c020b200241f0086a200110bd0120022802f0082204450d2b20022902f408210720024198036a200110bc012007a72105200228029803450d2a200228029c032101200541087621032004410876210a200742208821074102210b0b0b0c060b200241f0086a200110bb0120022d00f00822044102460d2820022d00f308210520022f00f10821062002418c096a290200210920024184096a2902002108200241fc086a290200210f20022902f4082118200241d0036a200110ba0120022903d003a7450d28200241d0036a41106a290300210d20022903d803210c200241c8036a200110bc0120022802c803450d282006200541107472210a20022802cc032111201842208821072018a722054108762103200f422088a7210e200fa721014106210b0c050b200241e8036a200110bc0120022802e803450d2720022802ec032204410876210a4107210b0b42002107410021030c020b200241f0036a2001105720022903f003a7450d2520022903f803220942208821072009a7220541087621034109210b0b0b0b20004107360200200041c0006a200d370200200041386a200c370200200041346a2006360200200041306a2011360200200041286a2009370200200041206a20083702002000411c6a200e360200200041186a2001360200200041086a200b360200200041c8006a20022903f0083703002000410c6a200a410874200441ff017172360200200041d0006a200241f0086a41086a290300370300200041d8006a200241f0086a41106a290300370300200041106a20074220862003ad42ffffff07834208862005ad42ff01838484370200200241d0096a24000f0b4101210641002004460d86010b2004450d8901200610200c89010b410c210e0c080b200241e8026a200110bc0120022802e802450d1c20022802ec022104200141046a22032802002105200241003a00900820024190086a2001280200220a200541004722061084041a20052006490d6b2003200520066b3602002001200a20066a3602002005450d1c20022d009008210a20022903f0082208422088a72115200241f8086a2903002109200228028c09211320022f018a09210b20022d008909211120022d008809211020022903800921072008a721164104210e0c7c0b200241f0086a2003412020034120491b22046a41004100412020046b2004411f4b1b1083041a200241f0086a200520041084041a200141046a200320046b3602002001200520046a3602002003411f4d0d1b20024190086a41186a200241f0086a41186a29000037030020024190086a41106a200241f0086a41106a29000037030020024190086a41086a200241f0086a41086a290000370300200220022900f008370390082002290097082208422088a721152002419f086a290000210920022d00af08211020022900a7082107200228009308210420022f009108211220022d009008210a2008a72116410a210e0c7b0b200241d8026a200110bc0120022802d802450d1a4102210e420021094100211520022802dc0221040c040b200241e0026a200110bc0120022802e002450d1920022802e4022104200141046a22032802002105200241003a00f008200241f0086a2001280200220a200541004722061084041a20052006490d692003200520066b3602002001200a20066a3602002005450d1920022d00f008210a4103210e42002109410021150c790b20024180036a20011057200229038003a7450d182002290388032107200241f8026a200110bc0120022802f802450d1820022802fc0221042007422088a721152007a721164107210e0c020b200241f0086a200110b90120022802f008210520024190086a200241f0086a41047241dc001084041a2005410f460d17200241b0076a20024190086a41dc001084041a41e00010222204450d6b20042005360200200441046a200241b0076a41dc001084041a200141046a220a2802002105200241003a00f008200241f0086a2001280200220b200541004722061084041a20052006490d6c200a200520066b22033602002001200b20066a22063602002005450d1620022d00f008220a41034f0d16200242003703f008200241f0086a20062003410820034108491b22051084041a200141046a200320056b3602002001200620056a360200200341074d0d1620022903f0082207422088a721152007a721164105210e0c770b200241f0026a200110bc0120022802f002450d164106210e420021094100211520022802f4022104410021160b0b0c740b200241f0086a2003412020034120491b22046a41004100412020046b2004411f4b1b1083041a200241f0086a200520041084041a200141046a200320046b22063602002001200520046a22043602002003411f4d0d1320024190086a41186a200241f0086a41186a29000037030020024190086a41106a200241f0086a41106a29000037030020024190086a41086a200241f0086a41086a290000370300200220022900f00837039008200229009708210720022d009008210a20022f009108210b200228009308210520022d00af08210320022900a7082109200241b0076a410f6a20024190086a410f6a290000220837000020024188076a41086a200837030020024188076a41106a200937030020024188076a41186a20033a0000200220053600b3072002200b3b00b1072002200a3a00b007200220073700b707200220033a00cf07200220093700c707200220053600ab072002200737038807200220022802b0073602a807200241003a00f008200241f0086a2004200641004722051084041a20062005490d69200141046a200620056b3602002001200420056a3602002006450d1320022d00f00821112002290388072208422088a7211520024190076a290300210920022d00a0072110200229039807210720022800ab07210420022f00a907211220022d00a807210a2008a72116410b210e0c730b200241f0086a2003412020034120491b22046a41004100412020046b2004411f4b1b1083041a200241f0086a200520041084041a200141046a200320046b3602002001200520046a3602002003411f4d0d1220024190086a41186a200241f0086a41186a29000037030020024190086a41106a200241f0086a41106a2900003703004108210e20024190086a41086a200241f0086a41086a290000370300200220022900f008370390082002290097082208422088a721152002419f086a290000210920022d00af08211020022900a7082107200228009308210420022f009108211220022d009008210a2008a721160c720b200241b8026a200110bc0120022802b802450d6f20022802bc022219ad2207421b88a70d462007420586a72205417f4c0d462005450d202005102222040d21200541011023000b200241a8026a200110bc0120022802a802450d6e20022802ac022204410876210e410c21030c090b200241f8016a200110bc0120022802f801450d6d20022802fc01210b200241e0016a200110ba0120022903e001a7450d6d200241f0016a290300210920022903e8012108410521034100210e0c260b200241003a00f008200241f0086a2010200a41004722041084041a200a2004490d55200141046a200a20046b3602002001201020046a360200200a450d6c20022d00f0082106410d21030c040b20024188026a20011057200229038802a7450d6b2002290390022108410a21030c0a0b200241b0016a200110ba0120022903b001a7450d6a200241c0016a290300210920022903b801210820024199076a290000210d200229009107210c200229008907210741022103410021114100210e0c220b200241c8016a200110ba0120022903c801a7450d69200241d8016a290300210920022903d0012108200241c8076a290300210d20022903c007210c20022903b807210720022802b407211120022802b007210b410321034100210e0c220b200241003a00f008200241f0086a2010200a41004722041084041a200a2004490d52200141046a200a20046b3602002001201020046a360200200a450d6820022d00f008220641034f0d68410821030b420021094100210e0c210b20024180026a200110bc01200228028002450d662002280284022212ad42247e2207422088a70d3d2007a72205417f4c0d3d2005450d192005102222040d1a200541041023000b200241b0026a200110bc0120022802b002450d6520022802b4022204410876210e410e21030b420021090c010b410721030b0c190b20024198026a20011057200229039802a7450d6120022903a0022108410b21030b4100210e0c160b200241f0086a200110bb0120022d00f00822044102460d5f20022f00f10820022d00f30841107472210e20024184096a290200220c422088a721112002418c096a2902002107200241fc086a290200210920022902f4082108200ca7210b4200210c410921034200210d0c180b2004109201200410200b2000410f360200200241d0096a24000f0b2005450d00200410200b2000410f360200200241d0096a24000f0b4100210a0b200241bf076a2009370000200220083700b707200220043a00cf07200220053600b307200220063b00b107200220033a00b007200220073700c707200a450d1f200241b8076a290300210920022802cc07210b20022903c007211820022903b007210820024198066a200110bc01200228029806450d1f200228029c062204417f4c0d302004450d1d200410762205450d5520052001280200200141046a22032802002206200420062004491b22061084041a2003280200220a2006490d562003200a20066b3602002001200128020020066a36020020062004470d1e0c5a0b4101210441002005460d5c0b20050d170c180b4101210441002005460d590b20050d150c160b4101210441002005460d5f0b20050d130c140b410421040b024002402015450d004200210741002111410021054100210a201521120340200241306a200110bc012002280230450d1320022802342203417f4c0d2b024002402003450d0020031076220e450d38200e2001280200200141046a220b2802002206200320062003491b22061084041a200b28020022102006490d39200b201020066b3602002001200128020020066a36020020062003460d010c140b4101210e41002003470d130b200241286a200110bc012002280228450d12200228022c2206417f4c0d2b024002402006450d00200610762210450d3420102001280200200141046a2213280200220b2006200b2006491b220b1084041a20132802002216200b490d3520132016200b6b36020020012001280200200b6a360200200b2006460d010c130b4101211041002006470d120b200a41016a210b0240200a2012470d002011200b200b2011491b2212ad42187e2209422088a70d2d2009a722134100480d2d0240200a450d00200420052013102122040d010c320b201310222204450d310b200420056a220a200e360200200a41146a2006360200200a41106a2006360200200a410c6a2010360200200a41046a2003ad220942208620098437020020074280808080107c2107201141026a2111200541186a2105200b210a200b2015490d000c020b0b41002112420021070b2004450d1220072012ad842107410621060c5d0b4101210341002004460d550b2004450d15200310200c150b410121040b024002402019450d00200241f0086a41186a210e200241f0086a41106a2110200241f0086a41086a2112200141046a211120024190086a410f6a211a20024190086a41176a211b420021074100210b4100210a410021032019211c0340200e42003703002010420037030020124200370300200242003703f008200241f0086a2001280200221320112802002205412020054120491b22061084041a2011200520066b3602002001201320066a3602002005411f4d0d0b200341016a210620024190086a41186a200e29030037030020024190086a41106a201029030037030020024190086a41086a2012290300370300200220022903f00837039008201a290000210920024190086a411f6a2d00002113201b2900002108200229009708210c200228009308211520022f009108211620022d009008211402402003201c470d00200b20062006200b491b221cad420586220d422088a70d29200da722054100480d2902402003450d002004200a2005102122040d010c2c0b200510222204450d2b0b2004200a6a220520143a00002005410f6a2009370000200541076a200c3700002005411f6a20133a0000200541176a2008370000200541036a2015360000200541016a20163b000020074280808080107c2107200b41026a210b200a41206a210a2006210320062019490d000c020b0b4100211c420021070b2004450d4d2007201cad8421082004410876210e410f21030c020b410421040b024002402012450d0042002107200241f0086a411c6a2113200241f0086a41146a2115200241f0086a410c6a21164100210a4100210341002105201221100340200241f0086a200110bb0120022d00f008220b4102460d0a200541016a210620022d00f308211120022f00f108210e20132902002109201529020021082016290200210c20022902f408210d024020052010470d00200a20062006200a491b2210ad42247e220f422088a70d27200fa722144100480d2702402005450d00200420032014102122040d010c2b0b201410222204450d2a0b200420036a2205200b3a0000200541036a200e201141107472220b4110763a0000200541016a200b3b00002005411c6a2009370000200541146a20083700002005410c6a200c370000200541046a200d37000020074280808080107c2107200a41026a210a200341246a21032006210520062012490d000c020b0b41002110420021070b2004450d4b20072010ad8421082004410876210e410621030b0b0b0b0b0b200020063a000920004105360200200041386a200d370000200041306a200c370000200041186a2009370000200041106a2008370000200041286a2007370000200041246a2011360000200041206a200b360000200041086a20033a0000200041c0006a20022903f0083703002000410c6a200e410874200441ff017172360000200041c8006a200241f0086a41086a290300370300200041d0006a200241f0086a41106a290300370300200041d8006a200241f0086a41186a290300370300200241d0096a24000f0b201c450d440c430b20100d420c430b2006450d00201010200b2003450d00200e10200b0240200a450d002004210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141186a2101200541686a22050d000b0b2012450d010b200410200b2000410f360200200241d0096a24000f0b4101210b41002004460d440b2004450d02200b10200c020b4101210541002004460d3c0b2004450d00200510200b20024190086a41186a200241c8066a41186a29030037030020024190086a41106a200241c8066a41106a29030037030020024190086a41086a200241c8066a41086a290300370300200220022903c806370390082000410f360200200241d0096a24000f0b20052004102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b1031000b1024000b20052003102d000b200541011023000b201441041023000b201341041023000b41e00041081023000b200641011023000b200b2016102d000b200441011023000b2005200a102d000b200341011023000b20062010102d000b41e00041081023000b20052004102d000b41e00041081023000b20052006102d000b2011200a102d000b2004200a102d000b2004200a102d000b200541011023000b2006200a102d000b200541011023000b2006200a102d000b200541011023000b2006200a102d000b20062005102d000b20062005102d000b200441011023000b2005200a102d000b41e00041081023000b41e00041081023000b20062005102d000b20052006102d000b20062005102d000b200441011023000b200a200e102d000b200441011023000b2006200a102d000b2003200a102d000b200410200b2000410f360200200241d0096a24000f0b200241c8066a41106a200c37030020022007421888a73b018a0920022007421088a73a00890920022007420888a73a008809200220183703800920022009423888a73a00ff082002200d3703d0062002200842388820094208868422093700f70820022008421888a722033600f3082002200f3703e00620022008a7220a3b01f0082002200a4110763a00f20820022004ad22074220862007843703c8062002200b36028c09200b4118762111200a4180feff0771410876210e200229008709210820022900ff082107410421144100210441002106410021100c060b2000200b3b012a200020113a0029200020123b000a2000200a3a0009200041063602002000412c6a2013360200200041286a20103a0000200041206a2007370200200041186a2009370200200041146a2015360200200041106a20163602002000410c6a2004360200200041086a200e3a0000200041306a20022903f008370300200041386a200241f0086a41086a290300370300200041c0006a200241f0086a41106a290300370300200041c8006a200241f0086a41186a290300370300200041d0006a200241f0086a41206a290300370300200041d8006a200241f0086a41286a290300370300200241d0096a24000f0b2005ad22074220862007842107410321060c080b2005ad22074220862007842107410521060c070b200241c8066a41186a200241f0086a41186a290300370300200241c8066a41106a200241f0086a41106a290300370300200241c8066a41086a200241f0086a41086a290300370300200220022903f0083703c8062004ad22094220862009842109410221144100211241002104410021060c020b2000200b3b012a200020113a0029200020063b000a200020033a0009200041083602002000412c6a200a360200200041286a20053a0000200041206a2009370200200041186a2008370200200041146a20074220883e0200200041106a20073e02002000410c6a2004360200200041086a20013a0000200041306a20022903f008370300200041386a200241f0086a41086a290300370300200041c0006a200241f0086a41106a290300370300200041c8006a200241f0086a41186a290300370300200041d0006a200241f0086a41206a290300370300200041d8006a200241f0086a41286a290300370300200241d0096a24000f0b200241e0066a200d3703002002200f3703d8062002200b3602c80620022004ad220d422086200d843702cc06200ca722114110762112201141807e712104200320064110747241087420057221032018422088a72106200c422088a721052018a7210b410321140b20024190086a41186a200241c8066a41186a290300220c37030020024190086a41106a200241c8066a41106a290300220d37030020024190086a41086a200241c8066a41086a290300220f370300200241f0086a41086a2213200f370300200241f0086a41106a2215200d370300200241f0086a41186a2216200c370300200220022903c806220c3703f0082002200c370390082000412c6a2005360000200041286a201241107420044180fe037172201141ff017172360000200041206a2008370000200041186a2007370000200041106a20093700002000410c6a20033600002000200e3b000a2000200a3a0009200041086a20143a00002000410d360200200041306a20022903f008370000200041386a2013290300370000200041c0006a2015290300370000200041c8006a2016290300370000200041dc006a20013a0000200041d8006a2010360000200041d0006a2006ad422086200bad84370000200241d0096a24000f0b2006450d03200020063602042000410b360200200041086a2004ad2207422086200784370200200041106a200241f0086a41d0001084041a200241d0096a24000f0b2000410f360200200241d0096a24000f0b2005ad22074220862007842107410121060b20004101360200200041106a20073702002000410c6a2004360200200041086a2006360200200041186a200241f0086a41c8001084041a200241d0096a24000f0b2000410f360200200241d0096a24000f0b2000410f360200200241d0096a24000bd00605057f017e017f027e037f230041306b22022400200241003a0018200241186a200128020022032001280204220441004722051084041a0240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d000240024020022d0018220341037122044102460d00024020044101460d0020040d022003410276ad21070c080b200241003a0018200241186a2005200641004722041084041a20062004490d06200141046a200620046b3602002001200520046a3602002006450d0220022d001841087420037241fcff0371410276ad21070c070b200241003a002e200241003b012c2002412c6a200520064103200641034922081b22041084041a200141046a200620046b3602002001200520046a36020020080d0120022f012c20022d002e41107472410874200372410276ad21070c060b0240024020034102762204410c460d00024020044104460d0020040d0220024100360218200241186a200520064104200641044922031b22041084041a200141046a200620046b3602002001200520046a36020020030d03200235021821070c080b4200210a20024200370318200241186a200520064108200641084922031b22041084041a200141046a200620046b3602002001200520046a36020020030d03200229031821070c070b4200210a2002420037032020024200370318200241186a200520064110200641104922031b22041084041a200141046a200620046b3602002001200520046a36020020030d02200241206a2903002109200229031821074201210a0c070b200441046a220b41104b0d00200141046a210c200241106a210d4200210742002109410021030340200241003a0018200241186a2005200641004722041084041a20062004490d04200c200620046b22083602002001200520046a22053602002006450d01200241086a20023100184200200341037441f80071108904200d2903002009842109200229030820078421074201210a20082106200341016a22042103200441ff0171200b490d000c070b0b4200210a0b0c040b20052004102d000b20042006102d000b20042006102d000b420021094201210a0b200020073703082000200a370300200041106a2009370300200241306a24000b870801067f230041f0006b22022400200241003a0050200241d0006a200128020022032001280204220441004722051084041a02400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d0020022d0050220441ef014b0d010c030b200041023a0000200241f0006a24000f0b02400240024002400240200441847e6a220441034b0d00024002400240024020040e0400010203000b200241003b0150200241d0006a20052006410220064102491b22041084041a200141046a200620046b3602002001200520046a360200200641014d0d0420022f0150220441ef014b0d09200041023a0000200241f0006a24000f0b20024100360250200241d0006a20052006410420064104491b22041084041a200141046a200620046b3602002001200520046a360200200641034d0d04410121012002280250220441ffff034b0d09200041023a0000200241f0006a24000f0b200041023a0000200141046a20062006410420064104491b22006b3602002001200520006a360200200241f0006a24000f0b41002103200241d0006a2006412020064120491b22046a41004100412020046b2004411f4b1b1083041a200241d0006a200520041084041a200141046a200620046b3602002001200520046a3602002006411f4d0d032002412c6a41026a200241d0006a41026a2d00003a0000200241186a200241df006a290000370300200241206a200241e7006a290000370300200241286a200241d0006a411f6a2d00003a0000200220022f00503b012c2002200229005737031020022800532104410121030c040b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b0b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2205200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c2002200229031037033002402003450d002002410c6a41026a20012d00003a0000200241d0006a41086a2005290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010c030b200041023a0000200241f0006a24000f0b20052004102d000b410121010b200020022f010c3b0001200020013a0000200041046a2004360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a280200360200200241f0006a24000bca0301077f230041106b22022400200241003a0003200241036a200128020022032001280204220441004722051084041a0240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d000240024020022d0003220341037122044102460d00024020044101460d0020040d0220034102762101410121040c050b200241003a000b2002410b6a2005200641004722041084041a20062004490d06200141046a200620046b3602002001200520046a3602002006450d0220022d000b4108742003724102762101410121040c040b41002104200241003a000e200241003b010c2002410c6a200520064103200641034922071b22081084041a200141046a200620086b3602002001200520086a36020020070d0320022f010c20022d000e411074724108742003724102762101410121040c030b200341034b0d004100210420024100360204200241046a200520064104200641044922081b22031084041a200141046a200620036b3602002001200520036a36020020080d0120022802042101410121040c020b410021040b0b2000200136020420002004360200200241106a24000f0b20052004102d000b20042006102d000b8303010a7f230041106b220224002002200110bc010240024002400240024002400240024002402002280200450d0020022802042203417f4c0d072003450d01200310222204450d08200141046a2105410021064100210720032108034020052802002109200241003a000f2002410f6a2001280200220a2009410047220b1084041a2009200b490d0520052009200b6b3602002001200a200b6a3602002009450d04200741016a210920022d000f210b024020072008470d002006200920092006491b22084100480d0702402007450d00200420072008102122040d010c090b200810222204450d080b200420076a200b3a0000200641026a21062009210720092003490d000c030b0b20004100360200200241106a24000f0b4101210441002109410021080b2000200836020420002004360200200041086a2009360200200241106a24000f0b2000410036020002402008450d00200410200b200241106a24000f0b200b2009102d000b1024000b200841011023000b1031000b200341011023000bdb0403027f017e0a7f230041106b22022400200241086a200110bc010240024002400240024002400240024002402002280208450d00200228020c2203ad420c7e2204422088a70d082004a72205417f4c0d082005450d01200510222206450d032003450d020c040b20004100360200200241106a24000f0b4104210620030d020b4100210d4100210a0c020b200541041023000b4100210741002108410021092003210a03402002200110bc0102400240024002402002280200450d0020022802042205417f4c0d08024002402005450d0020051076220b450d03200b2001280200200141046a220c280200220d2005200d2005491b220d1084041a200c280200220e200d490d04200c200e200d6b36020020012001280200200d6a360200200d2005470d010c050b4101210b41002005460d040b2005450d00200b10200b2000410036020002402009450d002006210503400240200541046a280200450d00200528020010200b2005410c6a2105200841746a22080d000b0b0240200a450d00200610200b200241106a24000f0b200541011023000b200d200e102d000b200941016a210d02402009200a470d002007200d200d2007491b220aad420c7e2204422088a70d032004a7220c4100480d0302402009450d0020062008200c102122060d010c050b200c10222206450d040b200620086a2209200b360200200941046a2005ad2204422086200484370200200741026a21072008410c6a2108200d2109200d2003490d000b0b2000200a36020420002006360200200041086a200d360200200241106a24000f0b1024000b200c41041023000b1031000bb00b03057f047e017f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012d00002203450d0020034101470d02200041003a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a29000037000020030d014101450d0f0c0e0b2002412b6a2001410c6a280000360000200041013a00002002200141046a29000037002320002002290020370001200041086a200241276a2900003700002003450d020b20034101460d0d20030d05200141086a280200450d0d200141046a2802001020200241c0006a24000f0b20034104470d0720022001410c6a28020022043602142002200141046a2802002205360210200241003a0020200241206a2005200441004722061084041a20042006490d052002200420066b22033602142002200520066a22063602102004450d0720022d002022044102460d0220044101460d0120040d07200241003a0020200241206a2006200341004722041084041a20032004490d082002200320046b22053602142002200620046a22063602102003450d0620022d00200d0641002103200241206a2005412020054120491b22046a41004100412020046b2004411f4b1b1083041a200241206a200620041084041a2002200520046b3602142002200620046a3602102005411f4d0d062002411c6a41026a2206200241206a41026a22052d00003a0000200220022f00203b011c20022800232104200229002f210720022900372108200231003f21092002290027210a200520062d000022063a00002002410c6a41026a20063a0000200220022f011c22063b010c200220063b0120200a422088a72106200aa721050c030b41000d0a0c0b0b200241003a0020200241206a2006200341004722041084041a20032004490d072002200320046b3602142002200620046a3602102003450d0520022d00200d05200241206a200241106a10c00120022802202204450d05200229022421072002410c6a41026a200241206a41026a2d00003a0000200220022f00203b010c2007422088a721062007a72105410121030c010b200241003a0020200241206a2006200341004722051084041a20032005490d072002200320056b22043602142002200620056a22063602102003450d040240024020022d002022034101460d0020030d0620024200370320200241206a20062004410820044108491b22031084041a2002200420036b3602142002200620036a360210200441074d0d0620022903202108200241206a200241106a10c10120022802202206450d0620022902242107410021050c010b20024200370320200241206a20062004410820044108491b22051084041a2002200420056b22033602142002200620056a2206360210200441074d0d052002290320210820024200370320200241206a20062003410820034108491b22041084041a2002200320046b3602142002200620046a360210200341074d0d0520022903202109200241206a200241106a10c10120022802202206450d0520022902242107410121050b410221032002410c6a41026a200241206a41026a2d00003a0000200220022f00203b010c0b200241206a41026a220b2002410c6a41026a2d00003a0000200220022f010c3b0120200020033a0000200041206a2009370000200041186a2008370000200041106a2007370000200041086a2006ad4220862005ad84370000200041046a2004360000200020022f01203b0001200041036a200b2d00003a00000b200141086a280200450d07200141046a28020010200c070b20062004102d000b200241206a41026a2002411c6a41026a2d00003a0000200220022f001c3b01200b41d0a3c000411e1039000b20042003102d000b20042003102d000b20052003102d000b200141086a280200450d00200141046a2802001020200241c0006a24000f0b200241c0006a24000bd80403027f017e0e7f230041d0006b22022400200241086a200110bc0102400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210e0c030b1031000b200541011023000b200241306a41186a2107200241306a41106a2108200241306a41086a2109200141046a210a4100210b4100210c4100210d2003210e034020074200370300200842003703002009420037030020024200370330200241306a2001280200220f200a2802002205412020054120491b22101084041a200a200520106b3602002001200f20106a3602002005411f4d0d02200d41016a2105200241106a41186a22102007290300370300200241106a41106a220f2008290300370300200241106a41086a22112009290300370300200220022903303703100240200d200e470d00200b20052005200b491b220ead4205862204422088a70d042004a722124100480d040240200d450d002006200c2012102122060d010c060b201210222206450d050b2006200c6a220d2002290310370000200d41186a2010290300370000200d41106a200f290300370000200d41086a2011290300370000200b41026a210b200c41206a210c2005210d20052003490d000b0b2000200e36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200e450d00200610200b200241d0006a24000f0b1024000b201241011023000bd10504027f017e0f7f017e230041d0006b22022400200241086a200110bc010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b410021114100210e0c030b1031000b200541081023000b200241306a41186a2107200241306a41106a2108200241306a41086a2109200141046a210a4100210b4100210c4100210d2003210e0240034020074200370300200842003703002009420037030020024200370330200241306a2001280200220f200a28020022054120200541204922101b22111084041a200a200520116b22053602002001200f20116a221136020020100d01200241106a41186a22102007290300370300200241106a41106a22122008290300370300200241106a41086a221320092903003703002002200229033037031020024200370330200241306a20112005410820054108491b220f1084041a200a2005200f6b36020020012011200f6a360200200541074d0d01200d41016a211120022903302104200720102903003703002008201229030037030020092013290300370300200220022903103703300240200d200e470d00200b20112011200b491b220ead42287e2214422088a70d042014a722054100480d040240200d450d002006200c2005102122060d010c060b200510222206450d050b2006200c6a22052002290330370300200541186a2007290300370300200541106a2008290300370300200541086a2009290300370300200541206a2004370300200b41026a210b200c41286a210c2011210d20112003490d000c020b0b200041003602000240200e450d00200610200b200241d0006a24000f0b2000200e36020420002006360200200041086a2011360200200241d0006a24000f0b1024000b200541081023000b0a0041f0a2c000102f000b3802017f017e230041106b220324002003200210c401200329030021042000200341086a29030037030820002004370300200341106a24000b9a0304027f017e027f017e230041c0006b2202240002400240411410222203450d00200341106a41002800a5ef40360000200341086a410029009def4037000020034100290095ef4037000020034114413410212203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034134200241206a1000200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041c8d7c400410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a2903002107200229032021040c010b420021070b200310202000200737030820002004370300200241c0006a24000f0b419a88c00041331039000b411441011023000b413441011023000bfb0101057f230041c0006b22052400024002402003450d002003280208210620032802002103200541206a41186a22074200370300200541206a41106a22084200370300200541206a41086a220942003703002005420037032020044120200541206a1000200541186a2007290300370300200541106a2008290300370300200541086a200929030037030020052005290320370300200541003602202003200620054120200541206a100a210420052802202203417f460d012000200336020420002004360200200041086a2003360200200541c0006a24000f0b20004100360200200541c0006a24000f0b20004100360200200541c0006a24000b8c0201027f23004180016b220324002003200210c701024020032d000022024102470d00200041003a000020034180016a24000f0b200341e0006a200341386a290300370300200341e8006a200341c0006a290300370300200341f0006a200341c8006a290300370300200341f8006a200341d0006a2802003602002003200341306a29030037035802402002450d00200041003a000020034180016a24000f0b2003412c6a2802002102200341286a28020021042000200329025c370001200041013a0000200041196a200341f4006a290200370000200041116a200341ec006a290200370000200041096a200341e4006a29020037000002402002450d00200410200b20034180016a24000bed0c04077f047e027f047e230041f0006b220224000240024002400240411710222203450d002003410f6a41002900cfe342370000200341086a41002900c8e342370000200341002900c0e34237000020034117413710212203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241386a41186a22014200370300200241386a41106a22044200370300200241386a41086a220542003703002002420037033820034137200241386a1000200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033837030802400240024002400240024002400240200241086a412041c8d7c400410041001001417f460d002002422037022c2002200241086a360228200241003a0038200241086a4120200241386a410141001001210120022002280230200141016a41014b22016a22043602302001450d0720022d003822014101460d0120010d072002200241286a108e012002280200450d0720022802042201417f4c0d0a2001450d02200110762206450d0b200241306a22072001410020022802282204200228022c2205200620012007280200100122082008417f461b2208200820014b1b220820072802006a220736020020082001460d030c060b200041023a00000c040b42002109200241d0006a4200370300200241c8006a4200370300200241386a41086a42003703002002420037033841002105200241286a41086a22064100200241086a4120200241386a41202004100122012001417f461b2201412020014120491b20062802006a360200024002402001411f4d0d002002200228003b36006b20022002280238360268200241cf006a290000210a2002290047210b200229003f210c200231005721092002200228006b36006320022002280268360260410121050c010b0b2002200228006336003b200220022802603602382005450d052002200228003b36005b200220022802383602582002200228005b36006b2002200228025836026820022002413b6a28000036006320022002280038360260410121010c020b4101210620022802282204200228022c220541014100200241306a280200220710011a41002001470d030b20024200370338200241286a41086a220d410020042005200241386a41082007100122082008417f461b2208410820084108491b20076a2207360200200841074d0d022002290338210c200241d0006a4200370300200241c8006a4200370300200241386a41086a420037030020024200370338200d410020042005200241386a41202007100122082008417f461b2208412020084120491b20076a220e360200024002402008411f4d0d002002200228003b36006b20022002280238360268200241cf006a290000210f20022900472110200229003f211120022d005721072002200228006b36006320022002280268360260410121080c010b410021080b2002200228006336003b200220022802603602382008450d022002200228003b36005b200220022802383602582002420037034020024200370338200241286a41086a220d410020042005200241386a4110200e100122082008417f461b2208411020084110491b200e6a220e3602002008410f4d0d02200241386a41086a290300210a2002290338210b20024200370338200d410020042005200241386a4108200e100122042004417f461b2204410820044108491b200e6a360200200441074d0d022001ad22094220862009842112200229033821092002200228005b3600632002200228025836026020022002413b6a28000036006b20022002280038360268410021010b2002200228006b36003b20022002280268360238200220022802603602582002200228006336005b200041186a200a370000200041106a200b370000200041cb006a200f370000200041c3006a2010370000200020013a00002000412c6a2012370000200041286a2006360000200041206a2009370000200041086a200c370000200041d3006a20073a00002000413b6a201137000020002002280238360001200041046a200228003b360000200041346a2002280258360000200041376a200228005b3600000b20031020200241f0006a24000f0b2001450d00200610200b419a88c00041331039000b411741011023000b413741011023000b1031000b200141011023000baf0201047f230041c0006b2202240002400240411710222203450d002003410f6a41002900cfe342370000200341086a41002900c8e342370000200341002900c0e34237000020034117413710212203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002412041c8d7c400410041001001210120031020200241c0006a24002001417f470f0b411741011023000b413741011023000b870102017f037e230041e0006b22032400200341086a200210c7010240024020032d000822024102470d00420021040c010b2002410173ad2104200341206a2903002105200341186a290300210620020d00200341346a280200450d00200341306a28020010200b2000200637030820002004370300200041106a2005370300200341e0006a24000bf4220a067f017e187f067e067f027e027f027e047f017e230041d0046b22022400200241286a4200370300200242003703202002420037031820012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b200241206a2107200241306a411c6a20042f0106360200200241306a41186a4100360200200241306a41146a2004360200200220033602502002410036024020024200370338200220013602342002410036023020024198016a200241306a103302400240024020022903b80122084202520d00200241306a10540c010b200241cc016a210920024198016a412c6a210a20024198016a410472210b200241f5016a210c20024198016a41086a2103200241f8026a412c6a210d200241c8016a210e20024198016a41286a210f200241e0016a211020024198016a41c0006a2111200241d0016a211220024198016a41d0006a2113200241f0016a2114200241f4016a211520024198016a411c6a211620024198016a41146a2117200241c8036a41206a2218410f41e8e2c2006b41f0e2c2006a200241c8036a6b6a2119200241f8026a41246a211a200241e4016a211b200241ec016a211c0340200241f8006a41186a220420024198016a41186a221d290300370300200241f8006a41106a220120024198016a41106a221e290300370300200241f8006a41086a22052003290300370300200241d8006a41086a2206200c41086a290000370300200241d8006a41106a221f200c41106a290000370300200241d8006a41186a2220200c41186a29000037030020022002290398013703782002200c290000370358200e2903002121200f2903002122201029030021232011290300212420122903002125201329030021262014280200212720152d0000212820024198026a41186a2229200429030037030020024198026a41106a222a200129030037030020024198026a41086a220120052903003703002002200229037837039802200241b8026a41186a22042020290300370300200241b8026a41106a2205201f290300370300200241b8026a41086a221f2006290300370300200220022903583703b80202400240024002400240024020084201520d0020024198016a20024198026a2022202110cb01201d2d0000210620022002290318200241186a41086a2220290300200241186a41106a222b2903002002290398012003290300201e29030010cc01202b200241106a290300370300202020022903083703002002200229030037031820060d010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020270d0020254201510d00202841ff01714101460d002026a721042026422088a72201450d01410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c030b0b20024198016a20024198026a10c70120022d00980122064103714102460d0220064101470d0320060d13200a280200450d13200f28020010202026a721042026422088a722010d140c150b200421010b20024198016a41206a4100360200201620042f0106360200201d410036020020172004360200201e4100360200200342003703002002200136029c01200241003602980120024198016a10420c150b2006450d014100212b202841ff01710d030c100b200241d8026a41086a2206200941086a290200370300200241d8026a41106a2220200941106a290200370300200241d8026a41186a222c200941186a290200370300200220092902003703d802201d290300212d201e290300212e200e280200212f200a280200213020024198016a41206a290300213120032903002132201c2802002133200f280200222b450d01202f417f4c0d0b202f450d03202f102222010d040c0c0b0240200a280200450d00200f28020010200b4100212b0b202841ff0171450d0d0b200241b0046a41186a222c2004290300370300200241b0046a41106a22342005290300370300200241b0046a41086a2235201f290300370300200220022903b8023703b00442002121200241c8036a41086a22064200370300200242003703c80341dcdac200411a200241c8036a100220032006290300370300200220022903c8033703980142002108024020024198016a411041c8d7c400410041001001417f460d00200242003703c80320024198016a4110200241c8036a41084100100141016a41084d0d0320022903c80321080b20064200370300200242003703c80341c5dac2004117200241c8036a100220032006290300370300200220022903c80337039801024020024198016a411041c8d7c400410041001001417f460d00200242003703c80320024198016a4110200241c8036a41084100100141016a41084d0d0420022903c80321210b20064200370300200242003703c80341c5dac2004117200241c8036a100220032006290300370300200220022903c80337039801200220213703c80320024198016a4110200241c8036a41081003412010222220450d052020200229039802370000202041186a2029290300370000202041106a202a290300370000202041086a20012903003700002020412041c00010212220450d062020202142017c370020201d4200370300201e42003703002003420037030020024200370398012020412820024198016a1000200241c8036a41186a201d290300370300200241c8036a41106a201e2903003703002006200329030037030020022002290398013703c803413710222201450d07200142bac6a1cbc68dd9aff300370000200142f4dec98bf6ac999de400370008200141e5cc85ab07360010200141ece8013b00142001413a3a0016200120022903c803370017200120022903d00337001f200120022802d803360027200120022f01dc033b002b200120022d00de033a002d200120022d00df033a002e200120022d00e0033a002f200120022d00e1033a0030200120022d00e2033a0031200120022d00e3033a0032200120022d00e4033a0033200120022d00e5033a0034200120022d00e6033a0035200120022d00e7033a0036202010204200212120064200370300200242003703c80341cdc8c000410d200241c8036a100220032006290300370300200220022903c80337039801024020024198016a411041c8d7c400410041001001417f460d00200242003703c80320024198016a4110200241c8036a41084100100141016a41084d0d0520022903c80321210b427f2122200241f8026a41106a427f370300200241f8026a41086a427f370300200241f8026a41286a201936020041372136201a4137360200200241f8026a41206a2001360200200d20022903b004370000200241f8026a41186a2021370300200d41086a2035290300370000200d41106a2034290300370000200d41186a202c290300370000200220083703f80220192120427f213720254201520d0b0c0a0b410121010b2001202b202f1084042129200241f8026a41106a202d370300200241f8026a41086a202e370300200241f8026a41286a202f360200201a202f360200200241f8026a41206a2029360200200241f8026a41186a2031370300200d20022903d802370200200d41086a2006290300370200200d41106a2020290300370200200d41186a202c290300370200200220323703f802202f2136202f212020312121202e2122202d21372032210820254201510d080c090b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b412041011023000b41c00041011023000b413741011023000b1031000b202f41011023000b200241f8026a41106a2023370300200241f8026a41086a202437030020242122202321370b0240202841ff0171450d00200d20022903b802370000200d41186a2004290300370000200d41106a2005290300370000200d41086a201f2903003700000b2026a72104024002402026422088a72205450d00410020056b2206211f20042105034020052802ec032105201f41016a221f0d000b0340200420042f01064102746a41ec036a2802002104200641016a22060d000c020b0b200421050b20042f0106210620182027360200200241c8036a411c6a2006360200200241c8036a41186a222c4100360200200241c8036a41146a2004360200200241c8036a41106a22344100360200200241c8036a41086a22354200370300200220053602cc03200241003602c80320024198016a200241c8036a103202402002280298014101470d000340200241f0036a41186a2206200b41186a290200370300200241f0036a41106a221f200b41106a290200370300200241f0036a41086a2227200b41086a2902003703002002200b2902003703f00320024198016a41246a2802002104200f2802002129200a280200210520024190046a41186a200629030037030020024190046a41106a201f29030037030020024190046a41086a2027290300370300200220022903f00337039004201d4200370300201e420037030020034200370300200242003703980120024190046a412020024198016a1000200241b0046a41186a221f201d290300370300200241b0046a41106a2227201e290300370300200241b0046a41086a2228200329030037030020022002290398013703b004200241003602980120012020200241b0046a412020024198016a100a212a02402002280298012206417f460d0020082006ad7d21082006450d00202a10200b024002402004450d00201d4200370300201e420037030020034200370300200242003703980120024190046a412020024198016a1000201f201d2903003703002027201e2903003703002028200329030037030020022002290398013703b00420012020200241b0046a412020042005100b20082005ad7c21082029450d01200410200c010b201d4200370300201e420037030020034200370300200242003703980120024190046a412020024198016a1000201f201d2903003703002027201e2903003703002028200329030037030020022002290398013703b00420012020200241b0046a4120100c0b20024198016a200241c8036a10322002280298014101460d000b200220083703f8020b200241c8036a1042202c200241d8026a41186a2903003703002034200241d8026a41106a2903003703002035200241d8026a41086a290300370300200220022903d8023703c8030240202b450d00201e202d3703002003202e370300200f202f36020020024198016a41246a203036020020024198016a41206a202b360200201d2031370300200a20022903c803370200201b2033360200200a41086a2035290300370200200a41106a2034290300370200200a41186a202c290300370200200220323703980141012104024002400240202f2020470d00024002402001202b460d00202b2001202f1086040d0220322008520d020c010b20322008520d010b200a200d41201086040d00202e202285202d2037858450450d002031202152210420300d010c020b2030450d010b202b10200b20044102460d0020040d002036450d05200110200c050b2003200241f8026a41d0001084041a200241003a00980120024198026a20024198016a10cd010c040b2026a721042026422088a72201450d010b410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c020b0b200421010b20024198016a41206a2027360200201620042f0106360200201d410036020020172004360200201e4100360200200342003703002002200136029c01200241003602980120024198016a10420b20024198016a200241306a103320024198016a41206a29030022084202520d000b20022903182108200241306a1054024020084200510d00200710ce01200241d0046a24000f0b200241206a290300200241286a2903008450450d010b200710cf01200241d0046a24000f0b41a8b7c000102f000ba30a03057f037e017f23004190016b2204240002400240024002400240411410222205450d00200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441186a22064200370300200441106a22074200370300200441086a22084200370300200442003703002005413420041000200441f0006a41186a2006290300370300200441f0006a41106a2007290300370300200441f0006a41086a2008290300370300200420042903003703700240024002400240200441f0006a412041c8d7c400410041001001417f460d002004420037030820044200370300200441f0006a412020044110410010012206417f460d022006410f4d0d02200441086a29030021092004290300210a0c010b4200210a420021090b20051020200441086a220542003703002004420037030041a5eec000411b20041002200441f0006a41086a2005290300370300200420042903003703700240200441f0006a411041c8d7c400410041001001417f460d002004420037030820044200370300200441f0006a411020044110410010012205417f460d022005410f4d0d02200a2009844200520d002004290300200258200441086a290300220b200358200b2003511b0d0020004200370300200041013a0018200041106a4200370300200041086a420037030020044190016a24000f0b200441086a220542003703002004420037030041a5eec000411b20041002200441f0006a41086a20052903003703002004200429030037037002400240200441f0006a411041c8d7c400410041001001417f460d002004420037030820044200370300200441f0006a411020044110410010012205417f460d062005410f4d0d062004290300200256200441086a290300220b200356200b2003511b450d0020012002200310af01410121010c010b411410222205450d06200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d07200520012900003700142005412c6a200141186a220c290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441186a22064200370300200441106a22074200370300200441086a22084200370300200442003703002005413420041000200441f0006a41186a2006290300370300200441f0006a41106a2007290300370300200441f0006a41086a200829030037030020042004290300370370200441f0006a412041c8d7c40041004100100121062005102002402006417f470d002001103a200441386a2003370300200441306a2002370300200441086a41003a0000200441096a2001290000370000200441116a200141086a290000370000200441196a200141106a290000370000200441216a200c290000370000200441023a00002004103d0b20012002200310af01410021010b20002002200a7d200a20027d200a2002582009200358200920035122051b22061b370308200020013a00182000200a200256200920035620051bad370300200041106a200320097d2002200a54ad7d200920037d200a200254ad7d20061b37030020044190016a24000f0b419a88c00041331039000b419a88c00041331039000b411441011023000b413441011023000b419a88c00041331039000b411441011023000b413441011023000b9e0a06037f027e017f017e027f017e230041c0006b220724002004a72108024002400240024002400240024002400240024002400240024002400240024020014201520d004101210920084101470d01427f200320067c200220057c22012002542208ad7c22022008200220035420022003511b22081b210a427f200120081b210b4100210c4201210d200450450d060c070b4101210c20084101470d012002200556200320065620032006511b450d02200320067d2002200554ad7d210a200220057d210b4200210d4100210c41012109200150450d030c040b200741086a20042005200642012002200310cc01200741186a290300210a2007290310210b2007290308210d0c0a0b427f200320067c200220057c220b2002542208ad7c220a2008200a200354200a2003511b22081b210a427f200b20081b210b4200210d41002109200150450d010c020b200620037d2005200254ad7d210a200520027d210b4201210d4100210c410121092001500d010b200741306a41086a2208420037030020074200370330418feec0004116200741306a1002200741206a41086a220e20082903003703002007200729033037032002400240200741206a411041c8d7c400410041001001417f460d002007420037033820074200370330200741206a4110200741306a411041001001220f417f460d0a200f410f4d0d0a200741386a2903002101200729033021100c010b42002110420021010b2008420037030020074200370330418feec0004116200741306a1002200e20082903003703002007200729033037032020074200200120037d2010200254ad7d2203201020027d2202201056200320015620032001511b22081b37033820074200200220081b370330200741206a4110200741306a411010030b2004500d010b200c450d05200741306a41086a2208420037030020074200370330418feec0004116200741306a1002200741206a41086a220c200829030037030020072007290330370320200741206a411041c8d7c400410041001001417f460d012007420037033820074200370330200741206a4110200741306a4110410010012209417f460d072009410f4d0d07200741386a2903002103200729033021020c020b2009450d04200741306a41086a2208420037030020074200370330418feec0004116200741306a1002200741206a41086a220c200829030037030020072007290330370320200741206a411041c8d7c400410041001001417f460d022007420037033820074200370330200741206a4110200741306a4110410010012209417f460d072009410f4d0d07200741386a2903002103200729033021020c030b42002102420021030b2008420037030020074200370330418feec0004116200741306a1002200c20082903003703002007200729033037032020074200200320067d2002200554ad7d2204200220057d2205200256200420035620042003511b22081b37033820074200200520081b370330200741206a4110200741306a411010030c020b42002102420021030b2008420037030020074200370330418feec0004116200741306a1002200c2008290300370300200720072903303703202007427f200320067c200220057c22052002542208ad7c22022008200220035420022003511b22081b3703382007427f200520081b370330200741206a4110200741306a411010030b2000200b3703082000200d370300200041106a200a370300200741c0006a24000f0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000bd00201047f230041c0006b2202240002400240411710222203450d002003410f6a41002900cfe342370000200341086a41002900c8e342370000200341002900c0e34237000020034117413710212203450d01200320002900003700172003412f6a200041186a290000370000200341276a200041106a2900003700002003411f6a200041086a290000370000200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a10f20220031020024020012d00000d002001412c6a280200450d00200141286a28020010200b200241c0006a24000f0b411741011023000b413741011023000bc80202047f047e230041206b22012400200141106a41086a2202420037030020014200370310418feec0004116200141106a1002200141086a22032002290300370300200120012903103703000240024002402001411041c8d7c400410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b200041086a2903002107200029030021082002420037030020014200370310418feec0004116200141106a1002200320022903003703002001200129031037030020014200200520077d2006200854ad7d2207200620087d2208200656200720055620072005511b22021b37031820014200200820021b37031020014110200141106a41101003200141206a24000f0b419a88c00041331039000bc70202047f047e230041206b22012400200141106a41086a2202420037030020014200370310418feec0004116200141106a1002200141086a22032002290300370300200120012903103703000240024002402001411041c8d7c400410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b200041086a2903002107200029030021082002420037030020014200370310418feec0004116200141106a100220032002290300370300200120012903103703002001427f200520077c200620087c22072006542202ad7c22062002200620055420062005511b22021b3703182001427f200720021b37031020014110200141106a41101003200141206a24000f0b419a88c00041331039000bde0202097f027e230041106b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120108604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d002004280200450d00200441106a290300210c200441086a290300210d0c010b200320012802102002200141146a28020028021c110100200341086a290300210c200128020021052003290300210d0b20012005417f6a3602002000200c3703082000200d370300200341106a24000f0b10d101000b7601017f230041c0006b220024002000411836020c200041bbb2c000360208200041346a4120360200200041246a41023602002000410336022c20004202370214200041b8d4c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8d4c4001048000bfa0401137f02400240200128020022054100480d00200541ffffffff07460d002001200541016a360200200141046a2106200141086a28020021070c010b10d101000b410021050340024002400240024002400240024002400240024020050e020001010b2006280200220841086a210920082f0106220a410574210b417f21050240024002400340200b450d01200541016a2105417f4101200220094120108604220c4100481b4100200c1b220c450d03200b41606a210b200941206a2109200c4101460d000b20070d010c040b200a21052007450d030b2007417f6a2107200820054102746a41880b6a2106410021050c0a0b200841e8026a200541e0006c6a2205450d01200541306a210d200541346a280200210e4108210f41052110417f21114102211241ec032113412021144100211541012116416021170c080b200d2802002208200f6a210920082f0106220d201074210b417f21050240024002400340200b450d01200520166a210520112016200420092014108604220c2015481b2015200c1b220c450d03200b20176a210b200920146a2109200c2016460d000b200e0d010c030b200d2105200e450d020b200e20116a210e200820052012746a20136a210d410121050c090b200841e8026a220b2005410c6c6a2216450d0020162802002209450d01200b2005410c6c6a2802082205417f4c0d062005450d022005102222160d03200541011023000b20002001280210200220032004200141146a28020028020c1103000c040b410021160c020b410121160b2016200920051084041a0b2000200536020420002016360200200041086a20053602000b20012001280200417f6a3602000f0b1031000b410121050c000b0ba90301097f230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120108604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b2007200441e0006c6a41e8026a2204450d00200341086a220a200441c5006a290000370300200341106a2208200441cd006a290000370300200341186a2207200441d5006a29000037030020032004413d6a29000037030020042d003c4101470d0020002003290300370001200041013a0000200041096a200a290300370000200041116a2008290300370000200041196a20072903003700000c010b200020012802102002200141146a280200280210110100200128020021050b20012005417f6a360200200341206a24000f0b10d101000ba40201087f0240200028020022024100480d00200241ffffffff07460d002000200241016a2203360200200041046a2102200041086a2802002104024003402002280200220541086a210620052f010622074105742108417f210202400240024003402008450d01200241016a2102417f410120012006412010860422094100481b410020091b2209450d03200841606a2108200641206a210620094101460d000b20040d010c040b200721022004450d030b2004417f6a2104200520024102746a41880b6a21020c010b0b2005200241e0006c6a41e8026a2202450d002002413c6a2d0000210220002003417f6a36020020024101460f0b20002802102001200041146a280200280218110400210220002000280200417f6a36020020020f0b10d101000bf80202097f037e230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120108604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d00200441186a290300220ca7450d00200441286a290300210d200441206a290300210e0c010b200341086a20012802102002200141146a280200280214110100200341186a290300210d200128020021052003290310210e2003290308210c0b20012005417f6a360200200041106a200d3703002000200e3703082000200c370300200341206a24000f0b10d101000bf71207057f017e1a7f047e017f017e097f230041b00d6b22022400024020002802000d002000417f36020020012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b2002411c6a20042f0106360200200241186a4100360200200241146a20043602002002200336022020024100360210200242003703082002200136020420024100360200200241b0026a200210330240024020022903d00222074202510d002000410c6a2108200041046a210920024190016a41146a210a20024190016a41206a2105200241b0026a41047221042002418d036a210b200241b0026a413d6a210c200241ad036a210d200241f8026a210e200241f0026a210f200241b0026a41306a2110200241b0026a41286a21112002418c036a2112200241e8026a211320024180036a211420024184036a211520024188036a2116200241b0026a413c6a2117200241e4026a2118200241c8016a411c6a21190340200241c8006a41086a2203200241b0026a41086a221a290300370300200241c8006a41106a221b200241b0026a41106a221c290300370300200241c8006a41186a221d200241b0026a41186a221e290300370300200241286a41086a221f200b41086a290000370300200241286a41106a2220200b41106a290000370300200241286a41186a2221200b41186a290000370300200220022903b0023703482002200b290000370328200e2903002122200f2903002123201029030021242011290300212520122d0000212620132903002127201428020021012015280200210620162802002128200241246a41026a2229200d41026a2d00003a00002002200d2f00003b0124200241f0006a41186a222a2021290300370300200241f0006a41106a222b2020290300370300200241f0006a41086a222c201f290300370300200241ec006a41026a222d20292d00003a000020022002290328370370200220022f01243b016c20024190016a41186a2220201d29030037030020024190016a41106a221d201b29030037030020024190016a41086a221f20032903003703002002200229034837039001024002402009280200221b4180e5c200460d00200041086a280200212e0c010b41880b1022221b450d034100212e201b41003b0106201b4100360200201b41086a200241b0026a41800b1084041a200041086a41003602002009201b3602000b024002400340201b2f0106222f4105742130417f212141002103024002400240034020302003460d01202141016a2121417f410120024190016a201b20036a41086a412010860422294100481b410020291b2229450d05200341206a210320294101460d000b202e0d010c020b202f2121202e450d010b202e417f6a212e201b20214102746a41880b6a280200211b0c010b0b200241c8016a41186a22032020290300370300200241c8016a41106a2220201d290300370300200241c8016a41086a2229201f29030037030020022002290390013703c801201d200836020020024190016a410c6a2021360200201f2009360200200a20022903c801370200200a41086a2029290300370200200a41106a2020290300370200200a41186a20032903003702002002201b36029401200241003602900120112022370300200241b0026a41206a2023370300201c2024370300201a2025370300201720263a0000201320283602002018200636020020102001360200201e2027370300200c2002290370370000200c41086a202c290300370000200c41106a202b290300370000200c41186a202a290300370000200b20022f016c3b0000200b41026a202d2d00003a0000200220073703b00220024190016a200241b0026a10411a0c010b201b41e8026a202141e0006c6a22212021290308202520075022031b37030820212021290300200720031b370300202141106a221b201b290300202420031b3703002020202a290300370300201d202b290300370300201f202c290300370300200220022903703703900120212d003c211b201e202141d5006a290000370300201c202141cd006a290000370300201a202141c5006a29000037030020022021413d6a22032900003703b00202400240202641ff01714101470d00200241c8016a41186a2020290300370300200241c8016a41106a201d290300370300200241c8016a41086a201f29030037030020022002290390013703c8014101211b0c010b200241c8016a41186a201e290300370300200241c8016a41106a201c290300370300200241c8016a41086a201a290300370300200220022903b0023703c8010b2021413c6a201b3a0000200341186a200241c8016a41186a2229290300370000200341106a200241c8016a41106a2230290300370000200341086a200241c8016a41086a222e290300370000200320022903c801370000202141286a2203202220032903002027a722031b37030020212023202129032020031b37032020212027202129031820031b370318024002402006450d002006211b20012103034020032802ec032103201b417f6a221b0d000b0340200120012f01064102746a41ec036a28020021012006417f6a22060d000c020b0b200121030b20012f01062106200241c8016a41206a20283602002019200636020020294100360200200241c8016a41146a200136020020304100360200202e4200370300200220033602cc01200241003602c801200241b0026a200241c8016a1032024020022802b0024101470d00202141306a211b034020024190016a41286a200441286a2802003602002005200441206a2902003703002020200441186a2201290200370300201d200441106a2206290200370300201f200441086a2203290200370300200220042902003703900120024180026a41186a200129000037030020024180026a41106a200629000037030020024180026a41086a20032900003703002002200429000037038002200241a0026a41086a200541086a280200360200200220052902003703a002200241f0016a201b20024180026a200241a0026a1044024020022802f001450d0020022802f4012201450d00200241f0016a41086a280200450d00200110200b200241b0026a200241c8016a103220022802b0024101460d000b0b200241c8016a10420b200241b0026a20021033200241b0026a41206a29030022074202520d000b0b200210542000200028020041016a360200200241b00d6a24000f0b41880b41081023000b10d701000b7601017f230041c0006b220024002000411036020c200041abb2c000360208200041346a4121360200200041246a41023602002000410336022c20004202370214200041b8d4c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8d4c4001048000b130020004102360204200041c0b8c0003602000b13002000410e360204200041abbac0003602000b130020004104360204200041bcbac0003602000b830701087f230041900c6b22042400024002400240024020002802000d002000417f360200200441d8006a41186a200141186a290000370300200441d8006a41106a200141106a290000370300200441d8006a41086a200141086a2900003703002004200129000037035802400240200028020422054180e5c200460d00200041086a28020021060c010b41880b10222205450d0241002106200541003b010620054100360200200541086a20044190016a41800b1084041a200041086a4100360200200041046a20053602000b200041046a210702400240034020052f01062209410574210a41002101417f21080240024002400340200a2001460d01200841016a2108417f4101200441d8006a200520016a41086a4120108604220b4100481b4100200b1b220b450d05200141206a2101200b4101460d000b20060d010c020b200921082006450d010b2006417f6a2106200520084102746a41880b6a28020021050c010b0b200441186a200441d8006a41186a290300370300200441106a200441d8006a41106a290300370300200441086a200441d8006a41086a290300370300200420042903583703002000410c6a21014100210641000d010c040b2000410c6a21014101450d030b200441a8016a4200370300200441a4016a4180e5c200360200200441003602b001200441003602a001200442003703980120044180e5c2003602940120044100360290012005200841e0006c6a41e8026a210120044190016a10420c030b10d701000b41880b41081023000b200441f4006a200441086a290300370200200441fc006a200441106a29030037020020044184016a200441186a2903003702002004200136026820042008360264200420073602602004200536025c200420063602582004200429030037026c200441c4016a4200370200200441b0016a2004290348370300200441b8016a200441c8006a41086a290300370300200441cd016a2004290025370000200441d5016a200441256a41086a290000370000200441dd016a200441256a41106a290000370000200441e5016a200441256a41186a290000370000200441ec016a200441c4006a280000360000200442003703a801200442003703900120044180e5c2003602c001200441003a00cc01200441d8006a20044190016a104121010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441900c6a24000bef1004047f017e087f037e230041b0046b22022400200241106a200110bc010240024002400240024002400240024002402002280210450d00200241003a00880220024188026a200128020022032001280204220441004722051084041a20042005490d04200141046a200420056b3602002001200320056a3602002004450d0120022d008802220441ff00714101470d022004411874411875417f4c0d03420221060c080b20004203370370200241b0046a24000f0b20004203370370200241b0046a24000f0b20004203370370200241b0046a24000f0b200241a8016a200110bb0102400240024020022d00a8014102460d00200241c8036a41206a200241a8016a41206a280200360200200241c8036a41186a200241a8016a41186a290300370300200241c8036a41106a200241a8016a41106a290300370300200241c8036a41086a200241a8016a41086a290300370300200220022903a8013703c80320024188026a41386a2207420037030020024188026a41306a2208420037030020024188026a41286a2209420037030020024188026a41206a220a420037030020024188026a41186a220b420037030020024188026a41106a220c420037030020024188026a41086a220d4200370300200242003703880220024188026a20012802002203200141046a220e280200220441c000200441c000491b22051084041a200e200420056b3602002001200320056a3602002004413f4d0d00200241f0036a41386a2007290300370300200241f0036a41306a2008290300370300200241f0036a41286a2009290300370300200241f0036a41206a200a290300370300200241f0036a41186a200b290300370300200241f0036a41106a200c290300370300200241f0036a41086a200d29030037030020022002290388023703f0032002200110572002280200450d002002290308210f200141046a220e2802002104200241003a00880220024188026a20012802002207200441004722051084041a20042005490d04200e200420056b22033602002001200720056a22053602002004450d002002310088022210500d01200241003a00880220024188026a2005200341004722041084041a20032004490d05200141046a200320046b3602002001200520046a3602002003450d0042022010420f838622114204540d00420121062002310088024208862010844204882011420c882210420120104201561b7e22102011540d020b420221060c050b420021060b20024180016a41206a200241c8036a41206a28020036020020024180016a41186a200241c8036a41186a29030037030020024180016a41106a200241c8036a41106a29030037030020024180016a41086a200241c8036a41086a290300370300200241e8026a41086a200241f0036a41086a290300370300200241e8026a41106a200241f0036a41106a290300370300200241e8026a41186a200241f0036a41186a290300370300200241e8026a41206a200241f0036a41206a290300370300200241e8026a41286a200241f0036a41286a290300370300200241e8026a41306a200241f0036a41306a290300370300200241e8026a41386a200241f0036a41386a290300370300200220022903c80337038001200220022903f0033703e8020c030b20052004102d000b20052004102d000b20042003102d000b200241a8016a41206a220420024180016a41206a280200360200200241a8016a41186a220520024180016a41186a290300370300200241a8016a41106a220320024180016a41106a290300370300200241a8016a41086a220e20024180016a41086a29030037030020024188026a41086a2207200241e8026a41086a29030037030020024188026a41106a2208200241e8026a41106a29030037030020024188026a41186a2209200241e8026a41186a29030037030020024188026a41206a220a200241e8026a41206a29030037030020024188026a41286a220b200241e8026a41286a29030037030020024188026a41306a220c200241e8026a41306a29030037030020024188026a41386a220d200241e8026a41386a29030037030020022002290380013703a801200220022903e80237038802024020064202520d0020004203370370200241b0046a24000f0b200241d8006a41206a2004280200360200200241d8006a41186a2005290300370300200241d8006a41106a2003290300370300200241d8006a41086a200e290300370300200241186a41086a2007290300370300200241186a41106a2008290300370300200241186a41186a2009290300370300200241186a41206a200a290300370300200241186a41286a200b290300370300200241186a41306a200c290300370300200241186a41386a200d290300370300200220022903a80137035820022002290388023703180b20024188026a200110b9012002280288022101200241e8026a20024188026a41047241dc001084041a02402001410f470d0020004203370370200241b0046a24000f0b200241a8016a200241e8026a41dc001084041a2000200f37030020002002290358370308200041106a200241d8006a41086a290300370300200041186a200241d8006a41106a290300370300200041206a200241d8006a41186a290300370300200041286a200241d8006a41206a2802003602002000200229031837022c200041346a200241186a41086a2903003702002000413c6a200241186a41106a290300370200200041c4006a200241186a41186a290300370200200041cc006a200241186a41206a290300370200200041d4006a200241186a41286a290300370200200041dc006a200241c8006a290300370200200041e4006a200241d0006a29030037020020004188016a200136020020004180016a201037030020002011370378200020063703702000418c016a200241a8016a41dc001084041a200241b0046a24000ba40301057f230041c0006b2202240002400240411010222203450d00200341086a41002900f7c840370000200341002900efc84037000020034110412010212203450d0120032001370010200241206a41186a22044200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034118200241206a1000200241186a2004290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041c8d7c400410041001001417f460d002004420037030020054200370300200241286a42003703002002420037032020024120200241206a4120410010012204417f460d022004411f4d0d0220002002290320370000200041186a200241206a41186a290300370000200041106a200241206a41106a290300370000200041086a200241206a41086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b20031020200241c0006a24000f0b419a88c00041331039000b411041011023000b412041011023000bc5e50137037f017e037f017e047f027e047f037e167f027e027f017e027f027e0d7f027e067f027e0c7f047e017f037e017f037e187f027e017f017e0e7f017e067f017e227f017e017f017e017f017e017f027e027f017e027f027e037f027e027f027e0d7f017e067f017e017f017e067f230041a0096b2201240020014190056a41086a22024200370300200142003703900541f691c200411320014190056a1002200141f8036a41086a200229030037030020012001290390053703f80302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141f8036a411041c8d7c400410041001001417f460d00200141003a00a008200141f8036a4110200141a0086a41014100100141016a41014d0d0220012d00a0082102200141f8036a411010092002450d0020014190056a41086a22024200370300200142003703900541b68cc000411d20014190056a1002200141f8036a41086a200229030037030020012001290390053703f8030240200141f8036a411041c8d7c400410041001001417f460d00200142103702b4052001200141f8036a3602b005200141a0086a200141b0056a103820012802a0082203450d0420012902a4082104200141f8036a41101009410610222202450d05200241046a41002f00b48c403b0000200241002800b08c4036000020024106410c10212202450d06200241086a41002d00a293423a0000200241002f00a093423b0006024002402002410941c8d7c400410041001001417f460d00200141003602a0084101210520024109200141a0086a41044100100141016a41044d0d0420012802a00821062002102020064521072006450d012006ad4205862208422088a70d312008a722024100480d31200210222205450d0a4100210920052102034020014190056a2009109c01200241186a20014190056a41186a290000370000200241106a20014190056a41106a290000370000200241086a20014190056a41086a2900003700002002200129009005370000200241206a21022006200941016a2209470d000c020b0b200210204101210741002106410121050b2004a7210a02400240024020062004422088a7220b470d000240200b450d0020032005460d004100210c200521022003210903402002200941201086040d02200241206a2102200941206a2109200c41016a220c200b490d000b0b20070d0120051020200a0d020c030b200141ac086a2006360200200141a8086a2006360200200120053602a408200141013a00a008200141a0086a10df010b200a450d010b200310200b20014190056a41086a22024200370300200142003703900541d2cfc200411820014190056a1002200141f8036a41086a2209200229030037030020012001290390053703f80342002104024002400240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d0120012903a00821040b20024200370300200142003703900541b8adc200411520014190056a10022009200229030037030020012001290390053703f80302400240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d0320012903a00822084200520d0141eccfc200102f000b42e80721080b20014190056a41086a22024200370300200142003703900541a3a8c200411920014190056a1002200141f8036a41086a200229030037030020012001290390053703f803200020047d200882210d0240200141f8036a411041c8d7c400410041001001417f460d00200141003a00a008200141f8036a4110200141a0086a41014100100141016a41014d0d0920012d00a0082102200141f8036a41101009200241004721060c0b0b200d4200520d0b410121060c0a0b419a88c00041331039000b419a88c00041331039000b41a493c200102f000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b410641011023000b410c41011023000b419a88c00041331039000b200241011023000b4200210e20014190056a41086a22024200370300200142003703900541da95c200410d20014190056a1002200141f8036a41086a2209200229030037030020012001290390053703f803420021040240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d0f20012903a00821040b2002420037030020014200370390054184d0c200411420014190056a10022009200229030037030020012001290390053703f8030240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d1020012903a008210e0b20014190056a41086a22024200370300200142003703900541a4adc200411420014190056a1002200141f8036a41086a2209200229030037030020012001290390053703f80302400240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d1220012903a00842017c21080c010b420121080b200141a0086a41086a2008370300200141033a00a008200141a0086a103d20024200370300200142003703900541a4adc200411420014190056a10022009200229030037030020012001290390053703f803200120083703a008200141f8036a4110200141a0086a410810032002420037030020014200370390054184d0c200411420014190056a10022009200229030037030020012001290390053703f803200120043703a008200141f8036a4110200141a0086a41081003200141a8036a4198d0c200411910e00102400240024020012903a803a74101470d0020012903b003210820014190056a41086a22024200370300200142003703900541b8adc200411520014190056a1002200141f8036a41086a200229030037030020012001290390053703f803200120083703a008200141f8036a4110200141a0086a410810030c010b200d500d010b20014190056a41086a22024200370300200142003703900541cdc8c000410d20014190056a1002200141f8036a41086a2209200229030037030020012001290390053703f803420021080240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d1320012903a00821080b20024200370300200142003703900541d2cfc200411820014190056a10022009200229030037030020012001290390053703f803200120083703a008200141f8036a4110200141a0086a410810030b2004200e7d200610e10120014190056a41086a22024200370300200142003703900541cdadc200411220014190056a1002200141f8036a41086a200229030037030020012001290390053703f8034100210302400240200141f8036a411041c8d7c400410041001001417f460d00200142103702b4052001200141f8036a3602b005200141a0086a200141b0056a103820012802a008220f450d1f200141a8086a280200210320012802a40821100c010b4101210f410021100b200141003602a008200141a0086a109e01410610222202450d18200241046a41002f00b48c403b0000200241002800b08c4036000020024106410c10212202450d19200241086a41002d00a293423a0000200241002f00a093423b0006024002402002410941c8d7c400410041001001417f460d00200141003602a00820024109200141a0086a41044100100141016a41044d0d1720012802a008210520021020200520034d0d01200321090340410610222202450d0e200241046a41002f00b48c4022063b0000200241002800b08c40220c36000020024106410c10212202450d0f200241086a41002d00a293423a0000200241002f00a093423b000602402002410941c8d7c400410041001001417f460d00200141003602a00820024109200141a0086a41044100100141016a41044d0d0620012802a008210b200210200240200b20094d0d00410610222202450d1b200241046a20063b00002002200c36000020024106410c10212202450d1c200220093600062002410a1009200210200b2005200941016a2209470d010c030b200210202005200941016a2209470d000c020b0b200210200b410610222202450d1a200241046a41002f00b48c403b0000200241002800b08c4036000020024106410c10212202450d1b200241086a41002d00a293423a0000200241002f00a093423b0006200120033602a00820024109200141a0086a4104100320021020024020034105742203450d0041002106200f2109034020014198046a41186a220c200941186a29000037030020014198046a41106a220b200941106a29000037030020014198046a41086a2205200941086a2900003703002001200929000037039804411210222202450d07200241106a41002f00efad423b0000200241086a41002900e7ad42370000200241002900dfad4237000020024112413210212202450d0820022001290398043700122002412a6a200c290300370000200241226a200b2903003700002002411a6a200529030037000020014190056a41186a220c420037030020014190056a41106a220b420037030020014190056a41086a2205420037030020014200370390052002413220014190056a1000200141d8036a41186a200c290300370300200141d8036a41106a200b290300370300200141d8036a41086a200529030037030020012001290390053703d80302400240200141d8036a412041c8d7c400410041001001417f460d00200141f8036a41186a220a4200370300200141f8036a41106a22074200370300200141f8036a41086a22114200370300200142003703f803200141d8036a4120200141f8036a4120410010012212417f460d072012411f4d0d07200141b8036a41186a2212200a290300370300200141b8036a41106a220a2007290300370300200141b8036a41086a22072011290300370300200120012903f8033703b80320021020200141b0056a41186a2012290300370300200141b0056a41106a200a290300370300200141b0056a41086a2007290300370300200120012903b8033703b0054106102222020d010c0b0b20021020200141b0056a41186a4200370300200141b0056a41106a4200370300200141b0056a41086a4200370300200142003703b005410610222202450d0a0b200241046a41002f00b48c40220a3b0000200241002800b08c40220736000020024106410c10212202450d0a20022006360006024002402002410a41c8d7c400410041001001417f460d00200c4200370300200b42003703002005420037030020014200370390052002410a20014190056a4120410010012211417f460d082011411f4d0d08200141a0086a41186a200c290300370300200141a0086a41106a200b290300370300200141a0086a41086a200529030037030020012001290390053703a0080c010b200141a0086a41186a4200370300200141a0086a41106a4200370300200141a0086a41086a4200370300200142003703a0080b2002102002400240200141a0086a200141b0056a4120108604450d00200141003602b007200141b0076a109e01410610222202450d0d200241046a200a3b00002002200736000020024106410c10212202450d0e200241086a41002d00a293423a0000200241002f00a093423b00062002410941c8d7c400410041001001417f460d01200141003602b00720024109200141b0076a41044100100141016a41044d0d0520012802b007210c20021020200c20064d0d00410610222202450d16200241046a200a3b00002002200736000020024106410c1021220c450d17200c2006360006412010222202450d18200220012903b005370000200241186a200141b0056a41186a290300370000200241106a200141b0056a41106a290300370000200241086a200141b0056a41086a290300370000200c410a20024120100320021020200c10200b200641016a2106200941206a2109200341606a22030d010c020b20021020200641016a2106200941206a2109200341606a22030d000b0b2010450d00200f10200b200141f8036a41086a22024200370300200142003703f80341f48fc1004116200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b00602400240200141b0066a411041c8d7c400410041001001417f460d00200142003703a008200141b0066a4110200141a0086a41084100100141016a41084d0d0e20012903a00822044200510d1d4200211320002004824200520d240c010b42002113200042e807824200520d230b4108210b200141f8036a41086a22022013370300200120133703f80341a490c1004115200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b0064100210a02400240200141b0066a411041c8d7c400410041001001417f460d00200142103702b4052001200141b0066a3602b005200141a0086a200141b0056a10e20120012802a008220b450d1f20012802a40821074188012102200141a8086a280200220a4188016c2209450d010c200b41002107418801210241004188016c22090d1f0b200141003602b8052001200b3602b4052001200b3602b005200120014198046a3602bc05200a0d1f0c200b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411241011023000b413241011023000b410641011023000b410c41011023000b410641011023000b410c41011023000b410641011023000b410c41011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b410641011023000b410c41011023000b412041011023000b419a88c00041331039000b410641011023000b410c41011023000b410641011023000b410c41011023000b410641011023000b410c41011023000b418c90c100102f000b419a88c00041331039000b419a88c00041331039000b200b20096a2109200141a0086a200b28026010e301200b20026a21020240024020012802b0082206450d0020014198036a20012903a008200141a0086a41086a290300200141b8086a350200420010880420014198036a41086a2903002108200129039803211420012802b408450d01200610200c010b42002114420021080b200141013602b805200120093602b405200120023602b005200120014198046a3602bc050240200b450d00200bad4220862115024020022009460d00200a4188016c41f87e6a2109200141b0086a210c200141b8086a2105200141b4086a21034201210e0340200141a0086a200241e0006a28020010e30102400240200c2802002206450d0020014188036a20012903a008200141a0086a41086a2903002005350200420010880420014188036a41086a2903002104200129038803210d2003280200450d01200610200c010b4200210d420021040b02402014200d56200820045620082004511b0d002002ad422086200e842115200d2114200421080b20024188016a2102200e42017c210e200941f87e6a22090d000b0b20154280808080105a0d030b200a450d010b200a4188016c2102200b21160340201610920120164188016a2116200241f87e6a22020d000b0b2007450d01200b10200c010b0240024002400240200a2015a722024d0d00200b20024188016c6a22022903102104200b200a417f6a22064188016c6a22094180016a29030021082009290360210e200941e8006a290300210d200941f0006a2903002114200941f8006a2903002115200941c8006a290300215d200941d0006a2903002158200941d8006a2903002159200941286a290300215a200941306a290300215b200941386a290300215e200941186a290300215f200941c0006a2903002162200941206a2903002161200929030021632009290308217c200220092903103703102002290308217d2002207c3703082002290300217c20022063370300200241206a2209290200216320092061370200200241c0006a2209290200216120092062370200200241186a220929030021622009205f370300200241386a2209290200215f2009205e370200200241306a2209290200215e2009205b370200200241286a2209290200215b2009205a370200200241d8006a2209290200215a20092059370200200241d0006a2209290200215920092058370200200241c8006a220929020021582009205d370200200241f8006a2015370300200241f0006a2014370300200241e8006a200d3703002002280260210c2002200e37036020024180016a2008370200200141b0056a41d8006a205a370300200141b0056a41d0006a2059370300200141b0056a41c8006a2058370300200141b0056a41c0006a2061370300200141b0056a41386a205f370300200141b0056a41306a205e370300200141b0056a41286a205b370300200141b0056a41206a2063370300200141b0056a41186a2062370300200120043703c0052001207d3703b8052001207c3703b005200120063602a808200120073602a4082001200b3602a008200141f8036a41086a22024200370300200142003703f80341a490c1004115200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b0062001411036029c042001200141b0066a36029804200141a0086a20014198046a10e40102402006450d00200a4188016c41f87e6a2109200b21020340200210920120024188016a2102200941f87e6a22090d000b0b02402007450d00200b10200b411310222202450d01410021062002410f6a410028008df040360000200241086a4100290086f040370000200241002900feef4037000020024113412610212202450d022002200c36001320014190056a41186a2209420037030020014190056a41106a220b420037030020014190056a41086a2205420037030020014200370390052002411720014190056a100020014190076a41186a200929030037030020014190076a41106a200b29030037030020014190076a41086a200529030037030020012001290390053703900702400240024020014190076a412041c8d7c400410041001001417f460d00200120014190076a360298042001412036029c04200142003703a808200142003703a0082001410020014190076a4120200141a0086a41104100100122092009417f461b2209411020094110491b3602a0042009410f4d0d02200141a8086a2209290300210420012903a0082108200141a0086a20014198046a103820012802a0082206450d022009280200210b20012802a408210520014190076a41201009200210202006450d010c060b2002102041000d050b200141b0056a1092010c050b419a88c00041331039000b41bc90c1002002200a10b501000b411341011023000b412641011023000b0240200b4105742209450d0020062102034020022008200410e501200241206a2102200941606a22090d000b0b200141c8086a2004370300200141c0086a2008370300200141b8086a200b360200200141b4086a2005360200200141a0086a41106a2006360200200141ac086a200c360200200141a0086a41086a41013a0000200141053a00a008200141a0086a103d200141f8036a41086a22024200370300200142003703f80341f9edc0004116200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b00602400240024002400240200141b0066a411041c8d7c400410041001001417f460d00200142003703a008200141b0066a4110200141a0086a41084100100141016a41084d0d0220012903a00821080c010b42e80721080b200141a0086a200141b0056a41e0001084041a42002104200141f8036a41086a22024200370300200142003703f80341cc90c1004115200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b0060240200141b0066a411041c8d7c400410041001001417f460d002001420037039804200141b0066a411020014198046a41084100100141016a41084d0d0220012903980421040b20014198046a200820007c200141a0086a4100200410e6012001280298044101470d03200128029c0420014198046a41086a280200100f0c020b419a88c00041331039000b419a88c00041331039000b410221020c010b200141f8036a41086a22162013370300200120133703f80341e190c1004113200141f8036a1002200141b0066a41086a2016290300370300200120012903f8033703b006410021160240024002400240024002400240200141b0066a411041c8d7c400410041001001417f460d00200141003602a008200141b0066a4110200141a0086a41044100100141016a41044d0d0120012802a00821160b200141f8036a41086a22024200370300200142003703f80341f490c1004119200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b006410021020240200141b0066a411041c8d7c400410041001001417f460d00200141003602a008200141b0066a4110200141a0086a41044100100141016a41044d0d0220012802a00821020b0240024002400240201620024f0d00200141ac086a210c200141a8086a210902400340200141a0086a201610e70120092802002206410f470d01201641016a22162002490d000c020b0b20012903a008210420014198046a200c41ec001084041a200141b0076a20014198046a41ec001084041a200141b0086a22092006360200200120043703a808200120163602a008200141b4086a200141b0076a41ec00108404210c024020042000520d00200141b0066a41086a2209200141a0086a41086a290300370300200120012903a0083703b006200141b0056a200c41ec001084041a20014198046a41086a220c2009290300370300200120012903b00637039804200141a0086a200141b0056a41ec001084041a41800110222217450d07201720012903980437030020172006360210201741086a200c290300370300201741146a200141a0086a41ec001084041a201641016a221620024f0d03200141a0086a41106a2118200141a0086a41146a2105200141ac086a2103200141a0086a41086a210641012119410121090340200141a0086a201610e70102402006280200220c410f470d00201641016a22162002490d010c040b20012903a008210420014198046a200341ec001084041a200141b0076a20014198046a41ec001084041a2018200c36020020062004370300200120163602a0082005200141b0076a41ec00108404210b20042000520d0520014190056a41086a220a2006290300370300200120012903a00837039005200141b0056a200b41ec001084041a200141f8036a41086a2207200a29030037030020012001290390053703f803200141a0086a200141b0056a41ec001084041a024020192009470d00201941016a220b2019490d0e2019410174220a200b200b200a491b220bad4207862204422088a70d0e2004a7220a4100480d0e024002402019450d0020172019410774200a102122170d010c0c0b200a10222217450d0b0b200b21190b201720094107746a220b20012903f803370300200b41086a2007290300370300200b41106a200c360200200b41146a200141a0086a41ec001084041a200941016a2109201641016a22162002490d000c030b0b20091092010b4100211941082117410021090b4107211a201720094107746a21182009450d060c070b410121194107211a201741014107746a211841010d060c050b20181092014107211a201720094107746a211820090d050c040b419a88c00041331039000b419a88c00041331039000b41800141081023000b200a41081023000b0240201722162018460d00410021020c020b410121020c010b4108211b20014198046a41086a211c200141a0086a41086a211d4104211e200141a0086a410472211f410c212020014198046a410c6a2121411021224114212341ec0021244180012125410f212641162127418feec00021284100212941c8d7c400212a417f212b4202212c423e212d41fe00212e4102212f42002130417e213141ff002132423f2133420121344115213541cc90c1002136410321374105213841e800213920014198046a41e8006a213a41e000213b200141a9086a213c4106213d4113213e41e190c100213f4101214041f800214142e80021424220214341172144412e214541182146411f21474120214841987f214942e4cab5fbb6ccdcb0e300214a4238214b4140214c4138214d4130214e4128214f4160215020014188056a215141c0002152412c215341242154411c2155413421562017211641002157410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010206060b200141a0086a41106a2109200141a0086a41146a210b0340200141b0066a41086a2206201641086a290300370300200120162903003703b006201641106a2802002102200141a0086a201641146a41ec001084041a2002410f460d6f20014190056a41086a220c2006290300370300200120012903b00637039005200141b0056a200141a0086a41ec001084041a20092002360200200141a0086a41086a200c29030037030020012001290390053703a008200b200141b0056a41ec001084041a200910920120164180016a22162018470d000b410121020c7a0b02402019450d00201710200b411710222202450d012002410f6a410029009c9141370000200241086a410029009591413700002002410029008d914137000020024117412e10212202450d022002200037001720014190056a41186a2209420037030020014190056a41106a2206420037030020014190056a41086a220c420037030020014200370390052002411f20014190056a100020014190076a41186a200929030037030020014190076a41106a200629030037030020014190076a41086a200c2903003703002001200129039005370390070240024020014190076a412041c8d7c400410041001001417f460d00200142203702b405200120014190076a3602b005200141a0086a200141b0056a10e80120012802a0082211450d0520012902a408210420014190076a412010092004422088a721092004a721120c010b4108211141002109410021120b200210202011200941e8006c22026a210c02400240024002402002450d00200241987f6a2106200141a0086a4104722105200141ac086a2103200141a9086a210a200141a8086a210720112102034020022802002109200141b0056a200241046a41dc001084041a20094110460d02200141a0086a200141b0056a41dc001084041a0240024002402009410f470d0020060d010c020b200241e0006a280200210b20014198046a200141a0086a41dc001084041a200120093602a008200520014198046a41dc001084041a200141003b01b005200141386a200141a0086a200141b0056a10a301200128023821092003200b360200200a2009453a0000200741063a0000200141053a00a008200141a0086a103d2006450d010b200241e8006a2102200641987f6a21060c010b0b200c2202200c470d020c030b20112202200c470d010c020b200241e8006a2202200c460d010b200141a0086a4104722106034020022802002109200141a0086a200241046a41e4001084041a20094110460d01200141b0056a200141a0086a41e4001084041a200120093602a0082006200141b0056a41e4001084041a02402009410f460d00200141a0086a1092010b200241e8006a2202200c470d000b0b2012450d6e20111020410221020c790b200010e9014108217e4200217f200141f8036a41086a2280014200370300200142003703f803411721810141f9d0c20021820141f9d0c2004117200141f8036a100220014190056a41086a228301208001290300370300200120012903f80337039005410021840141c8d7c4002185014110218601417f21870120014190056a411041c8d7c400410041001001417f460d0420014198046a4104722188014105218901200141a0086a410572218a014120218b01200141a0086a41206a218c01200141a0086a410472218d014210218e01200141a0086a41086a218f01410f21900141dc002191014118219201411521930141dbc9c10021940142202195014128219601410621970141ff01219801410c21990120014198046a410c6a219a014130219b01200141a0086a41306a219c01412c219d01200141a0086a412c6a219e014107219f01410121a001411c21a101413c21a201413421a301412421a40141e00021a501410d21a60141cdc8c00021a701410221a801411621a90141f9edc00021aa01411e21ab0141c4d1c20021ac01411b21ad01413b21ae01413321af01412b21b001412321b10141f60021b20141d30021b30141cb0021b40141c30021b50141db0021b601415821b701422821b801413821b901410121570c710b411741011023000b412e41011023000b419a88c00041331039000b0240024020570e0400010312120b201620226a28020021022016290208210420162802002106200141a0086a201620236a20241084041a201620256a2116024020022026460d00200141b0076a200141a0086a20241084041a201c200236020020012004370398042021200141b0076a20241084041a200141b0056a200610ea0120012802b0052105024002400240200141b0056a201b6a22102802002202450d002002203874210c4200210e200521024200211442002158420021594200215a4200215b0340200141f8026a2002103b200141f8026a201b6a290300210820012903f8022104201f2002290000370000201f201b6a2002201b6a290000370000201f20226a200220226a290000370000201f20466a200220466a290000370000200120063602a008200141e8026a20042008200141a0086a10eb012209204674204675220b201a7620097320406aad204b86204b872030108804200820147c2004200e7c220e200454ad7c21142030200141e8026a201b6a2903002204200b20294822091b20597c203020012903e802220820091b220d20587c2258200d54ad7c21592004203020091b205b7c2008203020091b2204205a7c225a200454ad7c215b200220486a2102200c20506a220c0d000b20012802b405450d020c010b4200215a4200215b42002158420021594200210e4200211420012802b405450d010b200510200b200141b0056a200610ea0120012802b005215c02400240024020102802002202450d00200220387421034200210d205c21024200215d420021134200215e420021154200215f0340200141a0086a20466a220b200220466a220a290000370300200141a0086a20226a2205200220226a2207290000370300201d2002201b6a2211290000370300200120022900003703a008202210222209450d192009201b6a20292900feee40370000200920292900f6ee4037000020092022204810212209450d1a2009200636001020092048205210212209450d1b200920012903a008370014200920536a200b290300370000200920546a2005290300370000200920556a201d29030037000020014190056a20466a220c203037030020014190056a20226a2212203037030020014190056a201b6a220f203037030020012030370390052009205620014190056a100020014190076a20466a200c29030037030020014190076a20226a201229030037030020014190076a201b6a200f2903003703002001200129039005370390074100210c024020014190076a2048202a410041001001202b460d00200120293a00b00620014190076a2048200141b0066a20402029100120406a20404d0d2020012d00b006210c0b20091020200b200a29000037030020052007290000370300201d2011290000370300200120022900003703a008200141c8026a2006200141a0086a200c2046742209204775200c7320406a202210ec01200141c8026a20466a290300205d7c20012903d8022204200d7c220d200454ad7c215d2030200141c8026a201b6a2903002204200920467520294822091b205e7c203020012903c802220820091b225e20137c2213205e54ad7c215e2004203020091b205f7c2008203020091b220420157c2215200454ad7c215f200220486a2102200320506a22030d000b20012802b405450d020c010b420021154200215f420021134200215e4200210d4200215d20012802b405450d010b205c10200b42002108200141f8036a201b6a22054200370300200142003703f80320282027200141f8036a1002200141b0066a201b6a22602005290300370300200120012903f8033703b00602400240200141b0066a2022202a202920291001202b460d00200120303703a808200120303703a008200141b0066a2022200141a0086a2022202910012202202b460d28200220264d0d28201d290300210420012903a00821080c010b420021040b024002400240200d200e7c220e202c88205d20147c200e200d54ad7c220d202d86842214200e85200d202c88225d200d8584500d002014205d84500d004100210202400340200141b8026a200e200d2002201e6a202e71108a042002202f6a210220012903b8022214200e85200141b8026a201b6a290300225d200d8584500d012014205d842030520d000b0b200141a8026a200e200d2002202e71108a0420012903a802200141a8026a201b6a2903008421144200215d2002450d012014420052ad2114034020014188026a200e200d2029200220316a2209200920024b1b2202203271108a0420014198026a201420348622612034842262205d203486201420338884225d2062205d108804206120622001290398022001290388025620014198026a201b6a290300221420014188026a201b6a29030022635620142063511b1b211420020d000c030b0b4200215d200e200d84420052ad21140c010b2014420052ad21140b0240024002400240024002402008202c882004202d8684220e2008852004202c88220d20048584500d00200e200d84500d004100210202400340200141f8016a200820042002201e6a202e71108a042002202f6a210220012903f801220e200885200141f8016a201b6a290300220d20048584500d01200e200d842030520d000b0b200141e8016a200820042002202e71108a0420012903e801200141e8016a201b6a29030084210e4200210d2002450d01200e420052ad210e0340200141c8016a200820042029200220316a2209200920024b1b2202203271108a04200141d8016a200e20348622612034842262200d203486200e20338884220d2062200d1088042061206220012903d80120012903c80156200141d8016a201b6a290300220e200141c8016a201b6a290300226356200e2063511b1b210e20020d000b2014205d8450450d020c030b4200210d2008200484420052ad210e2014205d8450450d010c020b200e420052ad210e2014205d84500d010b205e20597c201320587c2208201354ad7c2158205f205b7c2015205a7c2204201554ad7c211320512d00002202202f460d01024020022040470d000340205d215d20142159200e200d842030510d26200141a8016a200420132059205d108704200141b8016a20082058200e200d1087044101216420012903b801225a20012903a801225b54200141b8016a201b6a2903002214200141a8016a201b6a290300221554201420155122021b0d04205b205a54201520145420021b0d0220014198016a205a2014200e200d10880420014188016a205b20152059205d108804200420012903880122147d2215201320014188016a201b6a2903007d2004201454ad7d225a84500d02205820014198016a201b6a2903007d215b20082001290398012204542102200820047d2114200e2104200d21132015210e205a210d20592108205d21582014205b2002ad7d225d8450450d000c040b0b0340200141f8006a200820582014205d108704200e2259200d225a842030510d26200141f8006a201b6a290300210e2001290378210d200141e8006a200420132059205a10870441012164200d2001290368225b54200e200141e8006a201b6a290300221554200e20155122021b0d03205b200d542015200e5420021b0d01200141d8006a200d200e2014205d108804200141c8006a205b20152059205a10880420042001290348220e7d220d2013200141c8006a201b6a2903007d2004200e54ad7d221584500d012058200141d8006a201b6a2903007d215b200820012903582204542102200820047d210e20142104205d2113200d21142015215d20592108205a2158200e205b2002ad7d220d8450450d000c030b0b410021640c010b2004200856201320585620132058511b21640b4200210d20054200370300200142003703f80320362035200141f8036a100220602005290300370300200120012903f8033703b0060240200141b0066a2022202a202920291001202b460d00200120303703a008200141b0066a2022200141a0086a201b2029100120406a201b4d0d1e20012903a008210d0b200141a0086a200610ea0120012802a408216520012802a00821660240201d2802002202450d002002203874210f20642040732167206621020340200141d8036a20466a2209200220466a2203290000370300200141d8036a20226a220c200220226a220a290000370300200141d8036a201b6a220b2002201b6a2207290000370300200120022900003703d80320014190076a20466a2268200329000037030020014190076a20226a2269200a29000037030020014190076a201b6a226a2007290000370300200229000021042005200b290300370300200141f8036a20226a2211200c290300370300200141f8036a20466a221220092903003703002001200437039007200120012903d8033703f80320022900002104201f20466a226b2003290000370000201f20226a226c200a290000370000201f201b6a226d2007290000370000201f2004370000200120063602a008410021030240200141a0086a10eb01204674204675220a4100482067732040470d00200141b8036a20466a2012290300370300200141b8036a20226a2011290300370300200141b8036a201b6a2005290300370300200120012903f8033703b80341012103200a216e0b200141b0056a20466a2207200141b8036a20466a226f290300370300200141b0056a20226a225c200141b8036a20226a22702903003703002010200141b8036a201b6a2271290300370300200120012903b8033703b005024020030d00200220486a2102200f20506a220f0d010c020b0b200141b0066a20466a22722007290300370300200141b0066a20226a2273205c29030037030020602010290300370300200120012903b0053703b00620014190056a20466a2274207229030037030020014190056a20226a2275207329030037030020014190056a201b6a22762060290300370300200120012903b00637039005200141a0086a20466a22772074290300370300200141a0086a20226a22782075290300370300201d20762903003703002001204a3703a80620012001290390053703a008200141a8066a200141a0086a200d206e204674204675201a76206e7320406aad204b86204b877e20007c10ed01200f2048460d00200f204c6a21794100210a034020092002200a6a2203204d6a220f290000370300200c2003204e6a226e290000370300200b2003204f6a227a2900003703002001200320486a22032900003703d8032068200f2900003703002069206e290000370300206a207a290000370300200329000021042005200b2903003703002011200c290300370300201220092903003703002001200437039007200120012903d8033703f803200120063602a00820032900002104207a2900002108206e290000210e206b200f290000370000206c200e370000206d2008370000201f2004370000410021030240200141a0086a10eb01204674204675220f4100482067732040470d00206f20122903003703002070201129030037030020712005290300370300200120012903f8033703b80341012103200f217b0b2007206f290300370300205c207029030037030020102071290300370300200120012903b8033703b005024002402003450d00207220072903003703002073205c29030037030020602010290300370300200120012903b0053703b006207420722903003703002075207329030037030020762060290300370300200120012903b006370390052077207429030037030020782075290300370300201d20762903003703002001204a3703a80620012001290390053703a008200141a8066a200141a0086a200d207b204674204675201a76207b7320406aad204b86204b877e20007c10ed012079200a470d010c030b2079200a460d020b200a20486a210a0c000b0b02402065450d00206610200b200610ee0102400240024002400240024002402064450d00200141a0086a20206a22022006360200201d20373a0000200120383a00a008200141a0086a103d203a2903002204500d01200141b0056a20014198046a20411084041a200141f8036a200420007c220410ef01200141a0086a200141b0056a20411084041a200141b0066a201d203b1084041a20012802fc03220b20052802002202470d02200220406a22092002490d7e2002204074220c20092009200c491b220bad20427e2208204388a70d7e2008a722092029480d7e2002450d0320012802f803200220396c20091021220c0d040c4a0b200141a0086a20206a2006360200201d201e3a0000200120383a00a008200141a0086a103d20052030370300200120303703f803203f203e200141f8036a100220602005290300370300200120012903f8033703b0062001200620406a3602a008200141b0066a2022200141a0086a201e1003201c10920120162018470d690c050b200141a0086a201c203b1084041a200120293b01b005200141c0006a200141a0086a200141b0056a10a3012001280240210920022006360200203c2009453a0000201d203d3a0000200120383a00a008200141a0086a103d20052030370300200120303703f803203f203e200141f8036a100220602005290300370300200120012903f8033703b0062001200620406a3602a008200141b0066a2022200141a0086a201e100320162018470d670c040b20012802f803210c0c020b20091022220c450d460b2001200b3602fc032001200c3602f8030b200c200220396c22116a200141b0066a203b10840421092005200220406a22033602002009203b6a2006360200204410222202450d39200220266a202929009c91413700002002201b6a202929009591413700002002202929008d914137000020022044204510212202450d3a2002200437001720014190056a20466a2209203037030020014190056a20226a220a203037030020014190056a201b6a2207203037030020012030370390052002204720014190056a100020014190076a20466a200929030037030020014190076a20226a200a29030037030020014190076a201b6a2007290300370300200120012903900537039007200120483602a408200120014190076a3602a008200141f8036a200141a0086a10f0012002102002402003450d00201120396a2109200c21020340024020022802002026460d0020021092010b200220396a2102200920496a22090d000b0b0240200b450d00200c10200b20052030370300200120303703f803203f203e200141f8036a100220602005290300370300200120012903f8033703b0062001200620406a3602a008200141b0066a2022200141a0086a201e100320162018470d620b201821160b20162018470d680c670b2001208e013702b405200120014190056a3602b005200141a0086a200141b0056a10f10120012802a0082202450d2720012802a408210c410f21090240024002400240208f012802002206450d0020022903002000520d00200141b8036a2092016a220b2002208b016a290000370300200141b8036a2086016a220520022092016a290000370300200141b8036a207e6a220320022086016a290000370300200120022900083703b80320062087016a2209ad20b8017e220420950188a70d2e2004a722062087014c0d2e024002402006450d0020061022220a0d010c400b4108210a0b200a20022096016a20061084042106208f012009360200200120093602a408200120063602a008208001207f3703002001207f3703f803208201208101200141f8036a1002208301208001290300370300200120012903f8033703900520012086013602b405200120014190056a3602b005200141a0086a200141b0056a10f20102402009450d00200610200b200141b0066a2092016a220a200b290300370300200141b0066a2086016a22072005290300370300200141b0066a207e6a22112003290300370300200120012903b8033703b00620920110222209450d3f20092086016a2084012900a0d1423700002009207e6a208401290098d1423700002009208401290090d142370000200920920120b90110212206450d40200620012903b0063700182006209b016a200a29030037000020062096016a20072903003700002006208b016a2011290300370000200141f8036a2092016a2209207f370300200141f8036a2086016a220a207f370300208001207f3703002001207f3703f803200620b901200141f8036a1000200141d8036a2092016a2009290300370300200141d8036a2086016a200a290300370300200141d8036a207e6a208001290300370300200120012903f8033703d80302400240200141d8036a208b012085012084012084011001208701460d002001209501370294052001200141d8036a36029005200141a0086a20014190056a108b0120012802a0082209209001460d43200141b0056a208d012091011084041a200141d8036a208b0110090c010b410f21090b20014198046a200141b0056a2091011084041a2009209001470d0120061020410f21090b200c450d020c010b200141b0076a20014198046a2091011084041a2006102020014190076a2092016a200b29030037030020014190076a2086016a200529030037030020014190076a207e6a2003290300370300200120012903b80337039007200c450d010b200210200b2009209001460d002001200936029804208801200141b0076a2091011084041a200141b0066a2092016a221220014190076a2092016a290300370300200141b0066a2086016a220f20014190076a2086016a290300370300200141b0066a207e6a221020014190076a207e6a29030037030020012001290390073703b006208001207f3703002001207f3703f803209401209301200141f8036a1002208301208001290300370300200120012903f803370390050240024002400240024020014190056a2086012085012084012084011001208701460d002001208e013702b405200120014190056a3602b005200141a0086a200141b0056a10f30120012802a008225c450d3420012902a408220420950188a7226f2096016c220c450d020c010b420021044108215c420020950188a7226f2096016c220c450d010b4100211141002107205c21090340200141a0086a2092016a22062012290300370300200141a0086a2086016a220b200f290300370300208f012010290300370300200120012903b0063703a008208c012009290000370000208c01207e6a22052009207e6a290000370000208c012086016a220320092086016a290000370000208c012092016a220a20092092016a29000037000020ad0110222202450d1a20022081016a208401280088ae4236000020022086016a208401290081ae423700002002207e6a2084012900f9ad4237000020022084012900f1ad42370000200220ad0120ae0110212202450d1b200220012903a00837001b200220af016a2006290300370000200220b0016a200b290300370000200220b1016a208f01290300370000200220ae0120b20110212202450d1c2002208c0129000037003b200220b3016a200a290000370000200220b4016a2003290000370000200220b5016a2005290000370000200141f8036a2092016a2206207f370300200141f8036a2086016a220b207f370300208001207f3703002001207f3703f803200220b601200141f8036a100020014190056a2092016a200629030037030020014190056a2086016a200b290300370300208301208001290300370300200120012903f8033703900502400240024020014190056a208b012085012084012084011001208701470d00410221062002102041022098017120a801470d010c020b20012084013a00b00520014190056a208b01200141b0056a20a001208401100120a0016a20a0014d0d2020012d00b005210620014190056a208b0110092002102020062098017120a801460d010b2011200620a001716a2111200720062087017320a001716a21070b20092096016a2109200c20b7016a220c0d000b206f20076b21022004a7450d020c010b4100210741002111206f41006b21022004a7450d010b205c10200b200220116b2102024002400240024002400240200128029804209701470d0020014198046a207e6a2d000020980171209701470d00209a012802002109209c012002360200209e012007360200200141a0086a2096016a2011360200208a0120012903b006370000208a01207e6a2010290300370000208a012086016a200f290300370000208a012092016a201229030037000020012084013a00a4082001209f013a00a008200141a0086a103d20022007720d01200141a0086a2099016a2009360200208f012089013a000020012089013a00a008200141a0086a103d200910ee010c010b209c012002360200209e012007360200200141a0086a2096016a2011360200208a0120012903b006370000208a01207e6a2010290300370000208a012086016a200f290300370000208a012092016a2012290300370000200120a0013a00a4082001209f013a00a008200141a0086a103d2011200220076a4d0d0020a10110222209450d4320092092016a2084012800c0d14236000020092086016a2084012900b8d1423700002009207e6a2084012900b0d14237000020092084012900a8d142370000200920a10120a20110212209450d44200920012903b00637001c200920a3016a20122903003700002009209d016a200f290300370000200920a4016a201029030037000042002104200141f8036a2092016a22064200370300200141f8036a2086016a220c42003703002080014200370300200142003703f803200920a201200141f8036a1000200141d8036a2092016a2006290300370300200141d8036a2086016a200c290300370300200141d8036a207e6a208001290300370300200120012903f8033703d803200141d8036a208b01100920091020420021082007450d02208001207f3703002001207f3703f80320ac0120ab01200141f8036a1002208301208001290300370300200120012903f8033703900520014190056a2086012085012084012084011001208701460d012001207f3703a00820014190056a208601200141a0086a207e208401100120a0016a207e4d0d2d20012903a00821080c020b20014198046a1092010c020b420021080b200141b0056a20014198046a20a5011084041a2080014200370300200142003703f80320a70120a601200141f8036a1002208301208001290300370300200120012903f80337039005024020014190056a2086012085012084012084011001208701460d002001207f3703a00820014190056a208601200141a0086a207e208401100120a0016a207e4d0d2520012903a00821040b208001207f3703002001207f3703f80320aa0120a901200141f8036a1002208301208001290300370300200120012903f803370390050240024020014190056a2086012085012084012084011001208701460d002001207f3703a00820014190056a208601200141a0086a207e208401100120a0016a207e4d0d2720012903a008210e0c010b42e807210e0b200141a0086a200141b0056a20a5011084041a20014190056a200e20047c200141a0086a20a80120a00120022007721b200810e60120012802900520a001470d0020012802940522020d010b208001207f3703002001207f3703f803208201208101200141f8036a1002208301208001290300370300200120012903f8033703900520014190056a2086012085012084012084011001208701470d630c010b208301280200210941e2d1c200410f100f20022009100f0b200141286a41b7b0c000411010e001200129033021ba012001280228210b20014190056a41086a22024200370300200142003703900541cec0c000411520014190056a1002200141a0086a41086a200229030037030020012001290390053703a0080240200141a0086a411041c8d7c400410041001001417f460d00200141003a00b005200141a0086a4110200141b0056a41014100100141016a41014d0d4a20012d00b0050d090b410810222209450d4e2009420037030020014190056a41086a22024200370300200142003703900541c7b0c000411520014190056a1002200141a0086a41086a200229030037030020012001290390053703a008200141003602b805200142013703b005200141013602980420014198046a200141b0056a103e20092903002104024020012802b405220c20012802b80522066b41084f0d00200641086a22022006490d75200c4101742205200220022005491b22054100480d75200c450d0220012802b005200c200510212202450d050c030b20012802b00521020c030b20cc01290300210441002102024020c601a7220920c801460d002009450d1b4100210203402002200920c80176220620026a220c200420bd01200c20c301746a290300541b2102200920066b220920c8014b0d000b0b200420bd01200220c301746a22092903002208520d1b20c6012002ad580d1c2009200920c7016a200220c9017320c601a76a20c301741085041a20be0120c2018320c60120c5018620ca017c8421be0120c60120cb017c21c60120cc0120c7016a22cc0120c401470d610c080b200510222202450d020b200120053602b405200120023602b0052005210c0b200141b0056a41086a200641086a2205360200200220066a2004370000200141a0086a41102002200510030240200c450d00200210200b20091020410810222209450d4b2009420037030020014190056a41086a22024200370300200142003703900541e3c0c000411620014190056a1002200141a0086a41086a200229030037030020012001290390053703a008200141003602b805200142013703b005200141013602980420014198046a200141b0056a103e20092903002104024020012802b405220c20012802b80522066b41084f0d00200641086a22022006490d71200c4101742205200220022005491b22054100480d71200c450d0220012802b005200c200510212202450d070c030b20012802b00521020c030b200541011023000b200510222202450d040b200120053602b405200120023602b0052005210c0b200141b0056a41086a200641086a2205360200200220066a2004370000200141a0086a41102002200510030240200c450d00200210200b2009102020014190056a41086a22024200370300200142003703900541a7b0c000411020014190056a1002200141a0086a41086a2209200229030037030020012001290390053703a008200142003703b005200141a0086a4110200141b0056a41081003200141013a00b00520024200370300200142003703900541cec0c000411520014190056a10022009200229030037030020012001290390053703a008200141a0086a4110200141b0056a410110030b410821bb01420021bc0120014190056a41086a22024200370300200142003703900541c7b0c000411520014190056a1002200141a0086a41086a200229030037030020012001290390053703a0080240200141a0086a411041c8d7c400410041001001417f460d002001421037029c042001200141a0086a36029804200141b0056a20014198046a10f40120012802b00522bb01450d4220012902b40521bc010b410821bd01420021be0120014190056a41086a22024200370300200142003703900541e3c0c000411620014190056a1002200141a0086a41086a200229030037030020012001290390053703a0080240200141a0086a411041c8d7c400410041001001417f460d002001421037029c042001200141a0086a36029804200141b0056a20014198046a10f40120012802b00522bd01450d4320012902b40521be010b20014190056a41086a22024200370300200142003703900541f9c0c000411420014190056a1002200141a0086a41086a200229030037030020012001290390053703a008024002400240200141a0086a411041c8d7c400410041001001417f460d00200142003703b005200141a0086a4110200141b0056a41084100100141016a41084d0d29420120012903b00522042004501b21bf0120bc01422088a721c001200b0d020c010b42e50021bf0120bc01422088a721c001200b0d010b20c001417f6a220220c0014b0d39200220c0014f0d3920bb0120024103746a2202450d39200229030021ba010b410020c00141016a220220bf01a76b2209200920024b1b22c10120c0014b0d3942ffffffff0f21c201410321c30120bb0120c1014103746a21c40120c101450d00422021c50120be0142208821c601410821c701410121c801417f21c90142808080807021ca01427f21cb0120bb0121cc01410221570c650b20bc0120c201832108024020c00120c1016b2202450d00024020c101450d0020bb0120c40120024103741085041a0b2002ad42208620088421080b41002102024020be014220882204a7220b450d000240200b4101460d0041002102200b2109034020022009410176220620026a220c20ba0120bd01200c4103746a290300541b2102200920066b220941014b0d000b0b2002200220ba0120bd0120024103746a290300220e566a20ba01200e511b2202200b4b0d3f0b0240024002400240024002400240200b20be01a7470d00200b41016a2209200b490d712004a7220c4101742206200920092006491bad22be01420386220e422088a70d71200ea722094100480d710240200b450d0020bd01200c4103742009102122bd01450d020c010b2009102222bd01450d010b20bd0120024103746a220941086a2009200b20026b4103741085041a200920ba013703002008a72008422088220da72202470d02200241016a22092002490d7020024101742206200920092006491bad2208420386220e422088a70d70200ea722094100480d702002450d0120bb0120024103742009102122bb01450d030c020b200941081023000b2009102222bb01450d010b20bb0120024103746a20ba013703002004a7220741016a220a450d3c200a4101762202200a4f0d3d20bd0120024103746a290300210e0240200a4101710d002002417f6a2202200a4f0d4a20bd0120024103746a290300200e7c420188210e0b20014190056a41086a22024200370300200142003703900541c7b0c000411520014190056a1002200141a0086a41086a200229030037030020012001290390053703a008200141003602b805200142013703b0052001200d42017c220da722023602980420014198046a200141b0056a103e024002402002450d00200241037421cd014100200141b0056a41086a220328020022026b210920012802b405210c20bb0121060340200629030021040240024002400240200c20096a41084f0d00200241086a220b2002490d74200c4101742205200b200b2005491b22054100480d74200c450d0120012802b005200c20051021220b0d020c240b20012802b005210b0c020b20051022220b450d220b200120053602b4052001200b3602b0052005210c0b200641086a21062003200241086a2205360200200b20026a2004370000200941786a21092005210220cd0141786a22cd010d000c020b0b200141b0056a41086a280200210520012802b405210c20012802b005210b0b200141a0086a4110200b200510030240200c450d00200b10200b02402008a7450d0020bb0110200b20014190056a41086a22024200370300200142003703900541e3c0c000411620014190056a1002200141a0086a41086a200229030037030020012001290390053703a008200142013703b005200141003602b8052001200a36029804200741037441086a210520014198046a200141b0056a103e410020012802b80522026b210920012802b405210c20bd0121060340200629030021040240024002400240200c20096a41084f0d00200241086a220b2002490d72200c41017422cd01200b200b20cd01491b22cd014100480d72200c450d0120012802b005200c20cd011021220b0d020c1e0b20012802b005210b0c020b20cd011022220b450d1c0b200120cd013602b4052001200b3602b00520cd01210c0b200641086a2106200141b0056a41086a200241086a22cd01360200200b20026a2004370000200941786a210920cd012102200541786a22050d000b200141a0086a4110200b20cd0110030240200c450d00200b10200b024020be01a7450d0020bd0110200b20014190056a41086a220c4200370300200142003703900541a7b0c000411020014190056a1002200141a0086a41086a2202200c29030037030020012001290390053703a0082001200e3703b005200141a0086a4110200141b0056a41081003200d42ffffffff0f8320bf01520d07200c4200370300200142003703900541cdc8c000410d20014190056a10022002200c29030037030020012001290390053703a008420021040240200141a0086a411041c8d7c400410041001001417f460d00200142003703b005200141a0086a4110200141b0056a41084100100141016a41084d0d3120012903b00521040b20014190056a41086a22024200370300200142003703900541fcc1c000411720014190056a1002200141a0086a41086a200229030037030020012001290390053703a008200141a0086a411041c8d7c400410041001001417f460d01200142003703b005200141a0086a4110200141b0056a41084100100141016a41084d0d3120012903b00521080c020b200941081023000b42e80721080b200e20bf014201887c20087c2004560d04200141a0086a109d0120012802a008210b20012802a40821cd0120012802a8082202450d01200241057422094105752203ad42287e2204422088a70d6a2004a722064100480d6a200610222205450d51200b20096a210a2002410574210620052102200b21090340200941086a2900002104200941106a29000021082009290000210e200241186a200941186a290000370000200241106a2008370000200241086a20043700002002200e370000200241206a4201370300200241286a2102200941206a2109200641606a22060d000b200a200b6b41606a41057641016a210220cd01450d030c020b200541011023000b41002103410821054100210220cd01450d010b200b10200b4200210420014190056a41086a22094200370300200142003703900541a7b0c000411020014190056a1002200141f8036a41086a200929030037030020012001290390053703f8030240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d3220012903a00821040b200120023602a808200120033602a408200120053602a008200141a0086a20bf01427f7c4201200410f5010b200c4200370300200142003703900541c898c200411d20014190056a1002200141f8036a41086a200c29030037030020012001290390053703f8030240200141f8036a411041c8d7c400410041001001417f460d00200142103702b4052001200141f8036a3602b005200141a0086a200141b0056a10f60120012903b00822044202510d3e200141c8086a2802002105200141c4086a2802002107200141c0086a280200210a20012903a808211402400240024002400240024020012903a00822132000520d002005ad221542287e2208422088a741004721092008a721020240024002400240024020044201520d0020090d262002417f4c0d2620012903b80821152002450d0120021022220b450d592005450d030c020b20090d252002417f4c0d252002450d0520021022220b450d59410021cd014100210620050d060c070b4108210b2005450d010b200541286c210c41002106200b2102200a21090340200941086a2903002104200941106a2903002108200941186a290300210e2009290300210d200241206a200941206a290300370300200241186a200e370300200241106a2008370300200241086a20043703002002200d370300200241286a2102200641016a2106200941286a2109200c41586a220c0d000c020b0b410021060b200141c0086a2014370300200141b8086a2015370300200141b4086a2006360200200141b0086a2005360200200141ac086a200b360200200141a8086a4101360200200141023a00a008200141a0086a10df010b201420137c2000520d040c030b4108210b410021cd01410021062005450d010b200541286c210c41002106200b2102200a21090340200941086a2903002104200941106a2903002108200941186a290300210e2009290300210d200241206a200941206a290300370300200241186a200e370300200241106a2008370300200241086a20043703002002200d370300200241286a2102200641016a2106200941286a2109200c41586a220c0d000b0b200141b8086a2014370300200141ac086a200b360200200141a8086a20cd01360200200141b0086a2006ad422086201584370300200141023a00a008200141a0086a10df01201420137c2000520d010b2005ad42287e2204422088a70d1c2004a72202417f4c0d1c0240024002402002450d002002102222cd01450d504100210c4100210620050d010c020b410821cd014100210c410021062005450d010b200541286c210b4100210620cd012102200a21090340200941086a2903002104200941106a2903002108200941186a290300210e2009290300210d200241206a200941206a290300370300200241186a200e370300200241106a2008370300200241086a20043703002002200d370300200241286a2102200641016a2106200941286a2109200b41586a220b0d000b0b200141ac086a2006360200200141a0086a41086a220b2005360200200120cd013602a408200141093a00a008200141a0086a103d02402005450d00200a200541286c6a21034100210c200a21020340200141a0086a41186a2205200241186a290300370300200141a0086a41106a22cd01200241106a290300370300200b200241086a290300370300200120022903003703a008200241206a2903002104410e10222209450d1f200941066a410029009893423700002009410029009293423700002009410e411c10212206450d202006200c36000e412010222209450d21200920012903a008370000200941186a2005290300370000200941106a20cd01290300370000200941086a200b2903003700002009412041c00010212209450d2220092004370020200641122009412810032009102020061020200c41016a210c200241286a22022003470d000b0b02402007450d00200a10200b410e10222202450d46200241066a410029009893423700002002410029009293423700002002410e411c10212202450d47200241106a41002d00a293423a0000200241002f00a093423b000e024002402002411141c8d7c400410041001001417f460d00200141003602a00820024111200141a0086a41044100100141016a41044d0d3a20012802a008210b20021020200b200c4d0d01200c21090340410e10222202450d29200241066a41002900989342220437000020024100290092934222083700002002410e411c10212202450d2a200241106a41002d00a293423a0000200241002f00a093423b000e02402002411141c8d7c400410041001001417f460d00200141003602a00820024111200141a0086a41044100100141016a41044d0d1c20012802a0082106200210200240200620094d0d00410e10222202450d3e200241066a2004370000200220083700002002410e411c10212202450d3f2002200936000e200241121009200210200b200b200941016a2209470d010c030b20021020200b200941016a2209470d000c020b0b200210200b410e10222202450d48200241066a410029009893423700002002410029009293423700002002410e411c10212202450d49200241106a41002d00a293423a0000200241002f00a093423b000e2001200c3602a00820024111200141a0086a410410032002102020014190056a41086a22024200370300200142003703900541c898c200411d20014190056a1002200141f8036a41086a200229030037030020012001290390053703f803200141f8036a411010090c010b2007450d00200a10200b20014190056a41086a22024200370300200142003703900541e8c8c300411420014190056a1002200141f8036a41086a200229030037030020012001290390053703f80302400240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d2320012903a00822044200510d40420021ce0120002004824200520d040c010b420021ce0120004201824200520d030b20014190056a41086a220220ce01370300200120ce013703900541fca6c300410c20014190056a1002200141f8036a41086a2209200229030037030020012001290390053703f80302400240200141f8036a411041c8d7c400410041001001417f460d00200142003703a808200142003703a008200141f8036a4110200141a0086a4110410010012206417f460d442006410f4d0d44200141a8086a290300210420012903a00821080c010b42002108420021040b200120083703b006200120043703b806200141b8086a2004370300200141a0086a41106a2008370300200141a0086a41086a41013a00002001410a3a00a008200141a0086a103d200141003a009007420021cf01200142003703b807200142003703b0072002420037030020014200370390054194c9c300411220014190056a10022009200229030037030020012001290390053703f80302400240200141f8036a411041c8d7c400410041001001417f460d00200142103702b4052001200141f8036a3602b005200141a0086a200141b0056a10aa0120012802a00822d001450d4a20012902a40821cf010c010b410421d0010b410021d101410021d20120cf01422088a722d301450d01200141a9086a21d401200141d8046a21d501412021d60120014198046a41206a21d701410821d801200141b0056a41086a21d901410021da01410221db01410121dc01420121dd0141e00021de01410421df01411221e001411021e101412421e201411821e301420021e401411621e501427f21e601200141d8086a21e701200141d0086a21e801200141cc086a21e901410a21ea01417f21eb01410021ec01410021d201410021cd01410321570c610b024002400240024020d201450d0020d00120cd0120db01746a210220d00120cd0120ec016a20db01746a2109034020cd0120d3014f0d1d200141b0056a2002280200220610f70120012903b00520dd01520d0220014198046a20d90120de011084041a20012903b006220d200129039804220e54200141b0066a20d8016a290300220820014198046a20d8016a29030022045420082004511b450d03200120dc013a00900720ec0120cd016a220620d3014f0d2620092002280200360200200220df016a2102200920df016a210920d30120cd0120dc016a22cd01470d000c050b0b20d00120cd0120db01746a2102034020cd0120d3014f0d1c200141b0056a2002280200220610f70120012903b00520dd01520d0120014198046a20d90120de011084041a20012903b006220d200129039804220e5a200141b0066a20d8016a290300220820014198046a20d8016a29030022045a20082004511b0d02200120dc013a009007200220df016a210220d30120cd0120dc016a22cd01470d000c030b0b20ec0120eb016a21ec0120d20120dc016a21d20120cd0120dc016a22cd0120d301470d560c020b20cd0120dc016a21cd012001200d200e7d3703b0062001200820047d200d200e54ad7d3703b80620e00110222202450d49200220e1016a20da012f0098a7433b0000200220d8016a20da01290090a743370000200220da01290088a743370000200220e00120e20110212202450d4a2002200636001220014190056a20e3016a220920e40137030020014190056a20e1016a220c20e40137030020014190056a20d8016a220b20e401370300200120e40137039005200220e50120014190056a1000200141f8036a20e3016a2009290300370300200141f8036a20e1016a200c290300370300200141f8036a20d8016a200b29030037030020012001290390053703f803200141f8036a20d60110092002102020d70120014198046a20e1016a29030020014198046a20e3016a29030010e501200141186a20d501200e200410f801200141b0076a20d8016a220220e60120022903002208200141186a20d8016a2903007c20012903b007220d20012903187c2214200d542202ad7c220d2002200d200854200d2008511b22021b370300200120e601201420021b3703b00720e701200437030020e801200e370300200141a0086a20d8016a20db013a000020e901200636020020d40120d50129000037000020d40120d8016a20d50120d8016a29000037000020d40120e1016a20d50120e1016a29000037000020d40120e3016a20d50120e3016a290000370000200120ea013a00a008200141a0086a103d20ec0120eb016a21ec0120d20120dc016a21d20120cd0120d301470d540c010b410021d2010b20014190056a41086a2216420037030020014200370390054194c9c300411220014190056a1002200141f8036a41086a201629030037030020012001290390053703f803200120d1013602a808200142013703a008200120d30120d2016b22163602b005200141b0056a200141a0086a103e024002402016450d0020d30141027420d2014102746b2184014100200141a0086a41086a22860128020022166b214620012802a408212220d001211b0340201b28020021480240024002400240202220466a41044f0d00201641046a22022016490d6a20224101742209200220022009491b22094100480d6a2022450d0120012802a00820222009102122020d020c280b20012802a00821020c020b200910222202450d260b200120093602a408200120023602a008200921220b201b41046a211b208601201641046a2209360200200220166a20483600002046417c6a214620092116208401417c6a2284010d000c020b0b200141a0086a41086a280200210920012802a408212220012802a00821020b200141f8036a411020022009100302402022450d00200210200b024020cf01a7450d0020d00110200b20012903b007200141b0076a41086a29030010f901024020012d0090070d004200217f20014190056a41086a22164200370300200142003703900541a6c9c300410d20014190056a1002200141f8036a41086a201629030037030020012001290390053703f8030240200141f8036a411041c8d7c400410041001001417f460d00200141003602a008200141f8036a4110200141a0086a41044100100141016a41044d0d4320013502a008217f0b200141086a20012903b00622304200207f4200108804200141b0066a41086a22162016290300227f207f420042edeb82bdef9804200129030842c0843d8020012903104200521b22042030564100207f501b22161b22347d20302030200420161b227f54ad7d37030020012030207f7d3703b006200141b8086a2034370300200141b0086a207f370300200141a0086a41086a41033a00002001410a3a00a008200141a0086a103d0b20012903b0062130200141b8086a200141b0066a41086a2216290300370300200141a0086a41106a2030370300200141a0086a41086a41043a00002001410a3a00a008200141a0086a103d2016290300213020012903b006217f20014190056a41086a22164200370300200142003703900541fca6c300410c20014190056a1002200141f8036a41086a201629030037030020012001290390053703f803200120303703a8082001207f3703a008200141f8036a4110200141a0086a411010030b20014190056a41086a221620ce01370300200120ce013703900541f0e2c200411120014190056a1002200141a0086a41086a201629030037030020012001290390053703a008200141a0086a41101009200141a0096a24000f0b411041011023000b412041011023000b41c00041011023000b411b41011023000b413b41011023000b41f60041011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b410010fa01000b200220042008566a10fa01000b4194c4c100102f000b419ca7c300102f000b419ca7c300102f000b20cd0141011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b200541011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41ccc4c10020cd0120d30110b501000b1031000b410e41011023000b411c41011023000b412041011023000b41c00041011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41a4c5c100200620d30110b501000b200941011023000b410e41011023000b411c41011023000b411741011023000b412e41011023000b419a88c00041331039000b419a88c00041331039000b200641081023000b411841011023000b413841011023000b419a88c00041331039000b411c41011023000b413c41011023000b419a88c00041331039000b200941081023000b418dc1c00041261039000b418cb8c400102f000b41e4c1c000102f000b41d4b2c0002002200a10b501000b419a88c00041331039000b410e41011023000b411c41011023000b41c0b8c400102f000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41fcc8c300102f000b410841081023000b410841081023000b41d4b2c0002002200a10b501000b419a88c00041331039000b419a88c00041331039000b410e41011023000b411c41011023000b410e41011023000b411c41011023000b419a88c00041331039000b411241011023000b412441011023000b200241081023000b200641081023000b200241081023000b200241081023000b410021570c0a0b410021570c0a0b410021570c0a0b410121570c0b0b410221570c0c0b410321570c0d0b410321570c0d0b410121020c0d0b410021020c0c0b410121020c0b0b410221020c0a0b410321020c090b410321020c080b410321020c070b410321020c060b410321020c050b410321020c040b410321020c030b410321020c020b410321020c010b410321020c000b0b1024000ba00905027f017e037f027e097f230041d0006b220124004108210242002103200141186a41086a220442003703002001420037031841c0c8c000410d200141186a1002200141086a41086a2004290300370300200120012903183703084100210502400240024002400240024002400240024002400240200141086a411041c8d7c400410041001001417f460d00200142103702442001200141086a360240200141186a200141c0006a108a0220012802182202450d05200129021c2103200141186a41206a200041206a290300370300200141186a41186a200041186a290300370300200141186a41106a200041106a290300370300200141186a41086a200041086a290300370300200120002903003703182003422088a722052003a7470d02200141186a210020052003a7460d010c070b200141186a41206a200041206a290300370300200141186a41186a200041186a290300370300200141186a41106a200041106a2903003703002004200041086a29030037030020012000290300370318200141186a210041004200a7470d060b200541016a22042005490d0720054101742206200420042006491bad220742287e2208422088a70d072008a722044100480d072005450d012002200541286c200410212202450d020c040b200141186a21000c050b2004102222020d020b200441081023000b419a88c00041331039000b20034280808080708320078421030b2003422088a721050b2002200541286c22066a22042000290300370300200441206a200041206a290300370300200441186a200041186a290300370300200441106a200041106a290300370300200441086a200041086a290300370300200141186a41086a220942003703002001420037031841c0c8c000410d200141186a1002200141086a41086a20092903003703002001200129031837030820014100360248200142013703402001200541016a220a360218200141186a200141c0006a103e02400240200a450d00200641286a210b200141c0006a41086a220c28020021002001280244210d200221060340200141186a2006109a012001280218210e0240024002400240200d20006b2009280200220f4f0d002000200f6a22042000490d07200d4101742210200420042010491b22114100480d07200d450d012001280240200d2011102122100d020c080b2000200f6a2104200128024021100c020b201110222210450d060b20012011360244200120103602402011210d0b200c2004360200201020006a200e200f1084041a0240200128021c450d00200e10200b200641286a210620042100200b41586a220b0d000c020b0b200141c0006a41086a28020021042001280244210d200128024021100b200141086a41102010200410030240200d450d00201010200b0240200a450d00200541286c41286a2104200221000340024020002d00002206450d00024020064101470d00200041086a280200450d01200041046a2802001020200041286a2100200441586a22040d020c030b200041106a280200450d002000410c6a28020010200b200041286a2100200441586a22040d000b0b02402003a7450d00200210200b200141d0006a24000f0b1024000b201141011023000bbd0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1002200341086a2005290300370300200320032903103703000240024002402003411041c8d7c400410041001001417f460d002003420037031020034110200341106a41084100100141016a41084d0d0220032903102106200341101009420121040c010b0b2000200437030020002006370308200341206a24000f0b419a88c00041331039000beeab012e017f027e027f037e0e7f017e027f017e037f017e037f037e177f027e027f017e097f027e117f027e1f7f027e057f017e087f037e0e7f037e017f017e137f017e027f027e077f027e027f017e077f017e0b7f017e047f027e0a7f027e230041c0096b2202240002400240024002400240024002400240024002402001450d00200241e0056a41086a22014200370300200242003703e00541fc95c2004117200241e0056a100220024198046a41086a2001290300370300200220022903e00537039804024002400240024002400240024020024198046a411041c8d7c400410041001001417f460d00200242003703e80720024198046a4110200241e8076a41084100100141016a41084d0d0220022903e80721030c010b420321030b200241e0056a41086a22014200370300200242003703e00541b8adc2004115200241e0056a1002200241d8046a41086a2001290300370300200220022903e0053703d80402400240200241d8046a411041c8d7c400410041001001417f460d00200242003703e807200241d8046a4110200241e8076a41084100100141016a41084d0d034200210420022903e80720037e22034200510d010c050b4200210442e80720037e22034200520d040b200241e0056a41086a22012004370300200220043703e00541a299c400411c200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e0060240200241e0066a411041c8d7c400410041001001417f460d00200242003703f007200242003703e807200241e0066a4110200241e8076a4110410010012201417f460d032001410f4d0d03200241f0076a290300210320022903e80721040c050b420021030c040b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b2000200320032000541b22002004510d0442002104200241e0056a41086a22014200370300200242003703e00541a299c400411c200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e0062003421086200080210002400240200241e0066a411041c8d7c400410041001001417f460d00200242003703f007200242003703e807200241e0066a4110200241e8076a4110410010012201417f460d052001410f4d0d05200241f0076a290300210320022903e80721040c010b420021030b20024188046a200420032000420010880420022903880442108820024190046a2903002200423086842104200042108821030b200241e0056a41086a22014200370300200242003703e00541d899c4004118200241e0056a1002200241e0066a41086a22052001290300370300200220022903e0053703e00602400240200241e0066a411041c8d7c400410041001001417f460d00200242003703f007200242003703e807200241e0066a4110200241e8076a4110410010012206417f460d032006410f4d0d03200241f0076a290300210720022903e80721000c010b42002100420021070b20014200370300200242003703e00541d899c4004118200241e0056a100220052001290300370300200220022903e0053703e0062002200020047c22043703e8072002200720037c2004200054ad7c3703f007200241e0066a4110200241e8076a411010030b200241e0056a41086a22014200370300200242003703e00541a4adc2004114200241e0056a1002200241e0066a41086a22052001290300370300200220022903e0053703e006420021040240024002400240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d0120022903e80721040b20014200370300200242003703e00541f4edc3004115200241e0056a100220052001290300370300200220022903e0053703e0060240200241e0066a411041c8d7c400410041001001417f460d00200241e0066a411010090c070b200241e0056a41086a22014200370300200242003703e00541f099c400411b200241e0056a1002200241e0066a41086a22052001290300370300200220022903e0053703e006420021000240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d0220022903e80721000b20014200370300200242003703e005418b9ac4004116200241e0056a100220052001290300370300200220022903e0053703e00602400240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d0420022903e80722034200520d0141a49ac400102f000b42e80721030b200420007d2003824200520d070c060b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41c099c400102f000b42002104200241e0056a41086a22014200370300200242003703e00541d899c4004118200241e0056a100220024198046a41086a2001290300370300200220022903e0053703980402400240024002400240024020024198046a411041c8d7c400410041001001417f460d00200242003703f007200242003703e80720024198046a4110200241e8076a4110410010012201417f460d012001410f4d0d01200241f0076a290300210820022903e807210920024198046a41101009420121042009200884500d030c040b420042008450450d030c010b419a88c00041331039000b410121010c020b410121010c010b024002402004a7450d00200241e0056a41086a22014200370300200242003703e00541bc9ac4004116200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e0064100210a02400240024002400240200241e0066a411041c8d7c400410041001001417f460d00200242103702dc042002200241e0066a3602d804200241e8076a200241d8046a103820022802e807220b450d0220022802ec07210c200241f0076a280200220a41057422010d010c040b4101210b4100210c41004105742201450d020b200b20016a210d4120210e4112210f41102110410021114108211241322113412a21144118211541222116411a21174200211841c8d7c4002119417f211a4201211b20024190086a211c4130211d2002418c086a211e4220211f200b2120410021210c040b419a88c00041331039000b410021010c030b410021010c020b410121010c010b410321010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010212120b200241e8026a20092008200aad2203420010880420024180086a2008370300200241e8076a41106a2009370300200241e8076a41086a41003a0000200241043a00e807200241e8076a103d200241e0056a41086a22014200370300200242003703e00541d29ac4004111200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e006200241e0066a411041c8d7c4004100410010012101200241e8026a41086a290300210420022903e8022100024002402001417f460d00200242003703f007200242003703e807200241e0066a4110200241e8076a4110410010012201417f460d0f2001410f4d0d0f200241f0076a290300210720022903e80721230c010b42002123420021070b200241d8026a202320072003420010880402402000200484500d0020022903d8022203200241d8026a41086a290300222384500d0042002107200241e0056a41086a22014200370300200242003703e005418feec0004116200241e0056a100220024198046a41086a22052001290300370300200220022903e005370398040240024020024198046a411041c8d7c400410041001001417f460d00200242003703f007200242003703e80720024198046a4110200241e8076a4110410010012206417f460d112006410f4d0d11200241f0076a290300212520022903e80721240c010b42002124420021250b200241c8026a202420037d202520237d2024200354ad7d20032023108704200241b8026a20022903c802200241c8026a41086a2903002000200410880420014200370300200242003703e00541fca6c300410c200241e0056a100220052001290300370300200220022903e0053703980420024198046a411041c8d7c4004100410010012101200241b8026a41086a290300210420022903b8022100024002402001417f460d00200242003703f007200242003703e80720024198046a4110200241e8076a4110410010012201417f460d122001410f4d0d12200241f0076a290300210320022903e80721070c010b420021030b200241e0056a41086a22014200370300200242003703e00541fca6c300410c200241e0056a100220024198046a41086a2001290300370300200220022903e005370398042002200720007c22003703e8072002200320047c2000200754ad7c3703f00720024198046a4110200241e8076a411010030b200c450d12200b1020410121010c3d0b200241e0056a41086a22014200370300200242003703e00541e39ac4004112200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e00602400240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d0320022903e80742017c21040c010b420121040b200241e0056a41086a22014200370300200242003703e00541e39ac4004112200241e0056a1002200241e0066a41086a22052001290300370300200220022903e0053703e006200220043703e807200241e0066a4110200241e8076a4108100320014200370300200242003703e00541f59ac400411a200241e0056a100220052001290300370300200220022903e0053703e0060240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d03200220022903e80722043703d804200241e0056a41086a22014200370300200242003703e005418b9ac4004116200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e00602400240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d06200420022903e807520d010c020b200442e807510d010b200241e0056a41086a22014200370300200242003703e005418b9ac4004116200241e0056a1002200241e0066a41086a22052001290300370300200220022903e0053703e006200220043703e807200241e0066a4110200241e8076a4108100320014200370300200242003703e00541a4adc2004114200241e0056a100220052001290300370300200220022903e0053703e006420021040240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d0820022903e80721040b20014200370300200242003703e00541f099c400411b200241e0056a100220052001290300370300200220022903e0053703e006200220043703e807200241e0066a4110200241e8076a410810030b200241e0056a41086a22014200370300200242003703e005418f9bc4004116200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e006410021260240200241e0066a411041c8d7c400410041001001417f460d00200241003602e807200241e0066a4110200241e8076a41044100100141016a41044d0d0520022802e80721260b200241e0056a41086a22014200370300200242003703e00541a59bc400411d200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e006024002400240200241e0066a411041c8d7c400410041001001417f460d00200241003602e80741012127200241e0066a4110200241e8076a41044100100141016a41044d0d0820022802e807220141024f0d010c020b410421010b200121270b200241d8046a41186a22014200370300200241d8046a41106a22054200370300200241d8046a41086a22064200370300200242003703d80441dceec300411a200241d8046a1000200241e0066a41186a2001290300370300200241e0066a41106a2005290300370300200241e0066a41086a2006290300370300200220022903d8043703e006410021050240200241e0066a412041c8d7c400410041001001417f460d00200241e0056a41186a4200370300200241e0056a41106a4200370300200241e0056a41086a4200370300200242003703e005200241e0066a4120200241e0056a4120410010012201417f460d082001411f4d0d08200241e8076a41186a2201200241e0056a41186a290300370300200241e8076a41106a2205200241e0056a41106a290300370300200241e8076a41086a2206200241e0056a41086a290300370300200220022903e0053703e807200241d8046a41186a2001290300370300200241d8046a41106a2005290300370300200241d8046a41086a2006290300370300200220022903e8073703d804410121050b412810222201450d0a200120053a0004200141c8d7c400360200200120022903d804370005200120022f0098093b00252001410d6a200241d8046a41086a2205290300370000200141156a200241d8046a41106a22062903003700002001411d6a200241d8046a41186a2228290300370000200141276a2002419a096a2d00003a0000202842003703002006420037030020054200370300200242003703d80441c29bc400411a200241d8046a1000200241e0066a41186a2028290300370300200241e0066a41106a2006290300370300200241e0066a41086a2005290300370300200220022903d8043703e006410021050240200241e0066a412041c8d7c400410041001001417f460d00200241e0056a41186a4200370300200241e0056a41106a4200370300200241e0056a41086a4200370300200242003703e005200241e0066a4120200241e0056a4120410010012205417f460d092005411f4d0d09200241e8076a41186a2205200241e0056a41186a290300370300200241e8076a41106a2206200241e0056a41106a290300370300200241e8076a41086a2228200241e0056a41086a290300370300200220022903e0053703e807200241d8046a41186a2005290300370300200241d8046a41106a2006290300370300200241d8046a41086a2028290300370300200220022903e8073703d804410121050b412810222228450d0b202820053a0004202841c8d7c400360200202820022903d804370005202820022f0098093b00252028410d6a200241e0046a290300370000202841156a200241d8046a41106a2903003700002028411d6a200241d8046a41186a290300370000202841276a20024198096a41026a2d00003a0000200241003602c004200242083703b804200241f8086a41186a200241b8096a3602002002410036028809200241dc9bc4003602fc08200220013602f8082002200241b8046a36028c092002200241b8096a360284092002200241b8096a36028009200241e8076a200241f8086a10f702024002400240024020022d00e80822054102470d00200241023a00e0070c010b200241e0056a200241e8076a4180011084041a2002200241e8076a4184016a28000036009b04200220022800e90836029804200241e8076a41046a200241e0056a4180011084042121200241f8086a41106a4101360200200241d8046a200241e8076a4184011084041a200241003602e807200241e8076a410472200241d8046a4184011084041a200241e8076a4188016a20053a0000200241f1086a200228029804360000200241f4086a200228009b04360000200241e0066a2002418c096a200241e8076a104020022d00e0074102470d010b41002129200241003602d004200242083703c804200110204108212a4108212b4108212c4100212d0c010b200241e8076a200241e0066a4188011084041a200241d8046a200110ba034188011022222a450d10202a200241e8076a4188011084041a20024198096a41186a200241f8086a41186a28020036020020024198096a41106a222e200241f8086a41106a29030037030020024198096a41086a200241f8086a41086a290300370300200220022903f80837039809200241e8076a20024198096a10f702024002400240024020022d00e808222f4102470d004101212d410121290c010b200241f1086a212d200241e8076a410472212b200241ac096a2130200241e9086a212c202e280200213141022106418801210541002101410121290340200241e0056a200241e8076a4180011084041a2002202c41036a28000036009b042002202c280000360298042021200241e0056a4180011084041a202e203120016a222241016a360200200241d8046a200241e8076a4184011084041a200220223602e807202b200241d8046a4184011084041a200241e8076a4188016a202f3a0000202d200228029804360000202d41036a200228009b04360000200241e0066a2030200241e8076a1040200241e0066a4180016a2d00004102460d02200241e8076a200241e0066a4188011084041a0240200141016a22222029470d00200241d8046a200228029809200228029c09280210110500202241016a222f2022490d442006202f202f2006491b2229ad4288017e2204422088a70d442004a7222f4100480d4402402001417f460d00202a2005202f1021222a0d010c100b202f1022222a450d0f0b202a20056a200241e8076a4188011084041a200641026a210620054188016a2105200241e8076a20024198096a10f70220222101200241e8076a4180016a2d0000222f4102470d000b202241016a212d0b202a212b200241e0076a41023a00000c010b200141016a212d202a212b0b2002280298092205200228029c09220128020011060002402001280204450d00200510200b2002202d3602d004200220293602cc042002202a3602c804202b212c0b200241e0066a20281080032002280280072230450d2241012132200241d8046a410172213341282134200241e0066a41286a213541242136200241e0066a41246a213741182138411021394108213a4120213b200241e8076a41206a213c42d000213d4220213e417f213f410521404200214141162142418feec00021434100214441c8d7c400214541d000214641342147413c214841c4002149410f214a427e214b427f214c418801214d419f04214e41e000214f41e801215041f002215141f803215241a004215341c800215441c0002155413821564130215741cc002158410121210c140b209b01450d22209b01208e016a219b01209c0120706a2101209c0120686a2265219c0120012d00000d112065208e016a229c0120736a219d012065209a01470d170c160b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b202f41081023000b412841041023000b412841041023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41880141081023000b024002400240024002400240024002400240024002400240024002400240024002400240024020210e050001020304040b2020450d11200f10222201450d0a200120106a20112f00cdcf433b0000200120126a20112900c5cf43370000200120112900bdcf433700002001200f201310212201450d0b20012020290000370012200120146a202020156a290000370000200120166a202020106a290000370000200120176a202020126a290000370000200241d8046a20156a22052018370300200241d8046a20106a22062018370300200241d8046a20126a22222018370300200220183703d80420012013200241d8046a1000200241e0056a20156a2005290300370300200241e0056a20106a2006290300370300200241e0056a20126a2022290300370300200220022903d8043703e00502400240200241e0056a200e2019201120111001201a460d002002201f3702ec072002200241e0056a3602e80720024180046a200241e8076a108e01200228028004450d0b200241e8036a200241e8076a108c0120022903e803a7450d0b200241e8036a20106a290300210420022903f00321030c010b42002103420021040b2001102042002100200242003703e806200242003703e006024002402009200320092003200954200420085420042008511b22011b22237d220320082004200820011b22247d2009202354ad7d220784500d00200241e8076a202010b201200241e8076a20126a2903002204201820022903e8072200201b5620042018522004501b22011b21042000201b20011b2100200241e8076a200e6a28020021060240201c2802002201450d002000200484500d1020062001201d6c6a2105200621010340200241c0036a2001290300200120126a29030020032007108804200241b0036a20022903c003200241c0036a20126a29030020002004108704200241d0036a200120106a20022903b003200241b0036a20126a29030010bb03200241e0066a20022903d00320022903d803200241d0036a20106a29030010a0022001201d6a22012005470d000b0b20002004842018510d0e200241a0036a200241e8076a20106a290300200241e8076a20156a2903002003200710880420024190036a20022903a003200241a0036a20126a2903002000200410870420024190036a20126a29030021042002290390032100201e280200450d01200610200c010b420021040b200241f8026a2020200020237c2203200420247c2003200054ad7c10bb03200241e0066a20022903f802200229038003200241f8026a20106a29030010a00220022903e006200241e0066a20126a29030010f9012020200e6a220121202001200d470d0f410021010c3d0b203528020021592037280200215a20024198096a20386a225b200241e0066a20386a29030037030020024198096a20396a225c200241e0066a20396a29030037030020024198096a203a6a225d200241e0066a203a6a290300370300200220022903e00637039809200241d8046a20024198096a10f80202400240024020022d00d8042032470d00200241e0056a20386a203320386a290000370300200241e0056a20396a203320396a290000370300200241e0056a203a6a2033203a6a290000370300200220332900003703e005200241e8076a200241e0056a10b101203c2802002201450d01200241e8076a203a6a290300215e20022903e807215f200241e8076a20366a280200450d02200110200c020b203c20443602000b4200215f4200215e0b2059ad203d7e2204203e88a70d2a2004a72201203f4c0d2a0240024002402001450d00200110222260450d0920592040742201450d020c010b4108216020592040742201450d010b203020016a21614100216220302163410021640c1a0b410021620c210b0240202d450d00202b20706a2101206921050340024020012d0000450d00200120686a21012005208e016a22050d010c020b20012093016a290300220420900120042090015620012092016a2903002204208f01522004501b22061b22002004208f0120061b220484208f01510d04200241e8016a2091012091012000200410870420012094016a200241e8016a206c6a2903003703002001208d016a20022903e801370300200120686a21012005208e016a22050d000b0b20022802b804229601206d280200229701206e6c6a219801209701450d15209601219901410121640c190b20a8012802282201450d1e20a80128022022c901200120a7016c6a21ca0120a80120aa016a21cb01410321640c190b20ce0120d2016a290300210420ce012903002100200241e0066a20d3016a222e20ce0120de016a290000370300200241e0066a20d4016a22a30120ce0120df016a290000370300200241e0066a20d2016a22a50120ce0120e0016a290000370300200220ce012900603703e00620ce01280228222fad20e1017e220320e20188a70d272003a7220520e3014c0d2720ce0120d3016a290300210320ce01290310210720ce01280220210102400240024002402005450d00200510222221450d08202f450d020c010b41082121202f450d010b2001202f20d7016c6a212241002106202121050340200520012903003703002005200120d2016a290300370308200520d1016a200120d1016a290300370300200520cc016a200120cc016a290300370300200520d3016a200120d3016a290300370300200520d4016a200120d4016a290300370300200520d7016a2105200620d5016a2106200120d7016a22012022470d000c020b0b410021060b200241e8076a20d3016a200337030020dd01200737030020e401200636020020e501202f36020020e6012021360200200220003703e807200220043703f00720e70110222201450d01200120e8016a20cf012900fdee43370000200120cf012900f6ee43370000200120e70120e90110212231450d02203120022903e00637000f203120ea016a202e290300370000203120eb016a20a301290300370000203120ec016a20a501290300370000200241d8046a20d3016a220120ed01370300200241d8046a20d4016a220520ed01370300200241d8046a20d2016a222220ed01370300200220ed013703d804203120e901200241d8046a1000200241e0056a20d3016a2001290300370300200241e0056a20d4016a2005290300370300200241e0056a20d2016a2022290300370300200220022903d8043703e005202220cf01360200200220ee013703d8042002200241e8076a3602f808200241f8086a200241d8046a109801200220dd013602f808200241f8086a200241d8046a10980120e6012802002101200220e40128020022053602f808200241f8086a200241d8046a103e024002402005450d00200520d7016c212f0340024002400240024020022802dc042206202228020022056b20cc014f0d00200520cc016a22212005490d42200620d50174222e20212021202e491b222120cf01480d422006450d0120022802d80420062021102122060d020c060b20022802d80421060c020b202110222206450d040b200220213602dc04200220063602d8040b2022200520cc016a360200200620056a220520d2016a200120d3016a290000370000200520d4016a200120cc016a290000370000200520d3016a200120d1016a2900003700002005200120d4016a290000370000200220013602f808200241f8086a200241d8046a109801200120d7016a2101202f20d6016a222f0d000b0b200020d001542101200420dc01512105200420dc0154210620022802dc04212f200241e0056a20cc0120022802d8042221202228020010030240202f450d00202110200b2001200620051b210120ce0120da016a21ce0120311020024020e501280200450d0020e60128020010200b200420dc0120011b21dc01200020d00120011b21d00120ce0120db01470d0d200241e0056a41086a22654200370300200242003703e00541d29ac4004111200241e0056a1002200241e0066a41086a2065290300370300200220022903e0053703e006200220dc013703f007200220d0013703e807200241e0066a4110200241e8076a4110100320d8014188016c22654188016d217a024002402065450d00207aad4205862204422088a70d3e2004a722014100480d3e2001102222d401450d0d20d801450d010c1d0b410121d4014100217a20d8010d1c0b4100217320d9010d1c0c1d0b202141011023000b41d8d0c400102f000b410f41011023000b412f41011023000b200141081023000b200541081023000b419a88c00041331039000b411241011023000b413241011023000b41c099c400102f000b41c099c400102f000b200141011023000b410021210c040b410421210c050b410021010c2b0b410121010c2a0b410221010c290b410321010c280b410321010c270b410321010c260b410021010c050b410221010c040b410121010c030b410321010c020b410321010c010b410321010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010204040b209501206b6a219501202c202d20686c6a219a012069219b01202c2165024002400240024003402065219c01209a0120656b206f4d0d07209c0120706a2d0000450d01209c0120716a2d0000450d02209c0120746a2d0000450d03209b0120766a219b01209c0120776a2165209c0120786a2d00000d000b410321010c030b209c0120736a219d01209c0120686a2265209a01470d160c150b209c0120726a2165410121010c010b209c0120756a2165410221010b209c01200120686c6a229c0120736a219d012065209a01460d11410121010c270b209d01206c6a2903002104209d0129030021000340206520686a21010240206520706a2d0000450d0020012165206a2001470d010c150b20652085016a29030022032004206520736a2903002207200054200320045420032004511b22051b21042007200020051b21002065209c0120051b219c0120012165206a2001470d000b410221010c260b209c01206b3a008001209701450d02209c012085016a219e01209c01208c016a219f01410221640c160b410221010c440b02400240024020640e0400010204040b20632201450d2a2001203b6a2163202c202d204d6c6a212f41002105202c2106024002400340202f20066b204e4d0d012006204f6a22222001460d02200520222001203b10860422222044476a21052022450d02200620506a22222001460d02200520222001203b10860422222044476a21052022450d02200620516a22222001460d02200520222001203b10860422222044476a21052022450d02200620526a22222001460d02200520222001203b10860422222044476a2105200620536a210620220d000c020b0b02402006202f460d0003402006204f6a22062001460d02200520062001203b10860422222044476a21052022450d02200620346a2206202f470d000b0b20632061470d0c0c2b0b202c2005204d6c22066a22222903402104202220546a2903002100200241e0056a203a6a22222041370300200220413703e00520432042200241e0056a100220024198046a203a6a2022290300370300200220022903e0053703980402400240024020024198046a20392045204420441001203f460d00200220413703f007200220413703e80720024198046a2039200241e8076a2039204410012222203f460d082022204a4d0d08420121034200210720022903e8072224204b54200241e8076a203a6a29030022235020234201511b0d01200241a8026a20242023204c2041108704200241a8026a203a6a290300210720022903a8022103202d20054b0d020c090b42002107420121030b202d20054d0d070b20024198026a205f205e20032007108704202c20066a220620546a204c200020042002290398027c22032004542222ad7c220720222007200054200320045a1b22221b3703002006204c200320221b370340200241e8076a20386a2206200120386a290000370300200241e8076a20396a2222200120396a290000370300200241e8076a203a6a222f2001203a6a290000370300200220012900003703e807024020592062470d00205920326a22012059490d482059203274222e20012001202e491b2201ad203d7e2204203e88a70d482004a7222e2044480d48024002402059450d002060205920466c202e102122600d010c0a0b202e10222260450d090b200121590b2060206220466c6a220120443602242001200536022020012041370300200120386a2041370300200120396a20413703002001203a6a2041370300202f2903002104202229030021002006290300210320022903e8072107200120443a0048200120556a2003370300200120566a2000370300200120576a200437030020012007370328200120586a200228009b043600002001200228029804360049206220326a216220632061470d0c0c2a0b02402099012802282201450d002001206e6c2106209901280220208b016a21010340202d200128020022054d0d050240202c200520686c6a22052d0080010d002005290340220420052083016a290300220084500d0020024198016a209001208f012099012903002203208f01108804200241a8016a209901206c6a2903002207208f01208f01208f01108804200241d8016a2003208f01208f01208f01108804200241c8016a20910120022903d801200720022903b0018420022903a00184208f0152200241d8016a206c6a290300220320022903a8012002290398017c7c22072003547222221b209101200720221b20042000108704200241b8016a209901207a6a290300208f0120022903c801200241c8016a206c6a29030010880420052085016a222220910120222903002204200241b8016a206c6a2903007c2005290330220020022903b8017c22032000542222ad7c22002022200020045420002004511b22221b3703002005209101200320221b3703300b2001206e6a21012006208d016a22060d000b0b209901206e6a229901209801470d0c410021010c240b209601206e6a212e02402096012802282205450d0020960128022021012005206e6c210503400240209e012001460d0020012087016a209f01208b01108604450d002001206e6a21012005208d016a22050d010c020b209601207a6a22062903002104209e0129030021002001209c0120736a22222903002203209601207c6a222f29030022077d3703002001200020047d2003200754ad7d370308202229030021042006209e01290300370300202f20043703002001206e6a21012005208d016a22050d000b0b202e219601202e209801470d0c0b200241e8076a207a6a222e209c0120796a290300370300207d209c01207b6a290300370300200241e8076a206c6a222b209c01207e6a2903003703002002209c012903603703e807209c01280228222fad207f7e220420800188a70d302004a722052081014c0d30209c01207a6a2903002104209c01206c6a2903002100209c012802202101209c012903102103209c01290300210702400240024002402005450d00200510222221450d09202f450d020c010b41082121202f450d010b2001202f20736c6a2122410021062021210503402005200129030037030020052001206c6a29030037030820052087016a20012087016a2903003703002005208b016a2001208b016a2903003703002005207a6a2001207a6a2903003703002005207c6a2001207c6a290300370300200520736a21052006206b6a2106200120736a22012022470d000c020b0b410021060b209c0120706a2d00002131209c012082016a2903002123209c01206e6a2903002124209c012083016a2903002125209c012084016a29030021a001209c012085016a29030021a101209c0120736a29030021a201024002400240024020022802ac04200241a8046a206c6a22052802002201470d002001206b6a22222001490d482001206b7422a3012022202220a301491b22a301ad2086017e22a40120800188a70d4820a401a722a5012067480d482001450d0120022802a804200120686c20a501102122220d020c0a0b20022802a80421220c020b20a50110222222450d080b200220a3013602ac04200220223602a804200528020021010b2022200120686c6a22012024370350200120a001370340200120a20137033020012003370310200120003703082001200737030020012021360220200120022903e807370360200120312067473a008001200120022800e0063600810120012082016a202337030020012083016a202537030020012085016a20a1013703002001207a6a200437030020012087016a200636020020012088016a202f3602002001207e6a202b2903003703002001207b6a207d290300370300200120796a202e29030037030020012089016a208a0128000036000020052005280200206b6a360200202c212b2095012066490d070c290b20c901222220ab016a2105202220a7016a21c90120022802a804220620ac0128020020ad016c6a212e0240024002400340202e200622016b20ae014d0d03200120af016a22062005460d182006200520b001108604450d18200120b1016a22062005460d012006200520b001108604450d01200120b2016a22062005460d022006200520b001108604450d020240200120b4016a222f2005460d00200120b6016a2106202f200520b0011086040d010b0b200120b5016a21010c170b200120ad016a21010c160b200120b3016a21010c150b2001202e460d150340200120af016a22062005460d152006200520b001108604450d15200620ab016a2201202e470d000c160b0b419487c0002005202d10b501000b419a88c00041331039000b419487c0002005202d10b501000b202e41081023000b200541081023000b20a50141081023000b41022121410321010c3a0b410021640c070b410021640c070b410121640c070b410221640c080b410221010c150b410221010c140b410121010c130b410221010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b202220b7013a0048200241e8006a20a80120a6016a290300220020b8012022290300220420b801108804200241f8006a202220a6016a290300220320b80120a801290300220720b80110880420024188016a200720b801200420b80110880420a80120ba016a290300220420bb01200420bb015620a80120b9016a290300220420b801522004501b22051b2207200420b80120051b220484500d04200241d8006a20bc01200229038801200020b80152200320b8015271200229037020b801527220022903800120b801527220024188016a20a6016a2903002200200229036820022903787c7c22032000547222051b20bc01200320051b20072004108704202220b9016a2206200241d8006a20a6016a2903002200370300202220022903582203370310200120bd016a220520bc012000200529030022047c2003200129035022007c22032000542205ad7c22002005200020045420002004511b22051b370300200120bc01200320051b37035020cb01200120af016a2205460d00200520cb0120b001108604450d0020062903002123202220ba016a22222903002124200120a6016a290300210420012903002100200241e0056a20a6016a220520b801370300200220b8013703e00520bf0120be01200241e0056a1002200241d8046a20a6016a222f2005290300370300200220022903e0053703d80402400240200241d8046a20ba0120c10120c00120c001100120c201460d00200220b8013703f007200220b8013703e807200241d8046a20ba01200241e8076a20ba0120c0011001222e20c201460d07202e20c7014d0d07420121034200210720022903e80722a00120c80154200241e8076a20a6016a29030022255020254201511b0d01200241c8006a20a001202520bc0120b801108704200241c8006a20a6016a2903002107200229034821030c010b42002107420121030b200241386a2003200720242023108804200120bc012004200241386a20a6016a2903007c200020022903387c2203200054222ead7c2200202e200020045420002004511b222e1b370308200120bc012003202e1b370300200241e8076a20b9016a222e20cb0120b9016a290000370300200241e8076a20ba016a223120cb0120ba016a290000370300200241e8076a20a6016a22a30120cb0120a6016a290000370300200220cb012900003703e8072006290300210320222903002107200520b801370300200220b8013703e00520bf0120be01200241e0056a1002202f2005290300370300200220022903e0053703d80402400240200241d8046a20ba0120c10120c00120c001100120c201460d00200220b8013703e806200220b8013703e006200241d8046a20ba01200241e0066a20ba0120c0011001220520c201460d08200520c7014d0d08420121044200210020022903e006222420c80154200241e0066a20a6016a29030022235020234201511b0d01200241286a2024202320bc0120b801108704200241286a20a6016a2903002100200229032821040c010b42002100420121040b200241186a2004200020072003108804200241e0066a20b9016a2222202e290300370300200241e0066a20ba016a222f2031290300370300200241e0066a20a6016a222e20a301290300370300200220022903e8073703e006200241186a20a6016a290300210420022903182100024020012802282205200120c3016a2231280200470d00200520b7016a22062005490d2f200520b7017422a3012006200620a301491b22a301ad20c4017e220320c50188a70d2f2003a722a50120c001480d2f2005450d02200120b0016a280200200520c6016c20a501102122060d030c080b200120b0016a28020021060c030b20c90120ca01470d070c0f0b20a50110222206450d050b203120a301360200200120b0016a2006360200200120ab016a28020021050b2006200520c6016c6a220520022903e0063703102005200437030820052000370300200520ab016a2022290300370300200520b0016a202f290300370300200520b9016a202e290300370300200120ab016a2201200128020020b7016a36020020c90120ca01470d050c0c0b41a487c000102f000b419a88c00041331039000b419a88c00041331039000b20a50141081023000b410321640c010b410321640c010b410321010c010b410321010c000b0b20cd0120656a21870120d8014188016c210520cd014180016a2165200241a0086a219c014100217320d4012101024002400340206541a47f6a2802002168206541a07f6a28020021d301200241e0066a206541a87f6a41d8001084041a20652d00004102460d01200241e8076a200241e0066a41d8001084041a200241d8046a41186a2270209c0141186a290000370300200241d8046a41106a226a209c0141106a290000370300200241d8046a41086a22cc01209c0141086a2900003703002002209c012900003703d80402402068450d0020d30110200b200120022903d804370000200141186a2070290300370000200141106a206a290300370000200141086a20cc0129030037000020654188016a2165207341016a2173200141206a2101200541f87e6a22050d000c020b0b206541086a2265208701460d0020cd0120d8014188016c6a219c01034020654180016a2d00004102460d0120654188016a21010240206541246a280200450d00206541206a28020010200b20012165209c012001470d000b0b20d901450d010b20cd0110200b200241e0056a41086a22654200370300200242003703e00541bc9ac4004116200241e0056a1002200241e0066a41086a2065290300370300200220022903e0053703e006200241003602f007200242013703e807200220733602d804200241d8046a200241e8076a103e02400240024002400240024002402073450d00207341057421704100200241e8076a41086a28020022016b210520022802e807216a20022802ec07216820d401216503400240206820056a411f4b0d00200141206a229c012001490d27206841017422cc01209c01209c0120cc01491b229c014100480d27024002402068450d00206a2068209c011021226a0d010c060b209c011022226a450d050b209c0121680b206a20016a229c012065290000370000209c0141186a206541186a290000370000209c0141106a206541106a290000370000209c0141086a206541086a290000370000200541606a2105200141206a2101206541206a2165207041606a22700d000b200241f0076a2001360200200220683602ec072002206a3602e8070c010b200241e8076a41086a280200210120022802ec07216820022802e807216a0b200241e0066a4110206a2001100302402068450d00206a10200b410021050240024020734105742265450d002065410575228701ad4205862204422088a70d252004a722014100480d252001102222cc01450d0320d40120656a20d401470d010c040b410121cc01410021870120d40120656a20d401460d030b2073410574229c0141606a4105762168200241e8076a410172210520cc01216520d40121010340200241e0066a41186a200141186a290000370300200241e0066a41106a200141106a290000370300200241e0066a41086a200141086a290000370300200220012900003703e006200241e8076a200241e0066a10f8020240024020022d00e8074101470d00200241d8046a41186a200541186a290000370300200241d8046a41106a200541106a290000370300200241d8046a41086a200541086a290000370300200220052900003703d8040c010b200241d8046a41186a4200370300200241d8046a41106a4200370300200241d8046a41086a4200370300200242003703d8040b200141206a2101206520022903d804370000206541186a200241d8046a41186a290300370000206541106a200241d8046a41106a290300370000206541086a200241d8046a41086a290300370000206541206a2165209c0141606a229c010d000b206841016a2105207a0d030c040b209c0141011023000b200141011023000b207a450d010b20d40110200b2005ad2204421b88a70d0a2004420586a72265417f4c0d0a02400240024002402065450d002065102222d301450d0341002168410021d4014100216520050d010c020b410121d30141002168410021d401410021652005450d010b2005410574219c01416020cc016b217020d301216520cc012101034020652001290000370000206541186a200141186a290000370000206541106a200141106a290000370000206541086a200141086a290000370000206541206a2165200141206a2101209c0141606a229c010d000b20cc0120054105746a20706a41057641016a2165200521d4010b200241e0056a41086a22014200370300200242003703e00541cdadc2004112200241e0056a100220024198046a41086a2001290300370300200220022903e00537039804200220683602f007200242013703e807200220653602e006200241e0066a200241e8076a103e0240024002402065450d00206541057421704100200241e8076a41086a28020022016b210520022802e807216a20022802ec07216820d301216503400240206820056a411f4b0d00200141206a229c012001490d2420684101742273209c01209c012073491b229c014100480d24024002402068450d00206a2068209c011021226a0d010c060b209c011022226a450d050b209c0121680b206a20016a229c012065290000370000209c0141186a206541186a290000370000209c0141106a206541106a290000370000209c0141086a206541086a290000370000200541606a2105200141206a2101206541206a2165207041606a22700d000b200241f0076a2001360200200220683602ec072002206a3602e8070c010b200241e8076a41086a280200210120022802ec07216820022802e807216a0b20024198046a4110206a2001100302402068450d00206a10200b024020d401450d0020d30110200b208701450d0b20cc0110200c0b0b209c0141011023000b206541011023000b20a80120a7016a22a80120a901460d0341032121410321010c1b0b200241d8046a20386a2201205b290300370300200241d8046a20396a2205205c290300370300200241d8046a203a6a2206205d29030037030020022002290398093703d804200241e0056a203a6a22222041370300200220413703e00520432042200241e0056a100220024198046a203a6a2022290300370300200220022903e005370398040240024020024198046a20392045204420441001203f460d00200220413703f007200220413703e80720024198046a2039200241e8076a2039204410012222203f460d0c2022204a4d0d0c420121044200210020022903e8072207204b54200241e8076a203a6a29030022035020034201511b0d0120024188026a20072003204c204110870420024188026a203a6a290300210020022903880221040c010b42002100420121040b200241f8016a205f205e20042000108704200241f8086a20386a22222001290300370300200241f8086a20396a22012005290300370300200241f8086a203a6a22052006290300370300200220022903d8043703f80820022903f80121040240205a450d00203010200b2060450d00200241e8076a20386a222f2022290300370300200241e8076a20396a22222001290300370300200241e8076a203a6a22212005290300370300200220022903f8083703e8070240200241b8046a203a6a2206280200220520022802bc04470d00200241e0066a202810ba0320022802bc0422012006280200222e6b203f20022802e006223020326a223120312030491b22304f0d00202e20306a2230202e490d1d2001203274222e20302030202e491b2230ad203d7e2200203e88a70d1d2000a7222e2044480d1d024002402001450d0020022802b804200120466c202e102122010d010c150b202e10222201450d140b200220303602bc04200220013602b8040b20022802b804200520466c6a22012060360220200120022903e80737022c200120346a2062360200200120366a2059360200200120413703102001204137030820012004370300200120386a2041370300200120476a2021290300370200200120486a2022290300370200200120496a202f2903003702002006200520326a360200200241e0066a2028108003200241e0066a203b6a28020022300d160b202810200240202d20274f0d000240202d450d00202d4188016c2101202b41206a216503400240206541046a280200450d00206528020010200b20654188016a2165200141f87e6a22010d000b0b02402029450d00202a10200b0240200241c0046a2802002265450d00206541d0006c210120022802b80441206a216503400240206541046a280200450d00206528020010200b206541d0006a2165200141b07f6a22010d000b0b20022802bc04450d0320022802b80410200c030b202d2026202d2026491b2266ad4288017e2204422088a70d072004a72201417f4c0d07024002402001450d002001102222050d01200141081023000b410821050b41002167200241003602b004200220663602ac04200220053602a8042066450d004188012168202c202d4188016c22696a216a4101216b4108216c200241b8046a41086a216d41d000216e419f04216f418001217041880221714190022172413021734190032174419803217541e07b217641a0042177419804217841f80021794118217a41f000217b4110217c200241e8076a41106a217d41e800217e4230217f4220218001417f21810141d80021820141c80021830141c000218401413821850142880121860141282187014124218801418401218901200241e3066a218a014120218b0141e000218c0141b07f218d0141f87e218e014200218f014201219001427f2191014148219201414021930141b87f2194014100219501410221210c160b410821a601200241b8046a41086a2802002201450d0041d00021a70120022802b80422a801200141d0006c6a21a901412c21aa01412821ab01200241a8046a41086a21ac0141880121ad01419f0421ae0141e00021af01412021b00141e80121b10141f00221b20141900221b30141f80321b40141980321b50141a00421b601410121b701420021b801411821b901411021ba01420121bb01427f21bc0141d80021bd01411621be01418feec00021bf01410021c00141c8d7c40021c101417f21c201412421c301423021c401422021c501413021c601410f21c701427e21c801410321210c160b20022802c80421cc0120022902ac04210320022802a80421cd010240200241c8046a20a6016a2802002201450d0020014188016c210520cc0141206a210103400240200141046a280200450d00200128020010200b20014188016a2101200541f87e6a22050d000b0b024020022802cc04450d0020cc0110200b0240200241c0046a2802002201450d00200141d0006c210520022802b80441206a210103400240200141046a280200450d00200128020010200b200141d0006a2101200541b07f6a22050d000b0b024020022802bc04450d0020022802b80410200b20cd01450d00200220cd01360298092002200337029c09200241e0056a41086a22014200370300200242003703e00541bc9ac4004116200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e006200241e0066a411041c8d7c400410041001001417f460d01200242103702dc042002200241e0066a3602d804200241e8076a200241d8046a103820022802e80722ce01450d1220022802ec0721cf01200241f0076a280200410574222f0d020c030b420021d001200241e0056a41086a22654200370300200242003703e00541d29ac4004111200241e0056a1002200241e0066a41086a2065290300370300200220022903e0053703e006200241e0066a411041c8d7c400410041001001417f460d03200242003703f007200242003703e807200241e0066a4110200241e8076a4110410010012265417f460d0f2065410f4d0d0f20022903e80721d0010c030b410121ce01410021cf014100410574222f450d010b20ce0121010340410f10222205450d06200541076a41002900fdee43370000200541002900f6ee433700002005410f412f10212205450d072005200129000037000f200541276a200141186a22d1012900003700002005411f6a200141106a22d201290000370000200541176a200141086a2222290000370000200241d8046a41186a22cc014200370300200241d8046a41106a22d3014200370300200241d8046a41086a22d4014200370300200242003703d8042005412f200241d8046a1000200241e0056a41186a22d50120cc01290300370300200241e0056a41106a222120d301290300370300200241e0056a41086a22d60120d401290300370300200220022903d8043703e005200241e0056a4120100920051020411210222205450d08200541106a41002f008aed43222e3b0000200541086a4100290082ed432204370000200541002900faec43220037000020054112413210212205450d09200520012900003700122005412a6a20d101290000370000200541226a20d2012900003700002005411a6a202229000037000020cc01420037030020d301420037030020d4014200370300200242003703d80420054132200241d8046a1000200241e8076a41186a20cc01290300370300200241e8076a41106a20d301290300370300200241e8076a41086a20d401290300370300200220022903d8043703e807410021d7010240200241e8076a412041c8d7c400410041001001417f460d00200241003602e006200241e8076a4120200241e0066a41044100100141016a41044d0d0520022802e0062106200241e8076a41201009410121d7010b2005102002402006410020d7011b22d70141014d0d00411210222205450d0b200541106a202e3b0000200541086a20043700002005200037000020054112413210212205450d0c200520012900003700122005412a6a20d101290000370000200541226a20d2012900003700002005411a6a202229000037000020cc01420037030020d301420037030020d4014200370300200242003703d80420054132200241d8046a100020d50120cc01290300370300202120d30129030037030020d60120d401290300370300200220022903d8043703e005200220d701417f6a3602e807200241e0056a4120200241e8076a41041003200510200b200141206a2101202f41606a222f0d000b0b2003422088a721d801024020cf01450d0020ce0110200b20d801450d0d2003a721d90141880121da0120cd0120d8014188016c6a21db01410821d20120cd0141086a29030021dc0120cd0129030021d001411021d401200241e8076a41106a21dd0141f80021de01411821d30141f00021df0141e80021e001423021e101422021e201417f21e301413021d701412821d101200241e8076a41286a21e4012002418c086a21e501412021cc01200241e8076a41206a21e601410f21e701410721e801410021cf01412f21e901412721ea01411f21eb01411721ec01420021ed01420121ee01410121d501415021d60120cd0121ce01410421210c120b200241e0056a41086a22654200370300200242003703e00541e49dc4004115200241e0056a1002200241e0066a41086a2065290300370300200220022903e0053703e00602400240200241e0066a411041c8d7c400410041001001417f460d00200241003602e807200241e0066a4110200241e8076a41044100100141016a41044d0d0b20023502e80721040c010b423c21040b200241086a20d001420020044200108804200241e0056a41086a22654200370300200242003703e00541a299c400411c200241e0056a1002200241e0066a41086a2065290300370300200220022903e0053703e006200242003703f00720024289f48bdcc4002002290308428094ebdc038020022903104200521b3703e807200241e0066a4110200241e8076a411010030c130b1031000b419a88c00041331039000b419a88c00041331039000b410f41011023000b412f41011023000b411241011023000b413241011023000b411241011023000b413241011023000b419a88c00041331039000b202e41081023000b419a88c00041331039000b41d49dc4004100410010b501000b419a88c00041331039000b41012121410321010c030b410321010c020b410321010c010b410321010c000b0b200241e8076a109d0120022802e807210520022802ec072168024020022802f0072265450d002065410574220141057522cc01ad42287e2204422088a70d012004a7229c014100480d01209c011022226a450d02200520016a21702065410574219c01206a2165200521010340200141086a2900002104200141106a290000210020012900002103206541186a200141186a290000370000206541106a2000370000206541086a200437000020652003370000206541206a4201370300206541286a2165200141206a2101209c0141606a229c010d000b207020056b41606a41057641016a21702068450d040c030b410021cc014108216a4100217020680d020c030b1024000b209c0141081023000b200510200b02400240410e10222265450d0041002101206541066a410029009893423700002065410029009293423700002065410e411c10212265450d01206541106a41002d00a293423a0000206541002f00a093423b000e024002402065411141c8d7c400410041001001417f460d00200241003602e80720654111200241e8076a41044100100141016a41044d0d0120022802e80721010b20651020200241e0066a200110d40220022802e0062173024002400240207020022802e806470d002073206a460d01417f219c01206a2165207321010340209c0141016a229c0120704f0d022065200141201086040d01200141206a2105206541206a2168206541286a2165200141286a210120682903002005290300510d000b0b200220703602f007200220cc013602ec072002206a3602e807200241e8076a42004200200410f50120022802e406450d0120731020200241c0096a24000f0b024020022802e406450d00207310200b20cc01450d00206a10200b200241c0096a24000f0b419a88c00041331039000b410e41011023000b411c41011023000bb20803027f017e107f230041f0036b22022400200241086a2001108e0102400240024002400240024002400240024002402002280208450d00200228020c2203ad4288017e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241f0036a24000f0b4108210620030d030b4100210f4100210d0c030b1031000b200541081023000b200241b0026a4104722107200141086a2108200241306a41186a2109200241306a41106a210a4100210b4100210c410021052003210d0340200141046a220e280200210f200828020021102002410036029003200841002001280200200f20024190036a410420101001220f200f417f461b220f4104200f410449220f1b20082802006a36020002400240200f0d00200228029003211120024190036a2001108b01200228029003410f460d00200241b0026a20024190036a41e0001084041a20094200370300200a4200370300200241306a41086a2210420037030020024200370330200841002001280200200e280200200241306a412020082802001001220f200f417f461b220f4120200f4120491b20082802006a3602000240200f411f4d0d0020024190016a41186a200929030037030020024190016a41106a200a29030037030020024190016a41086a2010290300370300200220022903303703900120022802b0022110200241b4016a200741dc001084041a201121120c020b200241b0026a1093010b410f21100b20024190036a200241b4016a41dc001084041a20024190026a41186a220e20024190016a41186a29030037030020024190026a41106a221120024190016a41106a29030037030020024190026a41086a221320024190016a41086a2903003703002002200229039001370390022010410f460d02200541016a210f200241306a20024190036a41dc001084041a200241106a41186a2214200e290300370300200241106a41106a220e2011290300370300200241106a41086a22112013290300370300200220022903900237031002402005200d470d00200b200f200f200b491b220dad4288017e2204422088a70d042004a722134100480d0402402005450d002006200c2013102122060d010c060b201310222206450d050b2006200c6a22052010360200200541046a200241306a41dc001084041a200541e0006a2012360200200541fc006a2014290300370200200541f4006a200e290300370200200541ec006a2011290300370200200541e4006a2002290310370200200b41026a210b200c4188016a210c200f2105200f2003490d000b0b2000200d36020420002006360200200041086a200f360200200241f0036a24000f0b2000410036020002402005450d00200621050340200510920120054188016a2105200c41f87e6a220c0d000b0b0240200d450d00200610200b200241f0036a24000f0b1024000b201341081023000bad0302047f037e230041d0006b2202240002400240411310222203450d002003410f6a410028008df040360000200341086a4100290086f040370000200341002900feef4037000020034113412610212203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041c8d7c400410041001001417f460d00200220023602202002412036022420024200370338200242003703302002410020024120200241306a41104100100122012001417f461b2201411020014110491b3602282001410f4d0d02200241386a290300210620022903302107200241306a200241206a103820022802302201450d0220022902342108200020063703082000200737030020002008370214200020013602100c010b200041003602100b20031020200241d0006a24000f0b419a88c00041331039000b411341011023000b412641011023000bc90401077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103e0240024002400240024002402000450d0020004188016c2104200241086a22052802002100200228020421060340200341e0006a28020021070240024002400240200620006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102122060d020c070b200228020021060c020b200010222206450d050b2002200036020420022006360200200528020021000b2005200041046a360200200620006a200736000020032002109501024002400240024020022802042206200528020022076b41204f0d00200741206a22002007490d0620064101742207200020002007491b22004100480d062006450d01200228020020062000102122080d020c080b200228020021080c020b200010222208450d060b200220003602042002200836020020052802002107200021060b2005200741206a2200360200200820076a220741086a200341ec006a290000370000200741106a200341f4006a290000370000200741186a200341fc006a2900003700002007200341e4006a29000037000020034188016a2103200441f87e6a22040d000b200128020020012802042008200010032006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100320030d030c040b1024000b200041011023000b200041011023000b200810200b200241106a24000bdb0604027f017e037f047e230041c0006b22032400024002400240411810222204450d00200441106a41002900b9ef40370000200441086a41002900b1ef40370000200441002900a9ef4037000020044118413810212204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a29000037000042002105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044138200341206a1000200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041c8d7c400410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a2903002109200329032021052004102041142106411410222204450d010c050b4200210920041020411421064114102222040d040b200641011023000b419a88c00041331039000b411841011023000b413841011023000b200441106a41002800a5ef40360000200441086a410029009def4037000020044100290095ef40370000024020042006413410212204450d00200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a2900003700004200210a200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044134200341206a1000200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041c8d7c400410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a290300210b2003290320210a0c010b4200210b0b200410202000200a200120052005200156200920025620092002511b22041b22017c220c200b2002200920041b22027c200c200a54ad7c10af012000200520017d200920027d2005200154ad7d10b601200341c0006a24000f0b419a88c00041331039000b413441011023000bf20b03027f017e047f23004190026b22052400200541f8006a41086a220642003703002005420037037841f490c1004119200541f8006a1002200541086a200629030037030020052005290378370300410021060240024002400240024002400240024002400240024002400240024002402005411041c8d7c400410041001001417f460d002005410036027820054110200541f8006a41044100100141016a41044d0d01024020052802782206450d0020052006417f6a10e7012005280208410f460d01200541f8006a200541f8001084041a20052903782107200541f8006a41086a10920120072001580d01200041d491c10036020420004101360200200041086a41c700360200200210920120054190026a24000f0b410021060b200541f8006a41086a220842003703002005420037037841f490c1004119200541f8006a1002200541086a2008290300370300200520052903783703002005200641016a36027820054110200541f8006a41041003200520013703782008200241e0001084042109200520043703e001200520033a00e801411a10222208450d01200841186a41002f00eeef403b0000200841106a41002900e6ef40370000200841086a41002900deef40370000200841002900d6ef403700002008411a413410212202450d022002200636001a200541186a220a4200370300200541106a220b4200370300200541086a22084200370300200542003703002002411e20051000200541f0016a41186a200a290300370300200541f0016a41106a200b290300370300200541f0016a41086a2008290300370300200520052903003703f00120054100360208200542013703002005290378210141081022220a450d032005410836020420082008280200220b41086a3602002005200a360200200a200b6a20013700002009200510950102400240024002400240024002400240024002400240200541e8016a2d000022084101460d0020084102470d012005280204200541086a2802002208470d03200841016a220a2008490d162008410174220b200a200a200b491b220b4100480d162008450d0720052802002008200b1021220a450d080c130b2005280204200541086a2802002208470d01200841016a220a2008490d152008410174220b200a200a200b491b220b4100480d152008450d0420052802002008200b1021220a450d050c100b2005280204200541086a2802002208470d02200841016a220a2008490d142008410174220b200a200a200b491b220b4100480d142008450d0720052802002008200b1021220a450d080c0d0b2005280200210a0c0f0b2005280200210a0c100b2005280200210a0c0b0b200b1022220a0d0b0b200b41011023000b200b1022220a0d0b0b200b41011023000b200b1022220a0d050b200b41011023000b419a88c00041331039000b411a41011023000b413441011023000b410841011023000b2005200b3602042005200a360200200541086a28020021080b200541086a200841016a360200200a20086a41003a00000c040b2005200b3602042005200a360200200541086a28020021080b200541086a200841016a360200200a20086a41013a00000c020b2005200b3602042005200a360200200541086a28020021080b200541086a200841016a360200200a20086a41023a00000b200541e0016a29030021010240024002402005280204220a200541086a28020022086b41084f0d00200841086a220b2008490d03200a4101742208200b200b2008491b22084100480d03200a450d012005280200200a20081021220a450d020c040b2005280200210a0c040b20081022220a0d020b200841011023000b1024000b200520083602042005200a360200200541086a28020021080b200541086a220b200841086a360200200a20086a200137000020052802042108200541f0016a41202005280200220a200b280200100302402008450d00200a10200b20021020200910920120054184016a200636020020054181016a20033a0000200541f8006a41086a41023a0000200541053a0078200541f8006a103d200041003602002000200636020420054190026a24000bd60604047f017e027f017e230041b0036b220224000240024002400240411a10222203450d00200341186a41002f00eeef403b0000200341106a41002900e6ef40370000200341086a41002900deef40370000200341002900d6ef403700002003411a413410212203450d012003200136001a200241f0016a41186a22014200370300200241f0016a41106a22044200370300200241f0016a41086a22054200370300200242003703f0012003411e200241f0016a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903f0013703000240024002402002412041c8d7c400410041001001417f460d002002200236022020024120360224200242003703f0012002410020024120200241f0016a41084100100122012001417f461b2201410820014108491b360228200141074d0d0620022903f0012106200241f0016a200241206a108b0120022802f0012101200241d4026a200241f0016a41047241dc001084041a2001410f460d0620024194016a200241d4026a41dc001084041a20022001360230200241306a41047220024194016a41dc001084042104200241003a00f00120022802202002280224200241f0016a4101200241286a22012802001001210520012001280200200541016a41014b22056a22073602002005450d0220022d00f001220541034f0d02200242003703f001200241206a41086a2208410020022802202002280224200241f0016a41082007100122012001417f461b2201410820014108491b20082802006a360200200141074d0d0520022903f001210920022802302101200241f0016a200441dc001084041a2002200241336a2800003600d702200220022800303602d4022001410f460d06200241306a200241f0016a41dc001084041a200220022800d70236009701200220022802d4023602940120002001360208200020063703002000410c6a200241306a41dc001084041a200041f0006a20053a0000200041e8006a20093702002000200228029401360071200041f4006a2002280097013600000c010b2000410f3602080b20031020200241b0036a24000f0b200241306a109201419a88c00041331039000b411a41011023000b413441011023000b200241306a1092010b419a88c00041331039000bed0603027f017e0b7f23004190036b22022400200241086a2001108e0102400240024002400240024002400240024002400240024002402002280208450d00200228020c2203ad42e8007e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b2000410036020020024190036a24000f0b4108210620030d030b4100210d4100210b0c030b1031000b200541081023000b200241c8016a4104722107200141086a210541002108410021094100210a2003210b0340200241003a00a8022001280200200141046a220c280200200241a8026a410120052802001001210d20052005280200200d41016a41014b220d6a360200200d450d040240024020022d00a802220d4101460d00200d0d06200241a8026a200241106a41dc001084041a410f210c0c010b200241a8026a2001108b0120022802a802410f460d04200241c8016a200241a8026a41e0001084041a200c280200210d2005280200210c2002410036028c03200541002001280200200d2002418c036a4104200c1001220d200d417f461b220d4104200d4104491b20052802006a360200200d41034d0d03200228028c03210e20022802c801210c200241ec006a200741dc001084041a200241a8026a200241ec006a41dc001084041a200c410f460d05200241106a200241a8026a41dc001084041a200241a8026a200241106a41dc001084041a200c4110460d060b200a41016a210d200241c8016a200241a8026a41dc001084041a0240200a200b470d002008200d200d2008491b220bad42e8007e2204422088a70d072004a7220f4100480d070240200a450d0020062009200f102122060d010c090b200f10222206450d080b200620096a220a200c360200200a41046a200241c8016a41dc001084041a200a41e0006a200e360200200841026a2108200941e8006a2109200d210a200d2003490d000b0b2000200b36020420002006360200200041086a200d36020020024190036a24000f0b200241c8016a1093010b200241a8026a200241ec006a41dc001084041a0b200241a8026a200241106a41dc001084041a0b200041003602000240200a450d0020062105034002402005280200410f460d0020051092010b200541e8006a2105200941987f6a22090d000b0b0240200b450d00200610200b20024190036a24000f0b1024000b200f41081023000bfd82010b027f027e067f017e0d7f017e017f027e297f027e337f230041b0026b2201240020014190026a41086a22024200370300200142003703900241a082c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f0010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d02200129035022034200510d044200210420002003824200520d120c010b42002104200042e807824200520d110b20014190026a41086a22022004370300200120043703900241cc82c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f001200141f0016a411041c8d7c400410041001001417f460d1020014100360250200141f0016a4110200141d0006a41044100100141016a41044d0d0120012802502202450d104108210520014190026a41086a22064200370300200142003703900241dbc9c100411520014190026a1002200141f0016a41086a200629030037030020012001290390023703f0014100210602400240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10f30120012802502205450d06200141d8006a2802002106200128025421070c010b410021070b4200210320014190026a41086a22084200370300200142003703900241e082c200411420014190026a1002200141f0016a41086a2209200829030037030020012001290390023703f001200141d0006a200141f0016a105a0240200128025c220a450d00200128025822082001290360220b422088a76b20066a2109200129035021030240200ba7450d00200a10200b20092002490d070c060b20084200370300200142003703900241cdc8c000410d20014190026a10022009200829030037030020012001290390023703f001410021080240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d04200129035021030b200620024f0d050c060b419a88c00041331039000b419a88c00041331039000b41b482c200102f000b419a88c00041331039000b419a88c00041331039000b0240200820024f0d00200820026b220220066a220820024f0d052005200841286c6a29032021030c010b20014190026a41086a22024200370300200142003703900241f482c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d02200129035020037c21030c010b420520037c21030b20014190026a41086a22024200370300200142003703900241a082c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f00102400240024002400240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d022001290350220b4200520d0141f0c9c100102f000b42e807210b0b2003200b7c427f7c22032003200b827d210302402007450d00200510200b20032000520d0c4108210c20014190026a41086a22024200370300200142003703900241dbc9c100411520014190026a1002200141f0016a41086a200229030037030020012001290390023703f0014100210d02400240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10f3012001280250220c450d07200141d8006a280200210d2001280254210e0c010b4100210e0b20014190026a41086a22024200370300200142003703900241cc82c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f0014100210f0240200141f0016a411041c8d7c400410041001001417f460d0020014100360250200141f0016a4110200141d0006a41044100100141016a41044d0d032001280250210f0b4200210320014190026a41086a22024200370300200142003703900241cdc8c000410d20014190026a1002200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d02200129035021030b0240024002400240200d41286c2202450d00200c41206a2903002003520d00200141f0016a41186a2206200c41186a290300370300200141f0016a41106a2208200c41106a290300370300200141f0016a41086a2205200c41086a2903003703002001200c2903003703f001412010222210450d0b201020012903f001370000201041186a2006290300370000201041106a2008290300370000201041086a2005290300370000200c20026a200c41286a2202460d02200d41286c41586a21054120210841012106410121110340200241206a2903002003520d04200141f0016a41186a2207200241186a290300370300200141f0016a41106a220a200241106a290300370300200141f0016a41086a2209200241086a290300370300200120022903003703f00102400240024020112006470d00200641016a22122006490d2a20064101742213201220122013491b2213ad420586220b422088a70d2a200ba722124100480d2a2006450d01201020064105742012102122100d020c0c0b200621130c010b201210222210450d0a0b200241286a2102201020086a220620012903f001370000200641186a2007290300370000200641106a200a290300370000200641086a2009290300370000200841206a2108201141016a211120132106200541586a22050d000c020b0b4101211041002111410021130b200f200d20116b22064d0d0a0c0b0b4101211141012113200f200d41016b22064b0d0a0c090b20062113200f200d20116b22064b0d090c080b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b201241011023000b419a88c00041331039000b418883c2002008200610b501000b412041011023000b2013450d01201010200c010b20014190026a41086a220242003703002001420037039002419883c200411c20014190026a1002200141f0016a41086a200229030037030020012001290390023703f00102400240024002400240024002400240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d022001290350210b0c010b42e807210b0b20014190026a41086a22024200370300200142003703900241e082c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f0012001410036025820014201370350410810222202450d01200142888080808001370254200120023602502002200b20037c37000020024108411010212202450d0220014290808080c0013702542002200f20066b221436000820012002360250200120113602900220014190026a200141d0006a103e0240024002402011450d002011410574210a4100200141d0006a41086a28020022066b210520012802502109200128025421072010210203400240200720056a411f4b0d00200641206a22082006490d2320074101742212200820082012491b22084100480d23024002402007450d00200920072008102122090d010c060b200810222209450d050b200821070b200920066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102200a41606a220a0d000b200141d8006a200636020020012007360254200120093602500c010b200141d8006a280200210620012802542107200128025021090b200141f0016a411020092006100302402007450d00200910200b02402013450d00201010200b20014190026a41086a22024200370300200142003703900241b483c200410e20014190026a1002200141f0016a41086a200229030037030020012001290390023703f0014100210602400240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a103820012802502210450d0620012802542115200141d8006a280200220641ffffff3f712213450d010c070b4101211041002115410041ffffff3f7122130d060b410821120c060b200841011023000b419a88c00041331039000b410841011023000b411041011023000b419a88c00041331039000b20134104742202102222120d00200241081023000b4100210202402010201020064105746a460d002006410574220841606a2107200141086a21052012210220102106034020012006103b200129030021032002200529030037030820022003370300200241106a2102200641206a2106200841606a22080d000b200741057641016a21020b20014190026a41086a22064200370300200142003703900241c283c200411820014190026a1002200141d0006a41086a2006290300370300200120012903900237035020014100360298022001420137039002200120023602f001200141f0016a20014190026a103e0240024020024104742207450d0020062802002102200128029002210a2001280294022105201221060340200641086a29030021032006290300210b0240024002400240200520026b41104f0d00200241106a22082002490d1f20054101742209200820082009491b22094100480d1f2005450d01200a200520091021220a0d020c0a0b200241106a21080c020b20091022220a450d080b200921050b200641106a2106200a20026a220220033700082002200b37000020082102200741706a22070d000b20014198026a200836020020012005360294022001200a360290020c010b200628020021082001280294022105200128029002210a0b200141d0006a4110200a2008100302402005450d00200a10200b02402013450d00201210200b20014190026a41086a22024200370300200142003703900241da83c200411220014190026a1002200141f0016a41086a200229030037030020012001290390023703f00102400240200141f0016a411041c8d7c400410041001001417f460d0020014100360250200141f0016a4110200141d0006a41044100100141016a41044d0d0a200128025021060c010b410221060b200141a8026a4200370300200141a0026a420037030020014198026a42003703002001420037039002200620146a2212ad42307e2203422088a70d172003a72202417f4c0d17024002402002450d00200210222213450d0d201321020c010b41082113410821020b200141d0006a41186a220a20014190026a41186a290300370300200141d0006a41106a220920014190026a41106a290300370300200141d0006a41086a20014190026a41086a290300370300200120012903900237035002400240024020124102490d002011200f6a20066a417f6a200d6b21060340200141f0016a41186a2208200a290300370300200141f0016a41106a22052009290300370300200141f0016a41086a2207200141d0006a41086a290300370300200120012903503703f0012002420037030820024200370300200241286a2008290300370300200241206a2005290300370300200241186a2007290300370300200241106a20012903f001370300200241306a21022006417f6a22060d000b2012417f6a21060c010b410021062012450d010b200242003703082002420037030020022001290350370310200241186a200141d8006a290300370300200241206a200141e0006a290300370300200241286a200141d0006a41186a290300370300200641016a21060b20012006360258200120123602542001201336025020014190026a41086a22024200370300200142003703900241ec83c200411320014190026a1002200141f0016a41086a200229030037030020012001290390023703f00120014110360294022001200141f0016a36029002200141d0006a20014190026a10da0202402012450d00201310200b200141d0006a41086a2014360200200141023a0054200141063a0050200141d0006a103d2015450d0020101020200e0d010c020b200e450d010b200c10200b20014190026a41086a22022004370300200120043703900241e082c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f001200141d0006a200141f0016a105a200128025c2216450d172001280260211720012903502000520d1620014190026a41086a22024200370300200142003703900241c283c200411820014190026a1002200141f0016a41086a2206200229030037030020012001290390023703f001200141f0016a4110100920024200370300200142003703900241e082c200411420014190026a10022006200229030037030020012001290390023703f0010240024002400240024002400240200141f0016a411041c8d7c400410041001001417f460d002001200141f0016a3602900220014110360294022001420037035020014100200141f0016a4110200141d0006a41084100100122022002417f461b2202410820024108491b220636029802200241074d0d05200129035021042001410036025020014198026a4100200141f0016a4110200141d0006a41042006100122022002417f461b22024104200241044922021b20066a36020020020d0520012802502102200141d0006a20014190026a103820012802502218450d0520012902542119200141f0016a41101009200120023602c801200120043703c00120012802c801211a410821094200211b20014190026a41086a22024200370300200142003703900241ec83c200411320014190026a1002200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10dc0220012802502209450d0a2001290254211b200141f0016a411010090b20014190026a41086a22024200370300200142003703900241cdc8c000410d20014190026a1002200141f0016a41086a2206200229030037030020012001290390023703f0014200210b0240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d042001290350210b0b20024200370300200142003703900241f482c200411420014190026a10022006200229030037030020012001290390023703f001200141f0016a411041c8d7c400410041001001417f460d0120014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d042001290350211c0c020b02402017450d00201610200b41e2d1c200410f100f41de84c2004135100f200141b0026a24000f0b4205211c0b4200210420014190026a41086a22024200370300200142003703900241c984c200411520014190026a1002200141f0016a41086a200229030037030020012001290390023703f00102400240200141f0016a411041c8d7c400410041001001417f460d002001420037035820014200370350200141f0016a4110200141d0006a4110410010012202417f460d072002410f4d0d07200141d8006a2903002104200129035021000c010b420921000b2009201b422088a7221d41306c6a2102024002400240201a450d00201a417f6a211041002108024020092002460d002009201d41306c6a220641506a2202290300200641586a29030084500d02200141a8026a200641786a290000370300200141a0026a200641706a29000037030020014198026a200641686a2900003703002001200641606a29000037039002410121080b410021120c020b4100211241002110410021080c010b410121120b200141d9006a20014190026a41086a290300370000200141e1006a20014190026a41106a290300370000200141e9006a20014190026a41186a290300370000200120083a005020012001290390023700514101211e200141d0006a4101722106024002402008450d0020062000200410e501200141f0016a41186a200641186a290000370300200141f0016a41106a200641106a290000370300200141f0016a41086a200641086a290000370300200120062900003703f00141201022221e450d09201e20012903f001370000201e41186a200141f0016a41186a2208290300370000201e41106a200141f0016a41106a2205290300370000201e41086a200141f0016a41086a2207290300370000200141d0006a4101722106410221114120210a4101210d4101211f410020106b220f41016a4101460d010340201241ff01710d0220092002460d02200241506a2210290300200241586a29030084500d022008200241786a2900003703002005200241706a2900003703002007200241686a2900003703002001200241606a2900003703f001200620012903f001370000200641086a22022007290300370000200641106a22122005290300370000200641186a22132008290300370000200141013a005020062000200410e50120014190026a41186a220c201329000037030020014190026a41106a2213201229000037030020014190026a41086a2212200229000037030020012006290000370390022008200c290300370300200520132903003703002007201229030037030020012001290390023703f0010240200d201f470d00200d41016a2202200d490d1d2011200220022011491b221fad4205862203422088a70d1d2003a722024100480d1d0240200d450d00201e200a20021021221e0d010c080b20021022221e450d070b201e200a6a220220012903f001370000200241186a2008290300370000200241106a2005290300370000200241086a2007290300370000201141026a2111200a41206a210a4100211220102102200f200d41016a220d6a4101470d000c020b0b200141f0016a41186a200641186a290000370300200141f0016a41106a200641106a290000370300200141f0016a41086a200641086a290000370300200120062900003703f0014100210d4100211f0b4108212020014190026a41086a22024200370300200142003703900241dbc9c100411520014190026a1002200141f0016a41086a200229030037030020012001290390023703f0014100212102400240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10f30120012802502220450d0a200141d8006a2802002111200128025421210c010b410021110b200141013602502020201141286c6a210e0240024002400240024002402019422088a72205450d00410021224100212302402005200e20206b41286e2202200220054b1b2202450d00200241057422064100480d20200610222208450d1220012008360250200221230b20202102200521082001280250222421060340200e20026b419f014d0d0220062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020084101460d0320062002290028370020200641386a200241c0006a290000370000200641306a200241386a290000370000200641286a200241306a29000037000020084102460d0420062002290050370040200641d8006a200241e8006a290000370000200641d0006a200241e0006a290000370000200641c8006a200241d8006a29000037000020084103460d0520062002290078370060200641f8006a20024190016a290000370000200641f0006a20024188016a290000370000200641e8006a20024180016a290000370000202241046a212220064180016a2106200241a0016a21022008417c6a22080d000c060b0b4100212320012802502124410021220c040b200e2002460d032020201141286c6a2112410121070240034020062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020082007220a460d01200a41016a2107200641206a21062012200241286a2202470d000b0b2022200a6a21220c030b202241017221220c020b202241027221220c010b202241037221220b201c200b7c210b201e200d4105746a2125024002400240024002402005450d00200e2020460d012005417f732106201141286c2108202021020340200141f0016a41186a200241186a290300370300200141f0016a41106a200241106a290300370300200141f0016a41086a200241086a290300370300200120022903003703f001200641016a2206450d03200241286a2102200841586a22080d000c020b0b200e2020460d00200141d0006a41186a202041186a290300370300200141d0006a41106a202041106a290300370300200141d0006a41086a202041086a29030037030020012020290300370350202041286a2106202029032021040c020b0240201e2025460d00200141f0016a41186a201e41186a2202290000370300200141f0016a41106a201e41106a2206290000370300200141f0016a41086a201e41086a22082900003703002001201e2900003703f0012008290000210420062900002100201e290000210320014190026a41186a200229000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002201e41206a210841022105200e2106200b21040c030b410021114108210c02402021450d00202010200b410021070c100b200241206a2903002104200141d0006a41186a200141f0016a41186a290300370300200141d0006a41106a200141f0016a41106a290300370300200141d0006a41086a200141f0016a41086a290300370300200120012903f001370350200241286a21060b20014190026a41186a200141d0006a41186a29030037030020014190026a41106a200141d0006a41106a29030037030020014190026a41086a200141d0006a41086a290300370300200120012903503703900241002105201e21080b417f417f200e20066b41286d2202202520086b4105766a220720072002491b220241016a220720072002491b2211ad42287e2200422088a70d182000a72202417f4c0d18024002402002450d0020021022220c450d0c200c21260c010b4108210c410821260b200c200129039002370300200c41186a20014190026a41186a290300370300200c41106a20014190026a41106a290300370300200c41086a20014190026a41086a29030037030020262004370320024002402005450d0020082025460d01200841086a2900002104200841106a29000021002008290000210320014190026a41186a200841186a29000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002200841206a21080c100b02402006200e460d00200141d0006a41186a200641186a2202290300370300200141d0006a41106a200641106a2205290300370300200141d0006a41086a200641086a22072903003703002001200629030037035020014190026a41086a200729030037030020014190026a41106a200529030037030020014190026a41186a20022903003703002001200629030037039002200641286a2102200629032021044100210f0c110b20082025460d00200141f0016a41186a200841186a2202290000370300200141f0016a41106a200841106a2205290000370300200141f0016a41086a200841086a2207290000370300200120082900003703f00120072900002104200529000021002008290000210320014190026a41186a200229000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002200841206a21080c0f0b4101210720210d100c110b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b200241011023000b200941011023000b419a88c00041331039000b419a88c00041331039000b412041011023000b419a88c00041331039000b419a88c00041331039000b200241081023000b200641011023000b200241081023000b410021020c090b4102210f200b2104200621020b4102210a41022106412821050340200141d0006a41186a221220014190026a41186a2214290300370300200141d0006a41106a221020014190026a41106a2215290300370300200141d0006a41086a221320014190026a41086a22272903003703002001200129039002370350024020062207417f6a22062011470d002006417f417f200e20026b41286d2226202520086b4105766a221120112026491b222641016a221120112026491b6a22262006490d0b200a20262026200a491b2211ad42287e2200422088a70d0b2000a722064100480d0b0240024020074101470d0020061022220c0d010c060b200c200520061021220c450d050b200c21260b202620056a22062001290350370300200641186a2012290300370300200641106a2010290300370300200641086a2013290300370300200641206a2004370300024002400240024002400240200f41ff017122064101460d0020064102470d0120082025460d05200841086a2900002104200841106a2900002100200829000021032014200841186a29000037030020152000370300202720043703002001200337039002200841206a2108420121004102210f0c020b200e2002460d042014200241186a2903003703002015200241106a2903003703002027200241086a290300370300200120022903003703900220022903202104420121004101210f200241286a21020c030b200e2002470d014102210f024020082025460d00200141f0016a41186a200841186a2206290000370300200141f0016a41106a200841106a2212290000370300200141f0016a41086a200841086a2210290000370300200120082900003703f0012010290000210420122900002100200829000021032014200629000037030020152000370300202720043703002001200337039002200841206a2108420121000c010b420021000c020b200b21040c010b2012200241186a22062903003703002010200241106a22122903003703002013200241086a221029030037030020012002290300370350201029030021042012290300210020022903002103201420062903003703002015200037030020272004370300200120033703900220022903202104420121004100210f200241286a21020b200a41026a210a200741016a2106200541286a210520004200520d010b0b2021450d010b202010200b0240200741144b0d0041012128200741014d0d03417f21292007417f6a212a4128212b2026200741286c6a212c4102212d4120212e4118212f41102130410821314103213241f0002133415821344178213541702136416821374160213841c80021394100213a0c040b2007410176223bad42287e2204422088a70d062004a72202417f4c0d064108213c024002402002450d0020021022223d450d03203d213e0c010b4108213d4108213e0b4158213f202641586a2140202641a87f6a21414100214241042143417f21444101214542032146422021474103214841022149417d214a4128214b4178214c4120214d4118214e4110214f417e2150417421514164215241502153410521544109215541f000215641c800215741c0002158413821594130215a410a215b4104215c4100215d4100215e2007215f4101213a0c040b200641081023000b200241081023000b410021020c020b410121020c010b410121020b0240034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e020001010b20012007360258200120113602542001200c36025020014190026a41086a22654200370300200142003703900241dbc9c100411520014190026a1002200141f0016a41086a2202206529030037030020012001290390023703f00120014110360294022001200141f0016a36029002200141d0006a20014190026a10db0202402011450d00200c10200b206542003703002001420037039002419084c200411220014190026a10022002206529030037030020012001290390023703f00141002166024002400240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a103820012802502267450d02200141d8006a2802002168200128025421660c010b41012167410021680b200141d8016a4200370300200141d0016a4200370300200141c8016a4200370300200142003703c0012068ad2204421b88a70d172004420586a72265417f4c0d17024002402065450d002065102222690d01206541011023000b410121690b200141d0006a41186a2206200141c0016a41186a290300370300200141d0006a41106a2208200141c0016a41106a290300370300200141d0006a41086a2205200141c0016a41086a290300370300200120012903c00137035002400240024020684102490d002068417f6a210220692165034020652001290350370000206541186a2006290300370000206541106a2008290300370000206541086a2005290300370000206541206a21652002417f6a22020d000b2068417f6a216a0c010b4100216a206921652068450d010b20652001290350370000206541186a200141d0006a41186a290300370000206541106a200141d0006a41106a290300370000206541086a200141d0006a41086a290300370000206a41016a216a0b2009201d41306c6a2165201ba7216b4100216c4158216d4150216e4178216f4118217020014190026a41186a2171417021724110217320014190026a41106a2174416821754108217620014190026a41086a217741602178410121794105217a201a450d024102213a0c090b419a88c00041331039000b02400240024002400240024002400240024002400240203a0e0400010203030b2007202a220220296a222a490d0402402007202a6b2206202d490d0020262002202b6c6a2202202e6a22052903002026202a202b6c6a2208202e6a220a29030022045a0d00200141f0016a202f6a22122008202f6a2210290300370300200141f0016a20306a2213200820306a220f290300370300200141f0016a20316a220e200820316a2214290300370300200120082903003703f001200820022903003703002014200220316a290300370300200f200220306a29030037030020102002202f6a290300370300200a2005290300370300024020062032490d00200820336a29030020045a0d0041022108202c210503402005220220346a2002290300370300200220356a2002202e6a290300370300200220366a2002202f6a290300370300200220376a200220306a290300370300200220386a200220316a290300370300200820286a220820064f0d012002202b6a2105200220396a2903002004540d000b0b200220012903f001370300200220043703202002202f6a2012290300370300200220306a2013290300370300200220316a200e2903003703000b202c20346a212c202a0d090c0e0b205f21604100215f41012161206020446a2210450d1502400240024002400240024020262010204b6c6a204d6a29030020262060204b6c22026a20536a29030022045a0d002041206020546c20487422056a2102034020102045460d02201020446a21102004200229030022005421062002203f6a21022000210420060d000c030b0b206020506a2105204120026a21064100215f41002102034020052002460d05200220456a21022004200629030022005a21082006203f6a21062000210420080d000b200220456a2161206020026b20446a2210450d030c020b410021100b20602010490d08206020074b0d0a0240206020106b22612045762208450d00204020056a210220262010204b6c6a21060340200141d0006a204d6a22052006204d6a220a290300370300200141d0006a204e6a22122006204e6a2213290300370300200141d0006a204f6a220f2006204f6a220e290300370300200141d0006a203c6a22142006203c6a2215290300370300200120062903003703502002203c6a222729030021042002204f6a222529030021002002204e6a222029030021032002290300210b200a2002204d6a222129030037030020132003370300200e2000370300201520043703002006200b37030020212005290300370300202020122903003703002025200f29030037030020272014290300370300200220012903503703002002203f6a21022006204b6a2106200820446a22080d000b0b2010450d010b206120554b0d00206020074b0d0820262010204b6c6a2162410021630c1c0b2010215f205d205e460d190c1a0b20602161205d205e460d160c170b20652009460d012065206d6a21022065206e6a2265290300200229030084500d01201a2079460d0b2079201a6b2102034020092065460d022065206d6a21062065206e6a2265290300200629030084500d02200220796a22020d000c0b0b0b20652009460d00024003402065206d6a29030021042065206e6a2202290300210020712065206f6a2903003703002074206520726a2903003703002077206520756a2903003703002001206520786a290300370390022000200484500d01200141d0006a20706a22062071290300370300200141d0006a20736a22082074290300370300200141d0006a20766a220520772903003703002001200129039002370350200141e0016a200141d0006a10de02200141c0016a20706a220a2071290300370300200141c0016a20736a22122074290300370300200141c0016a20766a2210207729030037030020012001290390023703c001024020012802e0012079460d002002216520092002470d010c030b0b200141f0016a20766a22132010290300370300200141f0016a20736a22102012290300370300200141f0016a20706a2212200a290300370300200120012903c0013703f001200141e0016a20766a2802002102200141306a20706a220a2012290300370300200141306a20736a22122010290300370300200141306a20766a22102013290300370300200120012903f001370330200141106a20706a2213200a290300370300200141106a20736a220a2012290300370300200141106a20766a2212201029030037030020012001290330370310200620132903003703002008200a29030037030020052012290300370300200120012903103703500240206a20024d0d002065206e6a216520692002207a746a22022001290350370000200220706a2006290300370000200220736a2008290300370000200220766a2005290300370000206c20796a216c4100211a41000d0a4103213a0c110b418084c2002002206a10b501000b200141306a41186a200141f0016a41186a290300370300200141306a41106a200141f0016a41106a290300370300200141306a41086a200141f0016a41086a290300370300200120012903f0013703300b0240206b450d00200910200b024002400240206a206841ffffff3f7122652065206a4b1b2208450d0020672165206921024100214d0340024020652002460d00206520024120108604450d00411610222206450d032006410e6a41002900d3c941370000200641086a41002900cdc941370000200641002900c5c94137000020064116413610212206450d04200620652900003700162006412e6a206541186a290000370000200641266a206541106a2900003700002006411e6a206541086a290000370000200141f0016a41186a22054200370300200141f0016a41106a223c4200370300200141f0016a41086a224f4200370300200142003703f00120064136200141f0016a1000200141c0016a41186a2005290300370300200141c0016a41106a203c290300370300200141c0016a41086a204f290300370300200120012903f0013703c001200141c0016a41201009200610200b206541206a2165200241206a2102204d41016a224d2008490d000b0b2069206a4105746a2165206a21050240024002400240024002400240206a4104490d00200141d0006a41206a213c20014190016a214f200141b0016a214e200141d0016a213f200141e8006a2106200141e0006a214d200141d8006a210820652102206a2105034020064200370300204d420037030020084200370300200142003703500240203c2002460d00200241606a200141d0006a41201086040d030b20064200370300204d420037030020084200370300200142003703500240204f2002460d00200241406a200141d0006a41201086040d040b20064200370300204d420037030020084200370300200142003703500240204e2002460d00200241a07f6a200141d0006a41201086040d050b20064200370300204d42003703002008420037030020014200370350200241807f6a21650240203f2002460d002065200141d0006a41201086040d060b2005417c6a210520652102206520696b41ff004b0d000b0b20652069460d052005417f6a2102200141d0006a41206a2106200141e8006a214d200141e0006a2108200141d8006a21050340204d4200370300200842003703002005420037030020014200370350024020062065460d00206541606a200141d0006a41201086040d060b2002417f6a21022069206541606a2265470d000c060b0b2005417f6a21020c030b2005417e6a21020c020b2005417d6a21020c010b2005417c6a21020b200241016a2265206a206a20654b1b216a0b200141ec006a2022360200200141d0006a41186a2023360200200141e4006a2024360200200141d0006a41106a200d360200200141dc006a201f360200200141d0006a41086a2202201e360200200141033a0054200141063a0050200141d0006a103d20014190026a41086a226542003703002001420037039002419084c200411220014190026a1002200220652903003703002001200129039002370350200141003602980220014201370390022001206a3602f001200141f0016a20014190026a103e024002400240206a450d00206a41057421054100206528020022026b214d200128029002213c200128029402210820692165034002402008204d6a411f4b0d00200241206a22062002490d232008410174224f20062006204f491b22064100480d23024002402008450d00203c200820061021223c0d010c060b20061022223c450d050b200621080b203c20026a22062065290000370000200641186a206541186a290000370000200641106a206541106a290000370000200641086a206541086a290000370000204d41606a214d200241206a2102206541206a2165200541606a22050d000b20014198026a200236020020012008360294022001203c360290020c010b206528020021022001280294022108200128029002213c0b200141d0006a4110203c2002100302402008450d00203c10200b02402068450d00206910200b20014190026a41086a22654200370300200142003703900241a284c200411620014190026a1002200141f0016a41086a2202206529030037030020012001290390023703f0012001206c360250200141f0016a4110200141d0006a4104100320654200370300200142003703900241b884c200411120014190026a10022002206529030037030020012001290390023703f00102400240200141f0016a411041c8d7c400410041001001417f460d0020014100360250200141f0016a4110200141d0006a41044100100141016a41044d0d06200128025041016a21650c010b410121650b20014190026a41086a22024200370300200142003703900241b884c200411120014190026a1002200141f0016a41086a200229030037030020012001290390023703f00120012065360250200141f0016a4110200141d0006a4104100302402066450d00206710200b2019a7450d20201810200c200b200641011023000b411641011023000b413641011023000b202a2007102d000b419a88c00041331039000b20102060102d000b20602010417f6a225f490d160b20602007102e000b4100213a0c050b4103213a0c050b4102213a0c070b4103213a0c070b4103213a0c070b410021020c0e0b410121020c0d0b410121020c0c0b410121020c0b0b410121020c0a0b410121020c090b410121020c080b410121020c070b410021020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b205d205e470d13410121020c170b205d20456a2202205d490d1a205d2045742206200220022006491b2202ad2046862204204788a70d1a2004a722062042480d1a02400240205d450d00205c205d20487420061021225c0d010c030b20061022225c450d020b2002215d410221020c160b205c205e2048746a220220613602042002205f360200205e20456a2264215e20642049490d02410121630c140b200641041023000b0240024020630e020001010b2060201020446a225f490d1602402060205f6b22612049490d0020262010204b6c6a2202204d6a22082903002026205f204b6c6a2206204d6a220529030022045a0d00200141f0016a204e6a220a2006204e6a2212290300370300200141f0016a204f6a22132006204f6a220f290300370300200141f0016a203c6a220e2006203c6a2214290300370300200120062903003703f0012006200229030037030020142002203c6a290300370300200f2002204f6a29030037030020122002204e6a29030037030020052008290300370300024020612048490d00200620566a29030020045a0d0041022106206221080240034020082202204d6a200220576a2903003703002002204e6a200220586a2903003703002002204f6a200220596a2903003703002002203c6a2002205a6a29030037030020022002204b6a2208290300370300200620456a220620614f0d01200220566a2903002004540d000b0b2002204b6a21020b200220012903f001370300200220043703202002204e6a200a2903003703002002204f6a20132903003703002002203c6a200e2903003703000b205f450d0f2062203f6a2162205f21102061205b490d0d410021020c140b0240024002400240205c2064220e20446a22642048746a2202280200450d00205c200e2048746a220a20516a2802002205200228020422064d0d004102215e200e41024d0d04205c200e204a6a22022048746a2802042208200620056a4d0d014103215e200e41034d0d04200a20526a280200200820056a4d0d010c050b200e2048490d0120022802042106205c200e204a6a22022048746a28020421080b20082006490d010b200e20506a21020b200e200220456a22254d0d03200e20024d0d04205c20022048746a2215280204222020152802006a2202205c20252048746a2227280200225e490d05200220074b0d06201520436a21212026205e204b6c6a220f20272802042214204b6c22066a210a2002204b6c2108024002400240024002402002205e6b221220146b220220144f0d00203d200a2002204b6c22061084041a203e20066a210520142045480d0120022045480d01204020086a2108200a2102034020082002203f6a22122005203f6a22132005204c6a2903002002204c6a29030054220a1b22062903003703002008204d6a2006204d6a2903003703002008204e6a2006204e6a2903003703002008204f6a2006204f6a2903003703002008203c6a2006203c6a29030037030020052013200a1b2105200f20122002200a1b22024f0d042008203f6a2108203e2106203e2005490d000c050b0b203d200f20061084041a203e20066a210520142045480d01201220144c0d01202620086a2113203e2106200f210203402002200a2006200a204d6a2903002006204d6a2903005422121b22082903003703002002204d6a2008204d6a2903003703002002204e6a2008204e6a2903003703002002204f6a2008204f6a2903003703002002203c6a2008203c6a29030037030020062006204b6a20121b21062002204b6a2102200a204b6a200a20121b220a20134f0d04200520064b0d000c040b0b200a21020c010b200f21020b203e21060b20022006200520066b22082008204b706b1084041a2021202020146a3602002015205e36020020272027203c6a2025204473200e6a2048741085041a2064215e206420454b0d0d0b205f0d060c010b200e215e205f0d060b0240205d450d00205c10200b203b450d06203d1020410021020c110b41e896c2002025200e10b501000b41e896c2002002200e10b501000b205e2002102d000b20022007102e000b4101213a0c020b4101213a0c020b410021020c0a0b410121020c090b410121020c080b410021630c030b410121630c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b205f2060102d000b1031000b1024000b2017450d00201610200b200141b0026a24000bd20201047f230041d0006b22022400024002400240411310222203450d002003410f6a41002800b39141360000200341086a41002900ac9141370000200341002900a4914137000020034113412610212203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1000200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041c8d7c400410041001001417f460d002002422037022420022002360220200241306a200241206a103820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031020200241d0006a24000f0b411341011023000b412641011023000b419a88c00041331039000b800301047f230041c0006b220124000240024002400240411010222202450d00200241086a41002900feee40370000200241002900f6ee403700002000280200210320024110412010212202450d01200220033600102002412041c00010212202450d02200220002900043700142002412c6a2000411c6a290000370000200241246a200041146a2900003700002002411c6a2000410c6a290000370000200141206a41186a22004200370300200141206a41106a22034200370300200141206a41086a220442003703002001420037032020024134200141206a1000200141186a2000290300370300200141106a2003290300370300200141086a2004290300370300200120012903203703004100210002402001412041c8d7c400410041001001417f460d00200141003a002020014120200141206a41014100100141016a41014d0d0420012d002021000b20021020200141c0006a240020000f0b411041011023000b412041011023000b41c00041011023000b419a88c00041331039000b8912040a7f047e0a7f027e230041b0036b220524000240024002400240024002400240024002400240024002402004450d0020054190036a41186a2206420037030020054190036a41106a2207420037030020054190036a41086a22084200370300200542003703900341b791c100411d20054190036a1000200541e8016a41186a2006290300370300200541e8016a41106a2007290300370300200541e8016a41086a200829030037030020052005290390033703e801410021060240200541e8016a412041c8d7c400410041001001417f460d00200541d0026a41186a4200370300200541d0026a41106a4200370300200541d0026a41086a4200370300200542003703d002200541e8016a4120200541d0026a4120410010012206417f460d0b2006411f4d0d0b200541a0016a41186a200541d0026a41186a290300370300200541a0016a41106a200541d0026a41106a290300370300200541a0016a41086a200541d0026a41086a290300370300200520052903d0023703a001410121060b412810222208450d0b200820063a0004200841c8d7c400360200200820052903a001370005200820052f00e8013b00252008410d6a200541a8016a290300370000200841156a200541b0016a2903003700002008411d6a200541b8016a290300370000200841276a200541ea016a2d00003a0000200541a0016a200810ab0220052d00a001450d012004417f6a2109200541e8016a41206a210a200541a0016a4101722106200541e8016a41c0006a220b2002460d02200541e8016a41186a210c200541e8016a41106a210d200541c8026a210e4200210f4200211042002111420021120340200c2010370300200d200f370300200520113703e801200520123703f001200a200641c10010840421040240200b200241201086040d00200541f0026a41186a2213200441186a2214290200370300200541f0026a41106a2215200441106a2216290200370300200541f0026a41086a2217200441086a2218290200370300200520042902003703f002411010222207450d07200741086a41002900feee40370000200741002900f6ee4037000020074110412010212207450d0a200720013600102007412041c00010212207450d0b200720052903f0023700142007412c6a2013290300370000200741246a20152903003700002007411c6a201729030037000020054190036a41186a2219420037030020054190036a41106a221a420037030020054190036a41086a221b420037030020054200370390032007413420054190036a1000200541d0026a41186a2019290300370300200541d0026a41106a201a290300370300200541d0026a41086a201b29030037030020052005290390033703d002200541d0026a412041c8d7c400410041001001211c20071020201c417f470d00200e2c00002107201320142900003703002015201629000037030020172018290000370300200520042900003703f00220054190016a200541f0026a103b20054190016a41086a290300211d200529039001211e20054180016a200541f0026a103b200541d0006a20052903800120054180016a41086a2903002007200320072003411874411875481b2204ad423886423887420010880420192013290300370300201a2015290300370300201b2017290300370300200520052903f00237039003200541e0006a200120054190036a2004200910ec01201d20107c201e200f7c2210201e54ad7c200541e0006a41186a2903007c201020052903707c220f201054ad7c2110200541d0006a41086a29030020127c2005290350221e20117c2212201e54ad7c200541e0006a41086a2903007c201220052903607c2211201254ad7c21120b200541a0016a200810ab0220052d00a0010d000c040b0b4200210f4200211042002111420021120c030b42002111420021124200210f420021100c010b200541c8026a21194200210f4200211042002111420021120340200541e8016a41186a2010370300200541e8016a41106a200f370300200520113703e801200520123703f001200a200641c100108404210c200541f0026a41186a2207200641186a290000370300200541f0026a41106a2202200641106a290000370300200541f0026a41086a220b200641086a290000370300200520062900003703f002411010222204450d03200441086a41002900feee40370000200441002900f6ee4037000020044110412010212204450d04200420013600102004412041c00010212204450d05200420052903f0023700142004412c6a2007290300370000200441246a20022903003700002004411c6a200b29030037000020054190036a41186a220d420037030020054190036a41106a2213420037030020054190036a41086a2215420037030020054200370390032004413420054190036a1000200541d0026a41186a200d290300370300200541d0026a41106a2013290300370300200541d0026a41086a201529030037030020052005290390033703d002200541d0026a412041c8d7c40041004100100121172004102002402017417f470d0020192c000021042007200c41186a2900003703002002200c41106a290000370300200b200c41086a2900003703002005200c2900003703f002200541c0006a200541f0026a103b200541c0006a41086a290300211d2005290340211e200541306a200541f0026a103b20052005290330200541306a41086a2903002004200320042003411874411875481b2204ad4238864238874200108804200d2007290300370300201320022903003703002015200b290300370300200520052903f00237039003200541106a200120054190036a2004200910ec01201d20107c201e200f7c2210201e54ad7c200541106a41186a2903007c201020052903207c220f201054ad7c2110200541086a29030020127c2005290300221e20117c2212201e54ad7c200541106a41086a2903007c201220052903107c2211201254ad7c21120b200541a0016a200810ab0220052d00a0010d000b0b200810200b2000200f37031020002011370300200041186a201037030020002012370308200541b0036a24000f0b411041011023000b412041011023000b41c00041011023000b412041011023000b41c00041011023000b419a88c00041331039000b412841041023000bbd1207017f017e087f047e017f037e067f23004180016b2203240042002104200341086a41086a220542003703002003420037030841cdc8c000410d200341086a1002200341d8006a41086a2005290300370300200320032903083703580240024002400240024002400240200341d8006a411041c8d7c400410041001001417f460d0020034200370308200341d8006a4110200341086a41084100100141016a41084d0d01200329030821040b200341086a41106a427f370300200341086a41286a41023a0000200341086a41186a2002370300200341286a20002900003703002003427f3703104201210220034201370308200341d8006a200110a80220032802582106200328025c2107024002400240024002400240024020032802602208450d000240200341d8006a41186a22092000460d00200341f9006a210a200841286c210b420121022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a2211200e370300200341d8006a41086a200d370300200320103703580240024020092900002000290000510d002011290300220d2004580d010c050b2003290308210d4200210220034200370308200d4201510d060b200c41286a210c200b41586a220b0d000c020b0b200841286c210b200341086a41186a29030021122003290318211320032903102114200329030821022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a200e370300200341d8006a41086a200d370300200342003703082003201037035820024201510d03200c41286a210c42002102200b41586a220b0d000b0b4100210902402007450d00200610200b4108210a4100211520024201510d050c0b0b2003200a2800003602502003200a41036a280000360053200c41286a210c200341e0006a290300210e200341f8006a2d0000210b200341f0006a290300210f200329035821100c030b200c41286a210c0c010b200341086a41186a29030021122003290318211320032903102114200c41286a210c0b200341e0006a2903002202201320142003290358220d54201320025420132002511b220b1b210e200d2014200b1b2110200341e8006a2903002202201220122002541b210d200341f8006a2d0000410272210b200341f0006a290300210f420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336003b2003200328024036023841281022220a450d04200a2010370300200a200b3a0020200a200f370318200a200d370310200a2003280238360021200a200e370308200a41246a200328003b36000002400240200c2006200841286c6a2216460d002006200841286c6a2108200341d8006a41186a210b200341f9006a221741036a21184101210941012115034002400240024002400240200b2000460d000340200341d8006a41206a2219200c41206a290300370300200b200c41186a290300370300200341d8006a41106a2211200c41106a290300370300200341d8006a41086a221a200c41086a2903003703002003200c29030037035802400240200b2900002000290000510d002011290300220d2004580d010c040b2003290308210d4200210220034200370308200d4201510d040b2008200c41286a220c470d000c080b0b200341086a41186a290300210e2003290318210d2003290310210f200329030821020340200341d8006a41206a200c41206a290300370300200b200c41186a290300370300200341d8006a41106a200c41106a290300370300200341d8006a41086a200c41086a2903003703002003200c2903003703582003420037030820024201510d03420021022008200c41286a220c470d000c070b0b2003201728000036025020032018280000360053200c41286a210c201a290300211020192d00002111200b290300210e2003290358210f0c020b200341086a41186a290300210e2003290318210d2003290310210f0b200c41286a210c200341d8006a41086a2903002202200d200f2003290358221354200d200254200d2002511b22111b21102013200f20111b210f200341d8006a41106a2903002202200e200e2002541b210d200341d8006a41206a2d00004102722111200b290300210e420021020b2003200328005336004b200320032802503602482003200328004b36004320032003280248360240200341d8006a41206a221920113a0000200b200e370300200341d8006a41106a221a200d3703002017200328024036000020182003280043360000200320103703602003200f370358024020152009470d00200941016a22112009490d0620094101742215201120112015491b2215ad42287e220d422088a70d06200da722114100480d0602402009450d00200a200941286c20111021220a0d010c080b20111022220a450d070b200a200941286c6a22112003290358370300201141206a2019290300370300201141186a200b290300370300201141106a201a290300370300201141086a200341d8006a41086a290300370300200941016a2109200c2016470d000c020b0b41012109410121150b02402007450d00200610200b20024201520d060b200341d8006a41206a2200200541206a290300370300200341d8006a41186a220b200541186a290300370300200341d8006a41106a2211200541106a290300370300200341d8006a41086a2208200541086a2903003703002003200529030037035820092015470d04200941016a220c2009490d0120094101742205200c200c2005491b2215ad42287e2202422088a70d012002a7220c4100480d01024002402009450d00200a200941286c200c1021220a450d010c060b200c1022220a0d050b200c41081023000b419a88c00041331039000b1024000b201141081023000b412841081023000b200a200941286c6a220c2003290358370300200c41206a2000290300370300200c41186a200b290300370300200c41106a2011290300370300200c41086a2008290300370300200941016a21090b200320093602602003201536025c2003200a3602582001200341d8006a10ac0220034180016a24000b8607010d7f230041e0006b220124000240024002400240411a10222202450d00200241186a41002f00eeef403b0000200241106a41002900e6ef40370000200241086a41002900deef40370000200241002900d6ef403700002002411a413410212202450d012002200036001a200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002411e200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100920021020411310222202450d022002410f6a41002800b39141360000200241086a41002900ac9141370000200241002900a4914137000020024113412610212202450d0320022000360013200141c0006a41186a22044200370300200141c0006a41106a22054200370300200141c0006a41086a220342003703002001420037034020024117200141c0006a1000200141206a41186a22062004290300370300200141206a41106a22072005290300370300200141206a41086a200329030037030020012001290340370320200141206a4120100920021020200141c0006a200010ea012001280244210820012802402109024002400240024020012802482202450d002002410574210a200921030340200141186a220b200341186a290000370300200141106a220c200341106a290000370300200141086a220d200341086a29000037030020012003290000370300411010222202450d02200241086a41002900feee40370000200241002900f6ee4037000020024110412010212202450d03200220003600102002412041c00010212202450d04200341206a2103200220012903003700142002412c6a200b290300370000200241246a200c2903003700002002411c6a200d2903003700002004420037030020054200370300200141c0006a41086a220b42003703002001420037034020024134200141c0006a10002006200429030037030020072005290300370300200141206a41086a200b29030037030020012001290340370320200141206a4120100920021020200a41606a220a0d000b0b02402008450d00200910200b200141e0006a24000f0b411041011023000b412041011023000b41c00041011023000b411a41011023000b413441011023000b411341011023000b412641011023000bd30201057f230041d0006b22022400024002400240411710222203450d002003410f6a410029009c9141370000200341086a410029009591413700002003410029008d914137000020034117412e10212203450d0120032001370017200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a22064200370300200242003703302003411f200241306a1000200241186a2004290300370300200241106a2005290300370300200241086a200629030037030020022002290330370300024002402002412041c8d7c400410041001001417f460d002002422037022420022002360220200241306a200241206a10e80120022802302204450d0420002002290234370204200020043602000c010b20004100360208200042083702000b20031020200241d0006a24000f0b411741011023000b412e41011023000b419a88c00041331039000b9d0501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103e024002400240024002402000450d00200041e8006c2104200241086a2105034020052802002100200228020421060240024002400240024002400240024002402003280200410f470d0020062000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d03200228020020002007102122060d040c0c0b20062000470d01200041016a22062000490d0a20004101742207200620062007491b22074100480d0a2000450d05200228020020002007102122060d060c0c0b200228020021060c030b200228020021060c050b200710222206450d080b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41003a0000200341e8006a2103200441987f6a22040d030c040b200710222206450d060b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41013a000020032002109501200341e0006a2802002107024002400240024020022802042206200528020022006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102122060d020c090b200228020021060c020b200010222206450d070b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200341e8006a2103200441987f6a22040d000b0b200228020421002001280200200128020420022802002203200241086a280200100302402000450d00200310200b200241106a24000f0b1024000b200741011023000b200741011023000b200041011023000bb60504027f017e0e7f017e230041d0006b22022400200241086a2001108e010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210e4100210d0c030b1031000b200541081023000b200141046a2107200241306a41186a2108200241306a41106a21094100210a4100210b4100210c2003210d0240034020024200370330200141086a2205410020012802002007280200200241306a410820052802001001220e200e417f461b220e4108200e4108491b20052802006a220f360200200e41074d0d01200229033021042008420037030020094200370300200241306a41086a22104200370300200242003703302005410020012802002007280200200241306a4120200f1001220e200e417f461b220e4120200e4120491b20052802006a360200200e411f4d0d01200c41016a210e200241106a41186a220f2008290300370300200241106a41106a22112009290300370300200241106a41086a22122010290300370300200220022903303703100240200c200d470d00200a200e200e200a491b220dad42287e2213422088a70d042013a722054100480d040240200c450d002006200b2005102122060d010c060b200510222206450d050b2006200b6a22052004370300200541206a200f290300370300200541186a2011290300370300200541106a2012290300370300200541086a2002290310370300200a41026a210a200b41286a210b200e210c200e2003490d000c020b0b200041003602000240200d450d00200610200b200241d0006a24000f0b2000200d36020420002006360200200041086a200e360200200241d0006a24000f0b1024000b200541081023000ba20403057f017e037f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103e0240024002400240024002402000450d002003200041286c6a2104200241086a22052802002100200228020421060340200329030021070240024002400240200620006b41084f0d00200041086a22082000490d0620064101742209200820082009491b220a4100480d062006450d0120022802002006200a102122090d020c070b200041086a2108200228020021090c020b200a10222209450d050b2002200a36020420022009360200200a21060b20052008360200200920006a20073700000240024002400240200620086b41204f0d00200841206a22002008490d062006410174220a20002000200a491b220a4100480d062006450d0120092006200a102122090d020c080b200841206a21000c020b200a10222209450d060b2002200a36020420022009360200200a21060b20052000360200200920086a220841086a200341106a290000370000200841106a200341186a290000370000200841186a200341206a2900003700002008200341086a290000370000200341286a22032004470d000b200128020020012802042009200010032006450d050c040b200228020421032001280200200128020420022802002209200241086a280200100320030d030c040b1024000b200a41011023000b200a41011023000b200910200b200241106a24000bdd0504027f017e0f7f017e230041d0006b22022400200241086a2001108e010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210f4100210d0c030b1031000b200541081023000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d024003402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001001220f200f417f461b220f4120200f412049220f1b20052802006a2210360200200f0d01200241106a41186a22112007290300370300200241106a41106a22122008290300370300200241106a41086a2213200e29030037030020022002290330370310200242003703302005410020012802002009280200200241306a410820101001220f200f417f461b220f4108200f4108491b20052802006a360200200f41074d0d01200c41016a210f200229033021042007201129030037030020082012290300370300200e2013290300370300200220022903103703300240200c200d470d00200a200f200f200a491b220dad42287e2214422088a70d042014a722054100480d040240200c450d002006200b2005102122060d010c060b200510222206450d050b2006200b6a22052002290330370300200541186a2007290300370300200541106a2008290300370300200541086a200e290300370300200541206a2004370300200a41026a210a200b41286a210b200f210c200f2003490d000c020b0b200041003602000240200d450d00200610200b200241d0006a24000f0b2000200d36020420002006360200200041086a200f360200200241d0006a24000f0b1024000b200541081023000bc20304027f017e087f017e230041106b2202240020022001108e0102400240024002400240024002400240024002402002280200450d0020022802042203ad2204421d88a70d032004420386a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241106a24000f0b4108210620030d030b410021054100210b0c030b1031000b200541081023000b200141046a210741002108410021094100210a2003210b034020024200370308200141086a2205410020012802002007280200200241086a410820052802001001220c200c417f461b220c4108200c4108491b20052802006a360200200c41074d0d02200a41016a2105200229030821040240200a200b470d002008200520052008491b220bad420386220d422088a70d04200da7220c4100480d040240200a450d0020062009200c102122060d010c060b200c10222206450d050b200620096a2004370300200841026a2108200941086a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610200b200241106a24000f0b1024000b200c41081023000bb50d03017f017e097f230041d0006b2204240042002105200441206a41086a220642003703002004420037032041c898c200411d200441206a1002200441086a220720062903003703002004200429032037030002400240024002400240024002400240024002402004411041c8d7c400410041001001417f460d002004421037021420042004360210200441206a200441106a10f60120042903304202510d0102402004280244450d00200441c0006a28020010200b200041046a280200450d0920002802001020200441d0006a24000f0b200642003703002004420037032041cdc8c000410d200441206a100220072006290300370300200420042903203703000240024002402004411041c8d7c400410041001001417f460d002004420037032020044110200441206a41084100100141016a41084d0d01200429032021050b02402002a74101470d00200441206a41086a220642003703002004420037032041e598c200411a200441206a1002200441086a20062903003703002004200429032037030002402004411041c8d7c400410041001001417f460d002004420037032020044110200441206a41084100100141016a41084d0d0320042903202005580d00200041046a280200450d0c20002802001020200441d0006a24000f0b200441206a41086a220642003703002004420037032041e598c200411a200441206a1002200441086a2006290300370300200420042903203703002004200142018620057c37032020044110200441206a410810030b200028020821062000280204210820002802002109200441206a41086a220042003703002004420037032041c898c200411d200441206a1002200441086a2000290300370300200420042903203703002004410036022820044201370320410810222200450d03200442888080808001370224200420003602202000200537000020004108411010212200450d04200442908080808002370224200020013700082004200036022020042006360210200441106a200441206a103e02400240024002402006450d002009200641286c6a210a200441206a41086a220b280200210c2004280224210720092100034002400240024002402007200c6b41204f0d00200c41206a2206200c490d062007410174220d20062006200d491b220e4100480d062007450d0120042802202007200e1021220d0d020c070b200c41206a21062004280220210d0c020b200e1022220d450d050b2004200e3602242004200d360220200e21070b200b2006360200200d200c6a220c41186a200041186a290000370000200c41106a200041106a290000370000200c41086a200041086a290000370000200c2000290000370000200041206a29030021050240200720066b41074b0d00200641086a220c2006490d032007410174220e200c200c200e491b220c4100480d03024002402007450d00200d2007200c1021220d0d010c070b200c1022220d450d060b2004200c3602242004200d360220200c21070b200b200641086a220c360200200d20066a2005370000200a200041286a2200470d000b0b200441286a28020021002004280224210702400240024002400240024002400240024002400240024020024201520d0020072000470d01200041016a22062000490d0c20004101742207200620062007491b22074100480d0c2000450d03200428022020002007102122060d040c140b20072000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d05200428022020002007102122060d060c140b200428022021060c030b20042802202106200721070c050b200710222206450d100b20042007360224200420063602200b200441206a41086a220b200041016a220d360200200620006a41013a000002402007200d6b41074b0d00200d41086a220c200d490d072007410174220e200c200c200e491b220c4100480d072007450d0420062007200c102122060d050c110b2007210c0c050b200710222206450d0e0b20042007360224200420063602200b200441286a200041016a220d360200200620006a41003a0000200441102006200d10032007450d0f0c0e0b200c10222206450d0c0b2004200c360224200420063602200b200b200041096a22003602002006200d6a200337000020044110200620001003200c0d0b0c0c0b1024000b200e41011023000b200c41011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b410841011023000b411041011023000b200741011023000b200741011023000b200c41011023000b200610200b2008450d00200910200b200441d0006a24000be20808037f017e017f017e017f017e0c7f027e230041d0006b22022400200242003703302001410020012802002001280204200241306a41082001280208100122032003417f461b2203410820034108491b20012802086a2204360208024002400240024002400240200341074d0d002002290330210520024200370330200141086a220641002001280200200141046a280200200241306a41082004100122032003417f461b2203410820034108491b20062802006a360200200341074d0d0020022903302107200241086a2001108e012002280208450d000240024002400240200228020c2208ad42287e2209422088a70d002009a72203417f4c0d00024002402003450d0020031022220a450d032008450d010c040b4108210a20080d030b4100210f42002109200a450d040c030b1031000b200341081023000b200241306a41186a2104200241306a41106a2106200141046a210b420021094100210c4100210d4100210e2008210f024003402004420037030020064200370300200241306a41086a2210420037030020024200370330200141086a220341002001280200200b280200200241306a41202003280200100122112011417f461b22114120201141204922111b20032802006a221236020020110d01200241106a41186a22132004290300370300200241106a41106a22142006290300370300200241106a41086a221520102903003703002002200229033037031020024200370330200341002001280200200b280200200241306a41082012100122112011417f461b2211410820114108491b20032802006a360200201141074d0d01200e41016a211120022903302116200420132903003703002006201429030037030020102015290300370300200220022903103703300240200e200f470d00200c20112011200c491b220fad42287e2217422088a70d082017a722034100480d080240200e450d00200a200d20031021220a0d010c0a0b20031022220a450d090b200a200d6a22032002290330370300200341186a2004290300370300200341106a2006290300370300200341086a2010290300370300200341206a201637030020094280808080107c2109200c41026a210c200d41286a210d2011210e20112008490d000b200a0d010c020b200f450d01200a10200c010b2009200fad842116200241003a00302001280200200141046a280200200241306a4101200141086a22032802001001210420032003280200200441016a41014b22046a22063602002004450d0120022d00304101470d014200210920024200370330200141086a220341002001280200200141046a280200200241306a41082006100122012001417f461b2201410820014108491b20032802006a360200200141074d0d0220022903302117420121090c030b20004202370310200241d0006a24000f0b420021090b0b20002017370318200020093703102000200737030820002005370300200041246a2016370200200041206a200a360200200241d0006a24000f0b1024000b200341081023000b870301047f23004180026b22022400024002400240411210222203450d00200341106a41002f0098a7433b0000200341086a4100290090a74337000020034100290088a74337000020034112412410212203450d012003200136001220024198016a41186a2201420037030020024198016a41106a2204420037030020024198016a41086a2205420037030020024200370398012003411620024198016a1000200241e8006a41186a2001290300370300200241e8006a41106a2004290300370300200241e8006a41086a2005290300370300200220022903980137036802400240200241e8006a412041c8d7c400410041001001417f460d002002422037028c012002200241e8006a3602880120024198016a20024188016a10ab012002290398014201520d04200241086a20024198016a41086a41e0001084041a20004201370300200041086a200241086a41e0001084041a0c010b200042003703000b2003102020024180026a24000f0b411241011023000b412441011023000b419a88c00041331039000b850602057f037e230041c0006b22042400024002400240411410222205450d00200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1000200441186a2006290300370300200441106a2007290300370300200441086a2008290300370300200420042903203703000240024002402004412041c8d7c400410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012206417f460d022006410f4d0d02200441286a29030021092004290320210a0c010b4200210a420021090b20051020200441206a2001200a20027c2202200920037c2002200a54ad7c10cb01200441206a41106a290300210a20042903282102024002400240024020042903204200510d004200210b200441206a41086a2205420037030020044200370320418feec0004116200441206a1002200441086a22012005290300370300200420042903203703002004411041c8d7c400410041001001417f460d01200442003703282004420037032020044110200441206a4110410010012206417f460d072006410f4d0d07200441286a2903002103200429032021090c020b2002210b0c020b42002109420021030b2005420037030020044200370320418feec0004116200441206a10022001200529030037030020042004290320370300200442002003200a7d2009200254ad7d220a200920027d2202200956200a200356200a2003511b22051b37032820044200200220051b37032020044110200441206a411010034200210a0b2000200b3703002000200a370308200441c0006a24000f0b419a88c00041331039000b411441011023000b413441011023000b419a88c00041331039000bb60202047f027e230041206b22022400200241106a41086a2203420037030020024200370310418feec0004116200241106a1002200241086a22042003290300370300200220022903103703000240024002402002411041c8d7c400410041001001417f460d00200242003703182002420037031020024110200241106a4110410010012205417f460d022005410f4d0d02200241186a2903002106200229031021070c010b42002107420021060b2003420037030020024200370310418feec0004116200241106a100220042003290300370300200220022903103703002002427f200620017c200720007c22002007542203ad7c22072003200720065420072006511b22031b3703182002427f200020031b37031020024110200241106a41101003200241206a24000f0b419a88c00041331039000b7d01017f230041c0006b220124002001412e36020c200141b3c1c000360208200120003602142001413c6a41223602002001412c6a4102360200200141033602342001420237021c200141b8d4c4003602182001200141146a3602382001200141086a3602302001200141306a360228200141186a41c8d4c4001048000b130020004101360204200041d8c2c0003602000b1600200120002802002200280200200028020810fd010b8008010b7f200028021021030240024002400240024002400240024002400240200028020822044101470d0020030d010c020b2003450d070b02402002450d00200120026a2105200041146a280200417f732106410021072001210320012108024002400340200341016a21090240024020032c0000220a4100480d00200a41ff0171210a20092103200641016a22060d010c030b02400240024020092005460d0020092d0000413f71210b200341026a22032109200a411f71210c200a41ff0171220a41e001490d010c020b4100210b20052103200a411f71210c200a41ff0171220a41e0014f0d010b200b200c41067472210a20092103200641016a22060d010c030b02400240024020032005460d00200341016a2209210d20032d0000413f71200b41067472210b200a41f001490d010c020b2005210d4100200b41067472210b200a41f0014f0d010b200b200c410c7472210a20092103200641016a22060d010c030b02400240200d2005460d00200d41016a2103200d2d0000413f71210a0c010b4100210a200921030b200b410674200c411274418080f0007172200a72220a418080c400460d03200641016a2206450d020b200720086b20036a21072003210820052003470d000c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b2004450d020c010b410021022004450d010b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200220096b2000410c6a28020022064f0d014100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a2109410020002d0030220320034103461b2203410371450d0220034102460d03410021080c040b2000280218200120022000411c6a28020028020c1100000f0b2000280218200120022000411c6a28020028020c1100000f0b20092108410021090c010b200941016a4101762108200941017621090b417f2103200041046a210a200041186a21062000411c6a210702400340200341016a220320094f0d012006280200200a2802002007280200280210110400450d000b41010f0b200041046a280200210941012103200041186a220a280200200120022000411c6a220628020028020c1100000d01200a280200210a417f2103200628020041106a210602400340200341016a220320084f0d01200a20092006280200110400450d000b41010f0b41000f0b2000280218200120022000411c6a28020028020c11000021030b20030bb81c04047f027e027f027e23004180016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002b05090d0a0608040b030c0102000b200241206a200141086a10b70120004101360200200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b200241206a200141086a10ff01200041086a200241206a41d8001084041a2000410d36020020024180016a24000f0b200128020422044102460d0b4101210320044101470d29200141086a10800221010c160b2001410c6a2802002203417f4c0d29200128020421012003450d0e2003102222040d0f200341011023000b4102210320012d000422044102460d0a20044101470d29200141086a280200210541e00010222204450d2e20042001410c6a28020010fe01410121030c0b0b200141086a28020022034102460d0b20034101470d292001410c6a22032d00004101470d14200141106a2802002104410121030c150b200241206a200141086a10810220004107360200200041c0006a200241206a41386a290300370300200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b20004100360200200041086a200141086a29030037030020024180016a24000f0b200141086a22042d0000417f6a220341044b0d27024020030e05001d191b17000b2001410c6a1080022101410121030c1d0b41032103200141086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d27200241046a200441066a2f00003b0100200241286a200141206a290200370300200241206a41106a200141286a2d00003a00002002200441026a2800003602002002200141186a290200370320200141106a2902002106200141096a2d000021010c0c0b200241206a200141086a10820220004106360200200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b2000410a360200200041086a200141086a29030037030020024180016a24000f0b200141086a280200417f6a220341044b0d25024020030e05001b161814000b200141386a2903002106200141306a2903002107410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b200241206a200141086a10830220004105360200200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b41012103200141086a2d00004101470d082001410c6a28020021040c090b200241026a200141046a220441036a2d00003a0000200241206a41086a200141186a2902003703002002412d6a2001411d6a290000370000200220042f00013b01002002200141106a290200370320200141256a2d00004100472108200141286a28020021092001410c6a2802002104200141086a28020021050b200020022f01003b0005200020033a0004200020083a0025200041093602002000410c6a2004360200200041086a2005360200200041106a2002290320370200200041286a2009360200200041076a200241026a2d00003a0000200041186a200241206a41086a2903003702002000411d6a2002412d6a29000037000020024180016a24000f0b410121032001410c6a22042d00004101470d0a200141106a28020021040c0b0b410121040b20042001200310840421012000410c6a2003360200200041086a2003360200200020013602042000410b36020020024180016a24000f0b200141106a29030021060c010b20042d000141004721010b200020013a00092000200228020036010a20004104360200200041086a20033a0000200041106a2006370300200041186a20022903203703002000410e6a200241046a2f01003b0100200041206a200241206a41086a290300370300200041286a200241206a41106a29030037030020024180016a24000f0b200241086a200141186a290200370300200241106a200141206a2802003602002002200141106a290200370300200141246a350200200141286a310000422086842106200141096a2f00002001410b6a2d00004110747221052001410c6a2802002104410021030b200241206a41106a200241106a280200360200200241206a41086a200241086a2903003703002002200229030037032020032005410874722101410221030b200020033602042000410e3602002000410c6a2004360200200041086a2001360200200041106a2002290320370200200041246a2006370200200041186a200241206a41086a290300370200200041206a200241206a41106a28020036020020024180016a24000f0b200241fe006a200341036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220032f00013b017c2002200141146a290200370320200141106a2802002104410021030b2002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141386a2903002106200141306a2903002107410121050c020b200241fe006a200441036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220042f00013b017c2002200141146a290200370320200141106a2802002104410021030b410221052002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141c8006a290300210a200141c0006a290300210b200141386a2903002106200141306a29030021070b200020022f011c3b000d20004103360200200041c8006a200a370300200041c0006a200b370300200041386a2006370300200041306a20073703002000410c6a20033a0000200041086a2005360200200041106a2004360200200041146a20022903003702002000410f6a2002411e6a2d00003a00002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a28020036020020024180016a24000f0b200141106a2903002106410521030c060b2001410c6a28020022034108762104410521010c090b41032103200241fe006a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141106a29020021062001410c6a28020021010c040b200241206a41106a200141206a2903003703002002200141186a2903003703282002200141106a2802003602202001410c6a28020022034108762104200141286a290300210b410321010c070b200141106a2903002106410421030c020b2001410c6a28020022034108762104410421010c050b41022103200241fc006a41026a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141296a2d00004100472104200141106a29020021062001410c6a28020021010b200020022f017c3b0009200020043a00292000200228010036012a200041086a20033a0000200041106a20063703002000410c6a2001360200200041186a20022903203703002000410b6a200241fe006a2d00003a0000200041206a200241206a41086a290300370300200041286a200241206a41106a2d00003a00002000412e6a200241046a2f01003b01002000410836020020024180016a24000f0b2002200141186a2903003703282002200141106a29030037032041022101410021030c020b200241086a2001411c6a290200370300200241106a200141246a2802003602002002200141146a290200370300200141286a3502002001412c6a31000042208684210b2001410d6a2f00002001410f6a2d0000411074722104200141106a2802002101410021030b2002412c6a200241086a290300370200200241346a200241106a2802003602002002200229030037022420022001360220410121010b2000410c360200200041386a2006370300200041306a2007370300200041086a2001360200200041106a2002290320370300200041286a200b3703002000410c6a2004410874200341ff017172360200200041186a200241206a41086a290300370300200041206a200241206a41106a29030037030020024180016a24000f0b1045000b4198afc200102f000b1031000b41b8b3c000102f000b41d0bdc100102f000b41ccb0c200102f000b41f0afc200102f000b41a8a8c300102f000b41e00041081023000b980b02057f037e230041c0006b220224000240024020012d0000417f6a220341044b0d000240024002400240024002400240024002400240024020030e050004020301000b200041d0006a200141d0006a280200360200200041c8006a200141c8006a290300370300200041c0006a200141c0006a290300370300200041386a200141386a290300370300200041306a200141306a290300370300200041286a200141286a290300370300200041206a200141206a290300370300200041186a200141186a290300370300200041106a200141106a290300370300200041086a200141086a290300370300200041d4006a200141d4006a2d00004100473a0000200041013a0000200241c0006a24000f0b200241186a2204200141196a290000370300200241106a2205200141116a290000370300200241086a2206200141096a29000037030020022001290001370300410021030240200141216a2d00004101470d00200241206a41186a2001413a6a290000370300200241206a41106a200141326a290000370300200241206a41086a2001412a6a2900003703002002200141226a290000370320410121030b20002002290300370001200041216a20033a0000200041226a2002290320370000200041196a2004290300370000200041116a2005290300370000200041096a20062903003700002000412a6a200241206a41086a290300370000200041326a200241206a41106a2903003700002000413a6a200241206a41186a290300370000200041053a0000200241c0006a24000f0b41012104200141046a2d00004101470d02200141086a28020021050c030b200141386a2903002107200141306a2903002108200141c0006a2903002109200241386a200141196a290000370300200241306a200141116a290000370300200241286a200141096a290000370300200220012900013703202001412c6a2802002203417f4c0d08200141246a28020021012003450d032003102222040d04200341011023000b2001410c6a2802002203417f4c0d07200141046a2802002104200141106a29030021072003450d042003102222010d05200341011023000b200241026a200141076a2d00003a0000200241206a41086a200141146a290000370300200241306a2001411c6a290000370300200241386a200141246a2d00003a00002002200141056a2f00003b010020022001410c6a290000370320200141086a2800002105410021040b200141306a2802002203417f4c0d05200141c0006a2903002107200141386a2903002108200141286a2802002106200141c8006a2903002109024002402003450d002003102222010d01200341011023000b410121010b2001200620031084042101200041c0006a2007370300200041386a2008370300200041046a20043a0000200041086a2005360200200041c8006a2009370300200041306a20033602002000412c6a2003360200200041286a2001360200200041056a20022f01003b0000200041076a200241026a2d00003a00002000410c6a2002290320370200200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a280200360200200041033a0000200241c0006a24000f0b410121040b2004200120031084042101200041386a2007370300200041306a2008370300200041c0006a20093703002000412c6a2003360200200041286a2003360200200041246a2001360200200041043a000020002002290320370001200041096a200241286a290300370000200041116a200241306a290300370000200041196a200241386a290300370000200241c0006a24000f0b410121010b20012004200310840421012000410c6a2003360200200041086a2003360200200041046a2001360200200041106a2007370300200041023a0000200241c0006a24000f0b41c89dc300102f000b1031000bdc1c04057f027e027f027e23004180016b22012400024002400240024002400240024002400240024041e00010222202450d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002200280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002c05090d0a0608040b030c0102000b200141086a200041086a10b70120024101360200200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200141086a200041086a10ff01200241086a200141086a41d8001084041a2002410d36020020014180016a240020020f0b200028020422044102460d0b4101210320044101470d2a200041086a10800221000c160b2000410c6a2802002203417f4c0d2a200028020421002003450d0e2003102222040d0f200341011023000b4102210320002d000422044102460d0a20044101470d2a200041086a280200210541e00010222204450d2f20042000410c6a28020010fe01410121030c0b0b200041086a28020022034102460d0b20034101470d2a2000410c6a22032d00004101470d14200041106a2802002104410121030c150b200141086a200041086a10810220024107360200200241c0006a200141086a41386a290300370300200241386a200141086a41306a290300370300200241306a200141086a41286a290300370300200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200041086a2903002106200241003602002002200637030820014180016a240020020f0b200041086a22042d0000417f6a220341044b0d28024020030e05001d191b17000b2000410c6a1080022100410121030c1d0b41032103200041086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d28200141e4006a200441066a2f00003b0100200141106a200041206a290000370300200141086a41106a200041286a2d00003a00002001200441026a2800003602602001200041186a290000370308200041106a2900002106200041096a2d000021000c0c0b200141086a200041086a10820220024106360200200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200041086a29030021062002410a3602002002200637030820014180016a240020020f0b200041086a280200417f6a220341044b0d26024020030e05001b161814000b200041386a2903002106200041306a2903002107410121032000410c6a2d00004101470d1b200041106a28020021000c1c0b200141086a200041086a10830220024105360200200241386a200141086a41306a290300370300200241306a200141086a41286a290300370300200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b41012103200041086a2d00004101470d082000410c6a2802002104410021050c090b200141e0006a41026a200041046a220441036a2d00003a0000200141086a41086a200041186a290000370300200141156a2000411d6a290000370000200120042f00013b01602001200041106a290000370308200041256a2d00004100472108200041286a28020021092000410c6a2800002104200041086a28000021050b200220012f01603b0005200220033a00042002200436020c200220053602082002200129030837021020022009360228200220083a002520024109360200200241076a200141e2006a2d00003a0000200241186a200141106a2903003702002002411d6a200141156a29000037000020014180016a240020020f0b410121032000410c6a22042d00004101470d0a200041106a28020021040c0b0b410121040b20042000200310840421002002200336020c20022003360208200220003602042002410b36020020014180016a240020020f0b200041106a29030021060c010b20042d000141004721000b200220003a0009200220033a00082002200128026036010a2002200637031020022001290308370318200241043602002002410e6a200141e0006a41046a2f01003b0100200241206a200141106a290300370300200241286a200141186a29030037030020014180016a240020020f0b200141086a41086a200041186a290000370300200141086a41106a200041206a290000370300200141086a41186a200041286a2d00003a00002001200041106a290000370308200041096a2f00002000410b6a2d00004110747241087421052000410c6a2800002104410021030b200141e0006a41186a200141086a41186a280200360200200141e0006a41106a200141086a41106a290300370300200141e0006a41086a200141086a41086a2903003703002001200129030837036020032005722100410221030b2002200436020c2002200036020820022003360204200220012903603702102002410e360200200241186a200141e8006a290300370200200241206a200141f0006a290300370200200241286a200141e0006a41186a28020036020020014180016a240020020f0b200141fe006a200341036a2d00003a0000200141106a2000411c6a290200370300200141086a41106a200041246a290200370300200141206a2000412c6a2d00003a0000200120032f00013b017c2001200041146a290200370308200041106a2802002104410021030b200141046a41026a200141fc006a41026a2d00003a0000200141e0006a41086a200141086a41086a290300370300200141e0006a41106a200141086a41106a290300370300200141e0006a41186a200141086a41186a280200360200200120012f017c3b010420012001290308370360200041386a2903002106200041306a2903002107410121050c020b200141fe006a200441036a2d00003a0000200141106a2000411c6a290200370300200141086a41106a200041246a290200370300200141206a2000412c6a2d00003a0000200120042f00013b017c2001200041146a290200370308200041106a2802002104410021030b41022105200141046a41026a200141fc006a41026a2d00003a0000200141e0006a41086a200141086a41086a290300370300200141e0006a41106a200141086a41106a290300370300200141e0006a41186a200141086a41186a280200360200200120012f017c3b010420012001290308370360200041c8006a290300210a200041c0006a290300210b200041386a2903002106200041306a29030021070b2002200b37034020022007370330200220033a000c20022005360208200220012f01043b000d200220043602102002200129036037021420024103360200200241c8006a200a370300200241386a20063703002002410f6a200141066a2d00003a00002002411c6a200141e8006a290300370200200241246a200141f0006a2903003702002002412c6a200141f8006a28020036020020014180016a240020020f0b200041106a2903002106410521030c060b2000410c6a28020022034108762104410521000c090b41032103200141fe006a200441036a2d00003a0000200141106a200041206a290000370300200141086a41106a200041286a2d00003a0000200120042f00013b017c2001200041186a290000370308200041106a29000021062000410c6a28000021000c040b200141086a41106a200041206a2903003703002001200041186a2903003703102001200041106a2802003602082000410c6a28020022034108762104200041286a290300210b410321000c070b200041106a2903002106410421030c020b2000410c6a28020022034108762104410421000c050b41022103200141fc006a41026a200441036a2d00003a0000200141106a200041206a290000370300200141086a41106a200041286a2d00003a0000200120042f00013b017c2001200041186a290000370308200041296a2d00004100472104200041106a29000021062000410c6a28000021000b200220012f017c3b0009200220033a0008200220063703102002200036020c20022001290308370318200220043a00292002200128016036012a2002410b6a200141fe006a2d00003a0000200241206a200141086a41086a290300370300200241286a200141186a2d00003a00002002412e6a200141e4006a2f01003b01002002410836020020014180016a240020020f0b2001200041186a2903003703102001200041106a29030037030841022100410021030c020b200141e8006a2000411c6a290200370300200141e0006a41106a200041246a2802003602002001200041146a290200370360200041286a3502002000412c6a31000042208684210b2000410d6a2f00002000410f6a2d0000411074722104200041106a2802002100410021030b200141146a200141e8006a2903003702002001411c6a200141f0006a2802003602002001200129036037020c20012000360208410121000b2002200737033020022000360208200220012903083703102002200b3703282002410c360200200241386a200637030020022004410874200341ff01717236020c200241186a200141086a41086a290300370300200241206a200141186a29030037030020014180016a240020020f0b41e00041081023000b1045000b4198afc200102f000b1031000b41b8b3c000102f000b41d0bdc100102f000b41ccb0c200102f000b41f0afc200102f000b41a8a8c300102f000b41e00041081023000bb20a01047f230041206b2202240002400240024002402001280200417f6a220341094b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b2001410c6a2802002203417f4c0d124101210402402003450d0020012802042105200310222204450d142004200520031084041a0b20002004360204200041013602002000410c6a2003360200200041086a2003360200200041106a200141106a280200360200200241206a24000f0b2000410536020020002001280204360204200241206a24000f0b2000410a360200200041086a200141086a290300370300200241206a24000f0b2001280204210441012103200141086a22052d00004101470d062001410c6a28020021050c070b2000410436020020002001280204360204200241206a24000f0b4101210320012d00044101470d06200141086a28020021010c070b2001410c6a2802002203417f4c0d0c2003450d0920012802042105200310222204450d0e2004200520031084041a0c0a0b4101210320012d00044101470d06200141086a28020021040c070b2000410736020020002001280204360204200241206a24000f0b20004109360200200041086a200141086a290300370300200241206a24000f0b2002411e6a200541036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220052f00013b011c2002200141106a2902003703002001410c6a2802002105410021030b20002004360204200020022f011c3b0009200041086a20033a00002000410c6a2005360200200041106a20022903003702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a2802003602002000412c6a2001412c6a29020037020020004103360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030b200020022f011c3b0005200020033a000420004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002104410021030b200020033a0004200020022f011c3b0005200041086a20043602002000410c6a2002290300370200200041386a200141386a290300370300200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141286a280200210120004106360200200041286a2001360200200241206a24000f0b410121040b20002004360204200041023602002000410c6a2003360200200041086a2003360200200041106a200141106a280200360200200241206a24000f0b41ac86c200102f000b1031000b200341011023000b200341011023000bf70401027f02400240024020012d0000417f6a2202410b4b0d004109210302400240024002400240024002400240024002400240024020020e0c000406020809070b05030a01000b41e00010222202450d0c2002200141046a28020010b602200041046a2002360200200041106a200141106a290300370300200041086a200141086a290300370300200041013a00000f0b2000410c3a00000f0b200020012d00013a0001200041046a200141046a280200360200200041043a00000f0b20002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700002000410a3a00000f0b200041046a200141046a280200360200410221030b200020033a00000f0b200020012d00013a0001200041046a200141046a280200360200200041033a00000f0b200041086a200141086a290300370300200041046a200141046a280200360200200041073a00000f0b41e00010222202450d052002200141046a28020010b602200041046a2002360200200041086a200141086a290300370300200020012d00013a0001200041053a00000f0b200041046a200141046a280200360200200041063a00000f0b20002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00002000410b3a00000f0b20002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a290000370000200041083a00000f0b41f4bcc100102f000b41e00041081023000b41e00041081023000be70d03047f017e057f230041206b220224000240024002400240024002400240024020012d0000417f6a2203410e4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0f00090607030a0c080d050e02040b01000b41012103200141046a2d00004101470d0e200141086a28020021040c0f0b2001410c6a2802002205ad2206421b88a70d162006420586a72203417f4c0d16200141046a28020021072003450d11200310222208450d172005450d120c1b0b2000410c3a0000200041046a200141046a280200360200200241206a24000f0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a280200360200200241206a24000f0b2000410d3a0000200020012d00014100473a0001200241206a24000f0b2000410a3a0000200041086a200141086a290300370300200241206a24000f0b200041033a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b200041043a0000200241206a24000f0b200041083a0000200020012d00013a0001200241206a24000f0b200041023a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b2001410c6a280200220aad42247e2206422088a70d0d2006a72204417f4c0d0d200141046a28020021032004450d0a20041022220b450d0f200a450d0b0c100b2000410e3a0000200041046a200141046a280200360200200241206a24000f0b200041073a0000200241206a24000f0b41012103200141046a2d00004101470d03200141086a28020021010c040b2000410b3a0000200041086a200141086a290300370300200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030b200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041286a200141286a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141016a2d00002101200041013a0000200020013a0001200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030b200041093a0000200041056a20022f011c3b0000200041046a20033a0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b4101210820050d090b41002105410021010c090b4104210b200a0d050b410021040c050b41c898c400102f000b1031000b200341011023000b200441041023000b200a41246c2105410021042002411e6a2109200b210103400240024020032d00004101470d00200341046a2802002107410121080c010b2009200341036a2d00003a0000200341046a2800002107200341016a2f00002108200241186a200341206a2d00003a0000200241106a200341186a290000370300200241086a200341106a290000370300200220083b011c2002200341086a290000370300410021080b200341246a2103200120083a0000200141046a2007360200200141036a20092d00003a0000200141016a20022f011c3b0000200141206a200241186a280200360200200141186a200241106a290300370200200141106a200241086a290300370200200141086a2002290300370200200141246a2101200441016a21042005415c6a22050d000b0b200041063a00002000410c6a2004360200200041086a200a360200200041046a200b360200200241206a24000f0b20054105742104416020076b21092008210120072103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200720054105746a20096a41057641016a21010b2000410f3a00002000410c6a2001360200200041086a2005360200200041046a2008360200200241206a24000b8b0303027f017e057f230041306b220124004108210242002103200141206a41086a220442003703002001420037032041dbc9c1004115200141206a1002200141086a200429030037030020012001290320370300024002402001411041c8d7c400410041001001417f460d002001421037021420012001360210200141206a200141106a10f30120012802202202450d01200129022421030b20022003422088a7220541286c6a210620022104024002400340200620046b419f014d0d014101210720042000460d02200420004120108604450d02200441286a22082000460d02200820004120108604450d02200441d0006a22082000460d02200820004120108604450d02200441f8006a22082000460d02200441a0016a21042008200041201086040d000c020b0b024020062004460d002002200541286c6a210803404101210720002004460d02200420004120108604450d022008200441286a2204470d000b0b410021070b02402003a7450d00200210200b200141306a240020070f0b419a88c00041331039000baf0601097f230041106b220224002002410036020820024201370300200028020021030240024002400240410410222204450d0020024284808080c00037020420022004360200200420033600002000280204210320044104410810212204450d012002428880808080013702042004200336000420022004360200200041086a28020021042002200041106a280200220336020c2002410c6a2002103e02400240024002402003450d0020034105742105200241086a220628020021032002280204210703400240024002400240200720036b41204f0d00200341206a22082003490d0620074101742209200820082009491b220a4100480d062007450d0120022802002007200a102122090d020c070b200341206a2108200228020021090c020b200a10222209450d050b2002200a36020420022009360200200a21070b20062008360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002003200429000037000020082103200441206a2104200541606a22050d000b0b200041146a280200210420022000411c6a280200220336020c2002410c6a2002103e02402003450d00200341057421054100200241086a220628020022036b21082002280204210703400240024002400240200720086a41204f0d00200341206a22092003490d062007410174220a20092009200a491b220a4100480d062007450d0120022802002007200a102122090d020c080b200228020021090c020b200a10222209450d060b2002200a36020420022009360200200a21070b2006200341206a220a360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a29000037000020032004290000370000200841606a2108200a2103200441206a2104200541606a22050d000b200128020020012802042009200a10032007450d070c060b200228020421042001280200200128020420022802002209200241086a280200100320040d050c060b1024000b200a41011023000b200a41011023000b410441011023000b410841011023000b200910200b200241106a24000bb12403027f027e0a7f230041b00d6b2208240002402001280224200128024022092802a001470d00200041013a0000200041086a4124360200200041046a4183a9c300360200200841b00d6a24000f0b200442002004290308220a20094198016a2903007d220b200b200a56200b507222091b37030802402009450d00200041013a0000200041086a412a360200200041046a41a7a9c300360200200841b00d6a24000f0b200841b0026a41186a22094200370300200841b0026a41106a220c4200370300200841b0026a41086a220d4200370300200842003703b00220062007200841b0026a100020084180016a41186a200929030037030020084180016a41106a200c29030037030020084180016a41086a200d290300370300200820082903b00237038001024002400240024002400240024002400240024002400240412010222209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c00010212209450d012009200829038001370020200941386a20084180016a41186a290300370000200941306a20084180016a41106a290300370000200941286a20084180016a41086a290300370000200941c00041800110212209450d022009200141cc006a220e290000370040200941d8006a200e41186a290000370000200941d0006a200e41106a290000370000200941c8006a200e41086a290000370000200841b0026a41186a220c4200370300200841b0026a41106a220d4200370300200841b0026a41086a220f4200370300200842003703b002200941e000200841b0026a1000200841106a41186a200c290300370300200841106a41106a200d290300370300200841106a41086a200f290300370300200820082903b00237031020091020200841c4006a41d4a9c300360200200841306a41086a420037030020082001410c6a221036024020084180e5c2003602342008410036023020084180026a41186a200541186a29000037030020084180026a41106a200541106a29000037030020084180026a41086a200541086a2900003703002008410136023020082005290000370380022010200841106a10d401210920082008280230417f6a220c360230024002400240024002402009450d00200841306a410c6a2802002109200841306a41086a280200210520082802342101200041086a412a360200200041046a41ebafc000360200200041013a00002005450d012005210420012100034020002802880b21002004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012005417f6a22050d000c030b0b200c0d082008417f36023020084180016a41186a200841106a41186a29030037030020084180016a41106a200841106a41106a29030037030020084180016a41086a200841106a41086a29030037030020082008290310370380012008280234220c4180e5c200460d02200841306a41086a28020021110c030b200121000b200841cc026a20012f0106360200200841c8026a4100360200200841c4026a2001360200200820093602d002200841003602c002200842003703b802200820003602b402200841003602b002200841b0026a1054200841b00d6a24000f0b41880b1022220c450d0641002111200c41003b0106200c4100360200200c41086a200841b0026a41800b1084041a200841306a41086a41003602002008200c3602340b200841306a4104722112024002400340200c2f01062213410574211441002109417f210d024002400240034020142009460d01200d41016a210d417f410120084180016a200c20096a41086a4120108604220f4100481b4100200f1b220f450d05200941206a2109200f4101460d000b20110d010c020b2013210d2011450d010b2011417f6a2111200c200d4102746a41880b6a280200210c0c010b0b200841c8006a41186a220920084180016a41186a290300370300200841c8006a41106a220f20084180016a41106a290300370300200841c8006a41086a221420084180016a41086a29030037030020082008290380013703482008419c016a2014290300370200200841a4016a200f290300370200200841ac016a200929030037020020082008413c6a360290012008200d36028c0120082012360288012008200c3602840120084100360280012008200829034837029401200841e4026a4200370200200841003a00ec02200842003703b00220084180e5c2003602e002200842003703c80220084180016a200841b0026a104121090c010b200c200d41e0006c6a41e8026a21090b200941013a003c200941286a427f370300200941206a427f3703002009413d6a200829038002370000200941d5006a20084180026a41186a290300370000200941cd006a20084180026a41106a220c290300370000200941c5006a20084180026a41086a220d290300370000200942013703182008200828023041016a360230200c200841306a41106a290300370300200d200841306a41086a2903003703002008200829033037038002200841c8006a41186a2214200841106a41186a290300370300200841c8006a41106a2211200841106a41106a290300370300200841c8006a41086a2213200841106a41086a2903003703002008200829031037034820084180016a200841c8006a10c7014100210f0240024020082d00800122124102470d000c010b200841b0016a280200210920120d002009417f4c0d07200841ac016a280200211520084180016a41286a2802002112024002402009450d0020091022220f0d01200941011023000b4101210f0b200f201220091084041a2015450d00201210200b200841b0026a41086a200936020020084184036a20132903003702002008418c036a201129030037020020084194036a2014290300370200200841c4026a200d290300370200200841cc026a200c290300370200200820093602b4022008200f3602b002200820082903483702fc0220082008290380023702bc02200141246a2802002109200141c0006a290200210b2001280248210c200841e8026a4200370300200841e0026a428080808080013703002008200c3602f8022008200b3703f002200842083703d8022008200941016a3602d402200841086a20044101200e200841106a20022003200841b0026a109603024020082802082209450d00200828020c2101200041013a0000200041086a2001360200200041046a200936020020082802b00222010d0b0c0c0b20084180016a2005200141c8006a28020028020010970202402008280280014101470d00200041046a200829028401370200200041013a00000c0a0b20084180026a41186a22092008419c016a28020036020020084180026a41106a220c20084194016a29020037030020084180026a41086a22052008418c016a290200370300200820082902840137038002200841c8006a41106a2005290300370300200841c8006a41186a200c290300370300200841e8006a20092802003602002008410636024c200841fbb2c3003602482008200829038002370350200141c4006a280200210d200841e0016a41186a220e200141e4006a290000370300200841e0016a41106a220f200141dc006a290000370300200841e0016a41086a2214200141d4006a2900003703002008200129004c3703e0014200210b20054200370300200842003703800241da95c200410d20084180026a1002200841a0026a41086a200529030037030020082008290380023703a0020240200841a0026a411041c8d7c400410041001001417f460d002008420037038002200841a0026a411020084180026a41084100100141016a41084d0d04200829038002210b0b20084180026a108b02200841a4016a2014290300370200200841ac016a200f290300370200200841b4016a200e29030037020020084180016a41c4006a200529030037020020084180016a41cc006a200c29030037020020084180016a41d4006a2009290300370200200820033703880120082002370380012008200b37039001200820082903e00137029c0120082008290380023702bc012008200841b0026a3602980120084100360288022008420137038002200841f0006a200d200841c8006a20084180016a2006200720084180026a2004105d02400240200828027022054101460d0020054102470d01200041046a2008290274370200200041013a0000200841e0006a280200450d0b200841dc006a280200102020082802b00222010d0c0c0d0b200841f8006a280200450d00200828027410200b20084180016a41186a200141cc006a220541186a29000037030020084180016a41106a200541106a29000037030020084180016a41086a200541086a29000037030020084180026a41086a200841106a41086a29030037030020084180026a41106a200841106a41106a29030037030020084180026a41186a200841106a41186a290300370300200820052900003703800120082008290310370380020240024002400240200841e0026a2802002205200841dc026a280200470d00200541016a22042005490d0b20054101742209200420042009491b2209ad42d8007e220b422088a70d0b200ba7220c4100480d0b2005450d01200841d8026a280200200541d8006c200c102122040d020c0c0b200841d8026a28020021040c020b200c10222204450d0a0b200841dc026a2009360200200841d8026a2004360200200841e0026a28020021050b2004200541d8006c6a2205200829038001370001200541013a00002005200829038002370021200520082900e001370041200541096a20084180016a41086a2204290300370000200541116a20084180016a41106a290300370000200541196a20084180016a41186a290300370000200541296a20084180026a41086a2209290300370000200541316a20084180026a41106a290300370000200541396a20084180026a41186a290300370000200541d0006a200841ef016a290000370000200541c9006a200841e0016a41086a290000370000200841e0026a2205200528020041016a220c3602002004200841bc026a220541086a29020037030020092008418c016a2802003602002008200529020037038001200820082902840137038002200841ec026a2802002109200841e8026a2802002106200841e4026a2802002105200841dc026a2802002107200841d8026a28020021040240200841c8006a41186a280200450d00200841dc006a28020010200b024020082802b002220d450d0020082802b402450d00200d10200b20084180016a41086a220d20084180026a41086a280200360200200820082903800237038001200841b0026a41086a200d28020036020020082008290380013703b0022010200841b0026a10d60120082004200c41d8006c6a3602bc02200820043602b802200820073602b402200820043602b002200141286a200841b0026a10d8022008200520094107746a3602bc02200820053602b802200820063602b402200820053602b002200141346a200841b0026a10d702200041003a0000200041196a200841286a290300370000200041116a200841206a290300370000200041096a200841106a41086a29030037000020002008290310370001200841b00d6a24000f0b412041011023000b41c00041011023000b41800141011023000b419a88c00041331039000b10d701000b41880b41081023000b1031000b1024000b200c41081023000b20082802b0022201450d010b20082802b402450d00200110200b200841b0026a41186a2802002109200841c0026a280200210102400240200841b0026a41146a2802002200450d002000210420012105034020052802880b21052004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012000417f6a22000d000c020b0b200121050b2008419c016a20012f010636020020084180016a41186a410036020020084180016a41146a2001360200200820093602a001200841003602900120084200370388012008200536028401200841003602800120084180016a10540240200841e0026a2802002205450d00200841b0026a41286a2802002101200541d8006c21050340024020012d00004105490d00200141286a280200450d00200141246a28020010200b200141d8006a2101200541a87f6a22050d000b0b0240200841dc026a280200450d00200841d8026a28020010200b0240200841ec026a2802002201450d0020014107742105200841e4026a28020041206a21010340200110920120014180016a2101200541807f6a22050d000b0b0240200841e8026a280200450d00200841e4026a28020010200b200841b00d6a24000b1c00200128021841d081c500410b2001411c6a28020028020c1100000beb1d03027f027e097f230041b0036b2209240002400240024020012802242001280240220a2802a001470d0020004183abc30036020420004101360200200041086a4129360200200841046a2802000d010c020b200542002005290308220b200a4190016a2903007d220c200c200b56200c5072220a1b37030802400240200a450d00200041acabc30036020420004101360200200041086a41233602000c010b20024200410110f1021a200941c8016a41186a220d200241186a290000370300200941c8016a41106a220e200241106a290000370300200941c8016a41086a220f200241086a290000370300200920022900003703c80120094180026a200941c8016a10c701410021100240024020092d00800222114102460d00200941b0026a280200210a02402011450d00410021100c010b200a417f4c0d01200941ac026a2802002112200941a8026a280200211102400240200a450d00200a102222100d01200a41011023000b410121100b20102011200a1084041a2012450d00201110200b200941c8006a4200370300200941c0006a42808080808001370300200941306a41d4a9c3003602002009412c6a2001410c6a2212360200200941246a4200370200200941106a41106a4180e5c200360200200941106a41086a200a360200200941e4006a200f290300370200200941ec006a200e290300370200200941f4006a200d290300370200200942083703382009410036021c2009200a36021420092010360210200920092903c80137025c200920012802483602582009200141c0006a2902003703502009200141246a28020041016a3602340240024002400240024002400240024002400240024002402003200484500d00200941086a20054100200141cc006a200220032004200941106a1096032009280208220a450d00200928020c21012000200a36020420004101360200200041086a2001360200024020092802102201450d002009280214450d00200110200b200941106a41186a280200210a200941206a2802002101200941106a41146a2802002202450d012002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c030b0b201228020022134100480d0a201341ffffffff07460d0a2001410c6a201341016a360200200141106a210a200141146a28020021110240024002400340200a280200220e41086a210d200e2f010622144105742110417f210a02400240024003402010450d01200a41016a210a417f41012002200d4120108604220f4100481b4100200f1b220f450d03201041606a2110200d41206a210d200f4101460d000b20110d010c040b2014210a2011450d030b2011417f6a2111200e200a4102746a41880b6a210a0c010b0b200e200a41e0006c6a41e8026a220a450d0020094188026a2210200a41c5006a29000037030020094190026a220d200a41cd006a29000037030020094198026a220e200a41d5006a2900003703002009200a413d6a29000037038002200a2d003c4101470d0020094189016a201029030037000020094191016a200d29030037000020094199016a200e290300370000200920092903800237008101200941013a008001201220133602000c010b20094180016a2001411c6a2802002002200141206a28020028021011010020092d00800121022001200128020c417f6a36020c2002450d010b200941a8016a41186a20094199016a290000370300200941a8016a41106a20094191016a290000370300200941a8016a41086a20094189016a29000037030020092009290081013703a80120094180026a200941a8016a200141c8006a28020028020010970202402009280280024101470d00200020092902840237020420004101360200024020092802102201450d002009280214450d00200110200b200941106a41186a280200210a200941206a2802002101200941106a41146a2802002202450d042002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c060b0b20094180036a41186a220a2009419c026a28020036020020094180036a41106a221020094194026a29020037030020094180036a41086a22022009418c026a290200370300200920092902840237038003200941c8016a41106a2002290300370300200941c8016a41186a2010290300370300200941e8016a200a280200360200200941043602cc01200941bdb2c3003602c80120092009290380033703d001200141c4006a280200210a200941e0026a41186a200141e4006a290000370300200941e0026a41106a200141dc006a290000370300200941e0026a41086a200141d4006a2900003703002009200129004c3703e0024200210c20024200370300200942003703800341da95c200410d20094180036a1002200941a0036a41086a200229030037030020092009290380033703a003410021100240200941a0036a411041c8d7c400410041001001417f460d002009420037038003200941a0036a411020094180036a41084100100141016a41084d0d0b200929038003210c0b20094180036a108b02200941a4026a200941e0026a41086a290300370200200941ac026a200941e0026a41106a290300370200200941b4026a200941e0026a41186a29030037020020094180026a41c4006a20094180036a41086a2202290300370200200941cc026a20094180036a41106a29030037020020094180026a41d4006a20094180036a41186a290300370200200920043703880220092003370380022009200c37039002200920092903e00237029c0220092009290380033702bc022009200941106a360298022002200841086a2802003602002009200829020037038003200941f0016a200a200941c8016a20094180026a2006200720094180036a2005105d4101210d20092802f00122024101460d054100210620024102470d06200020092902f401370204200041013602000240200941e0016a280200450d00200941dc016a28020010200b024020092802102201450d002009280214450d00200110200b200941106a41186a2802002108200941206a2802002101200941106a41146a2802002202450d082002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c0a0b0b4101210d4100211041002106410121070c060b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a20013602002009200a3602a002200941003602900220094200370388022009200036028402200941003602800220094180026a10540240200941c0006a2802002200450d00200941106a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a28020010200b200141d8006a2101200041a87f6a22000d000b0b02402009413c6a280200450d00200941386a28020010200b0240200941cc006a2802002201450d0020014107742100200941c4006a28020041206a21010340200110920120014180016a2101200041807f6a22000d000b0b200941c8006a280200450d0a200941c4006a2802001020200841046a2802000d0b0c0c0b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a20013602002009200a3602a002200941003602900220094200370388022009200036028402200941003602800220094180026a10540240200941c0006a2802002200450d00200941106a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a28020010200b200141d8006a2101200041a87f6a22000d000b0b02402009413c6a280200450d00200941386a28020010200b0240200941cc006a2802002201450d0020014107742100200941c4006a28020041206a21010340200110920120014180016a2101200041807f6a22000d000b0b200941c8006a280200450d08200941c4006a2802001020200841046a2802000d090c0a0b200941fc016a2802002110200941f0016a41086a280200210620092802f401210d0b0240200941e0016a280200450d00200941dc016a28020010200b410021070b20094180026a41086a220a200941246a290200370300200941c8016a41086a220e20094180026a410c6a2802003602002009200929021c3703800220092009290284023703c801200941cc006a280200210f200941c8006a2802002111200941106a41346a2802002102200941c0006a28020021132009413c6a2802002114200941106a41286a2802002105024020092802102215450d002009280214450d00201510200b200a200e280200360200200920092903c80137038002200941106a41086a200a28020036020020092009290380023703102012200941106a10d60120092005201341d8006c6a36021c200920053602182009201436021420092005360210200141286a200941106a10d80220092002200f4107746a36021c200920023602182009201136021420092002360210200141346a200941106a10d7022000410c6a2010360200200041086a20063602002000200d360204200041003602002007450d07200841046a280200450d0720082802001020200941b0036a24000f0b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a2001360200200920083602a002200941003602900220094200370388022009200036028402200941003602800220094180026a10540240200941c0006a2802002200450d00200941106a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a28020010200b200141d8006a2101200041a87f6a22000d000b0b02402009413c6a280200450d00200941386a28020010200b0240200941cc006a2802002201450d0020014107742100200941c4006a28020041206a21010340200110920120014180016a2101200041807f6a22000d000b0b200941c8006a280200450d05200941c4006a2802001020200941b0036a24000f0b419a88c00041331039000b10d101000b1031000b200841046a280200450d010b200828020010200b200941b0036a24000bd90d01087f230041e0006b220324002003410036024041cec6c0004110200341c0006a41041003200341c0006a41086a220442003703002003420037034041cdc8c000410d200341c0006a1002200341106a41086a220520042903003703002003200329034037031020032000370340200341106a4110200341c0006a4108100320044200370300200342003703404183cec0004111200341c0006a10022005200429030037030020032003290340370310200341106a4110200141201003024002400240024002400240024002400240411010222204450d00200441086a41002900f7c840370000200441002900efc84037000020044110412010212205450d0120052000427f7c370010200341c0006a41186a22064200370300200341c0006a41106a22074200370300200341c0006a41086a220442003703002003420037034020054118200341c0006a1000200341106a41186a2006290300370300200341106a41106a2007290300370300200341106a41086a2208200429030037030020032003290340370310200341106a412020014120100320051020200442003703002003420037034041dac8c0004115200341c0006a10022008200429030037030020032003290340370310200341106a411020024120100320044200370300200342003703404194cec0004115200341c0006a1002200820042903003703002003200329034037031041002105024002400240024002400240200341106a411041c8d7c400410041001001417f460d002003200341106a36023020034110360234200341003a00402003200341106a4110200341c0006a41014100100141016a220441014b36023820044102490d0520032c00402108200341c0006a200341306a103820032802402204450d05200329024421002003200436020c2000a721092000422088a7220541d0004b0d02200341c0006a41186a200141186a290000370300200341c0006a41106a200141106a290000370300200341c0006a41086a200141086a29000037030020032001290000370340200341c0006a210120052009460d01200328020c2104200341c0006a21010c0a0b2003410136020c2006200141186a2900003703002007200141106a2900003703002004200141086a29000037030020032001290000370340200341c0006a2101410021080b200541016a22042005490d0a20054101742206200420042006491b2209ad4205862200422088a70d0a2000a722064100480d0a2005450d01200328020c2005410574200610212204450d020c070b200341c0006a41186a2206200141186a290000370300200341c0006a41106a2207200141106a290000370300200341c0006a41086a2202200141086a29000037030020032001290000370340200520084d0d05200420084105746a22012003290340370000200141186a2006290300370000200141106a2007290300370000200141086a2002290300370000200841187441808080086a41187541d1006f21080c080b2006102222040d050b200641011023000b419a88c00041331039000b411041011023000b412041011023000b41accec0002008200510b501000b2003200436020c0b200420054105746a22062001290000370000200641186a200141186a290000370000200641106a200141106a290000370000200641086a200141086a290000370000200541016a21050b200341c0006a41086a22014200370300200342003703404194cec0004115200341c0006a1002200341106a41086a2001290300370300200320032903403703102003410036024820034201370340410110222206450d02200620083a00002003428180808010370244200320063602402003200536023020054105742107200341306a200341c0006a103e4100200128020022056b2108200328024021022003280244210603400240200620086a411f4b0d00200541206a22012005490d022006410174220a20012001200a491b22014100480d02024002402006450d00200220062001102122020d010c050b200110222202450d040b200121060b200220056a22012004290000370000200141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a290000370000200841606a2108200541206a2105200441206a2104200741606a22070d000b200341c8006a20053602002003200636024420032002360240200341106a411020022005100302402006450d00200210200b02402009450d00200328020c10200b200341c0006a41086a220442003703002003420037034041bccec000410d200341c0006a1002200341106a41086a200429030037030020032003290340370310200341106a41101009200341e0006a24000f0b1024000b200141011023000b410141011023000bba1607027f017e137f017e047f017e077f23004180026b22022400200241106a2001108e01024002400240024002400240024002400240024002402002280210450d0020022802142203ad42287e2204422088a70d0a2004a72205417f4c0d0a2005450d01200510222206450d032003450d020c040b2000410036020020024180026a24000f0b4108210620030d020b41002114410021130c020b200541081023000b200241c4016a210520024185016a2107200241186a4101722108200141046a2109200141086a210a200241f8016a210b200241c3016a220c41056a210d200241bf016a210e200241e8016a210f410021104100211141002112200321130340200241003a00b00120012802002009280200200241b0016a4101200a28020010012114200a200a280200201441016a41014b22146a22153602002014450d0220022d00b001221441044b0d02024002400240024002400240024002400240024002400240024002400240024020140e050004020301000b20022001108e012002280200450d1120022802042214417f4c0d152014450d04201410762216450d0a200a201441002001280200200928020020162014200a280200100122152015417f461b2215201520144b1b2215200a2802006a36020020152014460d050c090b20092802002114200241003602b001200a410020012802002014200241b0016a41042015100122142014417f461b22144104201441044922141b200a2802006a36020020140d1020022802b0012117200241086a2001108e012002280208450d10200228020c2215417f4c0d142015450d06201510762214450d0a200a201541002001280200200928020020142015200a280200100122162016417f461b2216201620154b1b2216200a2802006a36020020162015470d070c0b0b200241b0016a41186a22164200370300200241b0016a41106a221b4200370300200241b0016a41086a221c4200370300200242003703b001200a410020012802002009280200200241b0016a41202015100122142014417f461b2214412020144120491b200a2802006a3602002014411f4d0d0f2002200c2900003703782002200d29000037007d200e280000211920022802b001211720022f01b401211420022d00b601211520022900b70121042007411f6a200241b0016a411f6a290000370000200741186a2016290000370000200741106a201b290000370000200741086a201c290000370000200720022900b00137000020044220882118201420154110747221152004a721144101211a0c0b0b200242003703b001200a410020012802002009280200200241b0016a41082015100122142014417f461b2214410820144108491b200a2802006a2215360200201441074d0d0e20022903b0012104200f4200370300200241b0016a41306a4200370300200241b0016a41286a4200370300200241b0016a41206a4200370300200241b0016a41186a4200370300200241b0016a41106a4200370300200241b0016a41086a4200370300200242003703b001200a410020012802002009280200200241b0016a41c0002015100122142014417f461b221441c000201441c000491b200a2802006a3602002014413f4d0d0e200241f8006a41086a200c41086a290000370300200241f8006a41106a200c41106a290000370300200241f8006a41186a200c41186a290000370300200241f8006a41206a200c41206a290000370300200241f8006a41256a200c41256a2900003700002002200c29000037037820022900b701221d422088211820022f01b40120022d00b601411074722115200e280000211920022802b0012117201da721144102211a0c0b0b200241b0016a2001103820022802b0012214450d0d20022902b4012104200241f8006a41306a200241b0016a41306a280200360200200241f8006a41286a200241b0016a41286a290200370300200241f8006a41206a200241b0016a41206a290200370300200241f8006a41186a200241b0016a41186a290200370300200241f8006a41106a200241b0016a41106a290200370300200241f8006a41086a200241b0016a41086a290200370300200220022902b0013703782004422088211820144108762115201441187421172004a721144100211a0c020b410121162001280200200928020041014100200a28020010011a41002014470d040b200241f8006a41306a200241b0016a41306a280200360200200241f8006a41286a200241b0016a41286a290200370300200241f8006a41206a200241b0016a41206a290200370300200241f8006a41186a200241b0016a41186a290200370300200241f8006a41106a200241b0016a41106a290200370300200241f8006a41086a200241b0016a41086a290200370300200220022902b00137037820164108762115201641187421172014ad21184104211a0b0c060b410121142001280200200928020041014100200a28020010011a41002015460d040b2015450d08201410200c080b2014450d07201610200c070b201441011023000b201541011023000b2014450d042015ad22044220862004842218422088a721194103211a0b0b200241c0006a41306a221e200241f8006a41306a280200360200200241c0006a41286a221f200241f8006a41286a290300370300200241c0006a41206a2220200241f8006a41206a290300370300200241c0006a41186a2221200241f8006a41186a221b290300370300200241c0006a41106a2222200241f8006a41106a221c290300370300200241c0006a41086a2223200241f8006a41086a222429030037030020022002290378370340200241b0016a41106a22162019360200200241b0016a41086a221920184220862014ad8437030020052002290340370200200541086a2023290300370200200541106a2022290300370200200541186a2021290300370200200541206a2020290300370200200541286a201f290300370200200541306a201e280200360200200220173600b1012002201a3a00b001200220153b00b501200220154110763a00b701200b2004370300200241186a200241b0016a10bf0120022d00182115200241b0016a411f6a22172008411f6a290000370000200241b0016a41186a221a200841186a2900003703002016200841106a2900003703002019200841086a290000370300200220082900003703b00120154103460d03201241016a2114200241f8006a411f6a221e2017290000370000201b201a290300370300201c201629030037030020242019290300370300200220022903b001370378024020122013470d002010201420142010491b2213ad42287e2204422088a70d052004a722164100480d0502402012450d00200620112016102122060d010c070b201610222206450d060b200620116a221220153a0000201241206a201e290000370000201241196a201b290300370000201241116a201c290300370000201241096a2024290300370000201241016a2002290378370000201041026a2110201141286a21112014211220142003490d000b0b2000201336020420002006360200200041086a201436020020024180026a24000f0b200241033a0018200241b0016a411f6a2008411f6a290000370000200241b0016a41186a200841186a290000370300200241b0016a41106a200841106a290000370300200241b0016a41086a200841086a290000370300200220082900003703b0010b2000410036020002402012450d00200621050340024020052d0000220a450d000240200a4101470d00200541086a280200450d01200541046a2802001020200541286a2105201141586a22110d020c030b200541106a280200450d002005410c6a28020010200b200541286a2105201141586a22110d000b0b02402013450d00200610200b20024180026a24000f0b1024000b201641081023000b1031000be81901307f230041b00d6b220124004100210220014100360204200141c8d7c400360200200141086a41086a22034200370300200142003703084194cec0004115200141086a1002200141900d6a41086a2003290300370300200120012903083703900d024002400240024002400240024002400240200141900d6a411041c8d7c400410041001001417f460d002001200141900d6a3602e80c200141103602ec0c200141003a00082001200141900d6a4110200141086a41014100100141016a220341014b3602f00c20034102490d0620012c00082103200141086a200141e80c6a103820012802082204450d06200128020c2102200141086a41086a2802002205450d01200141086a410041e00c1083041a200441206a2106200420054105746a2107200141900d6a41086a2108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021234100212441002125410021264100212741002128200421054100212941d100212a024003402029212b024002400240024002402003450d0020072004460d012003417f7321030340024020052007460d002005212c200541206a222d2105200341016a22030d010c050b2006212d200621052004212c200341016a22030d000c040b0b20052007460d01200541206a212d2005212c0c030b2003417f732103034020072005460d05200541206a2105200341016a22030d000b2005212d200541606a222c0d020c040b2006212d2004212c20072004460d030b202c450d020b202d21052001280204212e2001280200212f20084100360200200142013703900d410110222203450d072003202b3a000020014281808080103702940d200120033602900d2001202e36028c0d2001418c0d6a200141900d6a103e024002400240024020012802940d222d200828020022296b202e4f0d002029202e6a22032029490d0a202d4101742230200320032030491b22304100480d0a202d450d0120012802900d202d2030102122030d020c0d0b20012802900d21030c020b203010222203450d0b0b200120303602940d200120033602900d2030212d0b20082029202e6a2230360200200320296a202f202e1084041a0240024002400240202d20306b411f4b0d00203041206a222e2030490d0a202d4101742229202e202e2029491b222e4100480d0a202d450d012003202d202e102122030d020c0e0b202d212e0c020b202e10222203450d0c0b2001202e3602940d200120033602900d0b200320306a222d202c290000370000202d41186a202c41186a290000370000202d41106a202c41106a290000370000202d41086a202c41086a290000370000200141900d6a41186a222c4200370300200141900d6a41106a222d420037030020084200370300200142003703900d2003203041206a200141900d6a1000200141e80c6a41186a2230202c290300370300200141e80c6a41106a222c202d290300370300200141e80c6a41086a222d2008290300370300200120012903900d3703e80c0240202e450d00200310200b202a417f6a212a202b41016a2129200141086a202b4103704105746a220320012903e80c370000200341186a2030290300370000200341106a202c290300370000200341086a202d2903003700004100212c4100212e02400340202b202b41036e222d417d6c6a4102470d01200141086a202c6a220341df006a2d000022092003411f6a2d0000220a712009200a722003413f6a2d00007172211d200341de006a2d000022092003411e6a2d0000220a712009200a722003413e6a2d00007172211c200341dd006a2d000022092003411d6a2d0000220a712009200a722003413d6a2d00007172211b200341dc006a2d000022092003411c6a2d0000220a712009200a722003413c6a2d00007172211a200341db006a2d000022092003411b6a2d0000220a712009200a722003413b6a2d000071722119200341da006a2d000022092003411a6a2d0000220a712009200a722003413a6a2d000071722118200341d9006a2d00002209200341196a2d0000220a712009200a72200341396a2d000071722117200341d8006a2d00002209200341186a2d0000220a712009200a72200341386a2d000071722116200341d7006a2d00002209200341176a2d0000220a712009200a72200341376a2d000071722115200341d6006a2d00002209200341166a2d0000220a712009200a72200341366a2d000071722114200341d5006a2d00002209200341156a2d0000220a712009200a72200341356a2d000071722113200341d4006a2d00002209200341146a2d0000220a712009200a72200341346a2d000071722112200341d3006a2d00002209200341136a2d0000220a712009200a72200341336a2d000071722111200341d2006a2d00002209200341126a2d0000220a712009200a72200341326a2d000071722110200341d1006a2d00002209200341116a2d0000220a712009200a72200341316a2d00007172210f200341d0006a2d00002209200341106a2d0000220a712009200a72200341306a2d00007172210e200341cf006a2d000022092003410f6a2d0000220a712009200a722003412f6a2d00007172210d200341ce006a2d000022092003410e6a2d0000220a712009200a722003412e6a2d00007172210c200341cd006a2d000022092003410d6a2d0000220a712009200a722003412d6a2d00007172210b200341cc006a2d000022092003410c6a2d0000220a712009200a722003412c6a2d00007172210a200341cb006a2d000022092003410b6a2d0000221e712009201e722003412b6a2d000071722109200341ca006a2d0000221e2003410a6a2d0000221f71201e201f722003412a6a2d00007172211e200341c9006a2d0000221f200341096a2d0000222071201f202072200341296a2d00007172211f200341c8006a2d00002220200341086a2d00002221712020202172200341286a2d000071722120200341c7006a2d00002221200341076a2d00002222712021202272200341276a2d000071722121200341c6006a2d00002222200341066a2d00002223712022202372200341266a2d000071722122200341c5006a2d00002223200341056a2d00002224712023202472200341256a2d000071722123200341c4006a2d00002224200341046a2d00002225712024202572200341246a2d000071722124200341c3006a2d00002225200341036a2d00002226712025202672200341236a2d000071722125200341c2006a2d00002226200341026a2d00002227712026202772200341226a2d000071722126200341c1006a2d00002227200341016a2d00002228712027202872200341216a2d000071722127200341c0006a2d0000222820032d00002230712028203072200341206a2d000071722128202c41800c460d01200141086a202c202d410574202b41096e41e0006c6b6a6a220341ff006a201d3a0000200341fe006a201c3a0000200341fd006a201b3a0000200341fc006a201a3a0000200341fb006a20193a0000200341fa006a20183a0000200341f9006a20173a0000200341f8006a20163a0000200341f7006a20153a0000200341f6006a20143a0000200341f5006a20133a0000200341f4006a20123a0000200341f3006a20113a0000200341f2006a20103a0000200341f1006a200f3a0000200341f0006a200e3a0000200341ef006a200d3a0000200341ee006a200c3a0000200341ed006a200b3a0000200341ec006a200a3a0000200341eb006a20093a0000200341ea006a201e3a0000200341e9006a201f3a0000200341e8006a20203a0000200341e7006a20213a0000200341e6006a20223a0000200341e5006a20233a0000200341e4006a20243a0000200341e3006a20253a0000200341e2006a20263a0000200341e1006a20273a0000200341e0006a20283a0000202c41e0006a212c202d212b202e41016a222e4111490d000b0b41002103202a0d000b0b2000201d3a001f2000201c3a001e2000201b3a001d2000201a3a001c200020193a001b200020183a001a200020173a0019200020163a0018200020153a0017200020143a0016200020133a0015200020123a0014200020113a0013200020103a00122000200f3a00112000200e3a00102000200d3a000f2000200c3a000e2000200b3a000d2000200a3a000c200020093a000b2000201e3a000a2000201f3a0009200020203a0008200020213a0007200020223a0006200020233a0005200020243a0004200020253a0003200020263a0002200020273a0001200020283a000020020d020c030b410121040b20004200370000200041186a4200370000200041106a4200370000200041086a42003700002002450d010b200410200b200141b00d6a24000f0b1024000b410141011023000b419a88c00041331039000b203041011023000b202e41011023000bcf0301027f230041e0006b22032400200341003a0005024002402000413f4b0d00200320004102743a0000410121040c010b02402000418080014f0d00200320004106763a000141022104200320004102744101723a00000c010b024020004180808080044f0d00200320004116763a000320032000410e763a0002200320004106763a0001200320004102744102723a0000410421040c010b200341033a0000200320003a0001200320004118763a0004200320004110763a0003200320004108763a0002410521040b200320043a0005024002402001280200220028020822012002490d0020002802002100200320023602082003200436020c20042002470d012000200320021084041a200341e0006a24000f0b20022001102e000b2003200341086a36024020032003410c6a360244200341c8006a41146a4100360200200341286a41146a4104360200200341346a4105360200200341106a41146a4103360200200341c8d7c4003602582003420137024c200341d0d2c4003602482003410536022c20034203370214200341fcd1c4003602102003200341c8006a3602382003200341c4006a3602302003200341c0006a3602282003200341286a360220200341106a418cd3c4001048000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10d3032100200241206a240020000bc80201037f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001109a02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b2004418001102d000b2004418001102d000ba30201047f024020002802082201450d0020002802002102200141f8006c21034100210003400240200220006a22012d0000417b6a220441064b0d00024002400240024020040e0700010404020403000b200141086a2d00004101470d03200141146a280200450d03200141106a28020010202003200041f8006a2200470d040c050b200141046a2d00004103470d0202402001410c6a280200450d00200141086a28020010200b200141186a280200450d02200141146a28020010202003200041f8006a2200470d030c040b200141086a280200450d01200141046a28020010202003200041f8006a2200470d020c030b200141086a2d00004105490d00200141306a280200450d002001412c6a28020010200b2003200041f8006a2200470d000b0b0b13002000410636020420004198cfc0003602000bce0101047f230041206b2200240002400240024041cec6c000411041c8d7c400410041001001417f460d00200041003602104101210141cec6c0004110200041106a41044100100141016a41044d0d022000280210210241cec6c000411010090c010b410021010b200041106a41086a2203420037030020004200370310418bc7c0004115200041106a1002200041086a20032903003703002000200029031037030020002002410020011b36021020004110200041106a41041003200041206a24000f0b419a88c00041331039000b13002000410b360204200041a0cfc0003602000b5f01017f230041206b22022400200241003602082002420837030020024100360218200242013703102002410036021c2002411c6a200241106a103e200041086a2002280218360200200020022903103702002002108f02200241206a24000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010222206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b412041011023000b7901027f230041106b2202240020024100360208200242013703000240410110222203450d00200341003a00002002428180808010370204200220033602002002410036020c2002410c6a2002103e200041086a200241086a28020036020020002002290300370200200241106a24000f0b410141011023000b931206037f017e057f017e037f027e230041d0016b22012400200141b0016a41086a22024200370300200142003703b001418bc7c0004115200141b0016a1002200141f0006a41086a22032002290300370300200120012903b001370370200141f0006a4110100920024200370300200142003703b00141a0c7c0004117200141b0016a100220032002290300370300200120012903b001370370200141f0006a41101009200141cdc8c000410d10e001200129030821042001280200210520024200370300200142003703b0014183cec0004111200141b0016a100220032002290300370300200120012903b001370370024002400240024002400240024002400240200141f0006a411041c8d7c400410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d022002411f4d0d0220014190016a41186a2206200141b0016a41186a220229030037030020014190016a41106a2207200141b0016a41106a220329030037030020014190016a41086a2208200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100920022006290300370300200320072903003703002009200829030037030020012001290390013703b001200141106a41186a2002290300370300200141106a41106a2003290300370300200141106a41086a2009290300370300200120012903b0013703100c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141106a41186a4200370300200141106a41106a4200370300200141106a41086a4200370300200142003703100b410821064200210a200141b0016a41086a22024200370300200142003703b00141c0c8c000410d200141b0016a1002200141f0006a41086a2002290300370300200120012903b0013703700240200141f0006a411041c8d7c400410041001001417f460d0020014210370294012001200141f0006a36029001200141b0016a20014190016a108a0220012802b0012206450d0420012902b401210a200141f0006a411010090b200141b0016a41086a22024200370300200142003703b00141dac8c0004115200141b0016a1002200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041c8d7c400410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d032002411f4d0d0320014190016a41186a2207200141b0016a41186a220229030037030020014190016a41106a2208200141b0016a41106a220329030037030020014190016a41086a220b200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100920022007290300370300200320082903003703002009200b29030037030020012001290390013703b001200141306a41186a2002290300370300200141306a41106a2003290300370300200141306a41086a2009290300370300200120012903b0013703300c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141306a41186a4200370300200141306a41106a4200370300200141306a41086a4200370300200142003703300b200141f0006a41186a22024200370300200141f0006a41106a22034200370300200141f0006a41086a2209420037030020014200370370200141f0006a1013200141d0006a41186a2002290300370300200141d0006a41106a2003290300370300200141d0006a41086a200929030037030020012001290370370350200141b0016a41186a2207200141106a41186a290300370300200141b0016a41106a2208200141106a41106a290300370300200141b0016a41086a220b200141106a41086a290300370300200120012903103703b00120024200370300200342003703002009420037030020014200370370200141b0016a41202004420020051b2204427f7c200141f0006a1014450d0620014190016a41186a2205200229030037030020014190016a41106a220c200329030037030020014190016a41086a220d20092903003703002001200129037037039001200220052903003703002003200c2903003703002009200d29030037030020012001290390013703702007200229030037030020082003290300370300200b2009290300370300200120012903703703b001024002400240200a422088220ea72202200aa7470d00200241016a22032002490d05200ea74101742209200320032009491bad220f42287e220e422088a70d05200ea722034100480d052002450d012006200241286c200310212206450d020c070b200a210f0c070b2003102222060d050b200341081023000b419a88c00041331039000b419a88c00041331039000b1024000b419a88c00041331039000b200a422088220ea721020b2006200241286c6a220241003a0000200241196a200141c8016a290300370000200241116a200141c0016a290300370000200241096a200141b8016a290300370000200220012903b001370001200241216a200128009001360000200241246a20014193016a280000360000200f42ffffffff0f83200e4220864280808080107c84210a0b2000200129031037001420002004370300200020012903503700342000412c6a200141106a41186a290300370000200041246a200141106a41106a2903003700002000411c6a200141106a41086a2903003700002000413c6a200141d0006a41086a290300370000200041c4006a200141d0006a41106a290300370000200041cc006a200141d0006a41186a290300370000200041ec006a200141306a41186a290300370000200041e4006a200141306a41106a290300370000200041dc006a200141306a41086a290300370000200020012903303700542000410c6a200a37020020002006360208200141d0016a24000bad12010e7f23004190016b22032400024002400240024002400240024002400240024002400240411410222204450d00200441106a41002800bce342360000200441086a41002900b4e342370000200441002900ace34237000020044114413410212204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341f0006a41186a22054200370300200341f0006a41106a22064200370300200341f0006a41086a220742003703002003420037037020044134200341f0006a1000200341d0006a41186a2005290300370300200341d0006a41106a2006290300370300200341d0006a41086a2007290300370300200320032903703703500240024002400240200341d0006a412041c8d7c400410041001001417f460d00200342203702742003200341d0006a360270200341206a200341f0006a108e012003280220450d0320032802242106200341186a200341f0006a108e012003280218450d03200328021c2107200341106a200341f0006a108e012003280210450d032003280214210841002109200341003a0030200341f8006a22052005280200220520032802702003280274200341306a41012005100141016a41014b22056a3602002005450d03024020032d00302205450d004101210920054101470d040b200341086a200341f0006a108e012003280208450d03200328020c2205417f4c0d0b2005450d0120051076220a450d06200341f8006a220b200b280200220b2005410020032802702003280274200a2005200b1001220b200b417f461b220b200b20054b1b220b6a360200200b2005470d020c070b41022109200410204102210441024102460d070c080b4101210a2003280270200328027441014100200341f8006a28020010011a41002005460d050b2005450d00200a10200b419a88c00041331039000b411441011023000b413441011023000b200541011023000b200341cc006a41026a220b200341306a41026a2d00003a0000200320032f00303b014c200341f0006a41026a200b2d00003a0000200320032f014c3b0170200410204102210420094102470d010b4101210b41d4e0c0002106411121070c010b200341d0006a20046a200341f0006a20046a2d00003a0000200320032f01703b01504100210b0b2003412c6a20046a200341d0006a20046a2d00003a0000200320032f01503b012c0240200b450d002000200636020420004101360200200041086a200736020020034190016a24000f0b200341286a41026a220c2003412c6a41026a2d00003a0000200320032f012c3b0128024002400240024002400240024002400240024002400240024002400240200228024020064d0d00411510222204450d05410021062004410d6a41002900a4e342370000200441086a410029009fe34237000020044100290097e34237000020044115413510212204450d06200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341f0006a41186a22074200370300200341f0006a41106a22094200370300200341f0006a41086a220b42003703002003420037037020044135200341f0006a1000200341d0006a41186a2007290300370300200341d0006a41106a2009290300370300200341d0006a41086a200b29030037030020032003290370370350200341d0006a412041c8d7c400410041001001417f460d01200342203702742003200341d0006a3602702003200341f0006a108e012003280200450d042003280204220b417f4c0d0f200b450d02200b10762206450d07200341f8006a220720072802002207200b4100200328027020032802742006200b2007100122072007417f461b22072007200b4b1b22076a3602002007200b470d030c080b200521042005210e200a21020c120b2004102041000d070c080b410121062003280270200328027441014100200341f8006a28020010011a4100200b460d050b200b450d00200610200b419a88c00041331039000b411541011023000b413541011023000b200b41011023000b200410202006450d010b2006410020061b210d200341f0006a2006200b2002109802200341f0006a41086a28020021072003280274210620032802704101470d042000200636020420004101360200200041086a2007360200200b450d01200d102020050d020c030b200041e5e0c00036020420004101360200200041086a411a3602000b2005450d010b200a10200b20034190016a24000f0b200341d0006a41026a220f2003418f016a2d00003a0000200320032f008d013b01502003418c016a2d0000210920034188016a280200210420034184016a280200210e20034180016a2802002102200341fc006a280200210802402005450d00200a10200b200341286a41026a200f2d00003a0000200320032f01503b01282004417f4c0d004101210502402004450d00200410222205450d040b200520022004108404210a200341306a41146a2004360200200341306a41106a20043602002003200836023820032007360234200320063602302003200a36023c2003200941ff01714101463a0048411410222205450d01200541106a41002800bce342360000200541086a41002900b4e342370000200541002900ace34237000020054114413410212205450d02200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200341f0006a41186a22014200370300200341f0006a41106a220f4200370300200341f0006a41086a221042003703002003420037037020054134200341f0006a1000200341d0006a41186a2001290300370300200341d0006a41106a200f290300370300200341d0006a41086a201029030037030020032003290370370350200341d0006a200341306a105b2005102002402004450d00200a10200b200b450d04200d10200c040b1031000b411441011023000b413441011023000b200441011023000b20002006360204200020032f01283b001d200041003602002000411c6a20093a0000200041186a2004360200200041146a200e360200200041106a20023602002000410c6a2008360200200041086a20073602002000411f6a200c2d00003a000020034190016a24000be6db0123087f017e1a7f017e0d7f017e067f017e027f017e037f017e017f017e087f017e017f017e027f017e037f017e177f017e017f017e177f017e757f017e147f017e067f027e0f7f230041e0056b2204240041002105200441003602a0022004200236029c0220042001360298020240024002400240024002400240024002400240024002400240200241034b0d00200441013a008002200441e4046a4101360200200441013602bc01200442013702d404200441f8cac4003602d004200420044180026a3602b8012004200441b8016a3602e004200441c0036a200441d0046a102b20042802c803210620042802c403210720042802c0032108410521094100210a4101450d010c090b200441a0026a41043602000240024020012800004180c2cdeb06470d002002417c714104470d01200441013a008002200441e4046a4101360200200441013602bc01200442013702d404200441f8cac4003602d004200420044180026a3602b8012004200441b8016a3602e004200441c0036a200441d0046a102b20042802c803210620042802c403210720042802c003210841052109410021054100210a41010d0a0c040b4101210941010d09410021010c060b200241074d0d0320044198026a41086a4108360200024002400240024002400240200128000422084101470d00200441d0046a20044198026a104e20042802d0044101470d01410421074100210d4100210620042d00d4040d020c0a0b4102210941010d0d0c060b200441d0046a410572211441042107200441d0046a412c6a211b200441f4046a2117200441f0046a211e200441ec046a211a200441e8046a2122200441e4046a211d200441e0046a2123200441dc046a2124200441d8046a21264100210e4128210b4100210d410021064100210a034020044180026a41026a2209201441026a2d00003a0000200420142f00003b018002201b2802002119200441f8046a280200211120172802002118201e280200211c201a280200211f20222802002116201d280200218301202328020021840120242802002185012026280200218601024020042d00d4042215417e6a220141ff0171410a4b0d0002400240024002400240024002400240024002400240024002400240024002402001410a4b22130d00024020010e0b00070405020809060b030a000b200a41ff0171222541014d0d0c0c0b0b200a41ff0171222541004b0d0a0c0b0b200a41ff0171222541054d0d0a0c090b200a41ff01712225410a4d0d090c080b200a41ff0171222541034d0d080c070b200a41ff0171222541044d0d070c060b200a41ff0171222541084d0d060c050b200a41ff0171222541024d0d050c040b200a41ff0171222541064d0d040c030b200a41ff0171222541074d0d030c020b200a41ff01712225410b4d0d020c010b200a41ff0171222541094d0d010b411321092015410d4b0d010c020b02400240024002400240024002400240024002400240024020130d00024020010e0b00070405020809060b030a000b20254101470d0e0c0b0b20254100460d0a0c0d0b20254105470d0c0c090b2025410a470d0b0c080b20254103470d0a0c070b20254104470d090c060b20254108470d080c050b20254102470d070c040b20254106470d060c030b20254107470d050c020b2025410b470d040c010b20254109470d030b411421092015410d4d0d010b0240208501450d0020860110200b02402016450d00201f450d00201610200b0240024002402011450d0020181020200d0d020c010b410321010c0f0b410521010c0e0b410421010c0d0b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020150e0e0005060200000009040c08010307000b410221010c300b208401450d0b411821cd0120860120840141186c6a21ce01410421cf01411421d001411021d101410c21d201410921d301410821d40141ffffffff0321d501417021d60120860121d7014104210f0c1e0b208401450d0b20840141286c210b208601210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101200b41586a220b0d000c0d0b0b208401450d0c411c21d801208601208401411c6c6a21d901410c21da01410821db01411421dc01410421dd01411021de01410921df0141ffffffff0321e001417021e10120860121e2014105210f0c1d0b208401450d0c20840141146c210b208601210103400240200141046a280200450d00200128020010200b200141146a2101200b416c6a220b0d000c0e0b0b0240208501450d0020860110200b2016450d112083011020200d0d160c150b208401450d0c208401410474210b208601210103400240200141046a280200450d00200128020010200b200141106a2101200b41706a220b0d000c0e0b0b20860141ff017122014102460d0320014101460d02208401450d102085011020200d0d120c110b208401450d0c411c21e301208601208401411c6c6a21e401410c21e501410821e601411421e701410421e801411021e901410921ea0141ffffffff0321eb01417021ec0120860121ed014106210f0c190b208401450d0c410421ee012086012084014104746a21ef01411021f001410921f101410821f20141ffffffff0321f301417021f40120860121f5014107210f0c190b2016450d122016410c6c210b2084012101034002402001280200220e450d00200141046a280200450d00200e10200b2001410c6a2101200b41746a220b0d000c140b0b2016450d13410421f60120840120164104746a21f701411021f801410c21f901410821fa01417421fb0120840121fc014108210f0c180b410321010c240b410221010c230b410221010c220b410221010c210b410221010c200b410221010c1f0b410221010c1e0b410221010c1d0b410221010c1c0b410221010c1b0b410221010c1a0b410321010c190b410321010c180b410521010c170b410421010c160b410521010c150b410421010c140b410821010c130b410821010c120b410821010c110b410921010c100b410921010c0f0b410921010c0e0b410921010c0d0b410921010c0c0b0240024002400240024002400240024002400240024020130d00024020010e0b00070405020809060b030a000b4101210a0c0b0b4100210a0c0a0b4105210a0c090b410a210a0c080b4103210a0c070b4104210a0c060b4108210a0c050b4102210a0c040b4106210a0c030b4107210a0c020b410b210a0c010b4109210a0b200441c0036a41026a221320092d00003a0000200420042f0180023b01c0030240200d2006470d00200d41016a2201200d490d0c200e20012001200e491b2206ad422c7e2227422088a70d0c2027a722014100480d0c0240200d450d002007200b41586a2001102122070d010c040b200110222207450d030b2007200b6a220141586a20153a0000200120193602002001417c6a2011360200200141786a2018360200200141746a201c360200200141706a201f3602002001416c6a2016360200200141686a208301360200200141646a208401360200200141606a2085013602002001415c6a2086013602002001415b6a20132d00003a0000200141596a20042f01c0033b0000200e41026a210e200b412c6a210b200d41016a210d200441d0046a20044198026a104e20042802d0044101470d000b20042d00d404450d080b20042902d4042227a7220941107621052009410876210a2027422088a72108200441d0046a41106a280200218701200441dc046a280200218801200d0d020c010b200141041023000b410521010c060b410421010c050b410021010c040b410021010c030b410021010c020b41082002102e000b200d412c6c2101200741606a210b0240024003402001450d01200141546a2101200b41206a210e200b412c6a2214210b200e2d0000410b470d000b201428020021150c010b410021150b200d412c6c2101200741586a210b0240024002400340410021092001450d01200141546a2101200b41286a210e200b412c6a2214210b200e2d00004104470d000b200441b0016a2014109803201520042802b401460d010c020b20154100470d010b4101210841e100210a41f3da01210541000d04410021010c010b0240200d450d00200d412c6c210b2007210103402001104d2001412c6a2101200b41546a220b0d000b0b4119210902402006450d00200710200b41010d03410021010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0a00010203040506070817170b0240024002400240200441a0026a2802002002470d002005ad42ffff0383421086200aad42ff0183420886842009ad42ff018384210c2007200d412c6c6a210e200721010340200e2001460d0220012d0000210b2001412c6a220f2101200b4102470d000b200441a8016a200f41586a1098034104211020042802a801210b024020042802ac012211450d00201141047422014100480dd601200110222210450d1a0b410021124100211302402011450d002011410474210f41002113201021010340200b41086a280200220e417f4c0d0e200b410c6a2d00002114200b280200211502400240200e450d00200e102222160d010c130b410121160b20162015200e10840421152001410d6a200b410d6a2d00003a00002001410c6a20143a0000200141086a200e360200200141046a200e36020020012015360200200141106a2101201341016a2113200b41106a210b200f41706a220f0d000b0b2010450d02201121120c030b200441003a008002200441e4046a4101360200200441013602bc01200442013702d404200441f8cac4003602d004200420044180026a3602b8012004200441b8016a3602e004200441c0036a200441d0046a102b20042802c403210e20042802c00321080240200d450d00200d412c6c210b2007210103402001104d2001412c6a2101200b41546a220b0d000b0b4105210902402006450d00200710200b41e2abc30021014116210b200e450dd8010cd7010b410021120b41042110410021130b2007200d412c6c6a210e20072101024002400240024003404100210f41c8d7c4002114200e2001460d0120012d0000210b2001412c6a22152101200b4103470d000b200441a0016a201541586a10980341002101024020042802a001220b450d0020042802a4012101200b21140b410421172001450d020c010b41002101410421174100450d010b200141286c21112014411c6a2101410421184100210f410021194101211a4100210e4100211b4104211c410021144100211d4104211e4100210b410021154100211f4100212041012121034002400240024002400240024002400240024002400240024002402001417c6a2d000022164101460d00024020164102460d0020164103470d022001417e6a22162d000021222001417d6a22232d00002124200f2019470d08200f41016a2219200f490de201200f4101742225201920192025491b221920196a22262019490de20120264100480de201200f450d07201a202520261021221a0d080c210b200441d0046a41086a2216200141086a280200360200200420012902003703d0042014201d470d03201441016a22222014490de1012014410174221d20222022201d491b221dad420c7e2227422088a70de1012027a722224100480de1012014450d02201e2014410c6c20221021221e0d030c1e0b200441d0046a41086a2216200141086a280200360200200420012902003703d004200e201b470d04200e41016a221b200e490de001200e4101742222201b201b2022491b221bad420c7e2227422088a70de0012027a722224100480de001200e450d03201c200e410c6c20221021221c0d040c1e0b2001280200211602402015200b470d00200b41016a2222200b490de001200b4101742223202220222023491b2223ad4202862227422088a70de0012027a722224100480de001200b450d072018200b4102742022102122180d080c200b201521220c080b20221022221e450d1b0b201e2014410c6c6a222220042903d004370200202241086a2016280200360200201441016a2114200141286a2101201141586a22110d090c0b0b20221022221c450d1a0b201c200e410c6c6a222220042903d004370200202241086a2016280200360200200e41016a210e200141286a2101201141586a22110d070c090b20261022221a450d190b201a200f4101746a222620224101713a0001202620243a000020162d0000211620232d000021222020201f470d04201f41016a2220201f490dd901201f4101742224202020202024491b222020206a22232020490dd90120234100480dd901201f450d03202120242023102122210d040c1a0b202210222218450d180b200b21222023210b0b201820224102746a2016360200201541016a2115200141286a2101201141586a22110d020c040b202310222221450d160b200f41016a210f2021201f4101746a222320164101713a0001202320223a0000201f41016a211f200141286a2101201141586a22110d000c020b0b4101211a41042118410021194100210e4100211b4104211c410021144100211d4104211e4100210b410021154100211f41002120410121210b2007200d412c6c6a21112007210102400240034020112001460d0120012d000021162001412c6a2222210120162017470d000b20044198016a202241586a109803200428029c012216450d0020042802980121012016410274211603402001280200211102400240024002402015200b470d00200b41016a2217200b490dd801200b4101742222201720172022491b2222ad4202862227422088a70dd8012027a722174100480dd801200b450d012018200b4102742017102122180d020c130b200b2122201521170c020b201710222218450d110b200b21172022210b0b200141046a2101201820174102746a2011360200201541016a21152016417c6a22160d000c020b0b200b21220b2007200d412c6c6a2116200721010240024002400240034020162001460d0120012d0000210b2001412c6a22112101200b4105470d000b20044190016a201141586a109803200428029401410c6c2223450d002004280290012101200e4101742111200e410c6c210b200441e4046a2126200441e0046a21250340200141086a21170240200141046a2802004101470d002004201728020022163602a8032001280200222420164d0d0020044198026a410c6a41023602002026410236020020044198026a41086a20044180026a3602002004410236029c022004202436028002202520044198026a360200200442023702d404200441ccaac4003602d0042004200441a8036a36029802200441c0036a200441d0046a102b20042802c00322160d030b20012902002127200441d0046a41086a22162017280200360200200420273703d0040240200e201b470d00200e41016a221b200e490dd7012011201b201b2011491b221bad420c7e2227422088a70dd7012027a722174100480dd7010240200e450d00201c200b20171021221c0d010c140b20171022221c450d130b2001410c6a2101201c200b6a221720042903d004370200201741086a2016280200360200201141026a2111200b410c6a210b200e41016a210e202341746a22230d000b0b2007200d412c6c6a211620072101024002400240034020162001460d0120012d0000210b2001412c6a22112101200b4106470d000b20044188016a201141586a109803200428028c01220b450d002004280288012101200b410c6c2117201441017421112014410c6c210b0340200441d0046a2001109a0320042802d00422160d0220012902002127200441d0046a41086a2216200141086a280200360200200420273703d00402402014201d470d00201441016a221d2014490dd9012011201d201d2011491b221dad420c7e2227422088a70dd9012027a722234100480dd90102402014450d00201e200b20231021221e0d010c1c0b20231022221e450d1b0b2001410c6a2101201e200b6a222320042903d004370200202341086a2016280200360200201141026a2111200b410c6a210b201441016a2114201741746a22170d000b0b2007200d412c6c6a2116200721010240034020162001460d0120012d0000210b2001412c6a22112101200b4107470d000b20044180016a201141586a109803200428028401220b450d002004280280012201200b4104746a2123200f410174210b200441d0046a41086a2124200441e4046a21260340200441d0046a20012021201f109b0302400240024020042d00d0044101470d002024290300212720042802d4042216450d010c060b200420042d00d10422163a00a80320162001410c6a2d00002211460d0120044198026a410c6a41233602002026410236020020044198026a41086a200441a8036a3602002004412336029c02200420113a008002200441d0046a41106a20044198026a360200200442023702d404200441e0abc4003602d004200420044180026a36029802200441c0036a200441d0046a102b20042902c403212720042802c00322160d050b2001410c6a2d000021160b2001410d6a2d000021110240200f2019470d00200f41016a2219200f490dd901200b20192019200b491b221920196a22172019490dd90120174100480dd9010240200f450d00201a200b20171021221a0d010c1d0b20171022221a450d1c0b201a200b6a221720163a0000201741016a20114101713a0000200b41026a210b200f41016a210f200141106a22012023470d000b0b200441f8036a2015360200200441f4036a2022360200200441c0036a412c6a2013360200200441e8036a2012360200200441e0036a200f360200200441dc036a2019360200200441d4036a200e360200200441d0036a201b360200200420183602f003200420103602e4032004201a3602d8032004201c3602cc03200420143602c8032004201d3602c4032004201e3602c0032007200d412c6c6a210e20072101024002400340200e2001460d0120012d0000210b2001412c6a220f2101200b4104470d000b200441f8006a200f41586a109803200428027c21140c010b410021140b200420143602cc012007200d412c6c6a210e200721010240024002400340200e2001460d0120012d0000210b2001412c6a220f2101200b410b470d000b2004200f41606a28020022013602d00120142001460d020c010b200441003602d00120144100460d010b200441a4026a4102360200200441e4046a41023602002004410236029c02200442023702d404200441ace1c0003602d0042004200441d0016a3602a0022004200441cc016a36029802200420044198026a3602e00420044180026a200441d0046a102b2004290284022127200428028002211620042802c4030dcc010ccd010b2014450d1c2007200d412c6c6a210e200721010340200e2001460d0f20012d0000210b2001412c6a220f2101200b4104470d000b2007200d412c6c6a211420072101034020142001460d1020012d0000210b2001412c6a220e2101200b410b470d000b200441f0006a200f41586a10980320042802742201450d1c410221282004280270222920014102746a212a200e41606a212b200e41586a212c20044189056a212d4100212e4114212f200441d0046a41146a2130410121314102213241102133200441d0046a41106a21344201213541a4e2c00021364104213741182138412c2139200441c0036a412c6a213a200441e4036a213b42ff01213c4120213d4108213e4228213f20044188056a214020044184056a21414180800121424281808080102143200441f8046a214442808080808080102145410c2146200441d0046a410c6a21474170214820044180056a2149200441ec046a214a4124214b4103214c4125214d4203214e41f088c000214f4220215041782151412621524202215341ace2c000215441d8aec4002155410021564100210f0c86010b20042902d40421270b2020450d020c010b20042902c40321272020450d010b202110200b0240201d450d00201e10200b0240201b450d00201c10200b02402019450d00201a10200b02402013450d002013410474210b2010210103400240200141046a280200450d00200128020010200b200141106a2101200b41706a220b0d000b0b02402012450d00201010200b2022450dc801201810200cc8010b200441e4046a4101360200200420793602ac032004207a3602a803200441033602bc01200442013702d404200441ece2c0003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044180026a200441d0046a102b20042902840221272004280280022116208101450dbe010cc4010b208501450d792086011020410321010cce010b200d450d79410421010ccd010b200d412c6c210b2007210103402001104d2001412c6a2101200b41546a220b0d000b410521010ccc010b02402006450d00200710200b2087012106208801210741010dce010c700b200441e4046a4101360200200441023602ac03200442023702d404200441c8aec4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0cb8010b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d404200441d8aec4003602d004200420044180026a3602a80320044198026a200441d0046a102b0cb7010b208301450d722084011020200d0d760c750b1031000b41bce1c000411e1039000b41dae1c00041c8001039000b200e41011023000b201741041023000b201741041023000b202241041023000b202241041023000b202641011023000b202241041023000b202341011023000b202341041023000b201741011023000b200141041023000b0240200f0e0a00020708090a0b0c0d18180b200420563602d401202b2802002101202c280200210b203020313602002004203236028402203420044180026a360200200420353702d404200420363602d0042004200441d4016a3602800220044198026a200441d0046a102b200429029c0221272004280298022116200120564d0da80102402027a7450d00201610200b20042029280200220136028002024002400240024002400240203a28020020014d0d00200b205620386c6a220b2802142218450d01203b28020020012037746a220e2d000d2115200e2802002119200b28020c2101200b2802002116200e2802082211210f0240200b280208221f450d00201f204c7421142011210b2016210e0340200b200e2802006a220f200b490d04200e203e6a210e200f210b201420516a22140d000b0b203e1022220b450d2e200b2015ad203c83203f8637020020044180026a20286a220e20044198026a20286a2d00003a0000200420042f0098023b018002204020153a000020412042360200200441d0046a20396a221420433702002044200b360200200441d0046a203d6a2045370300200441d0046a20386a221520353703002030200f3602002034201f36020020472016360200200441d0046a203e6a2011360200202d20042f0180023b0000202d20286a200e2d00003a0000200420193602d4042018203774210e2004200441c0036a3602d0044100210b03402004200b3602e801200420013602ec01200441b8016a200441d0046a2001109e03024020042802b801450d00200441a8036a203e6a200441b8016a203e6a280200360200200420042903b8013703a80320044198026a202f6a204b36020020044198026a20466a203236020020044180026a202f6a204c36020020044198026a20336a200441a8036a36020020044198026a203e6a200441e8016a3602002004204d36029c0220044180026a20336a20044198026a3602002004204e370284022004204f360280022004200441ec016a36029802200441f0016a20044180026a102b024020042802ac03450d0020042802a80310200b20042802f001220f0d050b200120336a2101200b20316a210b200e20486a220e0d000b20492802000d2f0240204a280200450d00201528020010200b2014280200450d0520442802001020205620316a2156202920376a2229202a470d450c060b20302031360200200420323602ac032034200441a8036a360200200420533702d404200420553602d004200420044180026a3602a80320044198026a200441d0046a102b200429029c022227205088a721012027a7210b200428029802220f0d030c040b203d1022220f450d2f200f20386a202e2900e58840370000200f20336a202e2900dd8840370000200f203e6a202e2900d58840370000200f202e2900cd88403700004120210b41202101200f0d020c030b203d1022220f450d2d200f20386a202e2900a8b144370000200f20336a202e2900a0b144370000200f203e6a202e290098b144370000200f202e290090b1443700004120210b41202101200f0d010c020b20042902f40121270240204a280200450d00201528020010200b2027205088215702402014280200450d00204428020010200b2057a721012027a7210b0b2004200f3602800220042001ad205086200bad8437028402200420044180026a3602a80320044198026a20466a20523602002030202836020020044198026a203e6a200441a8036a3602002004203236029c02203420044198026a360200200420533702d404200420543602d0042004200441d4016a36029802200441d8016a200441d0046a102b0240200428028402450d0020042802800210200b20042802d80122160d050b205620316a2156202920376a2229202a470d3e0b2007200d412c6c6a210e2007210102400340200e2001460d0120012d0000210b2001412c6a220f2101200b4109470d000b2004200f41586a28020022013602b801200441f8036a28020020014d0d022004200441f0036a28020020014102746a280200220136028002200441ec036a28020020014d0d03200441e4036a28020020014104746a22013502084200520d05200131000d4220864280808080f000834280808080c000520d050b2007200d412c6c6a210e200721010340200e2001460da20120012d0000210b2001412c6a220f2101200b4108470d000b200441e8006a200f41586a2201109803200441d0046a200428026c10ec02411021584114215920044198026a41106a225a200441d0046a41146a225b2802003602004108215c20044198026a41086a225d200441d0046a410c6a290200370300200420042902d40437039802200441e0006a200110980320042802642201450da0012004280260225e200141146c6a215f410421604105216141b9f3ddf1792162417c2163410321644101216541022166417e216741ff0121684119216941fffdfb77216a417f216b418081828478216c4100216d20044198026a410c6a216e4220216f410221704202217141f8adc4002172200441e0036a2173200441d8036a2174200441f8036a2175200441f0036a2176200441ec036a21774101210f0c6c0b205e2278450d9f014100210b2078280208227921012078280200227a210e024020792060490d004100210b207a21012079210e03402001280000200b2061777320626c210b200120606a2101200e20636a220e20644b0d000b207920636a22012001206371220e6b2101207a200e6a20606a210e0b024002400240200120654d0d00200e20666a2114200b206177200e2f00007320626c210b200120676a450d020c010b200e21142001450d010b200b20617720142d00007320626c210b0b207820596a215e200b20617720687320626c227b206976227c205c74207c722201205874200172217d205d280200217e4100217f200428029802218001200428029c02218101207b218201410021010c8d010b200441e4046a4101360200200441023602ac03200442023702d404200441c8aec4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0ca4010b200441e4046a4101360200200441023602ac03200442023702d404200441d8aec4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0ca3010b20042902dc01212720042802c4030daa010cab010b412d10222216450d32201641256a41002900e1e240370000201641206a41002900dce240370000201641186a41002900d4e240370000201641106a41002900cce240370000201641086a41002900c4e240370000201641002900bce24037000042ad808080d005212720042802c4030da9010caa010b208b01450d9c012004208b01280200220136028002208d0128020020014d0d07200441d0046a208b01208e016a209001280200208f01280200109b0320042d00d004209101460d0820042d00d1040d09200441c0006a208b01109f03024020042802442201450d002004280240210b200120920174210e209301280200211403402004200b28020022013602b801201420014d0d6320042094012802002001209201746a28020022013602800220950128020020014d0d64200b208e016a210b200e2096016a220e0d000b0b208b01208a016a228b01208c01470d390c9c010b209b01209c01460d0541a4afc300210b412d2101209b01280208209d01470d120240209b01280200220e209e01460d00200e209e01209d011086040d130b02400240209b012d00182201209f01460d00209b01209a016a210e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200120a001460d002001209d01460d2641e7adc300210b41362101209701209b0128021c220f4d0d39209801200f20a401746a2214450d39209b012802142115209b0128020c210f20a5012d00000d01201520a601470d0141d8aec300210b41382101200f20a701460d39200f20a70120a601108604450d390c020b41d1afc300210b412f2101209b0128021420a201470d380240209b0128020c220f20a301460d00200f20a30120a2011086040d390b20cc010d32209b0120a1016a21cc01200e219b014103210f0ca4010b41b2aec300210b41262101201520ac016a221520ad014b0d3720150e14013737370c0e370d000b0a06050f070837370910010b200f20a801460d0120a801200f20a601108604450d01200f20ab01460d0220ab01200f20a601108604450d020240200f20a701460d0020a701200f20a6011086040d2f0b20a00110222215450d5320152099013b000020142d000c20a901470d2d201428020820a001470d2d201428020021164100210103402001209f014b0d04201520016a210b201620016a210f2001209f016a2101200f2d0000200b2d0000460d000c2e0b0b200f20ae01460d35200f20ae01209d01108604450d3520ae01200f209d011086040d35209f0110222216450d5120162099013a000020142d000c20a901470d362014280208209f01470d36201428020021114100210b0340200b0d172016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c370b0b41b2aec300210b4126210120142d000c20a901470d3420142802080d34200e219b01201420aa016a2d000020a401460d710c340b41b2aec300210b4126210120142d000c20a901470d3320142802080d33200e219b01201420aa016a2d000020a401460d6f0c330b201420aa016a2d0000210120151020200e219b01200120a401460d6d0c2a0b200f20bc01460d0b20bc01200f20bd01108604450d0b200f20be01460d1620be01200f20bd01108604450d160240200f20bf01460d0020bf01200f20bd011086040d320b41b2aec300210b4126210120142d000c20a901470d3120142802080d31200e219b01201420aa016a2d000020a401460d680c310b200f20b901460d0b20b901200f20ba01108604450d0b0240200f20bb01460d0020bb01200f20ba011086040d310b209d0110222216450d4820162099013a000220162099013b000020142d000c20a901470d3a2014280208209d01470d3a201428020021114100210b0340200b20a0014b0d182016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c3b0b0b200f20c301460d0b20c301200f20c401108604450d0b0240200f20c501460d0020c501200f20c4011086040d300b20a00110222216450d4220162099013b000020142d000c20a901470d38201428020820a001470d38201428020021114100210b0340200b209f014b0d182016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c390b0b0240200f20c601460d0020c601200f20c7011086040d2f0b41b2aec300210b4126210120142d000c20a901470d2e20142802080d2e200e219b01201420aa016a2d000020a401460d550c2e0b0240200f20c801460d0020c801200f20c9011086040d2e0b41b2aec300210b4126210120142d000c20a901470d2d20142802080d2d200e219b01201420aa016a2d000020a401460d5d0c2d0b0240200f20b801460d0020b801200f20aa011086040d2d0b41b2aec300210b4126210120142d000c20a901470d2c20142802080d2c200e219b01201420aa016a2d000020a401460d5e0c2c0b0240200f20b601460d0020b601200f20b7011086040d2c0b41b2aec300210b4126210120142d000c20a901470d2b20142802080d2b200e219b01201420aa016a2d000020a401460d5c0c2b0b0240200f20af01460d0020af01200f20b0011086040d2b0b41b2aec300210b4126210120142d000c20a901470d2a20142802080d2a200e219b01201420aa016a2d000020a401460d590c2a0b200f20b201460d0620b201200f20b301108604450d06200f20b401460d0f20b401200f20b301108604450d0f0240200f20b501460d0020b501200f20b3011086040d2a0b41b2aec300210b4126210120142d000c20a901470d2920142802080d29200e219b01201420aa016a2d000020a401460d5c0c290b0240200f20b101460d00200f290000208901520d290b20b00110222211450d4320112099013600032011209f013a000220112099013b000020142d000c20a901470d26201428020820b001470d262014280200211f4100210f0340200f20a2014b0d082011200f6a2115201f200f6a2116200f209f016a210f20162d000020152d0000460d000c270b0b200f20c001460d0520c001200f20c101108604450d050240200f20c201460d0020c201200f20c1011086040d280b209d0110222216450d3c20162099013a000220162099013b000020142d000c20a901470d322014280208209d01470d32201428020021114100210b0340200b20a0014b0d112016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c330b0b0240200f20ca01460d0020ca01200f20cb011086040d270b20a00110222211450d3820112099013b000020142d000c20a901470d25201428020820a001470d252014280200211f4100210f0340200f209f014b0d072011200f6a2115201f200f6a2116200f209f016a210f20162d000020152d0000460d000c260b0b20a40110222216450d3c201620990136000020142d000c20a901470d2c201428020820a401470d2c201428020021114100210b0340200b209d014b0d082016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c2d0b0b41b2aec300210b4126210120142d000c20a901470d2420142802080d24201420aa016a2d0000220f20a401460d24200e219b01200f20a4017220a401460d500c1c0b20a00110222216450d3720162099013b000020142d000c20a901470d2b201428020820a001470d2b201428020021114100210b0340200b209f014b0d072016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c2c0b0b20b00110222211450d3c20112099013600032011209f013a000220112099013b000020142d000c20a901470d28201428020820b001470d282014280200211f4100210f0340200f20a2014b0d072011200f6a2115201f200f6a2116200f209f016a210f20162d000020152d0000460d000c290b0b41b2aec300210b4126210120142d000c20a901470d2120142802080d21201420aa016a2d0000220f20a401460d21200e219b01200f20a4017220a401460d4b0c190b201420aa016a2d0000220f20a401460d1e20111020200e219b01200f20a4017220a401460d560c200b201420aa016a2d0000210120111020200e219b01200120a401460d470c170b201420aa016a2d0000210120161020200e219b01200120a401460d580c160b201420aa016a2d0000210120161020200e219b01200120a401460d560c150b201420aa016a2d0000210120161020200e219b01200120a401460d4a0c140b201420aa016a2d0000220f20a401460d2120111020200e219b01200f20a4017220a401460d500c1b0b209f0110222211450d3020112099013a000020142d000c20a901470d262014280208209f01470d262014280200211f4100210f0340200f0d052011200f6a2115201f200f6a2116200f209f016a210f20162d000020152d0000460d000c270b0b20a00110222216450d3220162099013b000020142d000c20a901470d26201428020820a001470d26201428020021114100210b0340200b209f014b0d052016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c270b0b201420aa016a2d0000210120161020200e219b01200120a401460d430c100b201420aa016a2d0000210120161020200e219b01200120a401460d440c0f0b201420aa016a2d0000210120161020200e219b01200120a401460d3f0c0e0b201420aa016a2d0000220f20a401460d2120111020200e219b01200f20a4017220a401460d4d0c150b201420aa016a2d0000210120161020200e219b01200120a401460d480c0c0b4114210120004190afc3003602040cad010b411521012000419daec3003602040cac010b024020d70120cf016a280200450d0020d70128020010200b024020d70120d0016a280200220b450d0020d70128020c2101200b20cf0174210b0340024020012d000020d301470d00200120d4016a28020020d50171450d00200120cf016a28020010200b200120d1016a2101200b20d6016a220b0d000b0b20d70120cd016a2101024020d70120d1016a280200450d0020d70120d2016a28020010200b200121d701200120ce01470d4f0c560b024020e20120da016a280200220b450d0020e2012802042101200b20dd0174210b0340024020012d000020df01470d00200120db016a28020020e00171450d00200120dd016a28020010200b200120de016a2101200b20e1016a220b0d000b0b024020e20120db016a280200450d0020e20120dd016a28020010200b20e20120d8016a2101024020e20120dc016a280200450d0020e20128021010200b200121e201200120d901470d4f0c560b024020ed0120e5016a280200220b450d0020ed012802042101200b20e80174210b0340024020012d000020ea01470d00200120e6016a28020020eb0171450d00200120e8016a28020010200b200120e9016a2101200b20ec016a220b0d000b0b024020ed0120e6016a280200450d0020ed0120e8016a28020010200b20ed0120e3016a2101024020ed0120e7016a280200450d0020ed0128021010200b200121ed01200120e401470d4f0c560b024020f501280208220b450d0020f5012802002101200b20ee0174210b0340024020012d000020f101470d00200120f2016a28020020f30171450d00200120ee016a28020010200b200120f0016a2101200b20f4016a220b0d000b0b20f50120f0016a2101024020f50120ee016a280200450d0020f50128020010200b200121f501200120ef01470d4f0c560b20fc01221420f8016a21fc01024020142802042201450d000240201420f9016a280200220b450d00200b20f9016c210b034002402001280200220e450d00200120f6016a280200450d00200e10200b200120f9016a2101200b20fb016a220b0d000b0b201420fa016a280200450d00201420f6016a28020010200b20fc0120f701470d4f410821010cac010b024020cc01450d0020cc01280204450d0620cc0128020022fd0120cc0141086a28020022fe014d0d082000419fb0c30036020441c90021010ca7010b410021fd01410021fe010c080b200441e4046a4101360200200441023602ac03200442023702d404200441a8aec4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0c98010b200441d8046a290300212720042802d404211620042802c4030d9f010ca0010b412010222216450d2c201641186a41002900a4e340370000201641106a410029009ce340370000201641086a4100290094e3403700002016410029008ce34037000042a08080808004212720042802c4030d9e010c9f010b201510200b41262101200041b2aec3003602040ca1010b200041a9b1c300360204413221010ca0010b411f210120004180b0c3003602040c9f010b20fe0120032802484d0d00200041e8b0c30036020441c10021010c9e010b200441d0046a41086a220b420037030020044180e5c2003602d404200420032903083e02e004200420032903103e02d004200441d0046a4104722201410d10a0032001410c10a0032001410710a0032001410f10a003200441c8016a20042802e004360200200441b8016a41086a200b290300370300200420042903d0043703b8012007450d22200441d0046a410c6a200dad4220862006ad84370200200420073602d80420042008ad422086200c843703d00420044198026a200441d0046a10a103410110222201450d23200141003a0000200420042f01d0043b01c003200441e0046a41e0083b0100200441d8046a428180808010370300200420013602d404200441013602d004200420042f01c0033b01e20420044198026a200441d0046a10a203211541031022220b450d24200b41026a41002d008cb7443a0000200b41002f008ab7443b000041031022220e450d25200e41026a41002d008fb7443a0000200e41002f008db7443b0000200441c0036a41026a2216200441d0046a41026a22112d00003a0000200420042f00d0043b01c003200441ac026a2214280200210f20044198026a41106a2802002101201120162d00003a0000200420042f01c0033b01d004200f2001470d07200141016a220f2001490da30120014101742216200f200f2016491b2216ad42287e22ff01422088a70da30120ff01a7220f4100480da3012001450d05200441a4026a280200200141286c200f10212201450d080c060b2080022d00002088026a22012089024b0d78024002400240024020010e0400030102000b20800228020c2201450d7b2001208a026c210b208002280204208b026a2101034002402001208c026a2802000d002001280200220e208102490d002001200e208d026a3602000b2001208a026a2101200b208e026a220b0d000c7c0b0b20800228020c2201450d7a20800228020422a2022001208f026c6a21a302410121010c790b20800228020c2201450d7920800228020422a40220012091026c6a21a5020c770b2080022802042201208102490d782080022085026a2001208d026a3602002080022083026a228002208402470d450c790b20111020200041b2aec3003602040c9b010b201110200b2000200b3602040c99010b20161020200041b2aec3003602040c98010b200f10222201450d020b200441a8026a2016360200200441a4026a2001360200200441ac026a280200210f0b200441a4026a280200200f41286c6a220141003a00182001200e36020c20014283808080303702042001200b360200200141106a4283808080303702002001411b6a200441d2046a2d00003a0000200141196a20042f01d0043b00002001411c6a20153602002014201428020041016a360200200441d0046a20044198026a418c011084041a200441a8036a200441d0046a10a303200441a8036a41106a2802002216412c6c210120042802b00322800241586a210b024003404100210e2001450d01200141546a2101200b41286a210f200b412c6a2214210b200f2d00004103470d000b201441086a2802002201450d00200141286c210b201428020041186a21014100210e0340200e20012d0000456a210e200141286a2101200b41586a220b0d000b0b2016412c6c210120800241586a210b200e417f6a218102024003404100210e2001450d01200141546a2101200b41286a210f200b412c6a2214210b200f2d00004103470d000b201441086a2802002201450d00200141286c210b201428020041186a21014100210e0340200e20012d0000456a210e200141286a2101200b41586a220b0d000b0b2016412c6c210120800241606a210b024002400340410021142001450d01200141546a2101200b41206a210f200b412c6a2215210b200f2d00004104470d000b2015280200210120160d010c750b410021012016450d740b2001200e6a218202412c2183022080022016412c6c6a2184024104218502200441b8016a4104722186024100218702417821880241032189024114218a024110218b02417c218c024101218d02416c218e02411c218f0241022190024118219102410c2192024108219302428080808010219402412d219502422021ff01417f219602410b2197024170219802417e21990241ec00219a024203219b024202219c0241ff01219d024105219e024106219f02410021a002410021a1024109210f0c6d0b200f41041023000b20111020200041b2aec3003602040c93010b20161020200041b2aec3003602040c92010b20161020200041b2aec3003602040c91010b20161020200041b2aec3003602040c90010b20161020200041b2aec3003602040c8f010b20161020200041b2aec3003602040c8e010b20111020200041b2aec3003602040c8d010b20161020200041b2aec3003602040c8c010b410841041023000b418889c000102f000b412041011023000b412041011023000b410241011023000b410241011023000b410241011023000b410341011023000b410141011023000b410441011023000b410341011023000b410241011023000b410741011023000b410741011023000b410141011023000b410241011023000b412d41011023000b41abadc30041361039000b410141011023000b410341011023000b410341011023000b412041011023000b4100210f0c2c0b4100210f0c2c0b4102210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4104210f0c2e0b4105210f0c2e0b4106210f0c2e0b4107210f0c2e0b4108210f0c2e0b4109210f0c2f0b410021010c5a0b410221010c590b410221010c580b410221010c570b410221010c560b410321010c550b410321010c540b410521010c530b410521010c520b410421010c510b410621010c500b410721010c4f0b410921010c4e0b410921010c4d0b410921010c4c0b410921010c4b0b410921010c4a0b410921010c490b410921010c480b410921010c470b410921010c460b410921010c450b410921010c440b410921010c430b410921010c420b410921010c410b410921010c400b410921010c3f0b410921010c3e0b410921010c3d0b410921010c3c0b410921010c3b0b410921010c3a0b410921010c390b410921010c380b410921010c370b410921010c360b410921010c350b410921010c340b410921010c330b410921010c320b410921010c310b410921010c300b410921010c2f0b410921010c2e0b410921010c2d0b410921010c2c0b410921010c2b0b410221010b034002400240024002400240024002400240024002400240024002400240024020010e03000102020b02402080012082012081017122016a280000220e207d73220b206b73200b206a6a71206c71220b450d00034002402079207e200b6820647620016a208101712064746a221420606a280200470d00207a20142802002214460d08207a20142079108604450d070b200b206b6a200b71220b0d000b0b207f20606a227f20016a218201200e200e20657471206c71450d030240205a2802000d0020044198026a10ed02200428029802218001200428029c022181010b208101207b71210b410421010340200b220e20016a20810171210b200120606a2101208001200e6a280000206c71220f450d000b0240208001200f68206476200e6a2081017122016a2c0000220b206d480d00208001208001280200206c716820647622016a2d0000210b0b20800120016a207c3a0000208001200120636a208101716a20606a207c3a0000205a205a280200200b2065716b360200206e206e28020020656a360200205d28020020012064746a2079ad206f86207aad8437020002400240024002400240024002400240207828020c22012065460d00024020012066460d0020012064470d022004207828021022013602f001207328020020014d0d06207428020020012065746a2d0001450d030c070b2004207828021022013602b801200441c0036a205c6a28020020014b0d02205b2065360200200420703602ac03200441d0046a20586a200441a8036a360200200420713702d404200420723602d0042004200441b8016a3602a80320044180026a200441d0046a102b2004280280022216450d020c110b2004207828021022013602b801200441c0036a20596a28020020014b0d010c030b2004207828021022013602f001207528020020014d0d012004207628020020012066746a28020022013602b801207728020020014d0d050b205e205f470d0b0c250b200441e4046a4101360200200441023602ac03200442023702d404200441c8aec4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a102b200429028402212720042802800221162081010d310c2b0b200441e4046a4101360200200441023602ac03200442023702d404200441a8aec4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044180026a200441d0046a102b200429028402212720042802800221162081010d300c2a0b200441e4046a4101360200200441023602ac03200442023702d404200441f8aec4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a102b200429028402212720042802800221162081010d2f0c290b200441e4046a4101360200200441023602ac03200442023702d40420044198afc4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a102b200429028402212720042802800221162081010d2e0c280b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d404200441d8aec4003602d0042004200441b8016a3602a80320044180026a200441d0046a102b200429028402212720042802800221162081010d2d0c270b20a2022201208f026a21a20202402001280218220b450d0020012802102101200b20900274210b034002402001280200220e208102490d002001200e208d026a3602000b20012085026a2101200b208c026a220b0d000b0b20a20220a302470d010c0e0b20a1022122024020a40228021420850274220b450d0020a40228020c21010340024020012d0000209702470d0020012085026a220e2802002214208102490d00200e2014208d026a3602000b2001208b026a2101200b2098026a220b0d000b0b20930210222201450d06200120940237020020850210222219450d0520a4022092026a210e201920870236020020a402208a026a221a280200221e450d084100210b41012116410121154101211f4101211402400240024002404100201e22114f0d0002400340200b208d026a211102400240024002400240024002400240200e280200200b208502746a2d0000220b2099026a2089024f0d00200b10a40321a602200441b8016a2093026a28020021a70220860221a8020c010b0240024002400240024002400240200b209e02460d00200b209f02470d012014450d0f20142096026a21140c0a0b2014450d0e20162015470d012016208d026a220b2016490d4a2016208d02742218200b200b2018491b2218ad209b0286222720ff0188a70d4a2027a7220b208702480d4a2016450d022001201620890274200b102122010d030c040b200b10a40321a902200441b8016a2093026a28020021aa0220860221ab020c060b201621180c010b200b10222201450d010b20012015208902746a220b208d02360204200b2011360200024002400240201f20142096026a2216470d00201f208d0274220b20142014200b491b221cad209c0286222720ff0188a70d492027a7220b208702480d49201f450d012019201f20900274200b102122190d020c040b201f211c0c010b200b10222219450d020b2015208d026a210b20192016209002746a20153602002011201e4f0d180c080b200b41041023000b200b41041023000b4100210b0c010b4101210b0b02400240034002400240200b0e020001010b20a802280200221c2093026a2117201c2f010621184100210b02400240024003402018200b460d01208702209602208d022017200b6a2d0000221320a602209d0271221b4b1b2013201b461b2213450d02200b208d026a210b2013208d02460d000b200b2096026a21180b024020a702450d0020a7022096026a21a702201c2018209002746a209a026a21a8024100210b0c040b200441b8016a211820142096026a220b2014490d010c0b0b200441b8016a21180240201c200b208902746a208a026a220b450d00200b280200221c208d02460d0b201c209002470d00200b2085026a21180b20142096026a220b20144f0d0a0b200b20144b0d0920152019200b209002746a280200220b4d0d092001200b208902746a221c280204220b20182802006a2218200b490d09201c2085026a2018360200024020162015470d002016208d026a220b2016490d462016208d02742218200b200b2018491b2218ad209b0286222720ff0188a70d462027a7220b208702480d462016450d062001201620890274200b102122010d070c0c0b201621180c060b20ab02280200221c2093026a2117201c2f010621184100210b024003402018200b460d01208702209602208d022017200b6a2d0000221320a902209d0271221b4b1b2013201b461b2213450d03200b208d026a210b2013208d02460d000b200b2096026a21180b024020aa02450d0020aa022096026a21aa02201c2018209002746a209a026a21ab024101210b0c010b0b200441b8016a211820142096026a220b2014490d010c070b200441b8016a21180240201c200b208902746a208a026a220b450d00200b280200221c208d02460d07201c209002470d00200b2085026a21180b20142096026a220b20144f0d060b200b20144b0d0520152019200b209002746a280200220b4d0d052001200b208902746a221c280204220b20182802006a2218200b490d05201c2085026a20183602000b201621182015210b201f211c2011201e490d020c120b200b10222201450d050b20012015208902746a220b208d02360204200b2011360200024002400240201f2014470d00201f208d026a220b201f490d41201f208d02742216200b200b2016491b221cad209c0286222720ff0188a70d412027a7220b208702480d41201f450d012019201f20900274200b102122190d020c080b201f211c0c010b200b10222219450d060b2015208d026a210b20192014209002746a20153602002014208d026a21142011201e4f0d100b20182116200b2115201c211f2011220b201a2802002211490d000c020b0b02402016450d00200110200b410121a0020240201f450d0020191020202221a1022080022083026a228002208402470d040c130b202221a1020c110b4190b7c400200b201110b501000b200b41041023000b200b41041023000b4109210f410921010c360b410121010c0b0b410021010c0a0b410121010c330b410121010c320b4101210f410921010c310b410441041023000b410841041023000b20042902840221272081010d230c1d0b20012093026a21154101211c410121180c010b200b450d012001200b208902746a21150b200121164101210b03402001290200212720042095023a00d0042004202720ff01883e02d404200e200b2027a76a22142096026a200441d0046a10a50320042097023a00d00420042081023602d404200e2014200441d0046a10a503200b2090026a210b201520012093026a2201470d000b201621010b02402018450d00200110200b0240201c450d00201910200b20a4022091026a21a40202400240200441b8016a208b026a280200450d00201a280200220b450d00200e2802002101200b20850274210b4100210e0340024020012d0000208302470d0020012097023a000020012085026a208202360200200e208d026a210e0b2001208b026a2101200b2098026a220b0d000b410121a102200e0d010b202221a1020b20a40220a502460d01410221010c000b0b2080022083026a228002208402470d0d0b024020a002410171450d00200441b4036a280200210720042802b003210e0240200441b8036a2802002201450d002001412c6c210b200e210103402001104d2001412c6a2101200b41546a220b0d000b0b02402007450d00200e10200b20042802bc01200441c0016a280200200441c4016a2802001055200041dbb1c300360204411a21010c030b024020a102410171450d00200441d0046a41106a200441a8036a41106a280200360200200441d0046a41086a200441a8036a41086a290300370300200420042903a8033703d004200441c0036a200441d0046a10a10341101022220b450d08200b41063a0000410110222201450d09200141003a0000410110222207450d0a200720012d00003a00002001102041101022220e450d0b200e41063a000041f00010222201450d0c200141063a00602001412c3b015020012081023602442001410b3a0040200141d8003a00302001412d3a0020200141003602142001410f3a0010200141003602042001410f3a00002001200441c8016a2802003602240240200e2d00004109470d00200e28020841ffffffff0371450d00200e28020410200b200e10200240200b2d00004109470d00200b28020841ffffffff0371450d00200b28020410200b200b1020200441f4046a4287808080f000370200200441f0046a2001360200200441ec046a4100360200200441d0046a410c6a4281808080800c370200200441d8046a4101360200200441003602fc04200442043702e404200420073602d404200441013602d004200441c0036a200441d0046a10a603200441d0046a200441c0036a418c011084041a20044180026a200441d0046a10a30320044190026a280200211420044180026a410c6a2802002101200428028802218002200428028402210b200428028002210e0c020b200441b8036a280200211420042802b0032180020b200441b4036a280200210120042802ac03210b20042802a803210e0b20042802bc01200441c0016a280200200441b8016a410c6a2802001055208002450d02200441c0036a410c6a2014ad4220862001ad8437020020042080023602c8032004200bad422086200ead843703c003200441d0046a200441c0036a200328024410a70320042802d0044101470d010240200441d8046a280200450d0020042802d40410200b200041f5b1c300360204412321010b20004101360200200041086a2001360200200441e0056a24000f0b200441dc046a2802002221450d01200441e4046a280200210b200441e0046a280200218401200441d8046a280200210d20042802d4042107200328024021860120044100360288022004420137038002410410222201450d02200441043602840220044188026a220e200e280200220f41046a36020020042001360280022001200f6a20073600000240024002402004280284022207200e28020022016b41044f0d00200141046a220e2001490d2720074101742201200e200e2001491b22014100480d272007450d01200428028002200720011021220e450d020c0c0b200428028002210e0c0c0b20011022220e0d0a0b200141011023000b41abadc30041361039000b41abadc30041361039000b410441011023000b411041081023000b410141011023000b410141011023000b411041081023000b41f00041081023000b4109210f410921010c1a0b20042001360284022004200e3602800220044188026a28020021010b20044180026a41086a200141046a360200200e20016a200d3600002021200b412c6c22016a210702400240024002400240200b450d00200141546a2116200441d0046a410172210b200441d0046a41276a210d200441d0046a41206a210f200441d0046a41186a2102200441d0046a41106a2114200441d0046a41086a211520212101034020012d0000210e200d200141286a280000360000200f200141216a2900003703002002200141196a2900003703002014200141116a2900003703002015200141096a2900003703002004200141016a2900003703d004200e410f460d02200441c0036a41276a2206200d280000360000200441c0036a41206a2211200f290300370300200441c0036a41186a22202002290300370300200441c0036a41106a2285012014290300370300200441c0036a41086a2283012015290300370300200420042903d0043703c003200b20042903c003370000200b41086a208301290300370000200b41106a208501290300370000200b41186a2020290300370000200b41206a2011290300370000200b41276a20062800003600002004200e3a00d00420044198026a200441d0046a20044180026a104920042d009802220e411a470d05201641546a21162001412c6a22012007470d000b200722012007470d020c030b202122012007470d010c020b2001412c6a22012007460d010b200441d0046a410172210b200441d0046a41276a210d200441d0046a41206a210f200441d0046a41186a2102200441d0046a41106a2114200441d0046a41086a2115034020012d0000210e200d200141286a280000360000200f200141216a2900003703002002200141196a2900003703002014200141116a2900003703002015200141096a2900003703002004200141016a2900003703d004200e410f460d01200441c0036a41276a2216200d280000360000200441c0036a41206a2206200f290300370300200441c0036a41186a22112002290300370300200441c0036a41106a22202014290300370300200441c0036a41086a2285012015290300370300200420042903d0043703c003200b20042903c003370000200b41086a208501290300370000200b41106a2020290300370000200b41186a2011290300370000200b41206a2006290300370000200b41276a20162800003600002004200e3a00d004200441d0046a104d2001412c6a22012007470d000b0b0240208401450d00202110200b20044180026a41086a280200210120042903800221ff012000411c6a41003a0000200041186a2001360200200041106a20ff013702002000410c6a20fe01360200200041086a20fd013602002000208601360204200041003602002000411d6a20042f00d0043b00002000411f6a200441d2046a2d00003a0000200441e0056a24000f0b20044198026a41086a280200218601200428029c02211f02402016450d002001412c6a2101200441d0046a410172210b200441d0046a41276a210f200441d0046a41206a2102200441d0046a41186a2114200441d0046a41106a2115200441d0046a41086a2116034020012d0000210d200f200141286a2800003600002002200141216a2900003703002014200141196a2900003703002015200141116a2900003703002016200141096a2900003703002004200141016a2900003703d004200d410f460d01200441c0036a41276a2206200f280000360000200441c0036a41206a22112002290300370300200441c0036a41186a22202014290300370300200441c0036a41106a2285012015290300370300200441c0036a41086a2283012016290300370300200420042903d0043703c003200b20042903c003370000200b41086a208301290300370000200b41106a208501290300370000200b41186a2020290300370000200b41206a2011290300370000200b41276a20062800003600002004200d3a00d004200441d0046a104d2001412c6a22012007470d000b0b0240208401450d00202110200b0240200428028402450d0020042802800210200b0240200e4105470d00208601450d00201f10200b20004198b2c30036020420004101360200200041086a4125360200200441e0056a24000f0b200428029c022201450d000240200141016aad4203862227422088a70d00200141086a417c71220b200141056a490d00200b2027a76a2201200b490d002001417c4b0d002004200b3602d804200441043602d404200420013602d0040b20042802980210200b2007200d412c6c6a210e2007210102400340200e2001460d0120012d0000210b2001412c6a220f2101200b4103470d000b200441d8006a200f41586a109803200428025c2201450d002004280258210f200141286c211441002101200441a4026a2111200441e4046a211f200441a0026a2118200441e0046a2119200441ec036a21150340024002400240200f20016a220b41186a2d0000220e4101460d000240200e4102460d00200e4103470d02200b411a6a2d0000450d030c090b200441d0046a200b411c6a109a0320042802d0042216450d020c060b200b41206a2802004101470d01200b411c6a280200210e2004200b41246a280200220b3602b801200e200b4d0d0120114102360200201f41023602002018200441a8036a3602002004410236029c022004200e3602a803201920044198026a360200200442023702d404200441ccaac4003602d0042004200441b8016a3602980220044180026a200441d0046a102b2004280280022216450d010c0c0b2004200b411c6a280200220b360280022015280200200b4d0d050b2014200141286a2201470d000b0b0240200441c0036a41146a28020022014102490d00200441d0046a41146a41013602002004410236028402200420013602a803200442013702d404200441fce2c0003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a102b0c050b0240200441c8036a280200220141014d0d00200441e4046a41013602002004410236028402200420013602a803200442013702d40420044184e3c0003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a102b0c050b2007200d412c6c6a210e2007210102400340200e2001460d0120012d0000210b2001412c6a220f2101200b410c470d000b200441d0006a200f41586a109803200428025022012004280254411c6c6a210e200441c8036a210f200441e0036a2114200441c0036a41186a2115200441e4046a2111200441e0046a211f03402001200e460d0120042001280200220b360280020240200f280200200b4b0d0020114101360200200441023602ac03201f200441a8036a360200200442023702d404200441f8adc4003602d004200420044180026a3602a80320044198026a200441d0046a102b20042802980222160d0a0b200441d0046a200141046a220120152802002014280200109b0320042d00d0044101460d08200141186a210120042d00d104450d000b412010222216450d0a201641186a41002900a4e340370000201641106a410029009ce340370000201641086a4100290094e3403700002016410029008ce34037000042a08080808004212720042802c4030d0d0c0e0b2007200d412c6c6a210e200721010340200e2001460d0120012d0000210b2001412c6a220f2101200b410a470d000b200441c8006a200f41586a109803200428024c2201450d00411c218a012004280248228b012001411c6c6a218c01200441d4036a218d014104218e01200441e0036a218f01200441d8036a21900141012191014102219201200441f8036a219301200441f0036a219401200441ec036a219501417c2196014102210f0c0a0b024020042802c403450d0020042802c00310200b0240200441d0036a280200450d00200441cc036a28020010200b0240200441dc036a280200450d00200441d8036a28020010200b0240200441ec036a280200220b450d00200441e4036a2802002101200b410474210b03400240200141046a280200450d00200128020010200b200141106a2101200b41706a220b0d000b0b0240200441e8036a280200450d00200441e4036a28020010200b0240200441f4036a280200450d00200441f0036a28020010200b2020450d0e2021102020070d0f0c120b20042902d404212720042802c4030d0a0c0b0b200441e4046a4101360200200441023602ac03200442023702d404200441d8aec4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0c010b200b410c6a2802002101200b41146a280200210b200441d0046a41146a41013602002004200b360284022004200136028002200441033602ac03200442013702d404200441f4e2c0003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0b200429029c02212720042802980221160b20042802c403450d070c060b200441d8046a290300212720042802d404211620042802c4030d050c060b200429029c02212720042802c4030d040c050b200429028402212720042802c4030d030c040b412041011023000b410921010c0b0b024020810141016aad420386228901422088a70d0020810141086a417c71220120810141056a490d002001208901a76a220b2001490d00200b417c4b0d00200420013602d804200441043602d4042004200b3602d0040b208001102020042802c403450d010b20042802c00310200b0240200441d0036a280200450d00200441cc036a28020010200b0240200441dc036a280200450d00200441d8036a28020010200b0240200441ec036a280200220b450d00200441e4036a2802002101200b410474210b03400240200141046a280200450d00200128020010200b200141106a2101200b41706a220b0d000b0b0240200441e8036a280200450d00200441e4036a28020010200b0240200441f4036a280200450d00200441f0036a28020010200b2020450d00202110202016450d010c0a0b20160d090b2007450d030b2007200d412c6c6a210e20072101024002400340200e2001460d0120012d0000210b2001412c6a220f2101200b4102470d000b200441386a200f41586a10980320042802382101200428023c210b0c010b410021010b200b410020011b2118200141c8d7c40020011b21192007200d412c6c6a210e20072101024002400340200e2001460d0120012d0000210b2001412c6a220f2101200b4108470d000b200441306a200f41586a109803200428023021012004280234210b0c010b410021010b200b410020011b2116200141c8d7c40020011b210f2007200d412c6c6a210e20072101024002400340200e2001460d0120012d0000210b2001412c6a22142101200b4104470d000b200441286a201441586a10980320042802282101200428022c210b0c010b410021010b200b410020011b2111200141c8d7c40020011b211f2007200d412c6c6a21142007210102400240024003404100210b20142001460d0120012d0000210e2001412c6a22152101200e4103470d000b200441206a201541586a10980320042802244100200428022022011b220e0d010c020b410021014100410041001b220e450d010b200e41286c210e200141c8d7c40020011b41186a21014100210b0340200b20012d0000456a210b200141286a2101200e41586a220e0d000b0b200f201641146c6a2116410021134100211c024002400240024002400340200f2016460d01200f28020021144138210141f8abc300210e02400240200f41086a28020022154106460d0020154104470d0741012113201441bdb2c300460d01201428000041e3c2b1e306460d010c070b4101211c201441fbb2c300460d00201441fbb2c30041061086040d060b200f410c6a2802000d02200f41106a2802002201200b6b221420014b0d034181b3c300210e41262101201120144d0d05201f20144102746a2214450d0541a7b3c300210e412021012018201428020022144d0d05201920144104746a2214450d05411f210141edacc300210e20142802080d05200f41146a210f20142d000d4104460d000c050b0b2013201c71410171450d022007200d412c6c6a210e200721010340200e2001460d0620012d0000210b2001412c6a220f2101200b4106470d000b200441186a200f41586a109803200428021c450d052000418cadc300360204411f21010c040b4113210141b0acc300210e0c020b412a210141c3acc300210e0c010b411c411e201c410171220b1b210141c1b2c30041ddb2c300200b1b210e0b2000200e3602040b20004101360200200041086a20013602002007450d0a0240200d450d00200d412c6c210b2007210103402001104d2001412c6a2101200b41546a220b0d000b0b2006450d0a20071020200441e0056a24000f0b2007200d412c6c6a210e200721010340200e2001460d0220012d0000210b2001412c6a220f2101200b4102470d000b200441106a200f41586a109803200428021021012004280214210b0c020b41abadc30041361039000b410021010b200b410020011b219701200141c8d7c40020011b2198012007200d412c6c6a210e200721010240024003404100219901200e2001460d0120012d0000210b2001412c6a220f2101200b4103470d000b200441086a200f41586a10980320042802082101200428020c210b0c010b410021010b4128219a01200141c8d7c40020011b229b01200b410020011b41286c6a219c014103219d01418ab7c400219e014101219f01410221a001411c21a101410621a20141e1adc30021a301410421a401200341cc006a21a501410b21a60141fda4c40021a701419da3c40021a80141e00021a901410d21aa0141c1a3c40021ab01417d21ac01411321ad01418db7c40021ae0141f0a3c40021af01410721b00141f7a2c40021b10142e5f0d1fbb5ac98b6ec0021890141ffa2c40021b201410a21b3014189a3c40021b4014193a3c40021b50141b5a3c40021b601410c21b70141a8a3c40021b8014188a4c40021b901410e21ba014196a4c40021bb0141d9a2c40021bc01410f21bd0141e8a2c40021be0141e1a3c40021bf0141a4a4c40021c001411021c10141b4a4c40021c20141f7a3c40021c301411121c40141c4a4c40021c50141eba4c40021c601411221c70141cca3c40021c801411521c90141d5a4c40021ca01411621cb01410021cc014103210f410921010c000b0b1024000b02402027a7450d00201610200b0240200d450d00200d412c6c210b2007210103402001104d2001412c6a2101200b41546a220b0d000b0b41cfabc30021014113210b2006450d02200710200c020b41e2abc30021014116210b2007450d010b200941ff01714105470d00200810200b2000200136020420004101360200200041086a200b3602000b200441e0056a24000bc10201037f23004180016b220224000240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001109a02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b2004418001102d000b2004418001102d000bd40203037f017e027f230041306b220324004127210402400240024020004290ce00540d00412721040340200341096a20046a2205417c6a200020004290ce0080220642f0b17f7e7ca7220741e4006e2208410174418ad8c4006a2f00003b00002005417e6a2008419c7f6c20076a410174418ad8c4006a2f00003b00002004417c6a2104200042ffc1d72f5621052006210020050d000b2006a7220541e3004c0d020c010b20002206a7220541e3004c0d010b200341096a2004417e6a22046a2006a7220741ffff037141e4006e2205419c7f6c20076a41ffff0371410174418ad8c4006a2f00003b00000b02400240200541094a0d00200341096a2004417f6a22046a200541306a3a00000c010b200341096a2004417e6a22046a2005410174418ad8c4006a2f00003b00000b2002200141c8d7c4004100200341096a20046a412720046b109b022104200341306a240020040be60601067f0240024002400240024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21082006410471450d010c020b200541016a2108412d2107200028020022064104710d010b410021024101210120002802084101470d010c020b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21084101210120002802084101460d010b200020072002200310f2030d012000280218200420052000411c6a28020028020c1100000f0b0240024002400240024002400240024002400240024002402000410c6a280200220920084d0d0020064108710d01200920086b2101410120002d0030220920094103461b2209410371450d0220094102460d034100210b200121090c040b200020072002200310f2030d0b2000280218200420052000411c6a28020028020c1100000f0b41012101200041013a003020004130360204200020072002200310f2030d0a200920086b21014101200041306a2d0000220920094103461b2209410371450d0320094102460d0441002108200121090c050b410021092001210b0c010b20014101762109200141016a410176210b0b417f2101200041046a210a200041186a21082000411c6a210602400340200141016a220120094f0d012008280200200a2802002006280200280210110400450d000c050b0b200041046a280200210a41012101200020072002200310f2030d07200041186a2209280200200420052000411c6a220328020028020c1100000d0720092802002100417f2109200328020041106a21030340200941016a2209200b4f0d06410121012000200a2003280200110400450d000c080b0b41002109200121080c010b20014101762109200141016a41017621080b417f2101200041046a210a200041186a21032000411c6a21020340200141016a220120094f0d022003280200200a2802002002280200280210110400450d000b0b410121010c030b200041046a280200210a41012101200041186a2209280200200420052000411c6a220328020028020c1100000d0220092802002100417f2109200328020041106a21030340200941016a220920084f0d02410121012000200a2003280200110400450d000c030b0b41000f0b41000f0b20010b810101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004413c6a41273602002004412c6a4102360200200441033602342004420237021c200441b8d4c4003602182004200441106a3602382004200441086a3602302004200441306a360228200441186a41c8d4c4001048000b110020002802002000280204200110b4020b1c00200128021841db81c500410e2001411c6a28020028020c1100000ba20b02037f017e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022024101460d00024020024102460d0020024103470d02200141046a280200200141086a2802002202470d05200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0b20012802002002200410212203450d0c0c150b200141046a280200200141086a2802002202470d02200241016a22032002490d1620024101742204200320032004491b22044100480d162002450d0620012802002002200410212203450d070c120b200141046a280200200141086a2802002202470d02200241016a22032002490d1520024101742204200320032004491b22044100480d152002450d0720012802002002200410212203450d080c0f0b200141046a280200200141086a2802002202470d03200241016a22032002490d1420024101742204200320032004491b22044100480d142002450d0a20012802002002200410212203450d0b0c0c0b200128020021030c100b200128020021030c0d0b200128020021030c100b200128020021030c090b2004102222030d0b0b200441011023000b2004102222030d070b200441011023000b2004102222030d090b200441011023000b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0b20024101742200200420042000491b22004100480d0b2002450d0120012802002002200010212202450d020c030b200128020021020c030b2000102222020d010b200041011023000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000200041086a290300210502400240024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0920024101742200200320032000491b22004100480d092002450d0120012802002002200010212202450d020c030b200128020021020c030b2000102222020d010b200041011023000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0720024101742200200420042000491b22004100480d072002450d0120012802002002200010212202450d020c030b200128020021020c030b2000102222020d010b200041011023000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a0000200041086a2903002105024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0320024101742200200320032000491b22004100480d032002450d0120012802002002200010212202450d020c040b200128020021020c040b2000102222020d020b200041011023000b1024000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000bd20503027f037e017f230041206b220424004101210502402001a74101470d00200041086a2205427f2005290300220620037c2000290300220720027c22082007542205ad7c22072005200720065420072006511b22051b3703002000427f200820051b370300410021050b0240024002400240024002400240024020014201510d004200210620014200510d03200441106a41086a2200420037030020044200370310418feec0004116200441106a1002200441086a22052000290300370300200420042903103703002004411041c8d7c400410041001001417f460d01200442003703182004420037031020044110200441106a4110410010012209417f460d062009410f4d0d06200441186a2903002101200429031021060c020b2005450d02200441106a41086a2200420037030020044200370310418feec0004116200441106a1002200441086a22052000290300370300200420042903103703002004411041c8d7c400410041001001417f460d03200442003703182004420037031020044110200441106a4110410010012209417f460d062009410f4d0d06200441186a2903002101200429031021060c040b420021010b2000420037030020044200370310418feec0004116200441106a100220052000290300370300200420042903103703002004427f200120037c200620027c22032006542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a411010030b200441206a24000f0b42002106420021010b2000420037030020044200370310418feec0004116200441106a100220052000290300370300200420042903103703002004427f200120037c200620027c22032006542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a41101003200441206a24000f0b419a88c00041331039000b419a88c00041331039000b1300200041023602042000419cf1c0003602000bbe0904027f017e037f077e230041f0006b2202240002400240024002400240411010222203450d00200341086a41002900f6f940370000200341002900eef94037000020034110413010212203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220742003703002002420037035020034130200241d0006a1000200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a200729030037030020022002290350370330024002400240024002400240200241306a412041c8d7c400410041001001417f460d002002420037035820024200370350200241306a4120200241d0006a4110410010012205417f460d052005410f4d0d05200241d8006a2903002108200229035021092002420037035820024200370350200241306a4120200241d0006a4110411010012205417f460d052005410f4d0d05200241d0006a41086a290300210a2002290350210b20031020411410222203450d09200341106a41002800a5ef40360000200341086a410029009def4037000020034100290095ef4037000020034114413410212203450d0a200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220142003703002002420037035020034134200241d0006a1000200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a2205200129030037030020022002290350370330200241306a412041c8d7c400410041001001417f460d012002420037035820024200370350200241306a4120200241d0006a4110410010012206417f460d082006410f4d0d08200241d8006a290300210c2002290350210d0c020b200310204200210c0c020b4200210d4200210c0b20031020200142003703002002420037035041cdc8c000410d200241d0006a100220052001290300370300200220022903503703300240200241306a411041c8d7c400410041001001417f460d0020024200370350200241306a4110200241d0006a41084100100141016a41084d0d02200229035021040b4200210e200242004200200b4200108804200241106a200a420020044200108804200241206a20044200200b42001088044200210402404200420052200a42005271200229030842005272200229031842005272200241286a290300220b200229030020022903107c7c220a200b54720d002008200a2002290320220e200954200a200854200a2008511b22011b200a7d2009200e20011b220a200e54ad7d2104200a200e7d210e0b2004200c200d200e56200c200456200c2004511b22011b210c200e200d20011b21040b200020043703002000200c370308200241f0006a24000f0b419a88c00041331039000b419a88c00041331039000b411041011023000b413041011023000b419a88c00041331039000b411441011023000b413441011023000b980204017f017e037f027e230041c0006b2203240042002104200341206a41186a22054200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020012002200341206a1000200341186a2005290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703000240024002402003412041c8d7c400410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012201417f460d022001410f4d0d02200341286a290300210820032903202109200341201009420121040c010b0b2000200437030020002009370308200041106a2008370300200341c0006a24000f0b419a88c00041331039000bf61a010f7f230041a0036b220124000240024002400240024002400240024002400240024002400240024002400240411210222202450d00200241106a41002f00bbcf433b0000200241086a41002900b3cf43370000200241002900abcf4337000020024112413210212202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141d0026a41186a22004200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00220024132200141d0026a1000200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a00202400240200141a0026a412041c8d7c400410041001001417f460d002001422037026c2001200141a0026a360268200141d0026a200141e8006a10d90220012d00dc0222054102460d0420014188016a41086a200141e5026a29000037030020014188016a41106a200141ed026a29000037030020014188016a41186a200141f5026a290000370300200141d8016a41086a20014186036a290100370300200141d8016a41106a2001418e036a290100370300200141d8016a41186a20014196036a290100370300200120012900dd02370388012001200141fe026a2901003703d801200141fd026a2d0000210020012802d402210620012802d0022107200141a0026a412010090c010b410221050b200141286a41186a20014188016a41186a290300370300200141286a41106a220320014188016a41106a290300370300200141286a41086a220420014188016a41086a290300370300200141086a41086a2208200141d8016a41086a290300370300200141086a41106a2209200141d8016a41106a290300370300200141086a41186a200141d8016a41186a2903003703002001200129038801370328200120012903d8013703082002102020054102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2003290300370300200141e8006a41086a2004290300370300200141c8006a41086a2008290300370300200141c8006a41106a2009290300370300200141c8006a41186a200141086a41186a29030037030020012001290328370368200120012903083703484100210a0240200041ff01714101470d00411210222202450d06200241106a41002f00bbcf433b0000200241086a41002900b3cf43370000200241002900abcf433700002002411241321021220a450d07200a2001290348370012200a412a6a200141e0006a290300370000200a41226a200141c8006a41106a290300370000200a411a6a200141c8006a41086a2903003700000b0240024002400240024020054101470d00411210222202450d0c200241106a41002f00bbcf433b0000200241086a41002900b3cf43370000200241002900abcf433700002002411241321021220b450d0d200b2001290368370012200b412a6a200141e8006a41186a290300370000200b41226a200141e8006a41106a290300370000200b411a6a200141e8006a41086a290300370000200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d002200b4132200141d0026a1000200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a002200141a0026a412041c8d7c400410041001001417f460d0e200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10d90220012d00dc0222024102460d0f20014188016a41086a2203200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001084041a200120023a00940120014188016a410d6a200141d8016a41c3001084041a200141b5016a20003a0000200141b6016a2001290348370100200141be016a200141c8006a41086a290300370100200141c6016a200141c8006a41106a290300370100200141ce016a200141c8006a41186a290300370100200141d0026a41186a22024200370300200141d0026a41106a22004200370300200c4200370300200142003703d002200b4132200141d0026a1000200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d002200128028801210d2001200328020022023602d801200141d8016a200141d0026a103e02402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d4022108200d210203400240200820046a411f4b0d00200041206a22032000490d052008410174220f20032003200f491b22034100480d05024002402008450d00200e200820031021220e0d010c090b20031022220e450d080b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a10b70220012802d4022102200141a0026a412020012802d0022200200c280200100302402002450d00200010200b0240200128028c01450d00200d10200b200b10204101210d200a0d010c110b200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00241c29bc400411a200141d0026a1000200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a0020240200041ff01714101470d00412010222202450d1020022001290348370000200241186a200141c8006a41186a290300370000200241106a200141c8006a41106a290300370000200241086a200141c8006a41086a290300370000200141a0026a4120200241201003200210204100210b4100210d200a0d010c110b200141a0026a412010094100210b4100210d200a450d100b200141d0026a41186a22024200370300200141d0026a41106a22004200370300200141d0026a41086a22034200370300200142003703d002200a4132200141d0026a1000200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a2003290300370300200120012903d0023703a002200141a0026a412041c8d7c400410041001001417f460d06200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10d90220012d00dc024102460d0720014188016a41086a2202200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001084041a20014188016a410d6a200141d8016a41c30010840420012903683700002001419d016a200141e8006a41086a290300370000200141a5016a200141e8006a41106a290300370000200141ad016a200141e8006a41186a290300370000200120053a009401200141d0026a41186a22004200370300200141d0026a41106a22034200370300200c4200370300200142003703d002200a4132200141d0026a1000200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d00220012802880121052001200228020022023602d801200141d8016a200141d0026a103e02402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d40221082005210203400240200820046a411f4b0d00200041206a22032000490d032008410174220f20032003200f491b22034100480d03024002402008450d00200e200820031021220e0d010c060b20031022220e450d050b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a10b70220012802d4022102200141a0026a412020012802d0022200200c280200100302402002450d00200010200b0240200128028c01450d00200510200b200a102041012102200d200b45720d110c100b1024000b200341011023000b200341011023000b411241011023000b413241011023000b419a88c00041331039000b4189eec30041d3001039000b419a88c00041331039000b411241011023000b413241011023000b411241011023000b413241011023000b4189eec30041d3001039000b419a88c00041331039000b412041011023000b41002102200d200b45720d010b200b10200b02400240200a45200272450d002006450d020c010b200a10202006450d010b200710200b200141a0036a24000b130020004108360204200041fef9c0003602000b13002000410a36020420004188fac0003602000b3901017f0240411010222202450d002002420037000820024200370000200042908080808002370204200020023602000f0b411041011023000bc60807057f017e087f047e017f017e017f230041e0006b220224000240024002400240024002400240024002400240410e10222203450d00200341066a41002900f6ef40370000200341002900f0ef403700002003410e412e10212204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241386a41186a22014200370300200241386a41106a22034200370300200241386a41086a22054200370300200242003703382004412e200241386a1000200241086a41186a2001290300370300200241086a41106a2003290300370300200241086a41086a2005290300370300200220022903383703080240024002400240200241086a412041c8d7c400410041001001417f460d002002422037022c2002200241086a3602282002200241286a108e012002280200450d0b20022802042206ad42287e2207422088a70d032007a72201417f4c0d032001450d01200110222208450d062006450d020c070b20004100360208200042083702000c080b4108210820060d050b4100210e420021072008450d080c050b1031000b410e41011023000b412e41011023000b200141081023000b200241286a41086a22032802002109200228022c21052002280228210a2002413b6a210b420021074100210c4100210d410021012006210e03402002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382110200242003703402002420037033820034100200a2005200241386a411020091001220f200f417f461b220f4110200f4110491b20096a2209360200200f410f4d0d03200241386a41086a2903002111200229033821122002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382113200241003a003820032009200a2005200241386a41012009100141016a41014b220f6a2209360200200f450d03200141016a210f20022d003821142002200b28000036005b200220022800383602582002200228005b36003b2002200228025836023802402001200e470d00200c200f200f200c491b220ead42287e2215422088a70d062015a722164100480d0602402001450d002008200d2016102122080d010c080b201610222208450d070b2008200d6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141246a200228003b360000200141216a200228023836000020074280808080107c2107200c41026a210c200d41286a210d200f2101200f2006490d000b2008450d030b20002007200ead84370204200020083602000b20041020200241e0006a24000f0b200e450d00200810200b419a88c00041331039000b1024000b201641081023000b8b0404027f017e037f027e230041d0006b2204240020042001103b02400240024002400240024002402004290300200441086a290300844200510d00411410222205450d05200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d06200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1000200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310200441106a412041c8d7c400410041001001417f460d012004420037033820044200370330200441106a4120200441306a4110410010012207417f460d042007410f4d0d04200441386a290300210a200429033021060c020b200041d5e8c000360204200041086a4122360200410121010c020b4200210a0b200510202001200620027c220b200a20037c200b200654ad7c10af01200041106a2003370300200041086a2002370300410021010b20002001360200200441d0006a24000f0b419a88c00041331039000b411441011023000b413441011023000b8b0604027f017e037f027e230041d0006b220524000240024002400240411410222206450d00200641106a41002800a5ef40360000200641086a410029009def4037000020064100290095ef4037000020064114413410212206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002107200541306a41186a22084200370300200541306a41106a22094200370300200541306a41086a220a42003703002005420037033020064134200541306a1000200541106a41186a2008290300370300200541106a41106a2009290300370300200541106a41086a200a29030037030020052005290330370310024002400240200541106a412041c8d7c400410041001001417f460d002005420037033820054200370330200541106a4120200541306a4110410010012208417f460d022008410f4d0d02200541386a290300210b200529033021070c010b4200210b0b20061020024002400240200720027d220c200756200b20037d2007200254ad7d2207200b562007200b511b450d00200041f7e8c000360204200041086a411d3602000c010b200541306a41086a220642003703002005420037033041a5eec000411b200541306a1002200541106a41086a2006290300370300200520052903303703100240200541106a411041c8d7c400410041001001417f460d002005420037033820054200370330200541106a4110200541306a4110410010012206417f460d062006410f4d0d06200c20052903305a2007200541306a41086a290300220b5a2007200b511b0d0020004194e9c000360204200041086a411a3602000c010b200541086a20012004200c200710ae0120052802082206450d01200528020c210120002006360204200041086a20013602000b410121060c050b2001200c200710af01200041106a2003370300200041086a2002370300410021060c040b419a88c00041331039000b411441011023000b413441011023000b419a88c00041331039000b20002006360200200541d0006a24000b830803037f047e077f230022022103200241e0026b416071220224002001411c6a22042902002105200420022903f801370200200141146a22042902002106200420022903f0013702002001410c6a22042902002107200420022903e801370200200241003a00e00120012902042108200120022903e00137020420022005370378200220063703702002200737036820022008370360200141246a2d00002109200241e0016a41176a22042002290078370000200241e0016a41106a220a2002290071370300200241e0016a41086a220b2002290069370300200220022900613703e00102400240024002402008a741ff01714101470d00200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b290300370300200220022903e001370318411510222204450d012004410d6a41002900ceef40370000200441086a41002900c9ef40370000200441002900c1ef4037000020044115413510212204450d0220042002290318370015200420093a00342004412c6a2002412f6a220a290000370000200441256a200241186a41106a220b2903003700002004411d6a200241186a41086a290300370000200241e0016a41186a220c4200370300200241e0016a41106a220d4200370300200241e0016a41086a220e4200370300200242003703e00120044135200241e0016a1000200241e0006a41186a220f200c290300370300200241e0006a41106a220c200d290300370300200241e0006a41086a200e290300370300200220022903e001370360200241e0016a200241e0006a105920022d0081024102460d03200241e0006a200241e0016a41e3001084041a200241386a41206a220d200241e0006a41206a2d00003a0000200241386a41186a220e200f290300370300200241386a41106a220f200c290300370300200241386a41086a220c200241e0006a41086a29030037030020022002290360370338200241e0016a200241e0006a41216a41c2001084041a200141046a220141206a200241e0016a41c1006a2d00003a0000200141186a200241e0016a41396a290000370000200141106a200241e0016a41316a290000370000200141086a200241e0016a41296a290000370000200120022900810237000020002002290318370001200041096a200241186a41086a290300370000200041116a200b290300370000200041186a200a290000370000200041206a20093a0000200041013a0000200041216a2002290338370000200041296a200c290300370000200041316a200f290300370000200041396a200e290300370000200041c1006a200d2d00003a000020041020200324000f0b200041003a0000200324000f0b411541011023000b413541011023000b41f1d1c20041d7001039000ba10802097f027e230041d0006b2202240002400240410e10222203450d00200341066a41002900f6ef40370000200341002900f0ef403700002003410e412e10212204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241286a41186a22004200370300200241286a41106a22034200370300200241286a41086a22054200370300200242003703282004412e200241286a1000200241086a41186a2000290300370300200241086a41106a2003290300370300200241086a41086a20052903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a103e02400240024002400240024002402000450d00200041286c210720052802002108200228022c210003400240024002400240200020086b41084f0d00200841086a22092008490d0720004101742203200920092003491b220a4100480d072000450d0120022802282000200a102122030d020c080b200841086a2109200228022821030c020b200a10222203450d060b2002200a36022c20022003360228200a21000b20052009360200200320086a200641186a290000370000200641086a290300210b2006290300210c0240024002400240200020096b41104f0d00200941106a22082009490d072000410174220a20082008200a491b220a4100480d072000450d0120032000200a102122030d020c090b200941106a21080c020b200a10222203450d070b2002200a36022c20022003360228200a21000b200320096a2209200b3700082009200c37000020052008360200200641106a290300210b0240200020086b41074b0d00200841086a22092008490d042000410174220a20092009200a491b22094100480d04024002402000450d00200320002009102122030d010c090b200910222203450d080b2002200936022c200220033602280b2005200841086a360200200320086a200b3700000240024002400240200228022c220020052802002203470d00200341016a22002003490d0720034101742208200020002008491b22004100480d072003450d01200228022820032000102122090d020c0b0b200228022821090c020b200010222209450d090b2002200036022c200220093602280b2005200341016a2208360200200920036a200641206a2d00003a0000200641286a2106200741586a22070d000c020b0b20052802002108200228022c2100200228022821090b200241086a412020092008100302402000450d00200910200b200410200240200141046a280200450d00200128020010200b200241d0006a24000f0b1024000b200a41011023000b200a41011023000b200941011023000b200041011023000b410e41011023000b412e41011023000b13002000410c360204200041f893c1003602000b13002000410936020420004195a1c1003602000b130020004110360204200041a0a1c1003602000bb70101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002400240412010222206450d0020062002290300370000200641186a2003290300370000200641106a2004290300370000200641086a20052903003700002006412041c00010212206450d01200042c0808080900437020420002006360200200641003a0020200241206a24000f0b412041011023000b41c00041011023000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a2002103e200041086a200228020836020020002002290300370200200241106a24000b8b0401047f230041e0006b2202240002400240410f10222203450d00200341076a410029008def4037000020034100290086ef403700002003410f412f10212203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412f200241c0006a1000200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041c8d7c400410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031020200241e0006a24000f0b419a88c00041331039000b410f41011023000b412f41011023000b95140f017f017e027f017e057f017e0a7f037e077f037e027f027e027f027e027f230041a0016b2206240042002107200641086a41086a220842003703002006420037030841cdc8c000410d200641086a1002200641f8006a41086a200829030037030020062006290308370378024002400240024002400240024002400240200641f8006a411041c8d7c400410041001001417f460d0020064200370308200641f8006a4110200641086a41084100100141016a41084d0d01200629030821070b200641086a41106a2003370300200641086a41286a20053a0000200641086a41186a2004370300200641286a22092000290000370300200620023703104201210a20064201370308200641f8006a200110a8022006280278210b200628027c210c200628028001220d450d02200641f8006a41186a220e2000460d01200d41286c210f4201210a200b21050340200541086a2903002104200541106a2903002102200541186a290300210320052903002110200641f8006a41206a200541206a290300370300200641f8006a41186a2003370300200641f8006a41106a22112002370300200641f8006a41086a2004370300200620103703780240024002400240200e2900002000290000510d0020112903002007580d01200641e8006a41086a200e41086a2903003703002006200e2903003703682011290300210220062903800121032006290378211042014201520d030c020b200641e8006a41086a200941086a290300370300200629030821044200210a2006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310211020044201510d010c020b42004201520d010b200541286a2111200a21040c050b200541286a2105200f41586a220f0d000c030b0b419a88c00041331039000b200d41286c2105200b41286a2111200641206a290300210220062903182103200629031021102006290308210a0340200641e8006a41086a200941086a290300370300420021042006420037030820062009290300370368200a4201510d02201141286a21114200210a200541586a22050d000b0b4100210e0240200c450d00200b10200b4108211241002113200a4201510d010c040b200641d8006a41086a2205200641e8006a41086a29030037030020062006290368370358200641c8006a41086a220f200529030037030020062006290358370348200641386a41086a2205200f290300370300200620062903483703380240024002400240412810222212450d00201220062903383703182012201037030020122003370308201241206a2005290300370300201241106a2002370300024002402011200b200d41286c6a460d00200641f8006a41186a220f2000460d0141282114200b200d41286c6a221541586a21164101211741202118411021194108211a4201211b4228211c4220211d4100211e4101210e41012113410021050c030b4101210e41012113200c0d030c040b41282122200b200d41286c6a222341586a2124200641086a41186a290300212520062903182126200629031021272006290308210441012128410821294200212a4201212b4110212c200641f8006a41106a212d4228212e4220212f41002130412021314101210e41012113410121050c010b412841081023000b03400240024002400240024020050e020001010b201121050340200641f8006a20186a221f200520186a290300370300200f200541186a290300370300200641f8006a20196a220d200520196a290300370300200641f8006a201a6a22202005201a6a290300370300200620052903003703780240024002400240200f2900002000290000510d00200d2903002007580d01200641e8006a201a6a200f201a6a2903003703002006200f290300370368200d29030021022006290380012103200629037821104201201b520d030c020b200641e8006a201a6a2009201a6a2903003703002006290308210a420021042006420037030820062009290300370368200641086a41186a29030021022006290318210320062903102110200a201b510d010c020b4200201b520d010b200641d8006a201a6a2211200641e8006a201a6a29030037030020062006290368370358200641c8006a201a6a2221201129030037030020062006290358370348200d2002370300200f2006290348370300200f201a6a202129030037030020062003370380012006201037037802402013200e470d00200e20176a2211200e490d0b200e2017742213201120112013491b2213ad201c7e2202201d88a70d0b2002a72211201e480d0b0240200e450d002012200e20146c2011102122120d010c060b201110222212450d050b200520146a21112012200e20146c6a22212006290378370300202120186a201f290300370300202141186a200f290300370300202120196a200d2903003703002021201a6a2020290300370300200e20176a210e20162005460d03410021050c060b2015200520146a2205470d000c020b0b2011210502400340200641e8006a20296a2211200920296a2903003703002006202a370308200620092903003703682004202b510d01420021042023200520226a2205470d000c020b0b200641d8006a20296a220d201129030037030020062006290368370358200641c8006a20296a2211200d29030037030020062006290358370348202d2025370300200f2006290348370300200f20296a201129030037030020062026370380012006202737037802402013200e470d00200e20286a2211200e490d08200e202874220d20112011200d491b2213ad202e7e2204202f88a70d082004a722112030480d080240200e450d002012200e20226c2011102122120d010c030b201110222212450d020b200520226a21112012200e20226c6a220d2006290378370300200d20316a200641f8006a20316a290300370300200d41186a200f290300370300200d202c6a202d290300370300200d20296a200641f8006a20296a290300370300200e20286a210e4200210420242005470d020b200c450d040c030b201141081023000b410121050c000b0b200b10200b20044201520d030b200641f8006a41206a2209200841206a290300370300200641f8006a41186a220f200841186a290300370300200641f8006a41106a2200200841106a290300370300200641f8006a41086a221a200841086a29030037030020062008290300370378200e2013470d01200e41016a2205200e490d00200e4101742211200520052011491b2213ad42287e2204422088a70d002004a722054100480d0002400240200e450d002012200e41286c200510212212450d010c030b2005102222120d020b200541081023000b1024000b2012200e41286c6a22052006290378370300200541206a2009290300370300200541186a200f290300370300200541106a2000290300370300200541086a201a290300370300200e41016a210e0b2006200e360280012006201336027c200620123602782001200641f8006a10ac02200641a0016a24000b931102167f017e230041206b22032400410121040240200228021841222002411c6a2802002802101104000d00024002402001450d00200020016a2105200241186a21062002411c6a210720002108410021094100210a024003402008210b200841016a210c024002400240024002400240024002400240024020082c0000220d4100480d00200d41ff0171210d0c010b024002400240200c2005460d00200c2d0000413f71210e200841026a2208210c200d411f71210f200d41ff0171220d41e001490d010c020b4100210e20052108200d411f71210f200d41ff0171220d41e0014f0d010b200e200f41067472210d0c010b0240024020082005460d00200841016a220c211020082d0000413f71200e41067472210e200d41f001490d010c030b200521104100200e41067472210e200d41f0014f0d020b200e200f410c7472210d0b200c21084102210c200d41776a220f411e4d0d010c020b0240024020102005460d00201041016a210820102d0000413f71210d0c010b4100210d200c21080b200e410674200f411274418080f0007172200d72220d418080c400460d084102210c200d41776a220f411e4b0d010b41f400210e024002400240200f0e1f07010505000505050505050505050505050505050505050505040505050504070b41f200210e0c010b41ee00210e0b0c040b200d41dc00470d010b0c010b0240200d10f6030d0002400240200d41ffff034b0d00200d4180fe0371410876211141c8ddc4002112410021134100210c0c010b0240200d41ffff074b0d00200d4180fe037141087621164183e3c4002117410021184101210c0c010b200d41ef83384b0d01200d41e28b746a41e28d2c490d01200d419fa8746a419f18490d01200d41dee2746a410e490d01200d41feffff0071419ef00a460d01200d41a9b2756a4129490d01200d41cb91756a410a4d0d010c040b0240034002400240200c0e020001010b201241026a2114201320122d0001220c6a2110024002400240024002400240024020122d0000220e2011470d0020102013490d06201041b0024f0d0520134198dec4006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c0b0b0b200e20114b0d01201021132014211220144198dec400470d030c010b201021132014211220144198dec400470d010b200d41ffff0371210e41c7e0c400210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b024020104183e3c400460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41d8dbc400102f000b200f410173210f200c4183e3c400470d000b0b200f410171450d070c0a0b4100210c0c040b4100210c0c030b201041af02102e000b20132010102d000b201741026a2114201820172d0001220c6a211002400240024002400240024020172d0000220e2016470d0020102018490d072010419f014f0d05201841c5e3c4006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c090b0b200e20164b0d012010211820142117201441c5e3c400470d030c010b2010211820142117201441c5e3c400470d010b200d41ffff0371210e41e3e4c400210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b0240201041e0e7c400460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41d8dbc400102f000b200f410173210f200c41e0e7c400470d000b0b200f410171450d050c080b4101210c0c020b4101210c0c010b0b2010419e01102e000b20182010102d000b200d41017267410276410773ad4280808080d0008421194103210c0b200d210e0b2003200136020420032000360200200320093602082003200a36020c02400240200a2009490d0002402009450d0020092001460d00200920014f0d01200020096a2c000041bf7f4c0d010b0240200a450d00200a2001460d00200a20014f0d012000200a6a2c000041bf7f4c0d010b2006280200200020096a200a20096b200728020028020c1100000d0103400240024002400240024002400240200c4101460d0041dc0021090240200c4102460d00200c4103470d062019422088a741ff0171417f6a220c41044b0d060240200c0e050006040503000b201942ffffffff8f608321194103210c41fd0021090c070b4101210c0c060b4100210c200e21090c050b201942ffffffff8f60834280808080c0008421194103210c0c040b201942ffffffff8f60834280808080208421194103210c41fb0021090c030b201942ffffffff8f60834280808080308421194103210c41f50021090c020b200e2019a7220f410274411c7176410f71220c413072200c41d7006a200c410a491b21090240200f450d002019427f7c42ffffffff0f832019428080808070838421194103210c0c020b201942ffffffff8f60834280808080108421194103210c0c010b4101210c0240200d418001490d004102210c200d418010490d0041034104200d41808004491b210c0b200c200a6a2109200a200b6b20086a210a20052008470d050c060b200628020020092007280200280210110400450d000b200341206a240041010f0b20032003410c6a3602182003200341086a36021420032003360210200341106a10fa03000b200341206a240041010f0b200a200b6b20086a210a20052008470d000b0b2009450d0120092001460d010240200920014f0d00200020096a2c000041bf7f4a0d020b200020012009200110f303000b410021090b200241186a220c280200200020096a200120096b2002411c6a220a28020028020c1100000d00200c2802004122200a28020028021011040021040b200341206a240020040b8c0605027f027e017f027e027f230041a0016b22022400200028020021000240024002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0120054290ce005441002004501b0d0241272100200241186a21060340200241106a200520044290ce0042001087042002200229031022072006290300220842f0b17f427f108804200241206a20006a2203417c6a200520022903007ca7220941e4006e220a410174418ad8c4006a2f00003b00002003417e6a200a419c7f6c20096a410174418ad8c4006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000b2007a7220341e3004a0d030c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d032001410141f8dac4004102200241206a20006a41800120006b109b022100200241a0016a240020000f0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d032001410141f8dac4004102200241206a20006a41800120006b109b022100200241a0016a240020000f0b412721002005a7220341e3004c0d030b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff0371410174418ad8c4006a2f00003b0000200941094a0d030c040b2000418001102d000b2000418001102d000b2003220941094c0d010b200241206a2000417e6a22006a2009410174418ad8c4006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141c8d7c4004100200241206a20006a412720006b109b022100200241a0016a240020000bb81c04047f027e027f027e23004180016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002b05090d0a0608040b030c0102000b200241206a200141086a10b70120004101360200200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b200241206a200141086a10ff01200041086a200241206a41d8001084041a2000410d36020020024180016a24000f0b200128020422044102460d0b4101210320044101470d29200141086a10800221010c160b2001410c6a2802002203417f4c0d29200128020421012003450d0e2003102222040d0f200341011023000b4102210320012d000422044102460d0a20044101470d29200141086a280200210541e00010222204450d2e20042001410c6a28020010fe01410121030c0b0b200141086a28020022034102460d0b20034101470d292001410c6a22032d00004101470d14200141106a2802002104410121030c150b200241206a200141086a10810220004107360200200041c0006a200241206a41386a290300370300200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b20004100360200200041086a200141086a29030037030020024180016a24000f0b200141086a22042d0000417f6a220341044b0d27024020030e05001d191b17000b2001410c6a1080022101410121030c1d0b41032103200141086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d27200241046a200441066a2f00003b0100200241286a200141206a290200370300200241206a41106a200141286a2d00003a00002002200441026a2800003602002002200141186a290200370320200141106a2902002106200141096a2d000021010c0c0b200241206a200141086a10820220004106360200200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b2000410a360200200041086a200141086a29030037030020024180016a24000f0b200141086a280200417f6a220341044b0d25024020030e05001b161814000b200141386a2903002106200141306a2903002107410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b200241206a200141086a10830220004105360200200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b41012103200141086a2d00004101470d082001410c6a28020021040c090b200241026a200141046a220441036a2d00003a0000200241206a41086a200141186a2902003703002002412d6a2001411d6a290000370000200220042f00013b01002002200141106a290200370320200141256a2d00004100472108200141286a28020021092001410c6a2802002104200141086a28020021050b200020022f01003b0005200020033a0004200020083a0025200041093602002000410c6a2004360200200041086a2005360200200041106a2002290320370200200041286a2009360200200041076a200241026a2d00003a0000200041186a200241206a41086a2903003702002000411d6a2002412d6a29000037000020024180016a24000f0b410121032001410c6a22042d00004101470d0a200141106a28020021040c0b0b410121040b20042001200310840421012000410c6a2003360200200041086a2003360200200020013602042000410b36020020024180016a24000f0b200141106a29030021060c010b20042d000141004721010b200020013a00092000200228020036010a20004104360200200041086a20033a0000200041106a2006370300200041186a20022903203703002000410e6a200241046a2f01003b0100200041206a200241206a41086a290300370300200041286a200241206a41106a29030037030020024180016a24000f0b200241086a200141186a290200370300200241106a200141206a2802003602002002200141106a290200370300200141246a350200200141286a310000422086842106200141096a2f00002001410b6a2d00004110747221052001410c6a2802002104410021030b200241206a41106a200241106a280200360200200241206a41086a200241086a2903003703002002200229030037032020032005410874722101410221030b200020033602042000410e3602002000410c6a2004360200200041086a2001360200200041106a2002290320370200200041246a2006370200200041186a200241206a41086a290300370200200041206a200241206a41106a28020036020020024180016a24000f0b200241fe006a200341036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220032f00013b017c2002200141146a290200370320200141106a2802002104410021030b2002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141386a2903002106200141306a2903002107410121050c020b200241fe006a200441036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220042f00013b017c2002200141146a290200370320200141106a2802002104410021030b410221052002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141c8006a290300210a200141c0006a290300210b200141386a2903002106200141306a29030021070b200020022f011c3b000d20004103360200200041c8006a200a370300200041c0006a200b370300200041386a2006370300200041306a20073703002000410c6a20033a0000200041086a2005360200200041106a2004360200200041146a20022903003702002000410f6a2002411e6a2d00003a00002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a28020036020020024180016a24000f0b200141106a2903002106410521030c060b2001410c6a28020022034108762104410521010c090b41032103200241fe006a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141106a29020021062001410c6a28020021010c040b200241206a41106a200141206a2903003703002002200141186a2903003703282002200141106a2802003602202001410c6a28020022034108762104200141286a290300210b410321010c070b200141106a2903002106410421030c020b2001410c6a28020022034108762104410421010c050b41022103200241fc006a41026a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141296a2d00004100472104200141106a29020021062001410c6a28020021010b200020022f017c3b0009200020043a00292000200228010036012a200041086a20033a0000200041106a20063703002000410c6a2001360200200041186a20022903203703002000410b6a200241fe006a2d00003a0000200041206a200241206a41086a290300370300200041286a200241206a41106a2d00003a00002000412e6a200241046a2f01003b01002000410836020020024180016a24000f0b2002200141186a2903003703282002200141106a29030037032041022101410021030c020b200241086a2001411c6a290200370300200241106a200141246a2802003602002002200141146a290200370300200141286a3502002001412c6a31000042208684210b2001410d6a2f00002001410f6a2d0000411074722104200141106a2802002101410021030b2002412c6a200241086a290300370200200241346a200241106a2802003602002002200229030037022420022001360220410121010b2000410c360200200041386a2006370300200041306a2007370300200041086a2001360200200041106a2002290320370300200041286a200b3703002000410c6a2004410874200341ff017172360200200041186a200241206a41086a290300370300200041206a200241206a41106a29030037030020024180016a24000f0b1045000b4198afc200102f000b1031000b41b8b3c000102f000b41d0bdc100102f000b41ccb0c200102f000b41f0afc200102f000b41a8a8c300102f000b41e00041081023000bf90801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024002400240024002400240024020002d00004101470d0020022003470d01200341016a22022003490d0c20034101742204200220022004491b22044100480d0c2003450d0320012802002003200410212202450d040c090b20022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0420012802002003200410212202450d050c060b200128020021020c080b200128020021020c050b2004102222020d050b200441011023000b2004102222020d010b200441011023000b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c020b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0620024101742203200420042003491b22034100480d062002450d0120012802002002200310212202450d020c030b200128020021020c030b2003102222020d010b200341011023000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a28020021030240024002400240024002400240024002400240024020002d00214101470d0020022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0320012802002003200410212202450d040c090b20022003470d01200341016a22002003490d0a20034101742202200020002002491b22024100480d0a2003450d0420012802002003200210212200450d050c060b200128020021020c080b200128020021000c050b2004102222020d050b200441011023000b2002102222000d010b200241011023000b20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a0000024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0320024101742203200420042003491b22034100480d032002450d0120012802002002200310212202450d020c040b200128020021020c040b2003102222020d020b200341011023000b1024000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000b9b11030a7f017e057f230041f0006b22042400200441c8006a41086a220542003703002004420037034841f8bfc1004118200441c8006a1002200441286a41086a2005290300370300200420042903483703284100210502400240024002400240024002400240024002400240024002400240200441286a411041c8d7c400410041001001417f460d00200441003a0048200441286a4110200441c8006a41014100100141016a41014d0d0120042d004821050b0240024002400240200341187441187541077620037341187441808080086a41187520054118744118754c0d004190c0c1002105411d21060c010b411a10222205450d04200541186a41002f00eeef403b0000200541106a41002900e6ef40370000200541086a41002900deef40370000200541002900d6ef403700002005411a413410212205450d052005200236001a200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a22084200370300200442003703482005411e200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041c8d7c4004100410010012106200510200240024002400240024002402006417f460d00200441086a41186a200141186a290000370300200441086a41106a200141106a290000370300200441086a41086a200141086a29000037030020042001290000370308411010222205450d0c200541086a41002900feee40370000200541002900f6ee4037000020054110412010212205450d0d200520023600102005412041c00010212205450d0e200520042903083700142005412c6a200441086a41186a2209290300370000200541246a200441086a41106a220a2903003700002005411c6a200441086a41086a220b290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041c8d7c400410041001001210c20051020200c417f470d05200441086a200210ea012006200141186a2900003703002007200141106a2900003703002008200141086a2900003703002004200129000037034820042802102205200428020c220d470d01200541016a22062005490d0720054101742207200620062007491b220dad420586220e422088a70d07200ea722064100480d072005450d022004280208200541057420061021220f0d030c150b41adc0c1002105412221060c050b2004280208210f0c020b20061022220f450d120b2004200d36020c2004200f3602080b200441086a41086a200541016a2207360200200f20054105746a22062004290348370000200641186a200441c8006a41186a290300370000200641106a200441c8006a41106a290300370000200641086a200441c8006a41086a290300370000411310222206450d0e2006410f6a41002800b39141360000200641086a41002900ac9141370000200641002900a4914137000020064113412610212210450d0f20102002360013200441c8006a41186a22084200370300200441c8006a41106a220c4200370300200441c8006a41086a220642003703002004420037034820104117200441c8006a1000200441286a41186a2008290300370300200441286a41106a200c290300370300200441286a41086a20062903003703002004200429034837032820044100360250200442013703482004200736026c200441ec006a200441c8006a103e024002402007450d00200541057441206a21114100200628020022066b210820042802482112200428024c210c200f210503400240200c20086a411f4b0d00200641206a22072006490d06200c4101742213200720072013491b22074100480d0602400240200c450d002012200c2007102122120d010c090b200710222212450d080b2007210c0b201220066a22072005290000370000200741186a200541186a290000370000200741106a200541106a290000370000200741086a200541086a290000370000200841606a2108200641206a2106200541206a2105201141606a22110d000b200441d0006a20063602002004200c36024c200420123602480c010b20062802002106200428024c210c200428024821120b200441286a41202012200610030240200c450d00201210200b20101020200d450d00200f10200b2009200141186a290000370300200a200141106a290000370300200b200141086a29000037030020042001290000370308411010222205450d09200541086a41002900feee40370000200541002900f6ee4037000020054110412010212205450d0a200520023600102005412041c00010212205450d0b200520042903083700142005412c6a200441086a41186a290300370000200541246a200441086a41106a2903003700002005411c6a200441086a41086a290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328410110222206450d0c200620033a0000200441286a41202006410110032006102020051020410021050b2000200636020420002005360200200441f0006a24000f0b1024000b200741011023000b419a88c00041331039000b411a41011023000b413441011023000b411041011023000b412041011023000b41c00041011023000b411041011023000b412041011023000b41c00041011023000b410141011023000b411341011023000b412641011023000b200641011023000bbe0503047f027e057f230041d0006b22022400024002400240411310222203450d002003410f6a410028008df040360000200341086a4100290086f040370000200341002900feef4037000020034113412610212204450d0120042000360013200241286a41186a22034200370300200241286a41106a22004200370300200241286a41086a220542003703002002420037032820044117200241286a1000200241086a41186a2003290300370300200241086a41106a2000290300370300200241086a41086a2005290300370300200220022903283703082002410036023020024201370328200141086a290300210620012903002107411010222203450d02200320073700002003200637000820024290808080800237022c20022003360228200128021021082002200141186a280200220336024c200241cc006a200241286a103e02400240024002402003450d0020034105742109200241286a41086a28020021002002280228210a200228022c210b2008210303400240024002400240200b20006b41204f0d00200041206a22052000490d07200b410174220c20052005200c491b220c4100480d07200b450d01200a200b200c1021220a0d020c080b200041206a21050c020b200c1022220a450d060b200c210b0b200a20006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200941606a22090d000b200241306a20053602002002200b36022c2002200a3602280c010b200241306a2802002105200228022c210b2002280228210a0b200241086a4120200a200510030240200b450d00200a10200b200410200240200141146a280200450d00200810200b200241d0006a24000f0b1024000b200c41011023000b411341011023000b412641011023000b411041011023000bb00901097f230041106b2202240020024100360208200242013703002002410436020c2002410c6a2002103e0240024002400240024002400240024020022802042203200228020822046b41044f0d00200441046a22052004490d0520034101742206200520052006491b22064100480d052003450d0120022802002003200610212203450d020c030b200441046a2105200228020021030c030b2006102222030d010b200641011023000b20022006360204200220033602000b200241086a22062005360200200320046a41eede91ab063600002002410e36020c2002410c6a2002103e0240024002400240024020022802042203200628020022066b410e4f0d002006410e6a22052006490d0520034101742204200520052004491b22074100480d052003450d0120022802002003200710212204450d020c030b2006410e6a2105200228020021040c030b2007102222040d010b200741011023000b2002200736020420022004360200200721030b200241086a22072005360200200420066a220641066a4100290087a24037000020064100290081a2403700000240200320056b41034b0d00200541046a22062005490d0120034101742208200620062008491b22064100480d010240024002402003450d0020042003200610212204450d010c020b2006102222040d010b200641011023000b20022006360204200220043602000b2007200541046a360200200420056a410a360000024020022802042203200728020022056b41034b0d00200541046a22062005490d0120034101742207200620062007491b22064100480d010240024002402003450d0020042003200610212204450d010c020b2006102222040d010b200641011023000b20022006360204200220043602000b200241086a2203200541046a360200200420056a41c8003600000240024002400240024020022802042205200328020022046b41044f0d00200441046a22032004490d0520054101742206200320032006491b22034100480d052005450d0120022802002005200310212205450d020c030b200228020021050c030b2003102222050d010b200341011023000b20022003360204200220053602000b200241086a2208200441046a360200200520046a41ca003600002002410836020c2002410c6a2002103e200828020021064190a2c00021072002280204210503400240024002400240200520066b41084f0d00200641086a22042006490d0520054101742203200420042003491b22094100480d052005450d01200228020020052009102122030d020c060b200641086a2104200228020021030c020b200910222203450d040b2002200936020420022003360200200921050b20082004360200200320066a2007290000370000200741086a28020021090240200520046b41034b0d00200441046a22062004490d022005410174220a20062006200a491b22064100480d02024002402005450d00200320052006102122030d010c060b200610222203450d050b2002200636020420022003360200200621050b2008200441046a2206360200200320046a20093600002007410c6a220741f0a2c000470d000b200241106a24002006ad4220862003ad840f0b1024000b200941011023000b200641011023000ba81b05027f017e087f017e027f23004180096b22022400024002402001450d00200220003602180c010b200241c8d7c4003602180b2002200136021c20024198076a200241186a10bc02024002400240024002400240024020022802a007450d00200241206a20024198076a4188011084041a200241a8016a200241206a4188011084041a20022903a801200241bc016a2201200241fc016a2203108902200241086a41e795c200411510e001024020022802084101470d002002290310210420024198076a41086a22004200370300200242003703980741fc95c200411720024198076a1002200241a8036a41086a2205200029030037030020022002290398073703a803200241a8036a411041c8d7c400410041001001417f470d0020004200370300200242003703980741fc95c200411720024198076a10022005200029030037030020022002290398073703a8032002200437039807200241a8036a411020024198076a410810030b024002400240024020022903a8012204500d0020024198076a2004427f7c10dd0120024198076a200141201086040d004100210620022802a0022100024002400240200241a8026a280200220141e8016c41e801490d002001410c6c220510222207450d0b2001210820010d010c020b41042107410021082001450d010b200141e8016c2105200141037441786a2109200721010340200220003602a80320024198076a200241a8036a10bd02200141086a20024198076a41086a28020036020020012002290398073702002001410c6a2101200041e8016a2100200541987e6a22050d000b200941037641016a21060b4104210a410021054100210b02402006410c6c2201410c490d002001410c6e220b41037422004100480d0a20001022220a450d0b0b0240200720016a220c2007460d0041002105200a210120072100034020002802002109200141046a200041086a28020036020020012009360200200141086a2101200541016a21052000410c6a2200200c470d000b0b20024198076a200a200510be020240200b450d00200a10200b02402006450d002006410c6c21002007210103400240200141046a280200450d00200128020010200b2001410c6a2101200041746a22000d000b0b02402008450d00200710200b0240200320024198076a4120108604450d0041c8d0c400410e100f20034120101620024198076a412010160b200320024198076a41201086040d05200241a4026a2802002106200241a8016a41f8006a2802002107200241a8026a2802002105200241b0026a200241a8016a41f8001084041a2007200541e8016c6a210020022903b002210d20072101024002400240024002402005450d00200241a8036a41f8006a210920024198076a41086a210c200721010340200241a8066a200141f0001084041a200141f0006a2903002104200241b8056a200141f8006a41f0001084041a20044203510d02200241a8036a200241a8066a41f0001084041a200241a8036a41f0006a20043703002009200241b8056a41f0001084041a2002200241a8036a3602900520024198076a20024190056a10bd02200c28020021050240200228029c07450d0020022802980710200b20024198076a200241a8036a41e8011084041a200241003602a00520024190056a20024198076a2005200241a0056a109f012002280290054101460d0502402002280294052205450d00200520024190056a41086a280200100f0b200141e8016a22012000470d000b200021010b20012000470d010c020b200141e8016a22012000460d010b200241a0086a210520024198076a41f8006a2109034020024198076a200141f0001084041a200141f0006a2903002104200241a8036a200141f8006a41f0001084041a20044203510d01200241a8066a20024198076a41f0001084041a200241b8056a200241a8036a41f0001084041a20024198076a200241a8066a41f0001084041a20024198076a41f0006a20043703002009200241b8056a41f0001084041a2005109201200141e8016a22012000470d000b0b02402006450d00200710200b109102200d10de0120024198076a1096022002200241b0026a41106a280200220b3602b00520022802b802210a200220024198076a41106a28020022013602b405200b2001470d0702400240200b450d0020022802a007210341002106034002400240200a200641286c22006a22012d00002205200320006a22002d0000470d0002400240024020054101460d0020054102470d01200141086a2802002209200041086a280200470d03200141186a210c2009450d02200c290300200041186a290300520d03200141206a290300200041206a290300520d03200141146a280200220e200041146a280200470d032001410c6a28020022092000410c6a280200220c460d04417f21070340200741016a2207200e4f0d052009200c41201086040d04200c41206a2108200941206a210f200941286a2109200c41286a210c200f2903002008290300510d000c040b0b2001410c6a28020022082000410c6a280200470d022008450d03200141046a2802002209200041046a280200220c460d034100210703402009200c41201086040d03200941206a2109200c41206a210c200741016a22072008490d000c040b0b200a2003460d02200141016a200041016a41201086040d010c020b200c290300200041186a290300520d00200141146a280200220e200041146a280200470d002001410c6a28020022092000410c6a280200220c460d01417f21070340200741016a2207200e4f0d022009200c41201086040d01200c41206a2108200941206a210f200941286a2109200c41286a210c200f2903002008290300510d000b0b4198a5c0004114100f200241a8036a2001109a0120022802a8032209200241a8036a41086a22052802001016024020022802ac03450d00200910200b200241a8036a2000109a0120022802a803220920052802001016024020022802ac03450d00200910200b20012d0000220520002d0000470d030b024002400240024020054101460d0020054102470d01200141086a2802002205200041086a280200470d06200141186a21092005450d022009290300200041186a290300520d06200141206a290300200041206a290300520d06200141146a2802002207200041146a280200470d062001410c6a28020022012000410c6a2802002200460d03417f21050340200541016a220520074f0d042001200041201086040d07200041206a2109200141206a210c200141286a2101200041286a2100200c2903002009290300510d000c070b0b2001410c6a28020022092000410c6a280200470d052009450d02200141046a2802002201200041046a2802002200460d024100210503402001200041201086040d06200141206a2101200041206a2100200541016a22052009490d000c030b0b200a2003460d01200141016a200041016a4120108604450d010c040b2009290300200041186a290300520d03200141146a2802002207200041146a280200470d032001410c6a28020022012000410c6a2802002200460d00417f21050340200541016a220520074f0d012001200041201086040d04200041206a2109200141206a210c200141286a2101200041286a2100200c2903002009290300510d000c040b0b200641016a2206200b490d000b0b0240200241b0026a41346a220120024198076a41346a22004120108604450d0041c8d0c400410e100f2001412010162000412010160b2001200041201086040d09024020024198076a41106a2802002200450d0020024198076a41086a2802002101200041286c21000340024020012d00002205450d00024020054101470d00200141086a280200450d01200141046a2802001020200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a28020010200b200141286a2101200041586a22000d000b0b0240200241a4076a280200450d00200241a0076a28020010200b0240200241b0026a41106a2802002200450d00200241b0026a41086a2802002101200041286c21000340024020012d00002205450d00024020054101470d00200141086a280200450d01200141046a2802001020200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a28020010200b200141286a2101200041586a22000d000b0b0240200241bc026a280200450d00200241b8026a28020010200b20024180096a240042010f0b41aca5c000102f000b2002280294052202450d0120024103460d0220024104460d0341e8a4c000102f000b41f0a3c000102f000b41b8a4c000102f000b41a0a4c000102f000b41d0a4c000102f000b200241bc036a4101360200200241033602ac01200241b0c1c1003602a801200242013702ac03200241b8c1c1003602a8032002200241a8016a3602b803200241a8036a41c0c1c1001048000b4188a4c000102f000b2002200241b0056a3602a0052002200241b4056a36029005200241a8036a41146a4100360200200241a8066a41146a4104360200200241b4066a4105360200200241b8056a41146a4103360200200241c8d7c4003602b803200242013702ac0320024180a5c0003602a803200241053602ac06200242033702bc05200241fcd1c4003602b8052002200241a8036a3602b806200220024190056a3602b0062002200241a0056a3602a8062002200241a8066a3602c805200241b8056a4188a5c0001048000b41c4a5c000102f000b200541041023000b1024000b200041041023000bfc0609047f017e017f017e037f017e047f017e017f230041a0066b22022400200241d8026a20011056200241e8026a280200210320022802e402210420022802e002210520022903d8022106200241b0056a200241ec026a41e4001084041a024002400240024002400240024002400240024002402005450d00200241106a200241b0056a41e4001084041a200241086a200110bc012002280208450d08200228020c2207ad42e8017e2208422088a70d032008a72209417f4c0d032009450d0120091022220a450d042007450d020c050b20004100360208200241a0066a24000f0b4108210a20070d030b4100210f4200210c200a450d050c030b1031000b200941081023000b200241d8026a41f8006a210b4200210c4100210d410021094100210e2007210f0340200241d8026a200110dc01200241b0056a200241d8026a41f0001084041a200241d8026a41f0006a2903002108200241c0046a200b41f0001084041a20084203510d02200e41016a2110200241e8016a200241b0056a41f0001084041a200241f8006a200241c0046a41f0001084041a0240200e200f470d00200d20102010200d491b220fad42e8017e2211422088a70d052011a722124100480d050240200e450d00200a200920121021220a0d010c070b20121022220a450d060b200a20096a200241e8016a41f000108404220e41f0006a2008370300200e41f8006a200241f8006a41f0001084041a200c4280808080107c210c200d41026a210d200941e8016a21092010210e20102007490d000b200a450d020b200241d8026a200241106a41e4001084041a200041106a20033602002000200436020c2000200536020820002006370300200041146a200241d8026a41e4001084041a200041fc006a200c200fad84370200200041f8006a200a360200200241a0066a24000f0b0240200e450d00200a4188016a211003402010109201201041e8016a2110200941987e6a22090d000b0b200f450d00200a10200b2000410036020802402003450d00200341286c2110200521090340024020092d0000220e450d000240200e4101470d00200941086a280200450d01200941046a2802001020200941286a2109201041586a22100d020c030b200941106a280200450d002009410c6a28020010200b200941286a2109201041586a22100d000b0b02402004450d00200510200b200241a0066a24000f0b1024000b201241081023000b8a1203047f027e097f230041206b22022400024002400240024002400240024002400240024002400240024041ea0110222203450d00200242ea0137020420022003360200200341003b00002002410236020802400240024002400240200128020022032903704202520d0020022802044102470d0120022802004102410410212201450d062002410436020420022001360200200241086a28020021040c020b20022802044102470d0220022802004102410410212201450d062002410436020420022001360200200241086a28020021040c030b41022104200228020021010b200120046a41013a0000200241086a2201200128020041016a3602000c070b41022104200228020021010b200120046a4181013a0000200241086a2201200128020041016a360200200341086a200210970102400240024020022802042204200128020022016b41c0004f0d00200141c0006a22052001490d0920044101742201200520052001491b22014100480d092004450d0120022802002004200110212204450d020c060b200228020021040c060b2001102222040d040b200141011023000b41ea0141011023000b410441011023000b410441011023000b2002200136020420022004360200200241086a28020021010b200241086a2205200141c0006a360200200420016a220141086a200341346a290000370000200141106a2003413c6a290000370000200141186a200341c4006a290000370000200141206a200341cc006a290000370000200141286a200341d4006a290000370000200141306a200341dc006a290000370000200141386a200341e4006a2900003700002001200329002c3700002003200210960102400240024002400240024002400240024002400240200341f0006a2903004201520d0020032903782206420c882207420120074201561b22074200510d0620034180016a290300200780210720022802042204200241086a28020022016b41024f0d01200141026a22052001490d0c20044101742201200520052001491b22014100480d0c2004450d0420022802002004200110212204450d050c090b0240200228020420052802002201470d00200141016a22042001490d0c20014101742205200420042005491b22054100480d0c2001450d0220022802002001200510212204450d030c070b200228020021040c070b200228020021040c080b2005102222040d040b200541011023000b2001102222040d040b200141011023000b41f0c9c100102f000b2002200536020420022004360200200241086a28020021010b200241086a200141016a360200200420016a41003a00000c020b2002200136020420022004360200200241086a28020021010b200241086a200141026a360200200420016a2007a741047420067aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b20034188016a2002109501200241086a22032802002101200241003602182002420137031020022001417e6a36021c2002411c6a200241106a103e024002400240024002402003280200220141014d0d002002280218210520022802102108200228021421092003410036020020022802002103024002400240024002400240024002402001417e6a220a450d004102210b2005450d12200320082d00003a00004101210c200241086a2204200428020041016a36020020054101460d12200820056a210d200320082d00013a00012004200428020041016a3602004102210b200841026a21044100210e2005417e6a2203450d052002280204220b20016b20034f0d01200120036a220c2001490d0d200b4101742201200c200c2001491b220c4100480d0d200b450d022002280200200b200c102122010d030c0a0b0240024002402002280204220120054f0d0020014101742204200520052004491b22044100480d0f2001450d0120032001200410212203450d020c110b4100210b2005450d120c110b2004102222030d0f0b200441011023000b200228020021010c020b200c10222201450d070b2002200c360204200220013602000b200120056a200141026a200a1085041a02402005200241086a220b280200220c460d002002280200200c6a210120052103034020034102460d03200120042d00003a0000200b200b28020041016a360200200141016a2101200441016a2104200c2003417f6a2203470d000b200d20046b2203450d030b20034100480d0820031022220c450d042005210b2003210e0b200d2004460d060c050b2005210b200a0d0b0c0c0b4101210c2005210b200d2004470d030c040b418cb8c400102f000b200341011023000b200c41011023000b200c20042d00003a00004101210f0240200441016a2203200d460d00200c41016a2101200520046b21040340200120032d00003a0000200141016a2101200d200341016a2203470d000b200820046a220f450d010b200c200f6a210d024002400240024020022802042203200b200a6a22016b200f4f0d002001200f6a22042001490d0520034101742201200420042001491b22014100480d052003450d01200228020020032001102122030d020c060b200228020021030c020b200110222203450d040b20022001360204200220033602000b2003200f200b6a22106a2003200b6a200a1085041a02402010200241086a22042802002203460d00200228020020036a2101200f200b6a20036b2105200c21030340200d2003460d01200120032d00003a00002004200428020041016a360200200341016a2103200141016a21012005417f6a22050d000b0b2010210b0b0240200e450d00200c10200b200a450d060c050b1024000b200141011023000b2002200436020420022003360200200241086a280200210b0b2003200b6a220120082d00003a0000024020054101470d00200b41016a210b0c010b2005417f6a2104200841016a2103200141016a21010340200120032d00003a0000200141016a2101200341016a21032004417f6a22040d000b200b20056a210b0b200241086a200b3602004102210b200a450d010b0240200b200241086a22012802002203460d002002280200220420036a2004200b6a200a1085041a0b20012003200a6a3602000b02402009450d00200810200b20002002290300370200200041086a200241086a280200360200200241206a24000bcb03010b7f230041206b22032400024002402002450d0020024102742204102222050d01200441041023000b410421050b0240024002400240200120024103746a22062001460d0020024103742107200141046a210420052108034020082004280200360200200441086a2104200841046a2108200741786a22070d000b200641786a20016b41037641016a21094101210a4100210b4100210403402001280200210c0240024002400240200b20046b200141046a28020022084f0d00200420086a22072004490d07200b410174220d20072007200d491b220d4100480d07200b450d01200a200b200d1021220a0d020c080b200820046a21070c020b200d1022220a450d060b200d210b0b200a20046a200c20081084041a20072104200141086a22012006470d000c020b0b4101210a410021094100210b0b200341186a22044200370300200341106a22014200370300200341086a2208420037030020034200370300200a2005200920031018200041186a2004290300370000200041106a2001290300370000200041086a2008290300370000200020032903003700000240200b450d00200a10200b02402002450d00200510200b200341206a24000f0b1024000b200d41011023000bb40403017f017e017f230041a0026b22022400024002402001450d00200220003602180c010b200241c8d7c4003602180b2002200136021c20024198016a200241186a1056024020022802a001450d00200241206a20024198016a41f8001084041a2002290320200241346a200241f4006a108902200241086a41e795c200411510e001024020022802084101470d002002290310210320024198016a41086a22014200370300200242003703980141fc95c200411720024198016a100220024190026a41086a2200200129030037030020022002290398013703900220024190026a411041c8d7c400410041001001417f470d0020014200370300200242003703980141fc95c200411720024198016a100220002001290300370300200220022903980137039002200220033703980120024190026a411020024198016a410810030b0240200241206a41106a2802002200450d0020022802282101200041286c21000340024020012d00002204450d00024020044101470d00200141086a280200450d01200141046a2802001020200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a28020010200b200141286a2101200041586a22000d000b0b02402002412c6a280200450d00200241286a28020010200b200241a0026a240042010f0b200241346a41013602002002410336029402200241bcc2c1003602900220024201370224200241b8c1c100360220200220024190026a360230200241206a41c0c1c1001048000b060010c201000bdc0d01087f230041206b22022400200241003602182002420137031002400240024002400240024002400240410410222203450d0020024104360214200241186a22042004280200220541046a36020020022003360210200320056a41edcad18b06360000024002400240200228021420042802002203470d00200341016a22042003490d0620034101742205200420042005491b22044100480d062003450d0120022802102003200410212205450d020c040b200228021021050c040b2004102222050d020b200441011023000b410441011023000b2002200436021420022005360210200241186a28020021030b200241186a2204200341016a360200200520036a41043a00004111200241106a10c2024100210302400340200341e88ec0006a280200200341ec8ec0006a280200200241106a10c30202400240024002400240024002400240024002400240024002400240024002400240200341f08ec0006a2802004101470d00200341f48ec0006a280200200341f88ec0006a280200200241106a10c302200341fc8ec0006a22062802004102460d010c020b2002200341f48ec0006a28020011060020022802002002280204200241106a10c302200341fc8ec0006a22062802004102470d010b02400240024002400240200228021420042802002205470d00200541016a22062005490d1620054101742207200620062007491b22074100480d162005450d01200228021020052007102122060d020c040b200228021021060c020b200710222206450d020b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a00002003418c8fc0006a22062802004102470d020c030b200741011023000b0240024002400240200228021420042802002205470d00200541016a22072005490d1420054101742208200720072008491b22084100480d142005450d01200228021020052008102122070d020c0d0b200228021021070c020b200810222207450d0b0b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10c4022003418c8fc0006a22062802004102460d010b0240200228021420042802002205470d00200541016a22072005490d1020054101742208200720072008491b22084100480d102005450d02200228021020052008102122070d030c0a0b200228021021070c030b0240200228021420042802002205470d00200541016a22062005490d0f20054101742207200620062007491b22074100480d0f2005450d04200228021020052007102122060d050c0a0b200228021021060c050b200810222207450d070b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10c5022003419c8fc0006a22062802004102460d030c080b200710222206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a00002003419c8fc0006a22062802004102470d050b0240024002400240200228021420042802002205470d00200541016a22062005490d0b20054101742207200620062007491b22074100480d0b2005450d01200228021020052007102122060d020c070b200228021021060c020b200710222206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c8006a220341c809470d050c060b200841011023000b200841011023000b200741011023000b200741011023000b0240024002400240200228021420042802002205470d00200541016a22072005490d0620054101742208200720072008491b22084100480d062005450d01200228021020052008102122070d020c070b200228021021070c020b200810222207450d050b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10c602200341c8006a220341c809470d000b0b200241186a2802002103200228021421072002280210210620024100360218200242013703102002200336020c2002410c6a200241106a103e02400240024020022802142205200228021822046b20034f0d00200420036a22082004490d0320054101742209200820082009491b22084100480d032005450d0120022802102005200810212205450d020c050b2002280210220520046a200620031084041a200420036a21032007450d060c050b2008102222050d030b200841011023000b1024000b200841011023000b2002200836021420022005360210200520046a200620031084041a200420036a21032007450d010b200610200b200241206a24002003ad4220862005ad840b910701037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000413f4b0d00200141046a280200200141086a2802002202470d01200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0520012802002002200410212203450d060c170b2000418080014f0d01200141046a2802002203200141086a28020022026b41024f0d02200241026a22042002490d1020034101742202200420042002491b22024100480d102003450d0820012802002003200210212203450d090c140b200128020021030c160b20004180808080044f0d01200141046a2802002203200141086a28020022026b41044f0d04200241046a22042002490d0e20034101742202200420042002491b22024100480d0e2003450d08200128020020032002102122030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102122030d0a0c0e0b2004102222030d110b200441011023000b200128020021030c050b200128020021030c070b2002102222030d0b0b200241011023000b200210222203450d060b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b200410222203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00000240024002400240200141046a2802002203200428020022026b41044f0d00200241046a22042002490d0420034101742202200420042002491b22024100480d042003450d01200128020020032002102122030d020c070b200128020021030c020b200210222203450d050b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b1024000b200241011023000b200441011023000b200241011023000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000bc60801037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0520022802002003200510212204450d060c160b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1820044101742203200520052003491b22034100480d182004450d0820022802002004200310212204450d090c130b200228020021040c150b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d08200228020020042003102122040d090c0e0b200228020021040c110b200241046a280200200241086a2802002203470d03200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d09200228020020032005102122040d0a0c0d0b2005102222040d100b200541011023000b200228020021040c050b200228020021040c070b2003102222040d0a0b200341011023000b200310222204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c0a0b200510222204450d030b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0c20044101742203200520052003491b22034100480d0c2004450d01200228020020042003102122040d020c060b200228020021040c020b200310222204450d040b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c070b200341011023000b200541011023000b200341011023000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000c020b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000b024002400240200241046a2802002204200241086a28020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d0120022802002004200310212204450d020c040b200228020021040c040b2003102222040d020b200341011023000b1024000b20022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a200020011084041a0bff0901097f230041206b22022400024002400240024002400240024020002802004101470d00200041046a28020021032000410c6a2802002200200110c2022000450d01200041e4006c2104410021050340200320056a220041046a280200200041086a280200200110c302200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041e0006a2d00004101470d0020072009470d01200941016a22072009490d0d2009410174220a20072007200a491b220a4100480d0d2009450d0320012802002009200a102122070d040c0e0b20072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0520012802002009200a102122070d060c0e0b200128020021070c030b200128020021070c050b200a10222207450d0a0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10222207450d080b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110e30302400240200041c0006a2802004101470d00200041c4006a280200200041cc006a280200200110c3020c010b200241106a200041c4006a280200200041c8006a28020028020c11050020022802102209200241106a41086a280200200110c3022002280214450d00200910200b200041d4006a28020021090240200041d0006a2802004101470d002009200041dc006a280200200110e4032004200541e4006a2205470d010c030b2009200041d8006a280200200110e4032004200541e4006a2205470d000c020b0b200241086a200041046a28020011060020022802082103200228020c2200200110c2022000450d00200041e4006c2104410021050340200320056a220041046a280200200041086a280200200110c302200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041e0006a2d00004101470d0020072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0320012802002009200a102122070d040c0f0b20072009470d01200941016a22072009490d0b2009410174220a20072007200a491b220a4100480d0b2009450d0520012802002009200a102122070d060c0f0b200128020021070c030b200128020021070c050b200a10222207450d0b0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10222207450d090b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110e30302400240200041c0006a2802004101470d00200041c4006a280200200041cc006a280200200110c3020c010b200241106a200041c4006a280200200041c8006a28020028020c11050020022802102209200241106a41086a280200200110c3022002280214450d00200910200b200041d4006a28020021090240200041d0006a2802004101470d002009200041dc006a280200200110e4032004200541e4006a2205470d010c020b2009200041d8006a280200200110e4032004200541e4006a2205470d000b0b200241206a24000f0b1024000b200a41011023000b200a41011023000b200a41011023000b200a41011023000bf40201057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a2802002200200110c2022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c3022000410c6a200110e503200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110e40320042005412c6a2205470d010c030b2006200041246a280200200110e40320042005412c6a2205470d000c020b0b200241086a200041046a28020011060020022802082103200228020c2200200110c2022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c3022000410c6a200110e503200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110e40320042005412c6a2205470d010c020b2006200041246a280200200110e40320042005412c6a2205470d000b0b200241106a24000bda0301057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a2802002200200110c2022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c302200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110e4030c010b2006200041146a280200200110e4030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110e40320042005412c6a2205470d010c030b2006200041246a280200200110e40320042005412c6a2205470d000c020b0b200241086a200041046a28020011060020022802082103200228020c2200200110c2022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c302200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110e4030c010b2006200041146a280200200110e4030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110e40320042005412c6a2205470d010c020b2006200041246a280200200110e40320042005412c6a2205470d000b0b200241106a24000be00301017f230041f0056b22022400024002402001450d00200220003602000c010b200241c8d7c4003602000b20022001360204200241f8036a200210dc0102400240024002400240024020022903e8044203510d00200241086a200241f8036a41e8011084041a200241f0016a200241086a41e8011084041a2002200241f0016a3602f803200241d8036a200241f8036a10bd0220022802e0032101200241f8036a200241f0016a41e8011084041a200241e8056a20022802e003360200200220022903d8033703e005200241e8036a200241f8036a2001200241e0056a109f010240024020022802e8034101470d004280828898f01f20022802ec03410374ad88a7210041011022210141010d010c050b20022802ec0341004721004101102221014100450d040b2001450d01200141013a000020014101410210212201450d020c040b20024184026a41013602002002410336020c200241d4c2c100360208200242013702f401200241b8c1c1003602f0012002200241086a36028002200241f0016a41c0c1c1001048000b410141011023000b410241011023000b2001450d01200141003a0000200141014102102122010d00410241011023000b200120003a0001200241f0056a24002001ad428080808020840f0b410141011023000bec1203027f017e0b7f230041c0016b2202240010910220024180016a41086a22034200370300200242003703800141cdc8c000410d20024180016a1002200241086a41086a200329030037030020022002290380013703084200210402400240024002400240024002400240200241086a411041c8d7c400410041001001417f460d00200242003703a001200241086a4110200241a0016a41084100100141016a41084d0d0120022903a00121040b200410de01200342003703002002420037038001418bc7c000411520024180016a100220024190016a41086a200329030037030020022002290380013703900120024190016a411041c8d7c400410041001001417f460d0141002105200241003602084104210641012107024020024190016a4110200241086a41044100100141016a41044d0d0020022802082208450d032008ad420c7e2204422088a70d042004a722034100480d040240200310222206450d00200621094100210a024002400340024002400240024002400240411410222203450d00200341106a41002800bcc840360000200341086a41002900b4c840370000200341002900acc8403700002003411441281021220b450d01200b200a360014200241086a41186a22034200370300200241086a41106a22054200370300200241086a41086a220c420037030020024200370308200b4118200241086a1000200241a0016a41186a2003290300370300200241a0016a41106a2005290300370300200241a0016a41086a200c290300370300200220022903083703a001024002400240200241a0016a412041c8d7c400410041001001417f460d002002422037020c2002200241a0016a3602082002200241086a108e012002280200450d0a20022802042203417f4c0d052003450d01200310762205450d06200c200c280200220d200341002002280208200228020c20052003200d1001220d200d417f461b220d200d20034b1b220d6a360200200d2003470d020c070b42002104410121050c070b410121052002280208200228020c41014100200c28020010011a41002003460d050b2003450d07200510200c070b411441011023000b412841011023000b1031000b200341011023000b2005450d022003ad22044220862004842104200241a0016a412010090b200b1020200941046a2004370200200920053602002009410c6a21092008200a41016a220a470d000c020b0b419a88c00041331039000b41002107200821050c040b200341041023000b419a88c00041331039000b419a88c00041331039000b4100210541012107410421060b410421084100210b4100210d02400240024002402005410c6c2203410c490d002003410c6e220d41037422094100480d04200910222208450d010b0240200620036a220c2006460d004100210b200821032006210903402009280200210a200341046a200941086a2802003602002003200a360200200341086a2103200b41016a210b2009410c6a2209200c470d000b0b200241a0016a2008200b10be020240200d450d00200810200b02402005450d002005410c6c21092006210303400240200341046a280200450d00200328020010200b2003410c6a2103200941746a22090d000b0b024020070d00200610200b200241086a41186a200241a0016a41186a290300370300200241086a41106a200241a0016a41106a290300370300200241086a41086a200241a0016a41086a290300370300200220022903a00137030820024180016a41086a22034200370300200242003703800141dac8c000411520024180016a100220024190016a41086a220b200329030037030020022002290380013703900120024190016a4110200241086a41201003200241086a109602200241003602980120024201370390010240412010222203450d00200242a080808080043702940120022003360290012003200229021c370000200341086a200241246a290200370000200341106a2002412c6a290200370000200341186a200241346a290200370000200241086a20024190016a1096010240024002402002280294012209200b280200220a6b41204f0d00200a41206a2203200a490d072009410174220b20032003200b491b220c4100480d072009450d012002280290012009200c1021220b450d020c050b200a41206a2103200228029001210b0c050b200c1022220b0d030b200c41011023000b412041011023000b200941041023000b2002200c360294012002200b36029001200c21090b20024190016a41086a220c2003360200200b200a6a220a41086a200241c4006a290200370000200a41106a200241cc006a290200370000200a41186a200241d4006a290200370000200a200229023c3700000240200920036b411f4b0d00200341206a220a2003490d0120094101742205200a200a2005491b220a4100480d010240024002402009450d00200b2009200a1021220b450d010c020b200a1022220b0d010b200a41011023000b2002200a360294012002200b360290010b200c200341206a360200200b20036a220341186a200241f4006a290200370000200341106a200241ec006a290200370000200341086a200241e4006a2902003700002003200229025c3700002002280210210e2002200241086a41106a280200220f3602a001200241a0016a20024190016a103e0240200f450d00200f41286c210d20024190016a41086a22072802002103200228029401210c200e210b0340200241a0016a200b109a0120022802a00121050240024002400240200c20036b200241a0016a41086a280200220a4f0d002003200a6a22092003490d06200c4101742208200920092008491b22064100480d06200c450d01200228029001200c2006102122080d020c070b2003200a6a210920022802900121080c020b200610222208450d050b200220063602940120022008360290012006210c0b20072009360200200820036a2005200a1084041a024020022802a401450d00200510200b200b41286a210b20092103200d41586a220d0d000b0240200f450d00200f41286c210b200e21030340024020032d0000220a450d000240200a4101470d00200341086a280200450d01200341046a2802001020200341286a2103200b41586a220b0d020c030b200341106a280200450d002003410c6a28020010200b200341286a2103200b41586a220b0d000b0b200241146a280200450d040c030b20024198016a28020021092002280290012108200241146a2802000d020c030b1024000b200641011023000b200e10200b200241c0016a24002009ad4220862008ad840bc60f03017f037e127f23004180026b22022400024002402001450d00200220003602080c010b200241c8d7c4003602080b2002200136020c200241306a200241086a10ca020240024002402002280230450d00200241106a41086a2201200241306a41086a220028020036020020022002290330370310200241206a41086a20012802003602002002200229031037032020024190016a200241206a10cb022002280290014101460d0120024190016a41086a2201290300210320014200370300200242003703900141da95c200410d20024190016a100220002001290300370300200220022903900137033042002104024002400240200241306a411041c8d7c400410041001001417f460d002002420037039001200241306a411020024190016a41084100100141016a41084d0d0120022903900121040b20024190016a41086a22014200370300200242003703900141fc95c200411720024190016a1002200241306a41086a2001290300370300200220022903900137033002400240200241306a411041c8d7c400410041001001417f460d002002420037039001200241306a411020024190016a41084100100141016a41084d0d03200229039001210541e801210141e80110222206450d010c060b4203210541e801210141e801102222060d050b200141081023000b419a88c00041331039000b419a88c00041331039000b200241a4016a41013602002002410336028401200241ecc2c100360280012002420137029401200241b8c1c10036029001200220024180016a3602a00120024190016a41c0c1c1001048000b419d97c200412820022802940120024190016a41086a280200109c02000b200620024190016a41f000108404220742023703702007410036028801200720022903800137037820074180016a20024180016a41086a29030037030020072003200520047c220420042003541b3703900120074198016a200241306a41d0001084041a2002280220220821092002280224220a210b41002101037e02400240024020010e020001010b200941086a210020092f0106220d4103742101417f210c02400240024003402001450d01417f410141b08dc00020004108108604220e4100481b4100200e1b220e450d03200141786a2101200c41016a210c200041086a2100200e4101460d000b200b0d010c020b200d210c200b450d010b200b417f6a210b2009200c4102746a41e4016a2802002109410021010c030b4108210f41032110417f21114102211241e401211341b4c5c10021144100211541012116417821170c010b2008200f6a210c20082f0106220d2010742100417f2101024002400240024002400240024003402000450d01200120166a2101201120162014200c200f108604220e2015481b2015200e1b220e450d03200020176a2100200c200f6a210c200e2016460d000b200a0d010c030b200d2101200a450d020b200a20116a210a200820012012746a20136a2802002108410121010c060b200841e0006a2001410c6c6a2216450d002016280208210120162802002116200242003703900120024190016a20162001410820014108491b1084041a200141074d0d01200229039001210320024190016a41086a22014200370300200242003703900141c7b0c000411520024190016a1002200241306a41086a200129030037030020022002290390013703304100210102400240200241306a411041c8d7c400410041001001417f460d0020024210370284012002200241306a3602800120024190016a20024180016a10f4012002280290012200450d0420024198016a2802002101200228029401210f0c010b410821004100210f0b4100211602402001417f6a220c20014b0d00200c20014f0d002000200c4103746a2201450d00200129030020035221160b0240200f450d00200010200b024002402016450d00200741e80141d00310212206450d05200641e8016a20024190016a41f0001084041a200642023703d802200620033703f8022006410a3602f00220062002290380013703e002200641e8026a20024188016a29030037030020064180036a200241306a41d0001084041a4102210e0c010b4101210e0b200228022020022802242002280228104320024100360238200242013703302002200e36029001200e41e8016c210720024190016a200241306a103e2002280234210c2002280238210120024190016a41086a2111410021000240024003402002200620006a3602800120024190016a20024180016a10bd0220022802900121080240024002400240200c20016b2011280200220f4f0d002001200f6a22162001490d05200c4101742215201620162015491b22094100480d05200c450d012002280230200c2009102122150d020c060b2001200f6a2116200228023021150c020b200910222215450d040b20022009360234200220153602302009210c0b200241306a41086a2016360200201520016a2008200f1084041a0240200228029401450d00200810200b201621012007200041e8016a2200470d000b200e41e8016c2100410021010340200620016a4188016a1092012000200141e8016a2201470d000b2006102020024180026a24002016ad4220862015ad840f0b1024000b200941011023000b41c0b5c000412b41bcc5c1004128109c02000b41c0b5c000412b41bcccc4004129109c02000b419a88c00041331039000b41d00341081023000b410121010c000b0b9d0a06027f017e097f017e077f017e23004190026b22022400200241086a200110bc01024002402002280208450d000240024002400240024002400240024002400240024002400240024002400240200228020c2203ad2204421d88a70d002004420386a72205417f4c0d00024002402005450d00200510222206450d032003450d010c040b4101210620030d030b410021054100210b2006450d100c030b1031000b200541011023000b200141046a210741002108410021094100210a2003210b034020024200370330200241306a2001280200220c20072802002205410820054108491b220d1084041a20072005200d6b3602002001200c200d6a360200200541074d0d02200a41016a2105200229033021040240200a200b470d002008200520052008491b220bad420386220e422088a70d09200ea7220d4100480d090240200a450d0020062009200d102122060d010c0b0b200d10222206450d0a0b200620096a2004370000200841026a2108200941086a21092005210a20052003490d000b2006450d0d0b2005ad422086200bad84210e200241306a200110be012002280230220f450d0120022802342110200241306a41086a2802002205200e422088a7470d022002420037021420024180e5c200360210200f2005410c6c6a210b20054103742205450d03200620056a2111200241106a41086a2112200241c4006a2113200241c0006a2114200f21082006210c034020082205200b460d062005410c6a210820052802002215450d05200529020421042002200c290000221637032002400240200228021022054180e5c200460d00200228021421070c010b41e40110222205450d0a41002107200541003b010620054100360200200541086a200241306a41dc011084041a20024100360214200220053602100b200c41086a210c02400340200541086a210d20052f010622034103742109417f210a02400240024003402009450d01200a41016a210a417f4101200241206a200d410810860422014100481b410020011b2201450d05200941786a2109200d41086a210d20014101460d000b20070d010c020b2003210a2007450d010b2007417f6a21072005200a4102746a41e4016a28020021050c010b0b2013201637020020142012360200200241306a410c6a200a360200200241306a41086a200241106a36020020022005360234200241003602302002200437022420022015360220200241306a200241206a103f200c2011470d010c060b2005200a410c6c6a220541e4006a220a2802002109200a2004370200200541e0006a220a2802002105200a201536020002402005450d002009450d00200510200b200c2011470d000c050b0b200b450d0b0c0a0b200ea70d090c0a0b2000410036020002402005450d002005410c6c210a200f210503400240200541046a280200450d00200528020010200b2005410c6a2105200a41746a220a0d000b0b02402010450d00200f10200b200ea7450d0a2006102020024190026a24000f0b200f21080b200ea7450d050c040b200b2108200ea70d030c040b1024000b200d41011023000b41e40141041023000b200610200b02402008200b460d00034020082802002205450d010240200841046a280200450d00200510200b2008410c6a2208200b470d000b0b02402010450d00200f10200b200241306a41086a2205200241106a41086a28020036020020022002290310370330200041086a20052802003602002000200229033037020020024190026a24000f0b200610200b200041003602000b20024190026a24000bae0201077f230041106b2202240020012802042103024002400240024003402001280200220541086a210620052f010622044103742101410021070240024003402001450d01419fcdc400200641081086042208450d02200141786a2101200741016a2107200641086a21062008417f4a0d000b2007417f6a21040b2003450d022003417f6a2103200520044102746a41e4016a21010c010b0b200541e0006a2007410c6c6a2206450d00200628020821012006280200210620024200370308200241086a20062001410820014108491b1084041a200141074d0d01200041086a2002290308370300410021010c030b200041d0cdc400360204200041086a41283602000c010b200041a7cdc400360204200041086a41293602000b410121010b20002001360200200241106a24000b933a1b0c7f017e067f017e0b7f017e027f027e017f017e027f037e027f017e017f027e067f017e017f017e027f037e1b7f027e0d7f027e057f230041d0026b22022400024002402001450d00200220003602100c010b200241c8d7c4003602100b20022001360214200241f0006a200241106a10bc020240024002400240024020022802782203450d00200241f0016a2802002104200241ec016a280200210520024180016a2802002106200241fc006a280200210720022802e8012108200241186a200241106a10ca022002280218450d01200241306a41086a2201200241186a41086a220928020036020020022002290318370330200241c0006a41086a200128020036020020022002290330370340200241013b015c2002420037025420024180e5c200360250200241d0006a41086a210a2004450d0241e801210b2008200441e8016c6a210c41f000210d4202210e4117210f41fc95c20021104100211141c8d7c400211241102113417f2114427f2115410321164102211741e401211841b4ccc4002119410c211a41e000211b4107211c418801211d419001211e410d211f200241d0006a410d6a212042f4d2b59bc7ae98b830212141dc01212220024184016a2123420121244281808080102125410921264289808080900121274178212841da95c2002129423c212a428080808070212b4225212c2008212d4100212e0c030b2002412c6a41013602002002410336025420024188c3c1003602502002420137021c200241b8c1c1003602182002200241d0006a360228200241186a41c0c1c1001048000b20024184016a41013602002002410336025420024188c3c10036025020024201370274200241b8c1c1003602702002200241d0006a36028001200241f0006a41c0c1c1001048000b410021010c010b410221010b037e024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b200241f0006a41086a200a290300370300200220022903503703700c200b412f411e2050204f410c6c6a41a07f4622431b215141b88dc0004181cdc40020431b21430c010b02400240202e0e06000103040506060b202d200d6a290300200e520d11202d2802880122010d4a202d29039001212f200241f0006a41086a22304200370300200242003703702010200f200241f0006a1002200920302903003703002002200229037037031802400240200241186a201320122011201110012014460d0020024200370370200241186a2013200241f0006a41082011100141016a41084d0d08200229037021310c010b420321310b2015203120317c223220322031541b2231500d09200241c0006a2133200228024421340c1c0b2044280200225020466a210020502f010622382047742101417f214f02400240024003402001450d01204f204d6a214f2048204d204b200020461086042237204c481b204c20371b2237450d152001204e6a2101200020466a21002037204d460d000b20450d010c020b2038214f2045450d010b204520486a21452050204f2049746a204a6a21444101212e0c130b412f215141b88dc00021430b2002205136026420022043360260200242efcc99e3a6ae99b830370318200241086a200241d0006a200241186a200241e0006a10cd02200228020822510d08200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c1d0b2053205b2059205a6a220120012059491b6a22012053490d432053205a742200200120012000491b2254ad205c862231205d88a70d432031a72201205e480d4302402053450d0020552053205f742001102122550d0b0c050b200110222255450d044103212e0c130b20552053205f746a20583602002053205a6a21532059450d1c0240205720512f01064f0d00205120572060746a20616a21582057205a6a21572059205b6a215920542053460d080c090b41012101024020512f01042200205128020022512f0106490d004101210103402001205a6a210120512f01042200205128020022512f01064f0d000b0b205120002060746a20616a215820512000205f746a20626a2802002151410021572001205a460d1a205a20016b2101034020512802e40121512001205a6a22010d000c1b0b0b2063206a206920646a220120012069491b6a22012063490d4120632064742200200120012000491b2265ad206b862231206c88a70d412031a72201206d480d4102402063450d0020662063206e742001102122660d0c0c040b200110222266450d034105212e0c150b20662063206e746a2068360200206320646a216302402069450d000240206720432f01064f0d0020432067206f6c6a20706a2168206720646a21672069206a6a216920652063460d0a0c0b0b41012101024020432f01042200204328020022432f0106490d00410121010340200120646a210120432f01042200204328020022432f01064f0d000b0b20432000206f6c6a20706a216820432000206e746a20716a28020021434100216720012064460d18206420016b2101034020432802e4012143200120646a22010d000c190b0b206621042053413f4b0d2c0c1d0b419a88c00041331039000b200141041023000b200141041023000b4198b4c000102f000b41f690c20041222051200228020c109c02000b4102212e0c080b4103212e0c080b4103212e0c090b4104212e0c090b4105212e0c090b4105212e0c0a0b410021010c410b410121010c400b410221010c3f0b410221010c3e0b410221010c3d0b410221010c3c0b410221010c3b0b410221010c3a0b410221010c390b410221010c380b410221010c370b41002101034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e020001010b2033280200223641086a210020362f010622352016742101410021370240024003402001450d012019200041081086042238450d02200120286a2101203741016a2137200041086a2100203820144a0d000b203720146a21350b2034450d03203420146a2134203620352017746a20186a2133410021010c150b2036201b6a2037201a6c6a2200450d02200028020821012000280200210020024200370370200241f0006a20002001410820014108491b1084041a2001201c4d0d03202f20318020022903702239520d05202d201d6a223a28020022010d42202d201e6a2903002132200241f0006a200241c0006a10cb020240024020022802704101470d002030350200213b2002280274213c4101213d20202d0000450d010c100b2030290300213e4200213b20304200370300200242003703702029201f200241f0006a100220092030290300370300200220022903703703180240200241186a201320122011201110012014460d0020024200370370200241186a2013200241f0006a41082011100141016a41084d0d0e2002290370213b0b20304200370300200242003703702010200f200241f0006a10022009203029030037030020022002290370370318024002400240200241186a201320122011201110012014460d0020024200370370200241186a2013200241f0006a41082011100141016a41084d0d112002290370213f2032203e202a7c580d020c010b4203213f2032203e202a7c580d010b2040202b83202c84213b4101213d41f896c200213c20202d0000450d010c100b4100213d2032203f203b7c223b5a0d0220202d00000d0f0b02400240203d450d0020022802502002280254200a28020010432002420037025420024180e5c200360250200220213703180c010b200228025021412002202137031820414180e5c200460d00200228025421420c140b201810222241450d0941002142204141003b010620414100360200204141086a200241f0006a20221084041a20024100360254200220413602500c120b204141086a210020412f010622362016742101417f213702400240024003402001450d01200241186a200041081086042138200120286a2101203741016a2137200041086a21002014410120382011481b201120381b22384101460d000b2038450d0a20420d010c020b203621372042450d010b204220146a2142204120372017746a20186a2802002141410121010c140b20232021370200200241f0006a20136a200a360200200241f0006a201a6a20373602002030200241d0006a36020020022041360274200220113602702009201136020020022024370318410110222101024002400240024002400240203d450d002001450d0f200141013a00002002202537021c200220013602182002203ba72201360260200241e0006a200241186a103e200228021c2237200928020022006b20014f0d01200020016a22382000490d4320374101742236203820382036491b22382011480d432037450d02200228021820372038102122370d030c100b2001450d13200120113a00002002202537021c2002200136021820014101202610212201450d142001203b3700012002202737021c200220013602180c040b200228021821370c020b203810222237450d0d0b2002203836021c200220373602180b2009200020016a360200203720006a203c20011084041a0b200241e0006a41086a200928020036020020022002290318370360200241f0006a200241e0006a103f2020203d3a0000200241d0006a201a6a20113a0000203b2140203d0d060b203a2802004101460d410c420b203942808080807083421c84213141e5ccc40021430c010b203942808080807083422984213141bcccc40021430b2031a721510c010b41312151418fb5c00021430b2002205136026420022043360260200242e1eac98bb68edbb7f4003703182002200241d0006a200241186a200241e0006a10cd02200228020022510d0a200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c100b200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c0f0b41f690c2004122419891c200412d109c02000b41e40141041023000b410141011023000b203841011023000b419a88c00041331039000b419a88c00041331039000b41f690c200412241c591c2004131109c02000b410141011023000b410941011023000b41f690c200412220512002280204109c02000b410121010c010b410121010c000b0b2069206a6a216902400240024020652063470d004104212e0c010b4105212e0c010b410221010c360b410221010c350b2059205b6a215902400240024020542053470d004102212e0c010b4103212e0c010b410221010c350b410221010c340b200228024020022802442002280248104302402006450d00200641286c2143200321510340024020512d00002201450d00024020014101470d00205141086a280200450d01205141046a2802001020205141286a2151204341586a22430d020c030b205141106a280200450d002051410c6a28020010200b205141286a2151204341586a22430d000b0b02402007450d00200310200b02402004450d00200441e8016c214320084188016a215103402051109201205141e8016a2151204341987e6a22430d000b0b02402005450d00200810200b410110222251450d05205120022d007c3a000020514101410210212252450d06205220022d007d3a0001200228027022432151024020022802742200450d002043215120002101034020512802e40121512001417f6a22010d000b2000210103402001417f6a22010d000b0b02400240024020022802782237450d002037417f6a215320512f0106450d01205141086a2138410121000c020b4100215441042155410421564100215320000d030c040b0240024020512f01042200205128020022512f01064f0d00410121010c010b410121010340200141016a210120512f01042200205128020022512f01064f0d000b0b205120004103746a41086a2138205120004102746a41e8016a28020021514100210020014101460d00410120016b2101034020512802e4012151200141016a22010d000b0b417f205341016a220120012053491b2254ad2231421e88a70d042031420286a72201417f4c0d04024002400240024002402001450d00200110222255450d0d205520383602002053450d020c010b41042155410420383602002053450d010b200020512f01064f0d01200041016a2157205120004103746a41086a21580c020b410121530c020b0240024020512f01042200205128020022512f01064f0d00410121010c010b410121010340200141016a210120512f01042200205128020022512f01064f0d000b0b205120004103746a41086a2158205120004102746a41e8016a28020021514100215720014101460d00410120016b2101034020512802e4012151200141016a22010d000b0b2037417e6a21594101215a417f215b4202215c4220215d4100215e4102215f410321604108216141e80121624101215320544101470d0b0c0a0b205521562002280270214320022802742200450d010b20002101034020432802e40121432001417f6a22010d000b03402000417f6a22000d000b0b024002400240200241f8006a2802002263450d002063417f6a216420432f0106450d01204341e0006a2137410121000c020b410021654104216641042104410021632053413f4d0d020c110b0240024020432f01042200204328020022432f01064f0d00410121010c010b410121010340200141016a210120432f01042200204328020022432f01064f0d000b0b20432000410c6c6a41e0006a2137204320004102746a41e8016a28020021434100210020014101460d00410120016b2101034020432802e4012143200141016a22010d000b0b417f206441016a220120012064491b2265ad2231421e88a70d012031420286a72201417f4c0d01024002400240024002402001450d00200110222266450d0b206620373602002064450d020c010b41042166410420373602002064450d010b200020432f01064f0d01200041016a216720432000410c6c6a41e0006a21680c020b41012163206621042053413f4b0d110c020b0240024020432f01042200204328020022432f01064f0d00410121010c010b410121010340200141016a210120432f01042200204328020022432f01064f0d000b0b20432000410c6c6a41e0006a2168204320004102746a41e8016a28020021434100216720014101460d00410120016b2101034020432802e4012143200141016a22010d000b0b2063417e6a216941012164417f216a4202216b4220216c4100216d4102216e410c216f41e000217041e80121714101216320654101470d0a0c090b4101215a410110222237450d03203720534102743a000020534102742243450d140c0f0b1031000b410141011023000b410241011023000b410141011023000b200141041023000b200141041023000b4102212e0c030b4103212e0c030b4104212e0c030b4105212e0c030b410221010c240b410221010c230b410221010c220b410221010c210b02402053418080014f0d004102215a410210222237450d02203720534102744101723b0000205341027422430d010c060b024020534180808080044f0d004104215a410410222237450d0320372053410274410272360000205341027422430d010c060b410110222251450d03205141033a00004105215a20514101410510212237450d042037205336000120534102742243450d050b4100205a6b2151205a215302400340205628020021010240205a20516a41074b0d00205341086a22002053490d15205a4101742264200020002064491b22004100480d1502400240205a450d002037205a2000102122370d010c040b200010222237450d030b2000215a0b205641046a2156203720536a2001290000370000205141786a2151205341086a21532043417c6a22430d000b2063413f4b0d070c060b200041011023000b410241011023000b410441011023000b410141011023000b410541011023000b205a21532063413f4b0d010b41012143410110222256450d08205620634102743a00004101210120630d010c020b02402063418080014f0d0041022143410210222256450d07205620634102744101723b00000c010b024020634180808080044f0d0041042143410410222256450d06205620634102744102723600000c010b410110222251450d04205141033a00004105214320514101410510212256450d03205620633600010b20634102742164204321010340200428020022512802002163024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020512802082251413f4b0d0020432001470d01204341016a22012043490d2120434101742200200120012000491b22004100480d212043450d05205620432000102122560d060c0f0b2051418080014f0d01204320016b41014b0d02200141026a22002001490d2020434101742238200020002038491b22004100480d202043450d0b205620432000102122560d0c0c0f0b204321000c050b20514180808080044f0d01204320016b41034b0d05200141046a22002001490d1e20434101742238200020002038491b22004100480d1e024020430d00200010222256450d100c070b205620432000102122560d060c0f0b204321000c090b20432001470d05204341016a22012043490d1c20434101742200200120012000491b22004100480d1c0240024020430d00200010222256450d100c010b20562043200010212256450d0f0b204321010c060b200010222256450d090b204321010b205620016a20514102743a00002000200141016a22016b20514f0d060c0c0b204321000b205620016a20514102744102723600002000200141046a22016b2051490d0a0c040b204321000b205620016a41033a000002402000200141016a22436b41034b0d00204341046a22382043490d162000410174222e20382038202e491b22384100480d16024002402000450d00205620002038102122560d010c080b203810222256450d070b203821000b205620436a20513600002000200141056a22016b2051490d080c020b200010222256450d030b205620016a20514102744101723b00002000200141026a22016b2051490d060b200021430c060b200041011023000b200041011023000b203841011023000b200041011023000b200041011023000b200120516a22432001490d0c20004101742238204320432038491b22434100480d0c02402000450d00205620002043102122560d010c040b204310222256450d030b200441046a2104205620016a206320511084041a200120516a21012064417c6a22640d000b0b024002400240205a20536b20014f0d00205320016a22512053490d0c205a4101742200205120512000491b22004100480d0c205a450d012037205a200010212237450d020c090b205320016a2151203720536a205620011084041a2043450d0a0c090b2000102222370d070b200041011023000b204341011023000b410541011023000b410141011023000b410441011023000b410241011023000b410141011023000b2000215a203720536a205620011084041a2043450d010b205610200b02402065450d00206610200b02402054450d00205510200b02402051450d00205141026a22432051490d0120434104204341044b1b22014100480d0120524102200110212252450d02205241026a203720511084041a205a450d040c030b205141026a2143205241026a203720511084041a205a0d020c030b1024000b200141011023000b203710200b20022802702002280274200241f8006a2802001043200241d0026a24002043ad4220862052ad840f0b20014101470d010b202d280290012017460d010b202d200b6a222d200c470d010c030b200241c0006a2144200228024421454108214641032147417f21484102214941e401214a41b08dc000214b4100214c4101214d4178214e0c010b4100212e0c020b4101212e0c020b410021010c020b410221010c010b410221010c000b0bdb0403037f017e047f23004180026b220424000240024020012d000d450d0041c591c2002101413121020c010b2001280200200141046a2205280200200141086a220628020010432005420037020020014180e5c2003602002004200229000022073703100240024041e40110222202450d00200241003b010620024100360200200241086a200441206a41dc011084041a200541003602002001200236020020022f01062208410374210941002105417f210a0240034020092005460d010240417f4101200441106a200220056a41086a4108108604220b4100481b4100200b1b220b450d00200541086a2105200a41016a210a200b4101460d010c040b0b419891c2002101412d21020c030b2008210a0c010b41e40141041023000b20042007370234200420063602302004200a36022c20042001360228200420023602242004410036022020044100360218200442013703102003280200210a2004200328020422023602002004200441106a103e02400240024002400240024020042802142203200428021822056b20024f0d00200520026a220b2005490d0320034101742209200b200b2009491b220b4100480d032003450d0120042802102003200b10212203450d020c040b200428021021030c040b200b102222030d020b200b41011023000b1024000b2004200b360214200420033602100b200441106a41086a220b200520026a360200200320056a200a20021084041a200441086a200b28020036020020042004290310370300200441206a2004103f20014180023b010c410021010b200020023602042000200136020020044180026a24000b7201027f230041206b220224002002108b020240412010222203450d0020032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241206a24002003ad42808080808004840f0b412041011023000bb11303027f027e087f230041f0076b22022400024002402001450d00200220003602080c010b200241c8d7c4003602080b2002200136020c20024188066a200241086a10dc010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022903f8064203510d00200241106a20024188066a41e8011084041a200241f8016a200241106a41e8011084041a2002200241f8016a3602f00420024188066a200241f0046a10bd0220022802900621030240200228028c06450d0020022802880610200b20024188066a200241f8016a41e8011084041a200241f0046a20024188066a10a0010240024002400240024002400240024020022802f0044101470d0020022802f404210320022802f8042201411a460d0120014115470d024102210141f601210020034195a9c000460d1420034195a9c00041151086040d020c140b200241e0036a200241f0046a41086a4190011084041a02400240200241e0036a41086a410020022903e0034201511b2201450d002001450d00410321002001200310a2010d01200110a101210441012100200141206a29030022052004540d01410c10222206450d0b412010222200450d0c20002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002000412041c00010212200450d0d20002005370020200642c080808080053702042006200036020041042107410021080240200420055a0d00410c10222207450d10412010222200450d1120002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002000412041c00010212201450d1220012005427f7c370020200742c0808080800537020420072001360200410121080b20024190046a10930120024100360290062002420137038806410110222201450d0e20024188066a41086a22002000280200220941016a3602002002410136028c062002200136028806200120096a41013a0000200228028c062209200028020022016b41084f0d05200141086a22002001490d1d20094101742201200020002001491b22014100480d1d2009450d0620022802880620092001102122000d070c120b4176416c20011b21000b20024190046a10930120024100360290062002420137038806410121014101102222030d140c1c0b41002100200341b4c0c000460d0141002101200341b4c0c000411a108604450d120b4100210141810121000c110b410021010c100b20022802880621000c020b200110222200450d0b0b2002200136028c06200220003602880620024190066a28020021010b20024188066a41086a2209200141086a360200200020016a2003ad370000200220083602f801200241f8016a20024188066a103e02402008450d0020072008410c6c6a210b2007210303402003280200210c2002200341086a28020022013602f801200241f8016a20024188066a103e0240024002400240200228028c06220a200928020022006b20014f0d00200020016a220d2000490d1a200a4101742200200d200d2000491b22004100480d1a200a450d01200228028806200a20001021220a0d020c070b200228028806210a0c020b20001022220a450d050b2002200036028c062002200a36028806200928020021000b2009200020016a360200200a20006a200c20011084041a2003410c6a2203200b470d000b0b200241013602f801200241f8016a20024188066a103e2006280200210a2002200628020822013602f801200241f8016a20024188066a103e0240024002400240200228028c062203200928020022006b20014f0d00200020016a22092000490d1820034101742200200920092000491b22004100480d182003450d0120022802880620032000102122030d020c0e0b20022802880621030c020b200010222203450d0c0b2002200036028c06200220033602880620024190066a28020021000b20024188066a41086a2209200020016a360200200320006a200a20011084041a0240024002400240200228028c062200200928020022016b41084f0d00200141086a22032001490d1820004101742201200320032001491b22014100480d182000450d0120022802880620002001102122000d020c0f0b20022802880621000c020b200110222200450d0d0b2002200136028c06200220003602880620024190066a28020021010b20024188066a41086a2203200141086a360200200020016a427f37000020032802002101200228028806210041000d1c02402008450d002008410c6c21092007210303400240200341046a280200450d00200328020010200b2003410c6a2103200941746a22090d000b2008450d00200710200b0240200641046a280200450d00200628020010200b200610200c1c0b2002418c026a410136020020024103360214200241a0c3c100360210200242013702fc01200241b8c1c1003602f8012002200241106a36028802200241f8016a41c0c1c1001048000b200041011023000b410c41041023000b412041011023000b41c00041011023000b410141011023000b410c41041023000b412041011023000b41c00041011023000b200141011023000b200041011023000b200141011023000b2002410036029006200242013703880620010d0141012101410110222203450d080b2002200136028c0620024190066a22092009280200220a20016a36020020022003360288062003200a6a41003a00000240200228028c0620092802002201470d00200141016a22032001490d0720014101742209200320032009491b22094100480d072001450d022002280288062001200910212203450d030c0c0b20022802880621030c0c0b410110222201450d072002410136028c0620024190066a22032003280200220941016a3602002002200136028806200120096a41023a0000200228028c0620032802002201470d02200141016a22032001490d0520014101742209200320032009491b22094100480d052001450d032002280288062001200910212203450d040c080b2009102222030d090b200941011023000b20022802880621030c060b2009102222030d040b200941011023000b1024000b200120011023000b410141011023000b2002200936028c06200220033602880620024190066a28020021010b20024190066a200141016a360200200320016a20003a00000c020b2002200936028c06200220033602880620024190066a28020021010b20024190066a200141016a360200200320016a20003a00000b20024190066a280200210120022802880621000b200241f0076a24002001ad4220862000ad840b6101017f230041206b220224000240200141074d0d00200241206a240042010f0b200241146a41013602002002410336021c200241bcc3c10036021820024201370204200241b8c1c1003602002002200241186a360210200241c0c1c1001048000b890c07027f017e057f017e027f037e037f230041306b22022400024002402001450d00200220003602080c010b200241c8d7c4003602080b2002200136020c200241106a200241086a10580240024002400240024002400240024020022802102203450d00200320022902142204422088a7220541286c6a21062004a72107200322012100024002400240024002400240034002400240024002400240200620006b419f014d0d00024020012d00004102470d00200141286a2100200141086a22082802004101460d050c070b200141286a2d00004102460d02200141d0006a2d00004102460d03200141f8006a2109200141a0016a2200210120092d00004102470d050c010b034020062001460d0720012d00002109200141286a2200210120094102470d000b0b200041606a22082802004101460d020c040b200141d0006a2100200141306a22082802004101460d010c030b200141f8006a2100200141d8006a22082802004101470d020b200021010c000b0b200828020421012008290310210a4108210b410021094100210c0240200828020c220641286c22004128490d0020004100480d032006ad42287e422088a74100470d0320001022220b450d092006210c0b2001200120006a460d01200641286c210641002109200b21000340200141086a2903002104200141106a290300210d200141186a290300210e2001290300210f200041206a200141206a290300370300200041186a200e370300200041106a200d370300200041086a20043703002000200f370300200041286a2100200941016a2109200141286a2101200641586a22060d000c020b0b4100210b0b20024100360218200242013703104101102221060240024002400240200b450d002006450d08200242818080801037021420022006360210200641013a000020022009360228200241286a200241106a103e200241106a41086a221028020021002002280214210602402009450d00200b200941286c6a2111200b210103400240024002400240200620006b41204f0d00200041206a22092000490d0a20064101742208200920092008491b22124100480d0a2006450d01200228021020062012102122080d020c0b0b200041206a2109200228021021080c020b201210222208450d090b2002201236021420022008360210201221060b20102009360200200820006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a29000037000020002001290000370000200141206a29030021040240024002400240200620096b41084f0d00200941086a22002009490d0a20064101742212200020002012491b22124100480d0a2006450d01200820062012102122080d020c0c0b200941086a21000c020b201210222208450d0a0b2002201236021420022008360210201221060b20102000360200200820096a20043700002011200141286a2201470d000b0b200620006b41084f0d01200041086a22012000490d0420064101742209200120012009491b22014100480d042006450d0220022802102006200110212206450d030c0b0b2006450d08200242818080801037021420022006360210200641003a0000428080808010210420050d0c0c0d0b200228021021060c0a0b2001102222060d080b200141011023000b1024000b201241011023000b201241011023000b200241246a41013602002002410336022c200241d4c3c10036022820024201370214200241b8c1c1003602102002200241286a360220200241106a41c0c1c1001048000b410141011023000b410141011023000b200041081023000b20022001360214200220063602100b200241106a41086a200041086a2201360200200620006a200a3700002001ad42208621040240200b450d00200c450d00200b10200b2005450d010b200541286c2100200321010340024020012d00002209450d00024020094101470d00200141086a280200450d01200141046a2802001020200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a28020010200b200141286a2101200041586a22000d000b0b02402007450d00200310200b200241306a240020042006ad840bbc0c07027f017e047f027e027f037e047f230041306b22022400024002402001450d00200220003602080c010b200241c8d7c4003602080b2002200136020c200241106a200241086a105802400240024002400240024002400240024020022802102203450d00200320022902142204422088a7220541286c6a21062004a72107200322012100024002400240024002400240034002400240024002400240200620006b419f014d0d00024020012d00004102470d00200141286a2100200141086a22082802004101470d050c070b200141286a2d00004102460d02200141d0006a2d00004102460d03200141f8006a2108200141a0016a2200210120082d00004102470d050c010b034020062001460d0720012d00002108200141286a2200210120084102470d000b0b200041606a22082802004101470d020c040b200141d0006a2100200141306a22082802004101470d010c030b200141f8006a2100200141d8006a22082802004101460d020b200021010c000b0b20082802042101200829031821092008290310210a4108210b410021064100210c0240200828020c220841286c22004128490d0020004100480d032008ad42287e422088a74100470d0320001022220b450d0a2008210c0b2001200120006a460d01200841286c210841002106200b21000340200141086a2903002104200141106a290300210d200141186a290300210e2001290300210f200041206a200141206a290300370300200041186a200e370300200041106a200d370300200041086a20043703002000200f370300200041286a2100200641016a2106200141286a2101200841586a22080d000c020b0b4100210b0b20024100360218200242013703100240024002400240200b450d00410110222201450d08200242818080801037021420022001360210200141013a000020014101410910212201450d09200242898080809001370214200220013602102001200a37000120022006360228200241286a200241106a103e200241106a41086a221028020021112002280214210802402006450d00200b200641286c6a2112200b210103400240024002400240200820116b41204f0d00201141206a22002011490d0a20084101742206200020002006491b22134100480d0a2008450d01200228021020082013102122060d020c0b0b201141206a2100200228021021060c020b201310222206450d090b2002201336021420022006360210201321080b20102000360200200620116a221141186a200141186a290000370000201141106a200141106a290000370000201141086a200141086a29000037000020112001290000370000200141206a29030021040240200820006b41074b0d00200041086a22112000490d0720084101742213201120112013491b22114100480d07024002402008450d00200620082011102122060d010c0b0b201110222206450d0a0b2002201136021420022006360210201121080b2010200041086a2211360200200620006a20043700002012200141286a2201470d000b0b200820116b41084f0d01201141086a22012011490d0420084101742200200120012000491b22014100480d042008450d0220022802102008200110212206450d030c0c0b410110222206450d09200242818080801037021420022006360210200641003a0000428080808010210420050d0d0c0e0b200228021021060c0b0b2001102222060d090b200141011023000b1024000b201341011023000b201141011023000b200241246a41013602002002410336022c200241f4c3c10036022820024201370214200241b8c1c1003602102002200241286a360220200241106a41c0c1c1001048000b410141011023000b410941011023000b410141011023000b200041081023000b20022001360214200220063602100b200241106a41086a201141086a2201360200200620116a20093700002001ad42208621040240200b450d00200c450d00200b10200b2005450d010b200541286c2100200321010340024020012d00002208450d00024020084101470d00200141086a280200450d01200141046a2802001020200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a28020010200b200141286a2101200041586a22000d000b0b02402007450d00200310200b200241306a240020042006ad840bd105020a7f017e230041206b220224000240024002400240410e10222203450d0041002104200341066a410029009893423700002003410029009293423700002003410e411c10212203450d01200341106a41002d00a293423a0000200341002f00a093423b000e024002402003411141c8d7c400410041001001417f460d002002410036021020034111200241106a41044100100141016a41044d0d01200228021021040b200310202002200410d40220024100360218200242013703102002280200210520022002280208220336021c2002411c6a200241106a103e02400240024002402003450d002005200341286c6a2106200241106a41086a22072802002104200228021421082005210303400240024002400240200820046b41204f0d00200441206a22092004490d062008410174220a20092009200a491b220b4100480d062008450d0120022802102008200b1021220a0d020c070b200441206a21092002280210210a0c020b200b1022220a450d050b2002200b3602142002200a360210200b21080b20072009360200200a20046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a290300210c0240024002400240200820096b41084f0d00200941086a22042009490d062008410174220b20042004200b491b220b4100480d062008450d01200a2008200b1021220a0d020c080b200941086a21040c020b200b1022220a450d060b2002200b3602142002200a360210200b21080b20072004360200200a20096a200c3700002006200341286a2203470d000b2002280204450d080c070b200241186a28020021042002280210210a20022802040d060c070b1024000b200b41011023000b200b41011023000b419a88c00041331039000b410e41011023000b411c41011023000b200510200b200241206a24002004ad422086200aad840bc70403017f017e0a7f230041c0006b2202240002400240024002400240024002402001450d002001ad42287e2203422088a70d052003a722044100480d05200410222205450d06200241206a41186a2106200241206a41106a2107200241206a41086a210820052104410021090340410e1022220a450d04200a41066a41002900989342370000200a41002900929342370000200a410e411c1021220a450d05200a200936000e02400240200a411241c8d7c400410041001001417f460d0020064200370300200742003703002008420037030020024200370320200a4112200241206a412041001001220b417f460d05200b4120490d05200241186a220b2006290300370300200241106a220c2007290300370300200241086a220d20082903003703002002200229032037030020024200370320200a4112200241206a41084120100141016a41084d0d05200229032021032006200b2903003703002007200c2903003703002008200d290300370300200220022903003703200c010b42002103200642003703002007420037030020084200370300200242003703200b200a1020200441186a2006290300370300200441106a2007290300370300200441086a200829030037030020042002290320370300200441206a2003370300200441286a21042001200941016a2209470d000b200121040c010b41002104410821050b200020043602082000200136020420002005360200200241c0006a24000f0b419a88c00041331039000b410e41011023000b411c41011023000b1024000b200441081023000be90104027f017e017f017e230041206b22022400200241106a41086a220342003703002002420037031041fc95c2004117200241106a1002200241086a20032903003703002002200229031037030002400240024002402002411041c8d7c400410041001001417f460d002002420037031020024110200241106a41084100100141016a41084d0d022002290310210441082105410810222203450d010c030b42032104410821054108102222030d020b200541011023000b419a88c00041331039000b2003427f200420047c220620062004541b370000200241206a24002003ad42808080808001840b8b0301097f230041206b220224002002109d0120024100360218200242013703102002280200210320022002280208220436021c2002411c6a200241106a103e024002400240024002402004450d0020044105742105200241106a41086a280200210620022802102107200228021421082003210403400240024002400240200820066b41204f0d00200641206a22092006490d062008410174220a20092009200a491b220a4100480d062008450d0120072008200a102122070d020c070b200641206a21090c020b200a10222207450d050b200a21080b200720066a22062004290000370000200641186a200441186a290000370000200641106a200441106a290000370000200641086a200441086a29000037000020092106200441206a2104200541606a22050d000b200241186a200936020020022008360214200220073602102002280204450d040c030b200241186a28020021092002280210210720022802040d020c030b1024000b200a41011023000b200310200b200241206a24002009ad4220862007ad840b8d0202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641077522074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad4207862209422088a70d032009a722084100480d032002450d0120002802002002410774200810212202450d020c040b200028020021020c040b2008102222020d020b200841081023000b1024000b20002002360200200041046a2003360200200041086a28020021030b200220034107746a200520061084041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010200b0b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641d8006d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad42d8007e2209422088a70d032009a722084100480d032002450d012000280200200241d8006c200810212202450d020c040b200028020021020c040b2008102222020d020b200841081023000b1024000b20002002360200200041046a2003360200200041086a28020021030b2002200341d8006c6a200520061084041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010200b0bb80a010b7f230041f0016b22022400200220011038024020022802002203450d00200241086a28020021042002280204210541002106200241003a00d00120012802002001280204200241d0016a410120012802081001210720012001280208200741016a41014b22076a220836020802402007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220641002001280200200141046a280200200241d0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d01200241b0016a41186a22072009290300370300200241b0016a41106a2206200a290300370300200241b0016a41086a2209200b290300370300200220022903d0013703b00120024190016a41186a220a200729030037030020024190016a41106a2207200629030037030020024190016a41086a22062009290300370300200220022903b00137039001200241f0006a41186a200a290300370300200241f0006a41106a2007290300370300200241f0006a41086a20062903003703002002200229039001370370410121060b200241d0006a41186a200241f0006a41186a290300370300200241d0006a41106a200241f0006a41106a290300370300200241d0006a41086a200241f0006a41086a2903003703002002200229037037035041002109200241003a00d0012001280200200141046a280200200241d0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220741002001280200200141046a280200200241d0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d01200241b0016a41186a22012009290300370300200241b0016a41106a2207200a290300370300200241b0016a41086a2208200b290300370300200220022903d0013703b00120024190016a41186a2209200129030037030020024190016a41106a2201200729030037030020024190016a41086a22072008290300370300200220022903b00137039001200241f0006a41186a2009290300370300200241f0006a41106a2001290300370300200241f0006a41086a20072903003703002002200229039001370370410121090b200241106a41186a2201200241f0006a41186a290300370300200241106a41106a2207200241f0006a41106a290300370300200241106a41086a2208200241f0006a41086a29030037030020022002290370370310200241306a41186a220a200241d0006a41186a290300370300200241306a41106a220b200241d0006a41106a290300370300200241306a41086a220c200241d0006a41086a29030037030020022002290350370330200020063a000c2000200436020820002005360204200020033602002000412d6a20093a00002000200229033037000d200041156a200c2903003700002000411d6a200b290300370000200041256a200a2903003700002000412e6a2002290310370000200041366a20082903003700002000413e6a2007290300370000200041c6006a2001290300370000200241f0016a24000f0b200041023a000c02402005450d00200310200b200241f0016a24000f0b200041023a000c200241f0016a24000b9e0403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103e0240024002400240024002402000450d002003200041306c6a2104200241086a280200210520022802002106200228020421000340200341086a2903002107200329030021080240024002400240200020056b41104f0d00200541106a22092005490d062000410174220a20092009200a491b220a4100480d062000450d0120062000200a102122060d020c070b200541106a21090c020b200a10222206450d050b200a21000b200620056a22052007370008200520083700000240024002400240200020096b41204f0d00200941206a22052009490d062000410174220a20052005200a491b220a4100480d062000450d0120062000200a102122060d020c080b200941206a21050c020b200a10222206450d060b200a21000b200620096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032004470d000b200241086a20053602002002200036020420022006360200200128020020012802042006200510032000450d050c040b200228020421032001280200200128020420022802002206200241086a280200100320030d030c040b1024000b200a41011023000b200a41011023000b200610200b200241106a24000ba00402087f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103e0240024002400240024002402000450d002003200041286c6a2104200241086a220528020021002002280204210603400240024002400240200620006b41204f0d00200041206a22072000490d0620064101742208200720072008491b22094100480d062006450d01200228020020062009102122080d020c070b200041206a2107200228020021080c020b200910222208450d050b2002200936020420022008360200200921060b20052007360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a290300210a0240024002400240200620076b41084f0d00200741086a22002007490d0620064101742209200020002009491b22094100480d062006450d01200820062009102122080d020c080b200741086a21000c020b200910222208450d060b2002200936020420022008360200200921060b20052000360200200820076a200a3700002004200341286a2203470d000b200128020020012802042008200010032006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100320030d030c040b1024000b200941011023000b200941011023000b200810200b200241106a24000bcf0506027f017e0b7f017e027f017e230041d0006b22022400200241086a2001108e010240024002400240024002400240024002402002280208450d00200228020c2203ad42307e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210d4100210c0c030b1031000b200541081023000b200141046a2107200141086a2108200241306a41186a21094100210a4100210b410021052003210c0240034020024200370338200242003703302008410020012802002007280200200241306a411020082802001001220d200d417f461b220d4110200d4110491b20082802006a220e360200200d410f4d0d01200241306a41086a220f29030021042002290330211020094200370300200241306a41106a22114200370300200f4200370300200242003703302008410020012802002007280200200241306a4120200e1001220d200d417f461b220d4120200d4120491b20082802006a360200200d411f4d0d01200541016a210d200241106a41186a220e2009290300370300200241106a41106a22122011290300370300200241106a41086a2211200f2903003703002002200229033037031002402005200c470d00200a200d200d200a491b220cad42307e2213422088a70d042013a7220f4100480d0402402005450d002006200b200f102122060d010c060b200f10222206450d050b2006200b6a2205200437030820052010370300200541286a200e290300370300200541206a2012290300370300200541186a2011290300370300200541106a2002290310370300200a41026a210a200b41306a210b200d2105200d2003490d000c020b0b200041003602000240200c450d00200610200b200241d0006a24000f0b2000200c36020420002006360200200041086a200d360200200241d0006a24000f0b1024000b200f41081023000b13002000410a360204200041f8cac1003602000ba70301047f230041c0006b2202240002400240411610222203450d002003410e6a41002900d3c941370000200341086a41002900cdc941370000200341002900c5c94137000020034116413610212203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034136200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703000240024002402002412041c8d7c400410041001001417f460d002002410036022020024120200241206a41044100100141016a4105490d02200228022021012002410036022020024120200241206a41044104100141016a4105490d02200041086a200228022036020020002001360204200041013602000c010b200041003602000b20031020200241c0006a24000f0b419a88c00041331039000b411641011023000b413641011023000b130020004107360204200041b7e0c1003602000b130020004114360204200041c0e0c1003602000b7801047f230041106b2202240020024100360208200242013703000240410110222203450d00200220033602002002410136020420002002290300370200200241086a22042004280200220441016a2205360200200320046a41003a0000200041086a2005360200200241106a24000f0b410141011023000b3201017f0240410410222202450d0020004284808080c00037020420002002360200200241003600000f0b410441011023000b3201017f0240410810222202450d0020004288808080800137020420002002360200200242053700000f0b410841011023000b3301017f0240410810222202450d0020004288808080800137020420002002360200200242e8073700000f0b410841011023000b3201017f0240410410222202450d0020004284808080c00037020420002002360200200241013600000f0b410441011023000b3201017f0240410410222202450d0020004284808080c00037020420002002360200200241023600000f0b410441011023000b3901017f0240411010222202450d002002420037000820024201370000200042908080808002370204200020023602000f0b411041011023000b3901017f0240411010222202450d002002420037000820024209370000200042908080808002370204200020023602000f0b411041011023000b981705067f017e047f017e047f230041e0006b22042400200441c0006a41086a2205420037030020044200370340419084c2004112200441c0006a1002200441206a41086a200529030037030020042004290340370320410021060240024002400240024002400240200441206a411041c8d7c400410041001001417f460d00200442103702142004200441206a360210200441c0006a200441106a103820042802402207450d02200441c8006a2802002106200428024421080c010b41012107410021080b200441c0006a41086a220542003703002004420037034041e082c2004114200441c0006a1002200441206a41086a22092005290300370300200420042903403703200240200441206a411041c8d7c400410041001001417f460d00419b8ec2002105412e21062008450d040c030b200542003703002004420037034041b884c2004111200441c0006a10022009200529030037030020042004290340370320024002400240200441206a411041c8d7c400410041001001417f460d0020044100360240200441206a4110200441c0006a41044100100141016a41044d0d0220042802402003470d010c040b41002003460d030b41c98ec20021054114210620080d030c040b419a88c00041331039000b419a88c00041331039000b024002402006450d002006200241086a28020022094f0d01419e8fc200210541c500210620080d020c030b41dd8ec200210541c100210620080d010c020b0240024002400240024002400240024002400240024002400240411410222205450d00200541106a41002800a38742360000200541086a410029009b874237000020054100290093874237000020054114413410212205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a2900003700004200210a200441c0006a41186a22064200370300200441c0006a41106a220b4200370300200441c0006a41086a220c42003703002004420037034020054134200441c0006a1000200441206a41186a2006290300370300200441206a41106a200b290300370300200441206a41086a200c29030037030020042004290340370320200441206a412041c8d7c4004100410010012106200510202006417f470d05200441c0006a41086a220542003703002004420037034041f388c2004112200441c0006a1002200441206a41086a20052903003703002004200429034037032002400240200441206a411041c8d7c400410041001001417f460d002004420037034820044200370340200441206a4110200441c0006a4110410010012205417f460d042005410f4d0d04200441c8006a290300210f2004290340210a0c010b4200210f0b200441086a2001200a200f10b001024020042802082205450d00200428020c210620080d0e0c0f0b200441c0006a41086a220642003703002004420037034041b483c200410e200441c0006a1002200441206a41086a20062903003703002004200429034037032041002105024002400240200441206a411041c8d7c400410041001001417f460d00200442103702142004200441206a360210200441c0006a200441106a103820042802402210450d06200441c0006a41086a2206280200210b20042802442105200441c0006a41186a200141186a290000370300200441c0006a41106a200141106a2900003703002006200141086a29000037030020042001290000370340200441c0006a210620052111200b2005460d010c020b200441c0006a41186a200141186a290000370300200441c0006a41106a200141106a2900003703002006200141086a2900003703002004200129000037034041012110200441c0006a21060b200541016a220b2005490d092005410174220c200b200b200c491b2211ad420586220a422088a70d09200aa7220c4100480d0902402005450d002005210b20102005410574200c102122100d010c060b2005210b200c10222210450d050b2010200b410574220c6a22052006290000370000200541186a200641186a290000370000200541106a200641106a290000370000200541086a200641086a290000370000200441c0006a41086a220542003703002004420037034041b483c200410e200441c0006a1002200441206a41086a20052903003703002004200429034037032020044100360248200442013703402004200b41016a2206360210200441106a200441c0006a103e0240024002402006450d00200c41206a210d4100200528020022066b210c200428024021122004280244210e2010210503400240200e200c6a411f4b0d00200641206a220b2006490d0d200e4101742213200b200b2013491b220b4100480d0d02400240200e450d002012200e200b102122120d010c060b200b10222212450d050b200b210e0b201220066a220b2005290000370000200b41186a200541186a290000370000200b41106a200541106a290000370000200b41086a200541086a290000370000200c41606a210c200641206a2106200541206a2105200d41606a220d0d000b200441c8006a20063602002004200e360244200420123602400c010b200528020021062004280244210e200428024021120b200441206a41102012200610030240200e450d00201210200b2011450d0620101020411421064114102222050d070c080b200b41011023000b411441011023000b413441011023000b419a88c00041331039000b419a88c00041331039000b200c41011023000b41142106411410222205450d010b200541106a41002800a38742360000200541086a410029009b874237000020054100290093874237000020052006413410212205450d03200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441c0006a41186a22064200370300200441c0006a41106a220b4200370300200441c0006a41086a220c42003703002004420037034020054134200441c0006a1000200441206a41186a2006290300370300200441206a41106a200b290300370300200441206a41086a200c2903003703002004200429034037032020042003360240200441206a4120200441c0006a41041003200510202002280204210d2002280200210e411310222202450d042002410f6a41002800978e42360000200241086a41002900908e42370000200241002900888e423700002002411341331021220c450d05200c2001290000370013200c412b6a200141186a290000370000200c41236a200141106a290000370000200c411b6a200141086a290000370000200441c0006a41186a22024200370300200441c0006a41106a22054200370300200441c0006a41086a2206420037030020044200370340200c4133200441c0006a1000200441206a41186a2002290300370300200441206a41106a2005290300370300200441206a41086a200629030037030020042004290340370320200441003602482004420137034020042009360210200441106a200441c0006a103e024002402009450d00200441c8006a220b280200210220042802442105200e21060340024002400240024020022005470d00200541016a22012005490d0820054101742203200120012003491b22034100480d082005450d01200428024020052003102122010d020c090b200428024021010c020b200310222201450d070b2004200336024420042001360240200321050b200b200241016a2203360200200120026a20062d00003a000020032102200641016a21062009417f6a22090d000c020b0b200441c8006a280200210320042802442105200428024021010b200441206a412020012003100302402005450d00200110200b200c10200240200d450d00200e10200b4100210502402008450d00200710200b0c080b200641011023000b1024000b200341011023000b413441011023000b411341011023000b413341011023000b200710200b200241046a280200450d00200228020010200b2000200636020420002005360200200441e0006a24000bee0803057f037e037f230041d0006b22032400024002400240024002402002280208220420014d0d0020022802002105200241086a2004417f6a2206360200200520064105746a22072900002108200729000821092007290010210a200520014105746a220141186a200741186a2900003700002001200a37001020012009370008200120083700002002280204210b200341306a41086a220242003703002003420037033041b483c200410e200341306a1002200341086a41086a20022903003703002003200329033037030820034100360238200342013703302003200636022c2003412c6a200341306a103e02400240024002402006450d00200441057441606a2104200228020021062003280230210c200328023421012005210203400240024002400240200120066b41204f0d00200641206a22072006490d072001410174220d20072007200d491b220d4100480d072001450d01200c2001200d1021220c0d020c080b200641206a21070c020b200d1022220c450d060b200d21010b200c20066a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020072106200241206a2102200441606a22040d000b200341386a2007360200200320013602342003200c3602300c010b20022802002107200328023421012003280230210c0b200341086a4110200c2007100302402001450d00200c10200b0240200b450d00200510200b411310222202450d032002410f6a41002800978e42360000200241086a41002900908e42370000200241002900888e4237000020024113413310212202450d04200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a290000370000200341306a41186a22064200370300200341306a41106a22074200370300200341306a41086a220142003703002003420037033020024133200341306a1000200341086a41186a2006290300370300200341086a41106a2007290300370300200341086a41086a200129030037030020032003290330370308200341086a4120100920021020411410222202450d05200241106a41002800a38742360000200241086a410029009b874237000020024100290093874237000020024114413410212202450d06200220002900003700142002412c6a200041186a290000370000200241246a200041106a2900003700002002411c6a200041086a290000370000200341306a41186a22064200370300200341306a41106a22074200370300200341306a41086a220142003703002003420037033020024134200341306a1000200341086a41186a2006290300370300200341086a41106a2007290300370300200341086a41086a200129030037030020032003290330370308200341086a4120100920021020200341d0006a24000f0b1024000b200d41011023000b418084c2002001200410b501000b411341011023000b413341011023000b411441011023000b413441011023000b860301047f230041d0006b22022400024002400240411310222203450d002003410f6a41002800978e42360000200341086a41002900908e42370000200341002900888e4237000020034113413310212203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034133200241306a1000200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041c8d7c400410041001001417f460d002002422037022420022002360220200241306a200241206a108f0120022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031020200241d0006a24000f0b411341011023000b413341011023000b419a88c00041331039000bee0202017e057f024002400240024002402001450d00200141074b0d01200141016a21010c020b200041106a4200370200200041086a4280808080c000370200200041046a41e48fc200360200200041003a00000f0b2001ad4203862202422088a70d022002a7220341076e210142808080801021022003410e490d010b417f2001417f6a677641016aad42208621020b024002402002423d88a70d002002422088a7220141076a417c712203200141046a2204490d0020032002421d88a76a22052003490d002005417d4f0d00200510222206450d012001417f6a22052002422388a741076c20054108491b2107200641ff012004108304220420036a21030240200141034b0d00200420016a418001410420016b1083041a0b200041146a2007360200200041106a41003602002000410c6a2003360200200041086a2005360200200041046a2004360200200041003a00000f0b41e88fc200102f000b200541041023000b41e88fc200102f000baf0f03287f017e137f230041206b220124000240024002400240024002400240200028020c220241016a22032002490d00200041046a28020022022104024020024108490d00200241016a41037641076c21040b0240200320044101764f0d00200241016a2105410421064103210741fffefdfb07210841072109417f210a4181828408210b4100210c41004101710d020c030b200141086a200310ec0220012d00084101460d062001411c6a280200210d200141086a410c6a280200210e200141106a280200210f200128020c2110417f21114180818284782112410421134101211420002802002215200041046a2802006a41016a21162000410c6a28020021172000280208211841202119417c211a4138211b4105211c41b9f3ddf179211d4103211e4102211f417e212041ff01212141002122411921232015280200417f734180818284787122240d040c030b41e88fc200102f000b410121020c030b410021020c020b410321020c010b410421020b0240024002400340024002400240024002400240024002400240024002400240024020020e050100090304040b200c20076a2202200c4922030d04200220054f0d042005200c20066a20031b200520022005491b210c0c010b200c20054f0d03200c2102200c41016a210c0b200028020020026a220220022802002202200976200a73200b7120022008726a3602004101410171450d09410121020c0a0b201520136a21020340200220164f0d03201820196a211820022802002103200220136a22042102200320127122032012460d000b200320127321242004201a6a2115410421020c090b2018202468201b716a22262802002127410021030240202628020422282013490d00410021032027210220282104034020022800002003201c7773201d6c2103200220136a21022004201a6a2204201e4b0d000b2028201a6a22022002201a7122026b2128202720026a20136a21270b024002400240202820144d0d002027201f6a21022003201c7720272f000073201d6c2103202820206a0d010c020b202721022028450d010b2003201c7720022d000073201d6c21030b202420116a2127410021022003201c77202173201d6c222521030340200220136a22022003200f7122046a2103201020046a2800002012712228450d000b02402010202868201e7620046a200f7122026a2c00002022480d00201028020020127168201e7621020b201020026a202520237622033a000020102002201a6a200f716a20136a20033a0000200e2002201e746a2026290200370200202720247122240d05410321020c080b20002802002102200041046a220428020041016a220341034b0d01200241046a200220031085041a2000280200200428020022026a41016a418001410320026b1083041a0c020b2000200d20176b3602102000410c6a2017360200200041086a200e3602002000280200210320002010360200200041046a220228020021132002200f3602002013450d0a0240201341016aad4203862229422088a70d00201341086a417c712202201341056a490d0020022029a76a22132002490d002013417c4b0d00200120023602102001410436020c200120133602080b200310200c0a0b200220036a20022800003600000b4104212a4101212b200041046a222c28020041016a222d450d054100212e418001212f41032130200041086a21314105213241b9f3ddf1792133417c213441022135417e213641ff0121374180818284782138411921394100213a410221020c040b203a2225202b6a213a0240024002400240202520002802006a2d0000202f460d00203a202d470d050c010b02400340203128020020252030746a223b2802002127410021030240203b2802042228202a490d004100210320272102202821040340200228000020032032777320336c21032002202a6a2102200420346a220420304b0d000b202820346a2202200220347122026b2128202720026a202a6a21270b0240024002402028202b4d0d00202720356a2102200320327720272f00007320336c2103202820366a0d010c020b202721022028450d010b200320327720022d00007320336c21030b202c28020021282000280200212741002102200320327720377320336c223c210303402002202a6a2202200320287122046a2103202720046a2800002038712226450d000b0240202720266820307620046a20287122026a2c0000202e480d0020272802002038716820307621020b02402002203c20287122036b202520036b7320287120304d0d00202720026a22032d000021042003203c20397622263a00002027200220346a2028716a202a6a20263a000020042037460d02203128020020022030746a220229020021292002203b290200370200203b20293702000c010b0b202720256a203c20397622023a000020272028202520346a716a202a6a20023a0000203a202d470d030c010b2000280200220320256a20373a00002003202c280200202520346a716a202a6a20373a0000203128020020022030746a203b290200370200203a202d470d010b200041046a280200221341084f0d070c080b410221020c040b410221020c030b410421020c020b410221020c010b410021020c000b0b417f21130b2013202b6a41037641076c21130b200020132000410c6a2802006b360210200141206a24000f0b200141206a24000b130020004101360204200041c897c2003602000b13002000410f360204200041ff98c2003602000b1300200041023602042000419099c2003602000beb1b09017f027e037f017e017f077e027f037e047f230041a0036b22032400200341a8026a200010c70102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020032d00a802417f6a41ff017141014d0d0020034188016a41086a200341e4026a29020037030020034188016a41106a200341ec026a29020037030020034188016a41186a200341f4026a2902003703002003200341dc026a29020037038801200341a8026a41186a2903002104200341a8026a41106a2903002105200341d8026a2802002106200341d4026a2802002107200341d0026a2802002108200341c8026a2903002109200341a8026a41086a220a290300210b200a4200370300200342003703a80241cdc8c000410d200341a8026a100220034180036a41086a200a290300370300200320032903a802370380034200210c024020034180036a411041c8d7c400410041001001417f460d00200342003703a80220034180036a4110200341a8026a41084100100141016a41084d0d0420032903a802210c0b024042004200200c20017d22012001200c561b220120097d220920092001561b220d500d00200341f8006a200010c401200341f8006a41086a29030021012003290378210e42002109200341a8026a41086a220a4200370300200342003703a8024195e4c200411a200341a8026a100220034180036a41086a200a290300370300200320032903a802370380030240024020034180036a411041c8d7c400410041001001417f460d00200342003703b002200342003703a80220034180036a4110200341a8026a411041001001220a417f460d07200a410f4d0d07024020032903a8022209200341a8026a41086a290300220f84500d00200341e8006a200e20012009200f108704200341e8006a41086a2903002110200329036821090c020b420021090b420021100b200341a8026a41086a220a4200370300200342003703a80241e8e3c2004114200341a8026a100220034180036a41086a200a290300370300200320032903a802370380030240024020034180036a411041c8d7c400410041001001417f460d00200342003703b002200342003703a80220034180036a4110200341a8026a411041001001220a417f460d08200a410f4d0d08200341b0026a290300210f20032903a80221110c010b420021114200210f0b200341386a4200420020107d200b200954ad7d2210200b20097d2209200b5620104200522010501b220a1b2210420020114200108804200341c8006a200f420042002009200a1b22094200108804200341d8006a2009420020114200108804427f20032903582010420052200f42005271200329034042005272200329035042005272200341d8006a41086a2903002209200329033820032903487c7c221120095472220a1b220f427f2011200a1b2211844200510d0042002109200341a8026a41086a220a4200370300200342003703a80241a5eec000411b200341a8026a100220034180036a41086a2212200a290300370300200320032903a8023703800320034180036a411041c8d7c400410041001001417f460d02200342003703b002200342003703a80220034180036a4110200341a8026a4110410010012213417f460d072013410f4d0d07200341b0026a290300211420032903a80221150c030b2007450d00200810200b4100210a0c190b42002115420021140b200a4200370300200342003703a80241fce3c2004119200341a8026a10022012200a290300370300200320032903a802370380030240024020034180036a411041c8d7c400410041001001417f460d00200342003703b002200342003703a80220034180036a4110200341a8026a411041001001220a417f460d06200a410f4d0d06200341b0026a290300211620032903a80221090c010b420021160b200341106a20114200200d4200108804200341206a200f4200200d4200108804200342004200200f4200108804200341306a200041084200200e2005427f20032903202003290318200329030884420052200341206a41086a290300220f200329031020032903007c7c2211200f5472220a1b22102010200556427f2011200a1b220f200456200f2004511b220a1b22117d22052005200e5620012004200f200a1b7d200e201154ad7d220420015620042001511b22121b22054200200420121b220410ae01201620147c200920157c2211200954ad7c21090240200328023022120d00200a0d002005201154200420095420042009511b0d004102210a2002450d16200341a8026a20002010200f410810aa0220032802a8024101460d072003200341b8026a290300220b3703b0012003200341a8026a41086a29030022013703a801200341a8026a200010c70120032d00a8022202410246220a0d064100200341a8026a200a1b220a2d00000d06200a200c370320200a200a290310220c20017d370310200a41186a220a200a290300200b7d200c200154ad7d37030041171022220a450d08200a410f6a41002900cfe342370000200a41086a41002900c8e342370000200a41002900c0e342370000200a411741371021220a450d09200a2000290000370017200a412f6a200041186a290000370000200a41276a200041106a290000370000200a411f6a200041086a29000037000020034188026a41186a2200420037030020034188026a41106a2206420037030020034188026a41086a221242003703002003420037038802200a413720034188026a100020034180036a41186a200029030037030020034180036a41106a200629030037030020034180036a41086a20122903003703002003200329038802370380032003412036028c02200320034180036a36028802200341a8026a20034188026a10f202200a1020024020020d00200341d4026a280200450d00200341d0026a28020010200b200341a8016a10ce014102210a20070d170c180b0240024020120d00200520115a200420095a20042009511b450d00200341a8026a20002010200f410810aa024101210a20032802a8024101460d0b2003200341b8026a2903003703c0012003200341a8026a41086a2903003703b801200341b8016a10ce01200e201154200120095420012009511b450d010c170b024002400240200e201154200120095420012009511b450d00200341e8016a20004200420010cb01200341f0016a210020032903e8014200510d01200010ce014101210a20070d1a0c1b0b200341c8016a20002011200910cb01200341d0016a210a20032903c8014200510d01200a10ce010c020b200010cf014101210a20070d180c190b200a10cf010b200341003602a80220082006200341a8026a1017211720032802a8022113200341a8026a41186a20034188016a41186a290300370300200341a8026a41106a20034188016a41106a290300370300200341a8026a41086a20034188016a41086a29030037030020032003290388013703a80220034100360288032003420137038003200320133602880220034188026a20034180036a103e0240024002402003280284032218200328028803220a6b20134f0d00200a20136a2202200a490d1520184101742212200220022012491b22024100480d152018450d012003280280032018200210212219450d020c0d0b2003280280032219200a6a201720131084041a200a20136a220a450d0d0c0e0b2002102222190d0b0b200241011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41b3e2c20041351039000b41a19bc20041f10020032802ac02200341a8026a41086a280200109c02000b411741011023000b413741011023000b41929cc200412b20032802ac02200341a8026a41086a280200109c02000b20032002360284032003201936028003200221182019200a6a201720131084041a200a20136a220a0d010b410021024101211241012019200a1084041a20180d010c020b200a4100480d05200a2102200a10222212450d0220122019200a1084041a2018450d010b201910200b2002200a6b41074b0d02200a41086a2218200a490d0320024101742219201820182019491b22184100480d03024002402002450d0020122002201810212212450d010c030b2018102222120d020b201841011023000b200a41011023000b201821020b2012200a6a200b3700000240024002402002200a41086a22186b41204f0d00201841206a22192018490d032002410174220a20192019200a491b220a4100480d032002450d0120122002200a10212212450d020c040b200a41286a21190c040b200a102222120d020b200a41011023000b1024000b200a21020b201220186a220a20032903a802370000200a41186a200341a8026a41186a290300370000200a41106a200341a8026a41106a290300370000200a41086a200341a8026a41086a29030037000020034188026a41186a220a420037030020034188026a41106a2218420037030020034188026a41086a221a420037030020034200370388022012201920034188026a100020034180036a41186a200a29030037030020034180036a41106a201829030037030020034180036a41086a201a29030037030020032003290388023703800302402002450d00201210200b02402013450d00201710200b200341c1026a20034198036a290300370000200341b9026a20034190036a290300370000200341b1026a20034188036a2903003700004101210a200341013a00a80220032003290380033700a9022000200341a8026a10cd012008200610150b2007450d010b20081020200341a0036a2400200a0f0b200341a0036a2400200a0b9d0902077f027e230041106b2202240020024100360208200242013703000240024002400240024002400240024002400240024020002d00004101470d00410110222203450d01200242818080801037020420022003360200200341013a000020034101412110212203450d02200242a180808090043702042002200336020020032000290001370001200341096a200041096a290000370000200341116a200041116a290000370000200341196a200041196a2900003700002001280200200128020420034121100341000d0a0c090b410110222203450d02200242818080801037020420022003360200200341003a0000200041286a28020021042002200041306a280200220536020c2002410c6a2002103e02400240024020022802042203200241086a28020022066b20054f0d00200620056a22072006490d0820034101742208200720072008491b22074100480d082003450d0120022802002003200710212203450d020c060b200228020021030c060b2007102222030d040b200741011023000b410141011023000b412141011023000b410141011023000b20022007360204200220033602000b200241086a2207200620056a360200200320066a200420051084041a200041086a29030021090240024002400240024020022802042204200728020022056b41084f0d00200541086a22062005490d0520044101742207200620062007491b22074100480d052004450d0120032004200710212203450d020c030b200541086a21060c030b2007102222030d010b200741011023000b20022007360204200220033602000b200241086a22042006360200200320056a20093700000240024002400240024020022802042205200428020022066b41204f0d00200641206a22042006490d0520054101742207200420042007491b22074100480d052005450d0120032005200710212203450d020c030b200641206a21040c030b2007102222030d010b200741011023000b2002200736020420022003360200200721050b200241086a2004360200200320066a220641186a200041346a220741186a290000370000200641106a200741106a290000370000200641086a200741086a29000037000020062007290000370000200041186a2903002109200041106a290300210a02400240024002400240200520046b41104f0d00200441106a22062004490d0520054101742207200620062007491b22074100480d052005450d0120032005200710212203450d020c030b200441106a21060c030b2007102222030d010b200741011023000b2002200736020420022003360200200721050b200320046a220420093700082004200a370000200241086a22042006360200200041206a2903002109200520066b41074b0d02200641086a22002006490d0020054101742207200020002007491b22004100480d00024002402005450d0020032005200010212203450d010c030b2000102222030d020b200041011023000b1024000b20022000360204200220033602000b2004200641086a360200200320066a2009370000200228020421002001280200200128020420022802002203200428020010032000450d010b200310200b200241106a24000b130020004101360204200041c09cc2003602000b13002000410936020420004198a0c2003602000b130020004104360204200041a4a0c2003602000b3201017f0240410810222202450d0020004288808080800137020420002002360200200242033700000f0b410841011023000bca0c040c7f027e027f087e230041b0036b22022400200241286a2001280200200128020428020c110500024002400240024020022903284201520d0020024184026a41046a2103200241c0026a41106a2104200241c0016a4101722105200241286a41086a2106200241c0026a41206a2107200241e4026a2108200241bc026a2109034020024198026a41186a220a200641186a29000037030020024198026a41106a220b200641106a29000037030020024198026a41086a220c200641086a2900003703002002200629000037039802200241c0016a20024198026a10f80202400240024020022d00c0014101470d0020024190036a41186a200541186a29000037030020024190036a41106a200541106a29000037030020024190036a41086a200541086a2900003703002002200529000037039003200241c0026a20024190036a10b1012007280200220d450d01200241c0026a41086a290300210e20022903c002210f2008280200450d02200d10200c020b200741003602000b4200210f4200210e0b20034200370200200341086a420037020020024190036a41186a220d200a29030037030020024190036a41106a220a200b29030037030020024190036a41086a2210200c290300370300200220022903980237039003200241c0026a41086a22114200370300200b20024184026a41106a280200360200200c20024184026a41086a2902003703002004200229039003370300200441086a2010290300370300200441106a200a290300370300200441186a200d290300370300200242003703c002200220022902840237039802200241c0016a41086a220a4200370300200242003703c001418feec0004116200241c0016a1002200241f0016a41086a220d200a290300370300200220022903c0013703f00102400240200241f0016a411041c8d7c400410041001001417f460d00200242003703c801200242003703c001200241f0016a4110200241c0016a4110410010012210417f460d052010410f4d0d05200241186a20022903c001200a290300427f42001087042002290318221242012012420156200241186a41086a29030022134200522013501b22101b22122013420020101b2213844200520d010c060b42002113420121120b200241086a200f200e201220131087040240024020022903082212500d00200241f0016a41106a200b280200360200200d200c290300370300200a2011290300370300200241c0016a41106a2004290300370300200241c0016a41186a200241c0026a41186a290300370300200241c0016a41206a2007290300370300200241c0016a41286a200241c0026a41286a29030037030020022002290398023703f001200220022903c0023703c001200220092800003600bb01200220022800b9023602b801420021144100210b200f2115200e2116200f2117200e2118201221190c010b4102210b0b200241a0016a41106a200241f0016a41106a280200360200200241a0016a41086a200d290300370300200241f0006a41086a200a290300370300200241f0006a41106a200241c0016a41106a290300370300200241f0006a41186a200241c0016a41186a290300370300200241f0006a41206a200241c0016a41206a290300370300200241f0006a41286a200241c0016a41286a290300370300200220022903f0013703a001200220022903c001370370200220022800bb0136006b200220022802b801360268200b4102470d02200241286a2001280200200141046a28020028020c11050020022903284201510d000b0b200041023a008001200241b0036a24000f0b2000201737031020002015370300200020193703402000410036022820004208370320200020022903a00137022c20002002290370370350200041186a201837030020002016370308200041c8006a2014370300200041346a200241a0016a41086a2903003702002000413c6a200241a0016a41106a280200360200200041d8006a200241f0006a41086a290300370300200041e0006a200241f0006a41106a290300370300200041e8006a200241f0006a41186a290300370300200041f0006a20024190016a290300370300200041f8006a20024198016a2903003703002000200b3a008001200020022802683600810120004184016a200228006b360000200241b0036a24000f0b419a88c00041331039000b41e88dc000102f000b8b0401047f230041e0006b2202240002400240410e10222203450d00200341066a41002900a3cf433700002003410029009dcf433700002003410e412e10212203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412e200241c0006a1000200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041c8d7c400410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031020200241e0006a24000f0b419a88c00041331039000b410e41011023000b412e41011023000b1300200041053602042000418cb3c2003602000b13002000410d360204200041ceb6c2003602000b130020004108360204200041dcb6c2003602000b130020004103360204200041ecbfc2003602000b130020004107360204200041c2c3c2003602000b130020004108360204200041ccc3c2003602000bc20602027f047e230041e0006b22032400200341386a41086a22044200370300200342003703384181e3c2004116200341386a1002200341d0006a41086a20042903003703002003200329033837035002400240024002400240200341d0006a411041c8d7c400410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821050c010b42c0843d21050b42002106200341386a41086a220442003703002003420037033841f0e2c2004111200341386a1002200341d0006a41086a2004290300370300200320032903383703500240200341d0006a411041c8d7c400410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821060b0240200520067d20025a0d00200041e2acc20036020420004101360200200041086a411b360200200341e0006a24000f0b42002105200341386a41086a220442003703002003420037033841d7e3c2004111200341386a1002200341d0006a41086a20042903003703002003200329033837035002400240200341d0006a411041c8d7c400410041001001417f460d002003420037034020034200370338200341d0006a4110200341386a4110410010012204417f460d042004410f4d0d04200341c0006a2903002105200329033821060c010b420121060b200341186a2005420020024200108804200341286a2002420020064200108804200341086a420042002006420010880402402003290310200329032084420052200341286a41086a2903002207200329030820032903187c7c220820075472450d00200041fdacc20036020420004101360200200041086a4127360200200341e0006a24000f0b200341386a200120032903282008410810aa02024020032802384101470d002000200329023c37020420004101360200200341e0006a24000f0b20032903402107200041306a200341386a41106a290300370300200041286a2007370300200041206a2005370300200041186a2006370300200041106a2002370300200041086a200237030020004100360200200341e0006a24000f0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000bc70703037f047e047f230022022103200241a0026b416071220224002001411c6a22042902002105200420022903d801370200200141146a22042902002106200420022903d0013702002001410c6a22042902002107200420022903c801370200200241003a00c00120012902042108200120022903c00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241c0016a41176a22042002290038370000200241c0016a41106a220a2002290031370300200241c0016a41086a220b2002290029370300200220022900213703c001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903c001370300411210222204450d01200441106a41002f00bbcf433b0000200441086a41002900b3cf43370000200441002900abcf4337000020044112413210212204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241c0016a41186a220a4200370300200241c0016a41106a220b4200370300200241c0016a41086a220c4200370300200242003703c00120044132200241c0016a100020024190016a41186a200a29030037030020024190016a41106a200b29030037030020024190016a41086a200c290300370300200220022903c0013703900120024190016a412041c8d7c400410041001001417f460d03200242203702b401200220024190016a3602b001200241c0016a200241b0016a10d90220022d00cc014102460d0420024180016a41086a220a200241c0016a41086a280200360200200220022903c00137038001200241206a200241cd016a41c3001084041a20024190016a41086a220b200a280200360200200220022903800137039001200241c0016a200241206a41c1001084041a200141246a20024180026a2d00003a00002001411c6a200241f8016a290000370000200141146a200241f0016a2900003700002001410c6a200241c0016a41286a290000370000200120022900e00137000420002002290300370000200041086a200241086a290300370000200041106a200241106a290300370000200041176a200241176a290000370000200020093a001f200041286a200b280200360200200020022903900137022020041020200324000f0b20004100360220200324000f0b411241011023000b413241011023000b41f1d1c20041d7001039000b419a88c00041331039000bc00703037f047e047f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042002290038370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a001370300411210222204450d01200441106a41002f00cdcf433b0000200441086a41002900c5cf43370000200441002900bdcf4337000020044112413210212204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41186a220a4200370300200241a0016a41106a220b4200370300200241a0016a41086a220c4200370300200242003703a00120044132200241a0016a1000200241f0006a41186a200a290300370300200241f0006a41106a200b290300370300200241f0006a41086a200c290300370300200220022903a001370370200241f0006a412041c8d7c400410041001001417f460d0320024220370294012002200241f0006a36029001200241a0016a20024190016a10820320022d00b8014102460d04200241a0016a41086a290300210820022802b001210a20022903a0012105200241206a200241b9016a41c7001084041a200241a0016a200241206a41c1001084041a200241206a200241a0016a41c1001084041a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2008370300200041286a2005370300200041386a200a360200200020093a00272000420137030020041020200324000f0b20004200370300200324000f0b411241011023000b413241011023000b41f1d1c20041d7001039000b419a88c00041331039000bf10a03027f027e077f230041e0016b22022400200241186a2001108e01024002402002280218450d00200228021c210320022001108c012002290300a7450d00200241106a29030021042002290308210541002106200241003a00c00120012802002001280204200241c0016a410120012802081001210720012001280208200741016a41014b22076a22083602082007450d01024020022d00c0012207450d0020074101470d02200241c0016a41186a22094200370300200241c0016a41106a220a4200370300200241c0016a41086a220b4200370300200242003703c001200141086a220641002001280200200141046a280200200241c0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d02200241a0016a41186a22072009290300370300200241a0016a41106a2206200a290300370300200241a0016a41086a2209200b290300370300200220022903c0013703a00120024180016a41186a220a200729030037030020024180016a41106a2207200629030037030020024180016a41086a22062009290300370300200220022903a00137038001200241e0006a41186a200a290300370300200241e0006a41106a2007290300370300200241e0006a41086a20062903003703002002200229038001370360410121060b200241c0006a41186a200241e0006a41186a290300370300200241c0006a41106a200241e0006a41106a290300370300200241c0006a41086a200241e0006a41086a2903003703002002200229036037034041002109200241003a00c0012001280200200141046a280200200241c0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d01024020022d00c0012207450d0020074101470d02200241c0016a41186a22094200370300200241c0016a41106a220a4200370300200241c0016a41086a220b4200370300200242003703c001200141086a220741002001280200200141046a280200200241c0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d02200241a0016a41186a22012009290300370300200241a0016a41106a2207200a290300370300200241a0016a41086a2208200b290300370300200220022903c0013703a00120024180016a41186a2209200129030037030020024180016a41106a2201200729030037030020024180016a41086a22072008290300370300200220022903a00137038001200241e0006a41186a2009290300370300200241e0006a41106a2001290300370300200241e0006a41086a20072903003703002002200229038001370360410121090b200241c0016a41186a2201200241e0006a41186a290300370300200241c0016a41106a2207200241e0006a41106a290300370300200241c0016a41086a2208200241e0006a41086a290300370300200220022903603703c001200241206a41186a220a200241c0006a41186a290300370300200241206a41106a220b200241c0006a41106a290300370300200241206a41086a220c200241c0006a41086a290300370300200220022903403703202000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290320370019200041216a200c290300370000200041296a200b290300370000200041316a200a2903003700002000413a6a20022903c001370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a200241a4016a2f01003b0100200041da006a20022801a001360100200241e0016a24000f0b200041023a0018200241e0016a24000f0b200041023a0018200241e0016a24000bd30302047f017e230041d0006b2202240002400240411c10222203450d00200341186a41002800c0d142360000200341106a41002900b8d142370000200341086a41002900b0d142370000200341002900a8d1423700002003411c413c10212203450d012003200129000037001c200341346a200141186a2900003700002003412c6a200141106a290000370000200341246a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a22054200370300200242003703302003413c200241306a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041c8d7c400410041001001417f460d002002200236022020024120360224200242003703302002410020024120200241306a41084100100122012001417f461b2201410820014108491b360228200141074d0d0220022903302106200241306a200241206a103820022802302201450d022000200229023437020c20002001360208200020063703000c010b200041003602080b20031020200241d0006a24000f0b419a88c00041331039000b411c41011023000b413c41011023000b1300200041023602042000419cd6c2003602000b1300200041043602042000419fd9c2003602000b130020004101360204200041a4d9c2003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010222206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b412041011023000bcf0202027f017e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d01200441012001109a02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141f8dac4004102200220006a41800120006b109b02210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141f8dac4004102200220006a41800120006b109b02210020024180016a240020000f0b2000418001102d000b2000418001102d000b13002000410536020420004194e6c2003602000b13002000410836020420004190dfc2003602000b130020004116360204200041ecf8c2003602000b3101017f0240410110222202450d00200042818080801037020420002002360200200241003a00000f0b410141011023000b3201017f0240410810222202450d0020004288808080800137020420002002360200200242003700000f0b410841011023000b9a0101017f230041e0006b22022400200241003a004c200241103602482002420137033820024201370330200242013703282002420137032020024201370318200242013703102002420137030820024201370300200242808080808080c00037034020024100360258200242013703502002200241d0006a109901200041086a200228025836020020002002290350370200200241e0006a24000b3401017f0240410810222202450d0020004288808080800137020420002002360200200242c0843d3700000f0b410841011023000b3301017f0240410410222202450d0020004284808080c00037020420002002360200200241e4003600000f0b410441011023000b3301017f0240410810222202450d0020004288808080800137020420002002360200200242af013700000f0b410841011023000b3301017f0240410810222202450d002000428880808080013702042000200236020020024287013700000f0b410841011023000b3901017f0240411010222202450d002002420037000820024215370000200042908080808002370204200020023602000f0b411041011023000be80102037f017e230041206b22012400200141106a41086a220242003703002001420037031041f0e2c2004111200141106a1002200141086a220320022903003703002001200129031037030042002104024002402001411041c8d7c400410041001001417f460d002001420037031020014110200141106a41084100100141016a41084d0d01200129031021040b200242003703002001420037031041f0e2c2004111200141106a100220032002290300370300200120012903103703002001200420007c37031020014110200141106a41081003200141206a24000f0b419a88c00041331039000b970e06057f087e037f057e017f057e23004180016b22012400200141306a41086a220242003703002001420037033041a39ec3004118200141306a1002200141106a41086a2002290300370300200120012903303703104100210341102104024002400240200141106a411041c8d7c400410041001001417f460d00200142103702242001200141106a360220200141306a200141206a10900120012d007c22034102460d022001410c6a41026a2202200141ff006a22052d00003a0000200120012f007d3b010c200129033021062001290338210720012903402108200129034821092001290350210a2001290358210b2001290360210c2001290368210d2001280270210e2001280274210f20012802782104200520022d000022023a0000200141206a41026a20023a0000200120033a007c200120043602782001200f3602742001200e3602702001200d3703682001200c3703602001200b3703582001200a37035020012009370348200120083703402001200737033820012006370330200120012f010c22023b007d200120023b01200c010b4201210d41808004210f4100210e4201210c4201210b4201210a420121094201210842012107420121060b200141306a41086a220242003703002001420037033041a5eec000411b200141306a1002200141106a41086a2205200229030037030020012001290330370310024002400240024002400240200141106a411041c8d7c400410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012210417f460d022010410f4d0d02200141386a2903002111200129033021120c010b42002112420021110b200242003703002001420037033041a0a0c3004111200141306a10022005200229030037030020012001290330370310024002400240200141106a411041c8d7c400410041001001417f460d0020014100360230200141106a4110200141306a41044100100141016a41044d0d02200128023021050c010b41e40021050b42002113200141306a41086a220242003703002001420037033041b1a0c3004114200141306a1002200141106a41086a20022903003703002001200129033037031002400240200141106a411041c8d7c400410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d042002410f4d0d04200141386a2903002113200129033021140c010b421521140b42002115200141306a41086a220242003703002001420037033041c5a0c3004114200141306a1002200141106a41086a221020022903003703002001200129033037031002400240200141106a411041c8d7c400410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012216417f460d052016410f4d0d05200141386a2903002117200129033021180c010b42002118420021170b200242003703002001420037033041d9a0c3004114200141306a1002201020022903003703002001200129033037031002400240200141106a411041c8d7c400410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d062002410f4d0d06200141386a2903002119200129033021150c010b420021190b200141306a41086a220242003703002001420037033041eda0c3004114200141306a1002200141106a41086a2002290300370300200120012903303703100240024002400240200141106a411041c8d7c400410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d022001290330211a0c010b428701211a0b200141306a41086a22024200370300200142003703304181a1c3004116200141306a1002200141106a41086a20022903003703002001200129033037031002400240200141106a411041c8d7c400410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d032001290330211b0c010b42af01211b0b20002012370350200020033a004c200020043602482000200f3602442000200e3602402000200d3703382000200c3703302000200b3703282000200a37032020002009370318200020083703102000200737030820002006370300200020012f01203b004d200020053602a001200041d8006a2011370300200041cf006a200141226a2d00003a000020004188016a20193703002000201537038001200041f8006a201737030020002018370370200041e8006a2013370300200020143703602000201b370398012000201a3703900120014180016a24000f0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000bf40d050c7f057e017f017e0a7f23004180016b22082400024002400240024002400240200728020c22094100480d00200941ffffffff07460d002007410c6a210a2007410c6a200941016a220b360200200741146a280200210c200741106a220d210e410021090340024002400240024002400240024020090e020001010b200e280200220f41086a2110200f2f010622114105742112417f21090240024002400240024003402012450d01200941016a2109417f410120042010412010860422134100481b410020131b2213450d03201241606a2112201041206a211020134101460d000b200c0d010c030b20112109200c450d020b200c417f6a210c200f20094102746a41880b6a210e410021090c090b200f41e8026a200941e0006c6a2209450d002009280200450d00200941106a2903002114200941086a29030021150c010b200841286a2007411c6a2802002004200741206a28020028021c110100200841306a2903002114200728020c210b200829032821150b2007410c6a200b417f6a360200200141186a29030021162007280240210920012903102117024041004101410220152014842218501b20021b22194101460d0020194102470d0220094180016a21094200211a20172016844200520d030c0d0b200941f0006a21094200211a20172016844200510d0c0c020b200d280200220f201d6a2110200f2f0106220d201e742112417f210902400240024003402012450d01200920196a2109201f201920032010202210860422132023481b202320131b2213450d03201220246a2112201020226a211020132019460d000b201c0d010c050b200d2109201c450d040b201c201f6a211c200f20092020746a20216a210d410121090c060b200f41e8026a200941e0006c6a2209450d022009280200450d02200941106a2903002116200941086a29030021170c030b200941e0006a21094200211a20172016844200510d0a0b200841186a2009290300200941086a290300201720161087042001201a2001290308221720082903187d221620162017562016507222091b37030802402009450d0041f8a9c3002109412221070c090b200a28020022094100480d04200941ffffffff07460d04410121192007410c6a200941016a221b360200200741146a280200211c4108211d4105211e417f211f4102212041880b21214120212241002123416021240c020b200841086a2007411c6a2802002003200741206a28020028021c110100200841106a2903002116200728020c211b200829030821170b200a201b417f6a3602000240201720057d221a201756201620067d2017200554ad7d221720165620172016511b4101470d00419aaac3002109411d21070c070b024020184200520d00200741c0006a2802002209290350200556200941d8006a290300221620065620162006511b450d0041b7aac3002109411f21070c070b200820034102201a201710ae01024020082802002209450d00200828020421070c070b0240201520057c22182015542209201420067c2009ad7c221620145420162014511b450d0041d6aac3002109412d21070c070b4100210920032004460d05200320044120108604450d05200a2003201a201710db01200a20042018201610db01200841e0006a41186a200341186a290000370300200841e0006a41106a200341106a290000370300200841e0006a41086a200341086a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a29000037030020082003290000370360200820042900003703400240024002400240200741306a28020022092007412c6a280200470d00200941016a22192009490d0320094101742212201920192012491b2212ad42d8007e2216422088a70d032016a722104100480d032009450d01200741286a280200200941d8006c201010212219450d020c070b200741286a28020021190c070b2010102222190d050b201041081023000b1024000b410121090c000b0b10d101000b2007412c6a2012360200200741286a2019360200200741306a28020021090b2019200941d8006c6a2219200829036037000141002109201941003a00002019200829034037002120192008280039360041201941096a200841e0006a41086a290300370000201941116a200841e0006a41106a290300370000201941196a200841e0006a41186a290300370000201941296a200841c0006a41086a290300370000201941316a200841c0006a41106a290300370000201941396a200841c0006a41186a290300370000201941c4006a2008413c6a280000360000201941d0006a200637030020192005370348200741306a2207200728020041016a3602000b0b200020073602042000200936020020084180016a24000f0b418caec200102f000bc50101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a2802002204450d002004210520032100034020002802880b21002005417f6a22050d000b0340200320032f01064102746a41880b6a28020021032004417f6a22040d000c020b0b200321000b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a1054200141306a24000b160020002001280208360204200020012802003602000b0e00200035020041012001109a020b8c0301037f230041c0006b22022400200141086a280200210320012802042104200220012802002201360210024002400240200141818004490d002002413c6a41013602002002410236021c200241b8aac4003602182002420237022c200241bcaac4003602282002200241186a3602382002200241286a102b2002280200450d010c020b02402004450d00200220033602140240200120034d0d00200241246a41023602002002413c6a41023602002002410236021c2002420237022c200241ccaac4003602282002200241106a3602202002200241146a3602182002200241186a3602382002200241286a102b20022802000d030c020b2003418080044d0d002002413c6a41013602002002410236021c200241b8aac4003602182002420237022c200241dcaac4003602282002200241186a3602382002200241286a102b20022802000d020c010b2002410036020020022802000d010b20004100360200200241c0006a24000f0b20002002290300370200200041086a200241086a280200360200200241c0006a24000bcd0601037f230041c0006b22042400024002400240024002400240024002400240024020012802084102470d00200128020022052d0000416e6a2201411e4b0d0141002106024020010e1f0002020202020202020202020202020202020202020202020202020a030405000b20042005280204220136020c200120034f0d05200220014101746a22012d0001450d06200441346a41013602002004410236023c20044202370224200441d8acc40036022020042004410c6a3602382004200441386a360230200441106a200441206a102b200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b412e10222201450d06200041013a0000200141266a41002900d0ac44370000200141206a41002900caac44370000200141186a41002900c2ac44370000200141106a41002900baac44370000200141086a41002900b2ac44370000200141002900aaac44370000200041086a42ae808080e005370200200041046a2001360200200441c0006a24000f0b412010222201450d06200041013a0000200141186a4100290090ad44370000200141106a4100290088ad44370000200141086a4100290080ad44370000200141002900f8ac44370000200041086a42a08080808004370200200041046a2001360200200441c0006a24000f0b410121060c060b410221060c050b410321060c040b200441346a41013602002004410236023c20044202370224200441e8acc40036022020042004410c6a3602382004200441386a360230200441106a200441206a102b200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b20012d000021060c020b412e41011023000b412041011023000b0240200541106a2d00004106470d00200041003a0000200020063a0001200441c0006a24000f0b0240412910222201450d00200041013a0000200141286a41002d00c0ad443a0000200141206a41002900b8ad44370000200141186a41002900b0ad44370000200141106a41002900a8ad44370000200141086a41002900a0ad4437000020014100290098ad44370000200041086a42a98080809005370200200041046a2001360200200441c0006a24000f0b412941011023000b90010002400240024020002d000022004101460d0020004102460d0120004103470d02200128021841d1cac40041032001411c6a28020028020c1100000f0b200128021841cbcac40041032001411c6a28020028020c1100000f0b200128021841cecac40041032001411c6a28020028020c1100000f0b200128021841c8cac40041032001411c6a28020028020c1100000b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ec81c5003602082002200236021820012000200241086a10d3032101200241206a240020010be0d00103037f037e067f230041f0006b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d0000417f6a220441aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01f602001b0f01aa01a701a901a301230c13a80104141a9a01531d2454063507a101880172269101a001a60134090e8a01399d01a40105023a43744b73568d01030a4616797b4184017825287a8901080d272e1218940196012298019c01a5015da201179b01601e5c119e019f0120920177750b1044472a1597011c6231930190018b012b193699013c29664d5767644c8001427e308c0187012d8e0195011f48402f8f01713d217f614a7c85012c3332383f6f5e6e83018201378601505181017668637d6b5f3b553e694e456c4f6d596a654958525a5bf6020b200141306a2802002204200141346a22052802004f0dad0120023100012106200141206a350200210720042001412c6a280200470df402200441016a22022004490de60220044101742205200220022005491b2202ad4203862208422088a70de6022008a722054100480de6022004450de401200141286a2802002004410374200510212204450de5010cf3020b200141306a2802002202417f6a220420024f0d9f02200420024b0d9f02200141286a220228020020044103746a22042d00044101470da90120043100052106200341d8006a200141186a200210bf032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110c0032003280258450df30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0da80120022001411c6a280200470def02200241016a22042002490de30220024101742205200420042005491b22044100480de3022002450ddf01200141186a2802002002200410212202450de0010cee020b200341d8006a200141186a2202200141286a2204410010c10320032d00584101470da801200341e0006a2903002106200328025c22010df0010cf1020b200341d8006a2001200241046a2802004102410010c0032003280258450df00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210c2032003280258450def0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010c2032003280258450dee0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450ded0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110c2032003280258450dec0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c4032003280258450deb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dea0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360248200441386a28020020024d0da2012003200428023020024102746a28020022023602282004412c6a28020020024d0db801200428022420024104746a22042d000d2109024020042802082202450d002004280200417f6a2104200141286a2105200141186a210a0340200341d8006a200a2005200420026a2d000010c10320032d00584101460de7012002417f6a22020d000b0b20094104460de902200141206a2802002202200141246a22042802004f0df30120022001411c6a280200470de402200241016a22042002490dda0220024101742205200420042005491b22044100480dda022002450d8702200141186a2802002002200410212202450d88020ce3020b200341d8006a2001410110c3032003280258450de80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410010c0032003280258450de70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20023100012106200341d8006a200141186a200141286a2204410010c10320032d00584101470da0012000200329025c370200200041086a200341e4006a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450de50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c3032003280258450de40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450de30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241046a280200210a2001280200210220034100360228200241146a280200450dac01200341d8006a200141186a2204200141286a2205410010c10320032d00584101470daf01200341e0006a2903002106200328025c22010df3010ce2020b200341d8006a200141046a200241046a28020010c60320032d00584101470d9c01200328025c2201450de102200341e0006a29030021060cb3010b200341d8006a2001410010c5032003280258450de00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450ddf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c3032003280258450dde0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450ddd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c7032003280258450ddc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360248200341d8006a200141046a200210c60320032d00584101470d9701200328025c21012003200341e0006a290300220637022c2003200136022820010daf010cdb020b200141306a2802002204200141346a22052802004f0d970120023100012106200141206a350200210720042001412c6a280200470dd302200441016a22022004490dcb0220044101742205200220022005491b2202ad4203862208422088a70dcb022008a722054100480dcb022004450dcb01200141286a2802002004410374200510212204450dcc010cd2020b200341d8006a2001410010c5032003280258450dd90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a28020022023602202001280200210420032002360254200441206a28020020024d0d9601200428021820024101746a22022d0001450db501200320022d000022023a0027200341d8006a200141186a200141286a410410c10320032d00584101470db801200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d9b020cd8020b200341d8006a2001410310c3032003280258450dd70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450dd60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c7032003280258450dd50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450dd40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450dd30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012d003822024104470d91010cc2020b200341d8006a2001200241046a2802004104410010c2032003280258450dd10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dd00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110c2032003280258450dcf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450dce0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dcd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450dcc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dcb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dca0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450dc90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450dc80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450dc70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450dc60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450dc50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dc40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450dc30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450dc20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110c2032003280258450dc10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310c2032003280258450dc00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c7032003280258450dbf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450dbe0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450dbd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210c0032003280258450dbc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110c0032003280258450dbb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110c8032003280258450dba0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450db90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450db80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110c8032003280258450db70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450db60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450db50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450db40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450db30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110c0032003280258450db20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450db10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210c8032003280258450db00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450daf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dae0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450dad0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410310c8032003280258450dac0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450dab0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012802002102200341003602282002280208450d750c94020b200341d8006a2001410110c5032003280258450da90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450da80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210c8032003280258450da70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410210c8032003280258450da60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450da50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410010c8032003280258450da40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110c8032003280258450da30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360228200441206a28020020024d0d62200141206a2802002205200141246a220a2802004f0d78200428021820024101746a2d0000210220052001411c6a280200470d8b02200541016a22042005490d93022005410174220a20042004200a491b22044100480d93022005450daa01200141186a2802002005200410212205450dab010c8a020b200341d8006a2001200241046a2802004108410110c2032003280258450da10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110c8032003280258450da00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d6020022001411c6a280200470d8602200241016a22042002490d900220024101742205200420042005491b22044100480d90022002450d9201200141186a2802002002200410212202450d93010c85020b200341d8006a2001410110c5032003280258450d9e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010c8032003280258450d9d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310c8032003280258450d9c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210c8032003280258450d9b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310c8032003280258450d9a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c3032003280258450d990220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c3032003280258450d980220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450d970220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110c8032003280258450d960220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c3032003280258450d950220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450d940220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450d930220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010c8032003280258450d920220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450d910220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310c8032003280258450d900220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450d8f0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450d8e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010c8032003280258450d8d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210c8032003280258450d8c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310c8032003280258450d8b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110c8032003280258450d8a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210c8032003280258450d890220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310c8032003280258450d880220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450d870220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450d860220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002202417f6a220420024f0db101200420024b0db101200128022820044103746a220a2802002205200141206a28020022024d0d482001411c6a280200220420026b200520026b22094f0d5d200220096a220b2002490df6012004410174220c200b200b200c491b220b4100480df6012004450d7c200141186a2802002004200b1021220c450d7d0ce6010b200341d8006a2001410210c5032003280258450d840220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010c2032003280258450d830220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d4420022001411c6a280200470de201200241016a22042002490df30120024101742205200420042005491b22044100480df3012002450d77200141186a2802002002200410212202450d780ce1010b20012802002102200341003602282002280208450d4d0cda010b200341d8006a2001410010c5032003280258450d800220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010c8032003280258450dff0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c7032003280258450dfe0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dfd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dfc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dfb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dfa0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450df90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110c8032003280258450df80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450df70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450df60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450df50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010c8032003280258450df40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450df30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450df20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450df10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450df00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450def0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450dee0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010c2032003280258450ded0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c4032003280258450dec0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410110c0032003280258450deb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dea0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450de90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d2c20022001411c6a280200470dc001200241016a22042002490dd90120024101742205200420042005491b22044100480dd9012002450d61200141186a2802002002200410212202450d620cbf010b200341d8006a2001410210c7032003280258450de70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450de60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450de50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110c2032003280258450de40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c7032003280258450de30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450de20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450de10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450de00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450ddf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dde0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450ddd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c7032003280258450ddc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a200141046a200241046a28020010c60320032d00584101470d20200328025c2201450ddb01200341e0006a29030021060c420b200341d8006a2001410210c3032003280258450dda0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c3032003280258450dd90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310c0032003280258450dd80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c3032003280258450dd70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c3032003280258450dd60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110c2032003280258450dd50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010c2032003280258450dd40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c3032003280258450dd30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241086a280200210a200241046a280200210420032002410c6a2802002205360240200141306a280200220220054d0d1820022005417f736a220520024f0d83014104210c0240200141286a220d280200220920054103746a22052d00044103460d0020052d0005210c0b2003200c3a0038200a450d34200c41ff0171220e4104470d33200a410274210a0340200320042802002205360240200220054d0d3e20022005417f736a220520024f0d7d0240200920054103746a22052d00044103460d0020052d00054104470d3e0b200441046a2104200a417c6a220a0d000b4104210c0c340b200341d8006a2001200241046a2802004101410010c0032003280258450dd10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c3032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110c2032003280258450dcf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360240200141306a280200220420024d0d1520042002417f736a220220044f0d8001200141286a220428020020024103746a22022d00044103460d9f0120022d0005220241ff01714104460d9f01200341d8006a200141186a22052004200210c10320032d00584101470d36200328025c2202450d9f01200341e0006a29030021060c9e010b200341d8006a200141186a200141286a410410c10320032d00584101470dcd01200328025c2201450dcd012000200341e0006a29030037020420002001360200200341f0006a24000f0b200241046a2802002102200341d8006a200141186a220a200141286a2205410010c10320032d00584101470d14200341e0006a2903002106200328025c22010d92010ccc010b200141306a2802002202417f6a220420024f0d78200420024b0d78200141286a220a28020020044103746a22042d0005210520042d00044101470d14200541ff01714104460d14200341ec006a41013602002003412936022c2003200441056a3602282003420237025c20034194a6c4003602582003200341286a360268200341086a200341d8006a102b200041086a200341086a41086a28020036020020002003290308370200200341f0006a24000f0b411a10222201450d7d200141186a41002f008fa6443b0000200141106a4100290087a644370000200141086a41002900ffa544370000200141002900f7a5443700002000429a808080a00337020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dc9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dc9012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a20022004410410c10320032d00584101470d16200341e0006a2903002106200328025c22010d470cc8010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dc7012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dc7012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a41013602002003410236023c2003420237025c200341c8aec4003602582003200341c8006a3602382003200341386a360268200341086a200341d8006a102b200329020c2106200328020822010d510cc6010b200141306a2802002202200141346a22052802004f0d15200141206a350200210720022001412c6a280200470d9b01200241016a22052002490db6012002410174220a20052005200a491b2205ad4203862208422088a70db6012008a7220a4100480db6012002450d4920042802002002410374200a10212202450d4a0c9a010b200141206a2802002202200141246a22042802004f0d1520032d0059210420022001411c6a280200470d9801200241016a22052002490db5012002410174220a20052005200a491b22054100480db5012002450d4a200141186a2802002002200510212202450d4b0c97010b200320032d005922023a0038200341d8006a200141186a200141286a410410c10320032d00584101470d16200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d170cc3010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dc2012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dc2012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a4101360200200341023602442003420237025c200341f8aec4003602582003200341d4006a3602402003200341c0006a360268200341086a200341d8006a102b0c1f0b200341d8006a200141186a2205200141286a200210c10320032d00584101470d15200328025c2202450db001200341e0006a29030021060c250b200341ec006a4101360200200341023602442003420237025c200341f8aec4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a102b20032802082201450dbf01200329020c21060c160b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dbe012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dbe012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dbd012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dbd012000200329022c37020420002001360200200341f0006a24000f0b2005200220052002491b21040ca1010b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dbb012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dbb012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a200141186a2205200141286a20032d0059220410c10320032d00584101470d13200328025c2201450dba01200341e0006a29030021060c210b200341086a410c6a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c20034180b0c4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a102b200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b200328022821022003200329022c37022c2003200236022820032802282202450d7b0c8b010b200341146a4102360200200341ec006a220241023602002003410236020c200320043602482003420237025c20034180b0c4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a102b200328022821042003200329022c37020c20032004360208200241013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b200328020c450d8601200328020810200c86010b200141306a280200210420032002360240200420024d0d1120042002417f736a220220044f0d6b200528020020024103746a22022d00044103460db70120022d0005220241ff01714104460db701200341d8006a200a2005200210c10320032d00584101470d38200328025c2201450db701200341e0006a29030021060c7d0b20024101470d1120012d003822024104470d1f0c83010b200341d8006a41146a41013602002003410236024c2003420237025c200341a8aec4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a102b200329020c2106200328020822010d460cb5010b200341ec006a41013602002003410236024c2003420237025c200341f8adc4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a102b20032802082202450d9e01200329020c21060c9f010b200341ec006a41013602002003410236024c2003420237025c200341f8adc4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a102b20032802082202450d8c01200329020c21060c8d010b20012802002209412c6a28020021022003200a3602282002200a4d0d112009280224200a4104746a220a2d000d21090240200a2802082202450d00200a280200417f6a210a0340200341d8006a20042005200a20026a2d000010c10320032d00584101460d372002417f6a22020d000b0b200941ff01714104460db201200141206a2802002202200141246a22052802004f0d4220022001411c6a280200470d7e200241016a22052002490da3012002410174220a20052005200a491b22054100480da3012002450d5620042802002002200510212202450d570c7d0b200341d8006a2002200420032d0059220510c10320032d00584101470d14200341e0006a2903002106200328025c22010d300cb1010b200341ec006a4101360200200341023602442003420237025c200341d8aec4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a102b200329020c2106200328020822010d3b0cb0010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450daf012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450daf012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dae012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dae01200329022c21060b2000200637020420002001360200200341f0006a24000f0b200320032d005922013a004020014104460dac01200241ff01712001460dac01200341086a41146a412b360200200341146a4123360200200341d8006a41146a41033602002003410236020c2003420337025c200341b4a6c4003602582003200341c0006a3602182003200341386a3602102003200341c8006a3602082003200341086a360268200341286a200341d8006a102b200329022c210620032802282201450dac010b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d0e20042001411c6a280200470d74200441016a220a2004490d9b0120044101742209200a200a2009491b220a4100480d9b012004450d3c20052802002004200a10212204450d3d0c730b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450da9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450da901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141186a280200220c200222046a210b20094102490d89010c8a010b200141206a2802002202200141246a220a2802004f0d0c20022001411c6a280200470d6e200241016a220a2002490d970120024101742209200a200a2009491b220a4100480d97012002450d3a20052802002002200a10212202450d3b0c6d0b200341146a4102360200200341ec006a220141023602002003410236020c200320043602482003420237025c20034180b0c4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a102b200328022821022003200329022c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b200329022c210620032802282201450da5010c6b0b200341d8006a200141186a2202200a10bf032003280258450d1f20002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002204200141346a22052802004f0d0f200141206a350200210720042001412c6a280200470d68200441016a22052004490d94012004410174220a20052005200a491b2205ad4203862208422088a70d94012008a7220a4100480d94012004450d3b20022802002004410374200a10212202450d3c0c670b200341ec006a41013602002003410236024c2003420237025c20034188afc4003602582003200341d4006a3602482003200341c8006a360268200341086a200341d8006a102b0b200328020821012003200329020c220637022c200320013602282001450da1010c640b200341ec006a41013602002003410236024c2003420237025c200341d8aec4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a102b200329020c2106200328020822010d310ca0010b200320032d005922013a00482001200241ff0171460d9f0120014104460d9f01200341086a41146a412b360200200341146a412b360200200341d8006a41146a41033602002003410236020c2003420337025c200341cca6c4003602582003200341c8006a3602182003200341276a3602102003200341206a3602082003200341086a360268200341286a200341d8006a102b200329022c2106200328022822010d620c9f010b200a410274210a0340200320042802002205360240200220054d0d0a20022005417f736a220520024f0d49200920054103746a22052d00044103460d0920052d0005220b4104460d09200e200b470d09200441046a2104200a417c6a220a0d000b0b200341d8006a200141186a2202200d410010c103024020032d00584101470d00200341306a200341e4006a2802003602002003200329025c370328200328022822020d700c600b200c41ff01714104470d1a0c5e0b200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d5c200441016a220a2004490d8d0120044101742209200a200a2009491b220a4100480d8d012004450d3620022802002004200a10212202450d370c5b0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082204450d8b012003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282202450d8b01200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d99012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d9901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d1720042001411c6a280200470d55200441016a220a2004490d880120044101742209200a200a2009491b220a4100480d88012004450d3320052802002004200a10212204450d340c540b200341d8006a200141186a2205200a200210c10320032d00584101470d18200328025c2202450d63200341e0006a29030021060c250b200341146a4129360200200341ec006a41023602002003200541056a3602102003412936020c2003420237025c200341a4a6c4003602582003200341386a3602082003200341086a360268200341286a200341d8006a102b200328022822020d670c570b200341146a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c20034180b0c4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a102b200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b200328022821022003200329022c37022c20032002360228200328022822020d660c560b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d93012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d93012000200329022c37020420002001360200200341f0006a24000f0b2004102222020d8e010b200441011023000b2005102222040d8e010b200541041023000b2005102222040d86010b200541041023000b2004102222020d720b200441011023000b2004102222020d690b200441011023000b200b1022220c0d690b200b41011023000b2004102222020d5d0b200441011023000b200541ff01714104460d8401200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d40200441016a220a2004490d7520044101742209200a200a2009491b220a4100480d752004450d2a20022802002004200a10212202450d2b0c3f0b200341e0006a2903002106200328025c22010d0e0c83010b200341d8006a2002200d200c10c10320032d00584101470d0e200328025c2202450d432003200341e0006a29030037022c20032002360228200328022822020d540c440b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d81012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d8101200329022c21060b2000200637020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082204450d502003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b200328020c450d4d20032802081020200328022822020d4e0c500b200141206a2802002204200141246a22052802004f0d0b20042001411c6a280200470d38200441016a22052004490d6f20044101742209200520052009491b22054100480d6f2004450d1e200a2802002004200510212204450d1f0c370b200141206a2802002204200141246a22092802004f0d0b20042001411c6a280200470d35200441016a22092004490d6e2004410174220b20092009200b491b22094100480d6e2004450d1f20052802002004200910212204450d200c340b200341e0006a2903002106200328025c22010d0d0c7c0b200a102222020d500b200a41041023000b2005102222020d4c0b200541011023000b2004102222050d5f0b200441011023000b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d752003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d75200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a22052802004f0d0a20042001411c6a280200470d29200441016a22052004490d642004410174220a20052005200a491b22054100480d642004450d1b20022802002004200510212202450d1c0c280b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d722003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d72200329022c21060c380b200341ec006a220241013602002003410236024c200320093602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082204450d3e2003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282202450d3e200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d6f2003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d6f200329022c21060b2000200637020420002001360200200341f0006a24000f0b200a102222040d360b200a41011023000b200a102222020d320b200a41011023000b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d692003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d692000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082204450d292003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282202450d292003200329022c37022c20032002360228200328022822020d3a0c2a0b200a102222020d2b0b200a41041023000b200a102222020d240b200a41011023000b200a102222040d200b200a41011023000b2004102222020d5b0b200441011023000b2005102222040d180b200541011023000b2009102222040d140b200941011023000b2005102222020d260b200541011023000b200a102222020d140b200a41011023000b2005102222020d0c0b200541011023000b41c2b0c400411d1039000b4118102222000d02411841011023000b4118102222000d02411841011023000b4118102222000d02411841011023000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c2003200136025841c3a5c4004134200341d8006a10ce03000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c200320013602584188a5c400413b200341d8006a10ce03000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c2003200136025841c3a5c4004134200341d8006a10ce03000b41c2b0c400411d1039000b41c2b0c400411d1039000b411a41011023000b41c2b0c400411d1039000b2001411c6a2005360200200141186a2002360200200141206a28020021040b200141186a28020020046a200c3a0000200141206a2202200228020041016a3602000c0a0b2001411c6a2009360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c140b2001411c6a2005360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2201200128020041016a3602000c450b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c430b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c120b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c3f0b20034100360228200328022822020d100b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d382004410174220c200b200b200c491b220b4100480d382004450d02200141186a2802002004200b1021220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1022220c0d020b200b41011023000b02404118102222000d00411841011023000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c200320013602584188a5c400413b200341d8006a10ce03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021083041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c3d0b2000200637020420002001360200200341f0006a24000f0b2001412c6a2005360200200141286a2002360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080802084370200200141306a2201200128020041016a3602000c3a0b2000200637020420002001360200200341f0006a24000f0b2001411c6a200a360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c370b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c250b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c330b200341d8006a200141186a200a10bf032003280258450d3220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20032802282202450d020b200329022c21060b2000200637020420002002360200200341f0006a24000f0b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d292004410174220c200b200b200c491b220b4100480d292004450d02200141186a2802002004200b1021220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1022220c0d020b200b41011023000b02404118102222000d00411841011023000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c200320013602584188a5c400413b200341d8006a10ce03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021083041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c2e0b2000200329022c37020420002002360200200341f0006a24000f0b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c2b0b2001412c6a2005360200200141286a2002360200200141306a28020021020b200141286a28020020024103746a200642288620078442808080801084370200200141306a2201200128020041016a3602000c290b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41023a0000200141206a2201200128020041016a3602000c270b0240200141206a2802002202200141246a22042802004f0d0020022001411c6a280200470d05200241016a22042002490d1820024101742205200420042005491b22044100480d182002450d02200141186a2802002002200410212202450d030c040b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d262003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282202450d26200329022c21060b2000200637020420002002360200200341f0006a24000f0b2004102222020d010b200441011023000b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c210b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c1f0b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021083041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c1a0b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41013a0000200141206a2201200128020041016a3602000c180b2001411c6a2004360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000c160b200341d8006a200141186a2204200141286a410010c103024020032d00584101470d00200328025c2202450d16200341e0006a29030021060c010b0240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d072002410174220a20052005200a491b22054100480d072002450d0220042802002002200510212202450d030c040b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d152003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282202450d15200329022c21060b2000200637020420002002360200200341f0006a24000f0b2005102222020d010b200541011023000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c100b200141306a2802002202417f6a220420024f0d01200420024b0d010240024002400240200128022820044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d042004410174220c200b200b200c491b220b4100480d042004450d02200141186a2802002004200b1021220c450d030c060b2005200220052002491b21040c090b200141186a280200220c200222046a210b20094102490d050c060b200b1022220c0d030b200b41011023000b1024000b02404118102222000d00411841011023000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c200320013602584188a5c400413b200341d8006a10ce03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021083041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c080b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080803084370200200141306a2201200128020041016a3602000c060b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c040b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41033a0000200141206a2201200128020041016a3602000c020b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a2006422886200784370200200141306a2201200128020041016a3602000b20004100360200200341f0006a24000b19002000200141186a280200360204200020012802103602000bb310012e7f230041a0016b220224000240024002400240200028020022034180e5c200460d00200028020421040c010b41ec0010222203450d0141002104200341003b010620034100360200200341086a200241086a41e4001084041a20004100360204200020033602000b200141ff017121050c010b41ec0041041023000b41002107024003400240024002400240024002400240024020070e020001010b200341086a210820032f0106210641002107024002400240034020062007460d014100417f4101200820076a2d0000220920054b1b20092005461b2209450d02200741016a210720094101460d000b2007417f6a21060b02402004450d002004417f6a2104200320064102746a41ec006a2802002103410021070c0a0b2000200028020841016a36020820032f01062207410b4f0d01200341086a2209200641016a220a6a200920066a2209200720066b1085041a200920013a0000200341146a2207200a4103746a200720064103746a2209200341066a22072f010020066b4103741085041a20094101360200200720072f010041016a3b0100200241a0016a24000f0b200320074103746a41146a42013702000c090b41ec001022220b450d04200b41003b0106200b4100360200200b41086a200241086a41e40010840421092003410e6a2d0000210c2003280248210d2003280244210e20092003410f6a200341066a220a2f010041796a22071084042109200b41146a200341cc006a2007410374108404210f200a41063b0100200b20073b010602400240200641064b0d00200341086a2207200641016a22096a200720066a220a200341066a22072f010020066b1085041a200a20013a0000200341146a220a20094103746a200a20064103746a220920072f010020066b4103741085041a200941013602000c010b20092006417a6a220a6a2009200641796a22066a2209200741ffff037120066b1085041a200920013a0000200f200a4103746a200f20064103746a2209200b41066a22072f010020066b4103741085041a200941013602000b4101210a200720072f010041016a3b010020032802002210450d014104210f410a2111419c0121124100211341082114419401211541c800211641c4002117410e2118410f21194106211a4179211b41cc00211c4114211d4103211e418801211f41ec002120417a21214102212241ffff03212341f0002124416c212541d4002126200341046a2f0100212720102f01062207410a4b0d060c020b201210222208450d02200820133b010620082013360200200820146a200241086a20151084042106201020166a280200212a201020176a2802002129201020186a2d000021282006201020196a2010201a6a222b2f01002209201b6a2207108404212c2008201d6a2010201c6a2007201e74108404212d200820206a2010201f6a200920216a222e202274108404212f202b201a3b0100200820073b01060240202e450d0041002107202f210603402006280200220920073b0104200920083602002006200f6a2106202e2007200a6a2207470d000b0b024002402027201a4b0d00201020146a22062027200a6a22076a200620276a2206202b2f0100220920276b222e1085041a2006200c3a00002010201d6a22062007201e746a20062027201e746a2206202e201e741085041a2006200e3602002006200d360204202b2009200a6a22063b0100201020206a22092027202274222b6a20146a200920072022746a222e2006202371220920076b2022741085041a202e200b360200202720094f0d012010202b6a20246a21070340200728020022062027200a6a22273b0104200620103602002007200f6a210720092027470d000c020b0b202c202720216a22066a202c2027201b6a22076a222e2008201a6a22092f010020076b1085041a202e200c3a0000202d2006201e746a202d2007201e746a222e20092f010020076b201e741085041a202e200e360200202e200d360204200920092f0100200a6a222e3b0100202f2027202274222b6a20256a202f20062022746a2209202e202371222720066b2022741085041a2009200b360200200620274b0d002008202b6a20266a21060340200628020022092007200a6a22073b0104200920083602002006200f6a210620272007470d000b0b024020102802002207450d002028210c2029210e202a210d2008210b2010200f6a2f01002127200722102f0106220720114d0d02410121070c070b2008210b202a210d2029210e2028210c0b419c0110222207450d03200741003b010620074100360200200741086a200241086a419401108404210920072000280200220636026c200020073602002000200028020441016a360204200641003b010420062007360200200720072f010622064103746a220a41186a200d360200200a41146a200e360200200920066a200c3a0000200741ec006a200641016a22064102746a200b360200200720063b0106200b20063b0104200b2007360200200241a0016a24000f0b201041086a2209202741016a22066a200920276a2209200720276b220a1085041a2009200c3a0000201041146a220920064103746a200920274103746a2209200a4103741085041a2009200e3602002009200d360204201041066a200741016a22073b0100201041ec006a220920274102746a41086a200920064102746a2209200741ffff0371220a20066b4102741085041a2009200b3602002027200a4f0d0520102006417f6a22074102746a41f0006a2106034020062802002209200741016a22073b010420092010360200200641046a2106200a2007470d000c060b0b419c0141041023000b41ec0041041023000b419c0141041023000b410121070c000b0b200241a0016a24000b8f4701af017f230041f0016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a28020021032001280208210441002105024002400240200141106a2802002206450d0041012107200241c0016a410172210841002109417f210a412c210b4109210c4108210d20024190016a41086a210e4111210f20024190016a41106a2110411921114118211220024190016a41186a21134121211420024190016a41206a21154127211620024190016a41276a2117410f2118417e2119410a211a410d211b4114211c200241c0016a41146a211d200241e4016a211e200241c0016a410c6a211f411c21204104212141ffffffff03212241702123410221244174212541582126416c212741002128410021294100212a4100212b4100212c4100212d4100212e4100212f4100213041002131410021320c010b4100210941002128410021294100212a4100212b4100212c4100212d4100212e4100212f4100213041002131410021010c010b410121010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e020001010b410421820120022802002183010240200241086a2802002201450d0020014104742132208301210103400240200141046a280200450d00200128020010200b200141106a2101203241706a22320d000b0b02402002280204450d0020830110200b2002410c6a2802002183010240200241146a2802002201450d00200141286c2132208301210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101203241586a22320d000b0b0240200241106a280200450d0020830110200b02402002411c6a280200450d00200241186a28020010200b0240200241286a280200450d00200241246a28020010200b0240200241346a280200450d00200241306a28020010200b2002413c6a280200218301200241c4006a2802002201450d01410421840120830120014104746a21850141102186014109218701410821880141ffffffff032189014170218a01208301218b01410121320c2d0b0240024020320e050001030507070b200e20042006200a6a2206200b6c6a2201200c6a29000037030020102001200f6a2900003703002013200120116a2900003703002015200120146a2900003703002017200141286a2800003600002002200129000137039001024020012d000022332018460d0020082002290390013700002008200d6a200e290300370000200841106a2010290300370000200820126a2013290300370000200841206a2015290300370000200820166a2017280000360000200220333a00c00141012134203320196a2235201a4b22360d3c02400240024002400240024002400240024002400240024002400240024002400240024020350e0b000102030405060708090a000b201f2802002137200241c0016a200d6a280200213820022802c40121392030450d0a0240203a450d00203a202174213b2030210103400240200120216a280200450d00200128020010200b200141106a2101203b20236a223b0d000b0b4100213b0240203c450d00203010200b2037213a2038213c203921300c4e0b201f2802002137200241c0016a200d6a280200213820022802c4012139202f450d0a0240203d450d00203d41286c213b202f210103400240200120216a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101203b20266a223b0d000b0b4100213e0240203f450d00202f10200b2037213d2038213f2039212f4101213b0c4e0b201f2802002140200241c0016a200d6a280200210120022802c401213302402041450d00202e450d00202e10200b2033212e2001214120060d200c2f0b201f2802002142200241c0016a200d6a280200210120022802c401213302402043450d00202d450d00202d10200b2033212d2001214320060d1e0c2d0b201f2802002144200241c0016a200d6a280200210120022802c401213302402045450d00202c450d00202c10200b2033212c2001214520060d1c0c2b0b201f2802002146200241c0016a200d6a280200214720022802c4012148202b450d072049450d42202b20492021746a214a202b214b4100214c0c4b0b201f2802002137200241c0016a200d6a280200213820022802c4012139202a450d0702402052450d002052201c6c213b202a210103400240200120216a280200450d00200128020010200b2001201c6a2101203b20276a223b0d000b0b4100214f02402053450d00202a10200b20372152203821532039212a4101213b4101213e4101214d41012150410121512036450d430c420b4101213120022802c401215420060d130c220b201f2802002155200241c0016a200d6a280200215620022802c40121572029450d062058450d422029205820206c6a21592029215a4101214c0c490b201f280200215c200241c0016a200d6a280200215d20022802c401215e2028450d06205f450d422028205f20126c6a2160202821614102214c0c490b201f2802002163200241c0016a200d6a280200216420022802c40121652009450d062066450d422009206620206c6a2167200921684103214c0c490b203921302038213c2037213a20060d190c280b2039212f2038213f2037213d20060d170c260b2048212b2047214e2046214920060d120c210b2039212a203821532037215220060d100c1f0b205721292056215b2055215820060d0e0c1d0b205e2128205d2162205c215f20060d0c0c1b0b20652109206421692063216620060d0a0c190b20062105410021010c430b0240208b012802082232450d00208b01280200210120322084017421320340024020012d0000208701470d0020012088016a28020020890171450d0020012084016a28020010200b20012086016a21012032208a016a22320d000b0b208b012086016a21010240208b012084016a280200450d00208b0128020010200b2001218b012001208501470d120b0240200241c0006a280200450d0020830110200b200241c8006a280200218c010240200241d0006a2802002201450d00200141146c2132208c01210103400240200141046a280200450d00200128020010200b200141146a21012032416c6a22320d000b0b0240200241cc006a280200450d00208c0110200b200241dc006a280200218c01200241e4006a2802002201450d01411c218d01208c012001411c6c6a218e01410c218f014108219001411421910141042192014110219301410921940141ffffffff032195014170219601208c01219701410221320c2d0b0240209701208f016a2802002232450d00209701280204210120322092017421320340024020012d0000209401470d0020012090016a28020020950171450d0020012092016a28020010200b20012093016a210120322096016a22320d000b0b02402097012090016a280200450d002097012092016a28020010200b209701208d016a210102402097012091016a280200450d0020970128021010200b20012197012001208e01470d110b0240200241e0006a280200450d00208c0110200b200241e8006a280200219801200241f0006a2802002201450d014118219901209801200141186c6a219a014104219b014114219c014110219d01410c219e014109219f01410821a00141ffffffff0321a101417021a20120980121a301410321320c2d0b024020a301209b016a280200450d0020a30128020010200b024020a301209c016a2802002232450d0020a30128020c21012032209b017421320340024020012d0000209f01470d00200120a0016a28020020a10171450d002001209b016a28020010200b2001209d016a2101203220a2016a22320d000b0b20a3012099016a2101024020a301209d016a280200450d0020a301209e016a28020010200b200121a3012001209a01470d100b0240200241ec006a280200450d0020980110200b41800121a401200241f4006a28020021a501200241fc006a2802002201450d01411c21a60120a5012001411c6c6a21a701410c21a801410821a901411421aa01410421ab01411021ac01410921ad0141ffffffff0321ae01417021af0120a50121b001410421320c2d0b024020b00120a8016a2802002232450d0020b0012802042101203220ab017421320340024020012d000020ad01470d00200120a9016a28020020ae0171450d00200120ab016a28020010200b200120ac016a2101203220af016a22320d000b0b024020b00120a9016a280200450d0020b00120ab016a28020010200b20b00120a6016a2101024020b00120aa016a280200450d0020b00128021010200b200121b001200120a701470d0f0b200220a4016a21010240200241f8006a280200450d0020a50110200b2066410020091b21322069410020091b218601205f410020281b218a012062410020281b2187012058410020291b219d01205b410020291b21960120524100202a1b21940120534100202a1b21930120494100202b1b21a201204e4100202b1b219f0120444100202c1b21af0120454100202c1b21ad0120424100202d1b21ac0120434100202d1b21890120404100202e1b21880120414100202e1b218301203d4100202f1b219001203f4100202f1b21a901203a410020301b219501203c410020301b218401200920820120091b21a101202820820120281b21a001202920820120291b21ae01202a208201202a1b219201202b208201202b1b218b01202c208201202c1b219b01202d208201202d1b219701202e208201202e1b21ab01202f208201202f1b21a301203020820120301b21b001200110e103024020024184016a2201280200450d0020024180016a28020010200b20024188016a20053602002001200336020020024180016a2004360200200241fc006a2032360200200241f8006a208601360200200241f4006a20a101360200200241f0006a208a01360200200241ec006a208701360200200241e8006a20a001360200200241e4006a209d01360200200241e0006a209601360200200241dc006a20ae01360200200241d8006a2054360200200241d4006a2031360200200241d0006a209401360200200241cc006a209301360200200241c8006a209201360200200241c4006a20a201360200200241c0006a209f013602002002413c6a208b01360200200241386a20af01360200200241346a20ad01360200200241306a209b013602002002412c6a20ac01360200200241286a208901360200200241246a209701360200200241206a2088013602002002411c6a208301360200200241186a20ab01360200200241146a209001360200200241106a20a9013602002002410c6a20a301360200200241086a2095013602002002208401360204200220b00136020020002002418c011084041a200241f0016a24000f0b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410121320c1a0b410221320c1b0b410321320c1c0b410421320c1d0b410021010c2b0b410021010c2a0b410021010c290b410021010c280b410021010c270b410021010c260b410021010c250b410021010c240b410021010c230b410021010c220b410021010c210b410121010c200b410121010c1f0b410121010c1e0b410121010c1d0b410121010c1c0b410121010c1b0b410121010c1a0b410121010c190b410121010c180b410121010c170b410121010c160b410121010c150b410121010c140b410121010c130b410121010c120b410121010c110b410121010c100b410121010c0f0b410121010c0e0b410021010c0c0b410821010c0b0b410121010c0a0b410221010c090b410321010c080b410421010c070b410521010c060b410621010c050b410721010c040b410921010c030b410921010c020b410921010c010b410921010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0a00010203040f10111234340b4100214d0240204e450d00202b10200b204621492047214e2048212b4101213b4101213e4101214f410121504101215120360d70410121010c87010b024020350e0b00040506070809720a0b0c000b203b450d4220022802c40121360240201f2802002201450d00200120217421332036210103400240200120216a280200450d00200128020010200b200141106a2101203320236a22330d000b0b200241c0016a200d6a280200450d422036102020060d160c210b410021500240205b450d00202910200b205521582056215b205721294101213b4101213e4101214d4101214f410121512036450d6d0c6c0b4100215102402062450d00202810200b205c215f205d2162205e21284101213b4101213e4101214d4101214f410121502036450d6a0c690b410021342069450d09200910202063216620642169206521094101213b4101213e4101214d4101214f4101215041012151410021342036450d670c660b203e450d3e20022802c40121360240201f2802002201450d00200141286c21332036210103400240200120216a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101203320266a22330d000b0b200241c0016a200d6a280200450d3e2036102020060d110c1c0b200241c0016a200d6a280200450d3d20022802c401102020060d0f0c1a0b200241c0016a200d6a280200450d3c20022802c401102020060d0d0c180b200241c0016a200d6a280200450d3b20022802c401102020060d0b0c160b204d450d3a20022802c401216a201f2802002201450d2b206a20012021746a216b206a216c4104214c0c6e0b204f450d3920022802c40121360240201f2802002201450d002001201c6c21332036210103400240200120216a280200450d00200128020010200b2001201c6a2101203320276a22330d000b0b200241c0016a200d6a280200450d392036102020060d080c130b2050450d3820022802c401216d201f2802002201450d2b206d200120206c6a216e206d216f4105214c0c6e0b2051450d3720022802c4012170201f2802002201450d2c2070200120126c6a2171207021724106214c0c6f0b2034450d3620022802c4012173201f2802002201450d2d2073200120206c6a2174207321754107214c0c700b206321662064216920652109410521010c790b4101213b410621010c780b4101213e410721010c770b4101214d4101214f41012150410121512036450d60410821010c760b024002400240024002402033201b4b0d000240024020330e0e0001020202020202023803040506000b200241c0016a200d6a280200450d3720022802c401102020060d0f0c1a0b0240200241c0016a200d6a280200450d0020022802c40110200b201d280200450d36200241c0016a41106a280200102020060d0d0c180b0240200241c0016a200d6a280200450d0020022802c40110200b0240201d2802002201450d00200241c0016a20126a280200450d00200110200b201e280200450d35200241c0016a41206a280200102020060d0e0c190b20022802c4012176201f2802002201450d2d2076200120206c6a2177207621784108214c0c700b20022802c4012179201f2802002201450d2e2079200120126c6a217a2079217b4109214c0c710b20022802c401217c201f2802002201450d2f207c200120206c6a217d207c217e410a214c0c720b02400240024020022d00c40122012024460d0020012007460d0120010d02201f280200450d34200241c0016a200d6a280200102020060d0a0c150b201f280200217f201d2802002201450d32207f20012021746a218001207f218101410b214c0c750b201f28020021350240201d2802002201450d002001410c6c2133203521010340024020012802002236450d00200120216a280200450d00203610200b2001410c6a2101203320256a22330d000b0b200241c0016a41106a280200450d322035102020060d070c120b201f280200450d31200241c0016a200d6a28020010200c310b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021010c6a0b410021010c690b410021010c680b410021010c670b410021010c660b410021010c650b410021010c640b410021010c630b410021010c620b410021010c610b410021010c600b410121010c5f0b410121010c5e0b410121010c5d0b410121010c5c0b410121010c5b0b410121010c5a0b410121010c590b410121010c580b410121010c570b410121010c560b410121010c550b02400240024002400240204c0e0c000102030406080a0c0e1012120b0240204b2802082237450d00204b2802002101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b204b41106a21010240204b20216a280200450d00204b28020010200b2001214b2001204a470d2e410021010c570b0240205a410c6a2802002237450d00205a2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b0240205a200d6a280200450d00205a20216a28020010200b205a20206a21010240205a201c6a280200450d00205a28021010200b2001215a20012059470d2e410221010c560b0240206120216a280200450d00206128020010200b02402061201c6a2802002237450d00206128020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b206120126a21010240206141106a280200450d002061410c6a28020010200b2001216120012060470d2e410321010c550b02402068410c6a2802002237450d0020682802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b02402068200d6a280200450d00206820216a28020010200b206820206a210102402068201c6a280200450d00206828021010200b2001216820012067470d2e410421010c540b0240206c2802082237450d00206c2802002101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b206c41106a21010240206c20216a280200450d00206c28020010200b2001216c2001206b470d2e0b200241c0016a200d6a280200450d0e206a102020060d120c1b0b0240206f410c6a2802002237450d00206f2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b0240206f200d6a280200450d00206f20216a28020010200b206f20206a21010240206f201c6a280200450d00206f28021010200b2001216f2001206e470d2d0b200241c0016a200d6a280200450d0c206d102020060d0f0c180b0240207220216a280200450d00207228020010200b02402072201c6a2802002237450d00207228020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b207220126a21010240207241106a280200450d002072410c6a28020010200b2001217220012071470d2c0b200241c0016a200d6a280200450d0a2070102020060d0c0c150b02402075410c6a2802002237450d0020752802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b02402075200d6a280200450d00207520216a28020010200b207520206a210102402075201c6a280200450d00207528021010200b2001217520012074470d2b0b200241c0016a200d6a280200450d082073102020060d090c120b02402078410c6a2802002237450d0020782802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b02402078200d6a280200450d00207820216a28020010200b207820206a210102402078201c6a280200450d00207828021010200b2001217820012077470d2a0b200241c0016a200d6a280200450d062076102020060d0b0c140b0240207b20216a280200450d00207b28020010200b0240207b201c6a2802002237450d00207b28020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b207b20126a21010240207b41106a280200450d00207b410c6a28020010200b2001217b2001207a470d290b200241c0016a200d6a280200450d042079102020060d0a0c130b0240207e410c6a2802002237450d00207e2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b0240207e200d6a280200450d00207e20216a28020010200b207e20206a21010240207e201c6a280200450d00207e28021010200b2001217e2001207d470d280b200241c0016a200d6a280200450d02207c102020060d090c120b208101223941106a218101024020392802042201450d0002402039410c6a2802002237450d002037410c6c21370340024020012802002238450d00200120216a280200450d00203810200b2001410c6a2101203720256a22370d000b0b2039200d6a280200450d00203920216a28020010200b208101208001470d270b200241c0016a41106a280200450d00207f102020060d080c110b2006450d08410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021010c3b0b410021010c3a0b410021010c390b410021010c380b410021010c370b410021010c360b410021010c350b410021010c340b410021010c330b410121010c320b410121010c310b410121010c300b410121010c2f0b410121010c2e0b410121010c2d0b410121010c2c0b410121010c2b0b410121010c2a0b4100214c0c140b4101214c0c140b4102214c0c140b4103214c0c140b4104214c0c150b4105214c0c160b4106214c0c170b4107214c0c180b4108214c0c190b4109214c0c1a0b410a214c0c1b0b410b214c0c1c0b410821010c1c0b410121010c1b0b410821010c1a0b410121010c190b410821010c180b410121010c170b410821010c160b410121010c150b410821010c140b410921010c130b410921010c120b410921010c110b410921010c100b410921010c0f0b410921010c0e0b410921010c0d0b410921010c0c0b410921010c0b0b410921010c0a0b410921010c090b410921010c080b410921010c070b410921010c060b410921010c050b410921010c040b410921010c030b410921010c020b410921010c010b410921010c000b0b0b9a0c02297f017e230041106b22022400024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042101200241086a200010980320022802082208200228020c22094104746a210a4100210b20094104490d0141ff01210c200341ff0171210d4101210e410d210f411c211041182111411d2112412c21134128211441202115412d2116413c211741c0002118413821194130211a413d211b413f211c4101211d0c020b20012802042104200241106a240020040f0b410021090c010b410121090b02400240024003400240024002400240024002400240024002400240024002400240024002400240024020090e020001010b2008200a460d01410421210240200741ff017122224104470d0041102123200341ff0171212441012125410d21264100211d0c0c0b41102127200341ff0171212841012129410d212a4102211d0c0f0b024002400240201d0e03010002020b024020082d000c200d470d0020082802082004470d002008280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008200f6a2d0000221f410446221e470d00201f2009460d0720200d07201e0d070b0240200820106a2d0000200d470d00200820116a2802002004470d00200841106a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820126a2d0000221f410446221e470d00201f2009460d0420200d04201e0d040b0240200820136a2d0000200d470d00200820146a2802002004470d00200820156a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820166a2d0000221f410446221e470d00201f2009460d0520200d05201e0d050b0240200820176a2d0000200d470d00200820196a2802002004470d002008201a6a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008201b6a2d0000221f410446221e470d00201f2009460d0620200d06201e0d060b200b41046a210b200a200820186a22086b201c4b0d0a410021090c110b024020082d000c2024470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920256a2109201f2d0000201d2d0000460d000c020b0b200820266a2d00002021460d060b200b20256a210b200820236a2208200a470d080c010b024020082d000c2028470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920296a2109201f2d0000201d2d0000460d000c020b0b2008202a6a2d000022092022470d0020092021470d050b200b20296a210b200820276a2208200a470d090b024002400240200041046a28020020002802082208470d00200841016a22092008490d082008410174220e20092009200e491b220ead420486222b422088a70d08202ba7221d4100480d082008450d0120002802002008410474201d10212209450d020c120b200028020021090c120b201d102222090d100b201d41041023000b200b410172210b20050d030c100b200b410272210b20050d020c0f0b200b410372210b0b2005450d0d0b20011020200241106a2400200b0f0b1024000b4100211d0c030b4101211d0c030b4102211d0c030b410121090c040b410121090c030b410121090c020b410121090c010b410121090c000b0b20002009360200200041046a200e360200200041086a28020021080b200920084104746a220820063b010e200820073a000d200820033a000c200820043602082008200536020420082001360200200041086a2204200428020041016a360200200220001098032002280204417f6a210b0b200241106a2400200b0bac24032d7f017e2b7f230041306b220224002001280204210320012802002104410121050240024002400240024020012802082206450d00412c10222207450d02200720022f002d3b0001200741023a00002007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002108410121090c010b4104210741002109410121080b200141106a280200210a200128020c210b024002400240200141146a280200220c450d002009410174220d200941016a220e200e200d491b220d412c6c210e2009450d0120072009412c6c200e10212207450d020c040b2009210d0c040b200e102222070d020b200e41041023000b412c41041023000b20072009412c6c6a220e20022f002d3b0001200e41033a0000200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200941016a2109410021050b2001411c6a280200210f2001280218211041002111024002400240024002400240024002400240200141206a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310212207450d020c030b410021140c040b2013102222070d010b201341041023000b200e210d0b20072009412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012114200941016a21090b200141286a28020021152001280224211602402001412c6a2802002212450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310212207450d010c020b2013102222070d010b201341041023000b200e210d0b20072009412c6c6a220e41053a0000200e201236000c200e2015360008200e2016360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012111200941016a21090b200141346a280200211720012802302118024002400240024002400240200141386a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310212207450d020c030b410021190c040b2013102222070d010b201341041023000b200e210d0b20072009412c6c6a220e41063a0000200e201236000c200e2017360008200e2018360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012119200941016a21090b200141c0006a280200211a200128023c211b4101211c024002400240024002400240200141c4006a280200221d450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210212207450d020c030b4101211e0c040b2012102222070d010b201241041023000b200e210d0b20072009412c6c6a220e41073a0000200e201d36000c200e201a360008200e201b360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100211e0b200141cc006a280200211f200128024821200240200141d0006a2802002221450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210212207450d010c020b2012102222070d010b201241041023000b200e210d0b20072009412c6c6a220e41083a0000200e202136000c200e201f360008200e2020360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241086a41086a290200370200200e2002290208370210200941016a21094100211c0b41012122024020012802544101470d00200141d8006a28020021120240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310212207450d010c020b2013102222070d010b201341041023000b200e210d0b20072009412c6c6a220e41093a0000200e2012360204200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41206a280200360200200e41206a200241086a41186a290200370200200e41186a200241086a41106a290200370200200e41106a200241106a290200370200200e2002290208370208200941016a21090b200141e0006a2802002123200128025c21240240200141e4006a2802002225450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210212207450d010c020b2012102222070d010b201241041023000b200e210d0b20072009412c6c6a220e410a3a0000200e202536000c200e2023360008200e2024360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021220b200141ec006a28020021262001280268212741012128024002400240024002400240200141f0006a2802002229450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210212207450d020c030b4101212a0c040b2012102222070d010b201241041023000b200e210d0b20072009412c6c6a220e410b3a0000200e202936000c200e2026360008200e2027360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100212a0b200141f8006a2802002112200128027421130240200141fc006a280200222b450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22282028200e491b220ead422c7ea722284100480d02024002400240200d450d002007200d412c6c202810212207450d010c020b2028102222070d010b202841041023000b200e210d0b20072009412c6c6a220e410c3a0000200e202b36000c200e2012360008200e2013360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021280b20014184016a280200212c200128028001210e024002400240200d20096b20014188016a280200412c6c222d412c6d22014f0d00200920016a22012009490d03200d410174222e20012001202e491b222ead422c7e222f422088a70d03202fa722304100480d03200d450d012007200d412c6c203010212207450d020c040b200920016a21010c040b2030102222070d020b203041041023000b1024000b202e210d0b20072009412c6c6a200e202d1084041a0240202c450d00200e10200b0240024002400240024041c00510222209450d002000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200936021020024280c2cdeb16370308200241106a10e103200910202028450d02202b450d01411c21312013202b411c6c6a2132410c2133410821344114213541042136411021374109213841ffffffff0321394170213a2013213b4100213c0c030b41c00541041023000b410021010c020b410121010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b2012450d0e20131020410121010c160b202a450d022029450d014118213d2027202941186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff03214541702146202721474101213c0c0f0b02400240203c0e0400010407070b0240203b20336a2802002209450d00203b2802042101200920367421090340024020012d00002038470d00200120346a280200203971450d00200120366a28020010200b200120376a21012009203a6a22090d000b0b0240203b20346a280200450d00203b20366a28020010200b203b20316a21010240203b20356a280200450d00203b28021010200b2001213b20012032470d09410021010c150b02402047203f6a280200450d00204728020010200b0240204720406a2802002209450d00204728020c21012009203f7421090340024020012d00002043470d00200120446a280200204571450d002001203f6a28020010200b200120416a2101200920466a22090d000b0b2047203d6a21010240204720416a280200450d00204720426a28020010200b200121472001203e470d090b2026450d00202710200b2022450d022025450d01411c214820242025411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff03215041702151202421524102213c0c0e0b02402052204a6a2802002209450d00205228020421012009204d7421090340024020012d0000204f470d002001204b6a280200205071450d002001204d6a28020010200b2001204e6a2101200920516a22090d000b0b02402052204b6a280200450d002052204d6a28020010200b205220486a210102402052204c6a280200450d00205228021010200b2001215220012049470d070b2023450d00202410200b0240201c450d0002402021450d00202141146c21092020210103400240200141046a280200450d00200128020010200b200141146a21012009416c6a22090d000b0b201f450d00202010200b201e450d02201d450d0141042153201b201d4104746a215441102155410921564108215741ffffffff03215841702159201b215a4103213c0c0d0b0240205a2802082209450d00205a2802002101200920537421090340024020012d00002056470d00200120576a280200205871450d00200120536a28020010200b200120556a2101200920596a22090d000b0b205a20556a21010240205a20536a280200450d00205a28020010200b2001215a20012054470d050b201a450d00201b10200b02402017410047201941017371450d00201810200b02402015410047201141017371450d00201610200b0240200f410047201441017371450d00201010200b02402005450d000240200c450d00200c41286c2109200b210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101200941586a22090d000b0b200a450d00200b10200b02402008450d0002402006450d00200641047421092004210103400240200141046a280200450d00200128020010200b200141106a2101200941706a22090d000b0b2003450d00200410200b200241306a24000f0b4100213c0c040b4101213c0c050b4102213c0c060b4103213c0c070b410121010c070b410221010c060b410221010c050b410221010c040b410221010c030b410221010c020b410221010c010b410221010c000b0bb505000240024002400240024002400240024002400240200041ff0171417f6a220041aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020000eab014a00000000000000000000000000010101010103030404050506060707080809094b0a0a0b0b0c0c0d0d4c4d0e0e0f0f10101111121213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f20204e212122224f2323242450252526262727282829292a2a512b2b2c2c2d2d2e2e2f2f30303131323233333434353536363737383839393a3a3b3b3c3c3d3d3e3e523f3f404041414242434344444545464647474848020202024a0b410a0f0b41080f0b41100f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410f0f0b410f0f0b410e0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b41110f0b41120f0b41050f0b41130f0b41140f0b41000f0b41020f0b41000f0b41020f0b410e0b800203047f017e017f024002400240200041086a28020022032001490d0002400240024002402003200041046a280200470d00200341016a22042003490d0320034101742205200420042005491b2206ad4204862207422088a70d032007a722084100480d032003450d0120002802002003410474200810212205450d020c050b200341016a2104200028020021050c050b2008102222050d030b200841081023000b1024000b41c0b8c400102f000b20002005360200200041046a20063602000b200520014104746a220541106a2005200320016b4104741085041a200541086a200241086a29030037030020052002290300370300200041086a20043602000b9e0503057f017e017f230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a10a2032103024002400240024002400240024002402000411c6a280200200041206a2802002204470d00200441016a22052004490d0520044101742206200520052006491b2206ad4202862207422088a70d052007a722084100480d052004450d01200041186a2802002004410274200810212205450d020c030b200041186a28020021050c030b2008102222050d010b200841041023000b2000411c6a2006360200200041186a2005360200200041206a28020021040b200520044102746a2003360200200041206a2204200428020041016a360200200241186a41106a200241106a290300370300200241186a41086a200241086a29030037030020022002290300370318024002400240200041ec006a280200200041f0006a2802002204470d00200441016a22052004490d0320044101742203200520052003491b2203ad42187e2207422088a70d032007a722064100480d032004450d01200041e8006a280200200441186c200610212205450d020c040b200041e8006a28020021050c040b2006102222050d020b200641041023000b1024000b200041ec006a2003360200200041e8006a2005360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000b9e900117097f017e5a7f037e047f017e117f017e187f017e1c7f027e127f037e497f027e017f017e107f047e107f017e1e7f23002203210420034180096b41607122032400024002400240024002400240024002400240411010222205450d00200541063a0000412010222206450d01200641063a001020064100360204200620032f00c0053b00012006412d3a0000200641036a200341c2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d00200528020410200b20051020200141106a2802002207412c6c21052001280208220841586a210902400240024002400240024003402005450d01200541546a2105200941286a210a2009412c6a220b2109200a2d00004107470d000b200320032f01a0033b01c005200b41046a280200200b41086a2802002205470d01200541016a22092005490d0e2005410174220a20092009200a491b220aad420486220c422088a70d0e200ca722074100480d0e2005450d04200b2802002005410474200710212209450d050c0b0b411010222209450d0720094180023b010c200942828080802037020420092006360200200920032f01a0033b010e2001410c6a2802002007470d09200741016a22052007490d0d2007410174220a20052005200a491b2205ad422c7e220c422088a70d0d200ca7220a4100480d0d2007450d0120082007412c6c200a10212208450d020c080b200b28020021090c0a0b200a102222080d060b200a41041023000b2007102222090d060b200741041023000b411041081023000b412041081023000b411041041023000b2001410c6a2005360200200141086a20083602000b200141106a200741016a220d36020020082007412c6c6a220520032f00b0043b0001200541073a0000200542818080801037000820052009360004200520032902c005370210200541036a200341b2046a2d00003a0000200541186a200341c8056a290200370200200541206a200341c0056a41106a290200370200200541286a200341c0056a41186a2802003602004100210e0c020b200b2009360200200b41046a200a360200200b41086a28020021050b200920054104746a22054180023b010c200542828080802037020420052006360200200520032f01c0053b010e200b41086a2205200528020041016a360200200341c0006a200b1098032003280244417f6a210e200141106a280200210d200141086a28020021080b200d412c6c2105200841586a210902400340410021062005450d01200541546a2105200941286a210a2009412c6a220b2109200a2d00004103470d000b200b41086a2802002205450d00200541286c2109200b28020041186a2105410021060340200620052d0000456a2106200541286a2105200941586a22090d000b0b200d412c6c2105200841586a2109024003404100210a2005450d01200541546a2105200941286a210b2009412c6a22072109200b2d00004103470d000b200741086a2802002205450d00200541286c2109200728020041186a21054100210a0340200a20052d0000456a210a200541286a2105200941586a22090d000b0b200d412c6c2105200841606a21090240024003402005450d01200541546a2105200941206a210b2009412c6a22072109200b2d00004104470d000b200728020021050c010b410021050b02402005200a6a220fad220c421e88a70d00200c420286a72205417f4c0d0002400240024002400240024002402005450d00200510762208450d02200f0d010c030b41042108200f450d030b2008200f4102746a2110410021114101211241042113200141106a2114412c211541082116200141086a211741582118415421194128211a410b211b4118211c4103211d2008211e4100211f0c030b200541041023000b410021050c020b410021050c010b410121050b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e020001010b200141086a2802002121412c2123200141106a2802002220450d370c010b024002400240024002400240024002400240201f0e050001030405050b024020112006490d002014280200222020156c220a21052017280200222120186a220b210902400340410021072005450d01200520196a21052009201a6a210d200920156a22222109200d2d0000201d470d000b202220166a2802002205450d002005201a6c21092022280200201c6a2105410021070340200720052d0000456a21072005201a6a2105200920186a22090d000b0b201120076b220720114b0d060340200a450d03200a20196a210a200b201a6a2105200b20156a2209210b20052d0000201b470d000b200920166a28020020074d0d0720092802002007201c6c6a2802082109200341c0056a2007200110d40320032802c405210520032802c0052012460d08201e200520096a3602000b201120126a2111201e20136a221e2010470d0c410021050c430b20212d0000202a470d3c202128020c2205450d3c202128020422702005202b6c6a2171410021720c1f0b412c10222205450d07200541286a41002800a6b344360000200541206a410029009eb344370000200541186a4100290096b344370000200541106a410029008eb344370000200541086a4100290086b344370000200541002900feb2443700000c360b20840121c3010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020bb01208c01712205207c460d002005208d01470d01410021050c4d0b20ba01208c01712205208d01460d0102402005207c470d000340208a0120810122056b208e014d0d05200528020c450d0920052090016a280200450d0d20052093016a280200450d1120052096016a21810120052097016a2802000d000b20052098016a28020021c4010c150b0340208a0120810122056b208e014d0d05200528020c450d0920052090016a280200450d0d20052093016a280200450d1120052096016a21810120052097016a2802000d000b20052098016a28020021c4010c190b20ba01208c01712205208d01460d0102402005207c470d000340208a0120810122056b208e014d0d06200528020c450d0a20052090016a280200450d0e20052093016a280200450d1220052096016a21810120052097016a2802000d000b20052098016a28020021c4010c1b0b0340208a0120810122056b208e014d0d06200528020c450d0a20052090016a280200450d0e20052093016a280200450d1220052096016a21810120052097016a2802000d000b20052098016a28020021c4010c1c0b20b801207c470d1c20830120b901460d1c0c490b20b801207c470d3020830120b901460d2f410321050c490b2005208a01460d4b2005208f016a21090340200528020c450d1020092089016a210920052089016a2205208a01470d000c4c0b0b2005208a01460d102005208f016a21090340200528020c450d1420092089016a210920052089016a2205208a01470d000b208a0121810120b801207c460d270c280b410121ba012005208a01460d102005208f016a21090340200528020c450d1520092089016a210920052089016a2205208a01470d000b208a012181012085010d310c490b2005208a01460d102005208f016a21090340200528020c450d1620092089016a210920052089016a2205208a01470d000b208a0121810120b801207c460d290c2a0b20052089016a2181012005208f016a28020021c4010c0c0b20052089016a2181012005208f016a28020021c4010c100b20052089016a2181012005208f016a28020021c4010c110b20052089016a2181012005208f016a28020021c4010c120b20052091016a21810120052092016a28020021c4010c080b20052091016a21810120052092016a28020021c4010c0c0b20052091016a21810120052092016a28020021c4010c0d0b20052091016a21810120052092016a28020021c4010c0e0b20052094016a21810120052095016a28020021c4010c040b20052094016a21810120052095016a28020021c4010c080b20052094016a21810120052095016a28020021c4010c090b20052094016a21810120052095016a28020021c4010c0a0b2009208b016a218101200928020021c4010b410121ba01410121bb0120c301218401200320c40136027c20080d250c380b200521810120b801207c470d150c140b20052181012085010d1f0c380b200521810120b801207c470d170c160b2009208b016a218101200928020021c4010b410121bb01410021ba0120c301218401200320c40136027c20080d1e0c330b2009208b016a218101200928020021c4010b410021bb01410121ba0120c301218401200320c40136027c20080d1d0c310b2009208b016a218101200928020021c4010b410021ba01410021bb0120c301218401200320c40136027c20080d1d0c2f0b0340208201208801460d31200341286a208201109f032003280228228301450d312082012087016a218201208301208301200328022c208d01746a22b901470d2d0c000b0b20c101220520e3016a21c101200528020021bb02200341e0006a21bc02200328026421bd020c140b024020c1022d0000220520c302460d000240200520cf02460d00200520c702470d2f20c10228020c2205450d2f20c10228020422d102200520d0026c6a21d202410a21720c290b20c10228020421d602200341e0006a21d702200328026421d8020c150b20c10228020c2205450d2d20c10228020422d902200520c4026c6a21da02410c21720c290b412c10222205450d04200541286a41002800fab244360000200541206a41002900f2b244370000200541186a41002900eab244370000200541106a41002900e2b244370000200541086a41002900dab244370000200541002900d2b2443700000c320b411e10222205450d04200541166a41002900c0b344370000200541106a41002900bab344370000200541086a41002900b2b344370000200541002900aab344370000429e808080e003210c0c320b200341c8056a290300210c2008102020050d3241002108412c21232020450d360b2021202020236c6a212441142125200341b0046a41146a2126200341b0076a212741012128200341c0056a4101722129410b212a4118212b410c212c4104212d4102212e200341a4076a212f200341a0076a21304113213120034190076a213241d700213320034184076a213420034180076a2135412d2136200341f4066a2137200341f0066a213841122139200341e4066a213a200341e0066a213b200341d0066a213c4106213d200341c0066a213e4100213f200341b0066a21404184082141200341a0066a21424137214320034194066a214420034190066a214520034184066a214620034180066a2147200341f4056a2148200341f0056a21494120214a200341c0056a41206a214b41d600214c4110214d200341c0056a41106a214e4108214f200341b0046a41086a215041ac0121514109215241ffffffff032153200341e8056a2154200341e4056a2155200341f8056a215620034188066a215720034198066a2158200341a8066a2159200341a4066a215a200341b8066a215b200341b4066a215c200341c8066a215d200341c4066a215e200341d8066a215f200341d4066a2160200341e8066a2161200341f8066a216220034188076a216320034198076a216420034194076a2165200341a8076a21664208216742042168422021694103216a4170216b41ff01216c412c216d4201216e41d8b3c400216f4101211f0c040b412c41011023000b412c41011023000b411e41011023000b4100211f410121050c360b410121050c350b410421720c120b410321720c120b410421720c120b410321720c120b410521720c120b410621720c120b410521720c120b410621720c120b410721720c120b410821720c120b410921720c120b410b21720c130b410121050c150b410121050c140b410221050c130b410221050c120b410221050c110b410221050c100b410421050c0f0b410421050c0e0b410421050c0d0b410421050c0c0b410421050c0b0b410421050c0a0b410421050c090b410421050c080b410421050c070b410421050c060b410421050c050b410421050c040b410421050c030b410421050c020b410421050c010b208301450d0320830128020021c401410121b801410221ba01208301208b016a218301410121bb0120c301218401200320c40136027c2008450d01410221050b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e05000102030f0f0b208501450d39410121050c360b4100218501410221bb014100218401200320c30122c40136027c2008450d36410221050c350b200f20c4014d0d05200820c401208d01746a2802002209450d0b20bd0120bc01470d0320bc01207c6a220520bc01490d4920bc01207c74220a20052005200a491b22bd01ad20800186220c20990188a70d49200ca72205207f480d4920bc01450d0120bf0120bc01208d01742005102122be010d020c090b208301208b016a2105208301450d0320830128020021c401410021bb01410221ba01410121b801200521830120c301218401200320c40136027c20080d170c340b2005102222be01450d070b20be0121bf0120be0121c00120be0121c1010b20c10120bc01208d01746a20c401360200200341c0056a200328027c22c501200341c8006a10d603209c0128020021c60120032802c40521c20120032802c00522c701207c460d0220c2012802082205209d014c0d4420c2012d000c210b024002402005450d0020c201280200210720051022220a450d06200a200720051084041a0c010b4101210a0b20c201209e016a2d000021072003200936029c012003200328027c360298012003207f36029001200320073a008d012003200b3a008c01200320053602880120032005360284012003200a3602800102400240200328027022c801208601460d00200328027421c9010c010b209f01102222c801450d07410021c90120c80141003b010620c801410036020020c801209b016a200341c0056a20a0011084041a20034100360274200320c8013602700b20bc01207c6a21bc010c090b410221ba01410121b80120052183012085010d110c320b200341d4056a4101360200200341023602a403200341d0056a200341a0036a360200200342023702c40520034198bdc4003602c0052003200341fc006a3602a003200341b0046a200341c0056a102b20032902b404228001422088a7210920032802b00421c201208001a721c6010c010b209a0128020021090b20032802702003280274200341f8006a28020010d703024020bd01450d0020be0110200b0240207d450d00207d412c6c217c207e210503402005104d2005412c6a2105207c41546a227c0d000b0b0240200341d4006a280200450d00207e10200b200020c20136020420004101360200200041086a2009ad42208620c601ad843702002008450d38200f450d3820081020200424000f0b200541011023000b200541041023000b41940341041023000b4102211f410121050c3b0b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020720e0d000102060708090b0c0f101112120b207020256a22732802002274450d4c2070202c6a2175410021760c400b20c801209b016a210a20c8012f01062207208d01742109417f21050240024002400240024003402009450d012005207c6a2105207f209d01207c200a280200220b20c5014b1b200b20c501461b220b450d04200920b5016a2109200a208b016a210a200b207c460d000b20c9010d010c020b2007210520c901450d010b20c901209d016a21c90120c8012005208d01746a209f016a28020021c801410121720c370b200341f0006a209b016a22092009280200207c6a360200200329039801210c20032903900121ca0120032903880121cb0120032903800121cc0120c8012f0106220920a2014f0d0120c801209b016a220a2005207c6a220b208d01746a200a2005208d01746a220a200920056b208d01741085041a200a20c50136020020c8012093016a2209200b20a301746a2009200520a301746a220920c80120a1016a220a2f010020056b20a301741085041a200920a4016a200c370200200920ca01370210200920cb01370208200920cc01370200200a200a2f0100207c6a3b010020c701450d220c470b20c801200520a301746a22052098016a200329039801370200200520ac016a220929020021ca01200920032903900137020020052094016a20032903880137020020052093016a2205290200210c200520032903800137020020ca0120b7018320800185500d45200c20b60183500d45200ca710200c450b209f0110222209450d1b2009207f3b01062009207f3602002009209b016a200341c0056a20a001108404210b200341c0056a20a4016a22cd0120c80120a5016a290200370300200341c0056a208f016a22ce0120c80120a6016a290200370300209c0120c80120a7016a290200370300200320c8012902f4013703c00520c80128022021cf01200b20c8012092016a20c80120a1016a22072f010020a8016a220a208d0174108404210b20092093016a20c80120a9016a200a20a30174108404210d200720a1013b01002009200a3b0106200341b0046a20a4016a22d00120cd01290300370300200341b0046a208f016a22d10120ce01290300370300200341b0046a209b016a22d201209c01290300370300200320032903c0053703b00402400240200520a1014b0d0020c801209b016a220a2005207c6a220b208d01746a200a2005208d01746a220720c80120a1016a220a2f010020056b208d01741085041a200720c50136020020c8012093016a2207200b20a301746a2007200520a301746a220b200a2f010020056b20a301741085041a200b20a4016a200c370200200b20ca01370210200b20cb01370208200b20cc013702000c010b200b200520b2016a221f208d01746a200b200520a8016a2207208d01746a2205200a20ad017120076b208d01741085041a200520c501360200200d201f20a301746a200d200720a301746a2205200920a1016a220a2f010020076b20a301741085041a200520a4016a200c370200200520ca01370210200520cb01370208200520cc013702000b200a200a2f0100207c6a3b0100200341a0036a20a4016a22d30120d001290300370300200341a0036a208f016a22d40120d101290300370300200341a0036a209b016a22d50120d201290300370300200320032903b0043703a00320034190026a20a4016a22d60120d30129030037030020034190026a208f016a22d70120d40129030037030020034190026a209b016a22d80120d501290300370300200320032903a0033703900220c80128020022d901450d0120c8012f010421da01200921db010c260b20d30120d60129030037030020d40120d70129030037030020d50120d80129030037030020032003290390023703a00320da0120ad0171210720d9012f0106220520ae014d0d0220aa011022220b450d1b200b207f3b0106200b207f360200200b209b016a200341c0056a20ab01108404210920d9012090016a280200217920cd0120d90120a5016a29020037030020ce0120d90120a6016a290200370300209c0120d90120a7016a290200370300200320d90120b0016a2902003703c005200920d9012092016a20d90120a1016a221f2f0100220a20a8016a2205208d01741084042122200b2093016a20d90120a9016a200520a301741084042178200b209f016a20d90120b1016a200a20b2016a220d208d01741084042120201f20a1013b0100200b20053b01060240200d450d00410021052020210903402009280200220a20053b0104200a200b3602002009208b016a2109200d2005207c6a2205470d000b0b20d00120cd0129030037030020d10120ce0129030037030020d201209c01290300370300200320032903c0053703b00420cd0120d00129030037030020ce0120d101290300370300209c0120d201290300370300200320032903b0043703c0050240024020da0120ad0171220920a1014b0d0020d901209b016a22052007207c6a220d208d0174220a6a20052007208d017422206a2205201f2f0100222220076b2278208d01741085041a200520cf0136020020d9012093016a2205200d20a301746a2005200720a301746a2205207820a301741085041a200520a4016a20d3012903003702002005208f016a20d4012903003702002005209b016a20d501290300370200200520032903a003370200201f2022207c6a22053b010020d901209f016a221f20206a209b016a201f200a6a221f200520ad0171220a200d6b208d01741085041a201f20db013602002009200a4f0d0120d90120206a20af016a21050340200528020022092007207c6a22073b0104200920d9013602002005208b016a2105200a2007470d000c020b0b2022200720b2016a220a208d0174221f6a2022200720a8016a2205208d01746a2209200b20a1016a220d2f010020056b208d01741085041a200920cf013602002078200a20a301746a2078200520a301746a2209200d2f010020056b20a301741085041a200920a4016a20d3012903003702002009208f016a20d4012903003702002009209b016a20d501290300370200200920032903a003370200200d200d2f0100207c6a22093b010020202007208d017422226a20b3016a2020201f6a220d200920ad01712207200a6b208d01741085041a200d20db01360200200a20074b0d00200b20226a20b4016a210903402009280200220a2005207c6a22053b0104200a200b3602002009208b016a210920072005470d000b0b20d60120cd0129030037030020d70120ce0129030037030020d801209c01290300370300200320032903c00537039002024020d9012802002205450d0020d9012f010421da01200521d901207921cf01200b21db01410221720c360b207921cf0120aa01102222050d010c1c0b2009210b20aa0110222205450d1b0b2005207f3b01062005207f3602002005209b016a200341c0056a20ab0110840421072005200328027022093602940320032003280274207c6a3602742009207f3b01042003200536027020092005360200200520052f0106220a20a301746a22092098016a20d601290300370200200920ac016a20d70129030037020020092094016a20d80129030037020020092093016a2003290390023702002007200a208d01746a20cf013602002005209f016a200a207c6a2209208d01746a200b360200200520093b0106200b20093b0104200b200536020020c7010d420c1c0b20d901209b016a22092007207c6a220a208d0174220b6a20092007208d0174220d6a2209200520076b221f208d01741085041a200920cf0136020020d9012093016a2209200a20a301746a2009200720a301746a2209201f20a301741085041a200920a4016a20d3012903003702002009208f016a20d4012903003702002009209b016a20d501290300370200200920032903a00337020020d90120a1016a2005207c6a22053b010020d901209f016a2209200d6a209b016a2009200b6a2209200520ad0171220b200a6b208d01741085041a200920db013602002007200b4f0d4020d901200a209d016a2205208d01746a20af016a210903402009280200220a2005207c6a22053b0104200a20d9013602002009208b016a2109200b2005470d000c410b0b208201208801460d4a200341206a208201109f032003280220228301450d4a2082012087016a2182012083012003280224208d01746a21b901410421720c330b20830120b901460d21208301450d4920830128020021c401410121b801410221ba01208301208b016a218301410121bb0120c301218401200320c40136027c20080d2b0c470b024020830120b901460d00208301208b016a2105208301450d0220830128020021c401410021bb01410221ba01410121b801200521830120c301218401200320c40136027c20080d290c470b410121b80120830121b901410621720c330b410221ba01208201208801460d03200341106a208201109f032082012087016a21820120032802102205450d2220052003280214208d01746a21b90120052183010c200b410221ba01410121b80120052183012085010d240c460b410121b80120830121b901410821720c320b410221ba01208201208801470d010b2088012182012085010d200c430b200341186a208201109f032082012087016a21820120032802182205450d1e20052283012005200328021c208d01746a22b901470d250c1c0b20bc02280200220b20de016a210a200b2f0106220d20e001742109417f210502400240024003402009450d01200520e6016a210520e70120e40120e601200a280200220720bb024b1b200720bb02461b2207450d03200920e8016a2109200a20e3016a210a200720e601460d000b20bd020d010c080b200d210520bd02450d070b20bd0220e4016a21bd02200b200520e001746a20e5016a21bc02410921720c300b200b20ea016a200520e901746a2220450d0520202802182109202028021c210520eb01200e36020020ed0120ee013a000020f00120f1013a000020f201200536020020f40120f5013a000020f601200e36020020f80120f9013a000020fa01200936020020fc0120fd013a000020ff012080023a000020820220e7013a00002084022085023b01002087022088023a00002089022002360200208b0220f5013a0000208c02200e360200208e0220f9013a0000200341c0056a20ea016a2278200e36020020900220ee013a00002092022093023a0000209502200536020020dd0120f5013a00002003200e3602c405200320f9013a00c0052020280208220d20dc016a2205ad220c20970288a70d52200c20960286a7220920e4014c0d52202020de016a2122024002400240024002402009450d00200910222207450d0d2022280200220d450d020c010b41082107200d450d010b4100210b410021090340024020092005470d00200520e6016a220a2005490d58200520e60174221f200a200a201f491b220aad20960286220c20990288a70d58200ca7221f20e701480d58024002402005450d002007200520e30174201f102122070d010c0b0b201f10222207450d0a0b200a21050b2007200b6a220a2098023a0000200a20e3016a2009360200200a20ba026a200341a0036a20e0016a2d00003a0000200a20e6016a20032f01a0033b0000200b20dc016a210b200920e6016a220a2109200d200a470d000b2005200a6b2098024f0d020c010b4100210a200541006b2098024f0d010b200a2098026a2209200a490d54200520e60174220b20092009200b491b2209ad20960286220c20990288a70d54200ca7220b20e701480d54024002402005450d002007200520e30174200b102122070d010c0e0b200b10222207450d0d0b200921050b200341b0046a200341c0056a10d8032007200a20e301746a220920032903b004370300200920de016a200341b0046a20de016a220b290300370300200341b0046a20dd0110d8032009209a026a200b290300370300200920032903b004370310200341b0046a20920210d8032009209b026a200b29030037030020092091026a20032903b004370300200341b0046a20900210d8032009209c026a200b2903003703002009208f026a20032903b004370300200341b0046a208e0210d8032009209d026a200b2903003703002009208d026a20032903b004370300200341b0046a208b0210d8032009209e026a200b2903003703002009208a026a20032903b004370300200341b0046a20870210d8032009209f026a200b29030037030020092086026a20032903b004370300200341b0046a20840210d803200920a0026a200b29030037030020092083026a20032903b004370300200341b0046a20820210d803200920a1026a200b29030037030020092081026a20032903b004370300200341b0046a20ff0110d803200920a2026a200b290300370300200920fe016a20032903b004370300200341b0046a20fc0110d803200920a3026a200b290300370300200920fb016a20032903b004370300200341b0046a20f80110d803200920a4026a200b290300370300200920f7016a20032903b004370300200341b0046a20f40110d803200920a5026a200b290300370300200920f3016a20032903b004370300200341b0046a20f00110d803200920a6026a200b290300370300200920ef016a20032903b004370300200341b0046a20ed0110d803200920a7026a200b290300370300200920ec016a20032903b00437030002400240024002402005200a2098026a2209470d00200520e6016a22092005490d57200520e60174220b20092009200b491b221fad20960286220c20990288a70d57200ca7220920e701480d572005450d012007200520e301742009102122070d020c100b2005211f0c020b200910222207450d0e0b200521090b2007200920e301746a22052080023a0000200520de016a20a802290000370000200520032900b004370001200341b0046a20034180016a20a9021084041a20dc0110222209450d0620092080023a0000200341a0036a200341b0046a20a9021084041a2022280200220520e4014c0d52024002402005450d002020280200210b20051022220d450d0b200d200b2005108404210b20051022220d450d0c200d200b20051084041a200b10202005ad210c0c010b4101210d4101410120051084041a2005ad210c410021050b200341b0046a200341a0036a20a9021084041a202031000d21ca01200341a0036a200341b0046a20a9021084041a200341b0046a200341a0036a20a9021084041a20034190026a200341b0046a20a9021084041a20dc011022220b450d07200a20dc016a210a20be0220aa028322be02200c8420ca0120ac02868420ad0284210c200b2080023a0000200b1020200341a0036a20034190026a20a9021084041a200341b0046a200341a0036a20a9021084041a024020092d000020ae02470d00200928020820af0271450d00200928020410200b2009102020034190026a200341b0046a20a9021084041a200341b0046a20034190026a20a9021084041a20b00220e701360200200341a0036a209b026a200a36020020b202201f360200200341a0036a2091026a200736020020b30220e701360200200341a0036a2094026a20960237020020b402200c370200200341a0036a20de016a20053602002003200d3602a403200320e6013602a003200341b0046a200341a0036a10a60320034180016a200341b0046a20a9021084041a202020e601360210202020e201360214024020032d00c00520ae02470d0020df0128020020af0271450d0020032802c40510200b024020dd012d000020ae02470d00200341c0056a209a026a28020020af0271450d0020950228020010200b02402092022d000020ae02470d00200341c0056a209b026a28020020af0271450d00200341c0056a20b1026a28020010200b02402090022d000020ae02470d00200341c0056a209c026a28020020af0271450d00207828020010200b0240208e022d000020ae02470d00200341c0056a209d026a28020020af0271450d00208c0228020010200b0240208b022d000020ae02470d00200341c0056a209e026a28020020af0271450d0020890228020010200b02402087022d000020ae02470d00200341c0056a209f026a28020020af0271450d0020b50228020010200b02402084022d000020ae02470d00200341c0056a20a0026a28020020af0271450d0020b60228020010200b02402082022d000020ae02470d00200341c0056a20a1026a28020020af0271450d0020b70228020010200b024020ff012d000020ae02470d00200341c0056a20a2026a28020020af0271450d0020b80228020010200b024020fc012d000020ae02470d00200341c0056a20a3026a28020020af0271450d0020fa0128020010200b024020f8012d000020ae02470d00200341c0056a20a4026a28020020af0271450d0020f60128020010200b024020f4012d000020ae02470d00200341c0056a20a5026a28020020af0271450d0020f20128020010200b024020f0012d000020ae02470d00200341c0056a20a6026a28020020af0271450d0020b90228020010200b024020ed012d000020ae02470d00200341c0056a20a7026a28020020af0271450d0020eb0128020010200b20be0220ab028421be0220e20120e6016a21e20120c10120e101470d130c420b20d10228020c0d3420d10228021021d302200341e0006a21d402200328026421d5020c310b20d702280200220b20c7026a210a200b2f0106220d20c502742109417f21050240024003402009450d01200520ca026a210520cb0220c80220ca02200a280200220720d6024b1b200720d602461b2207450d04200920cc026a2109200a20c6026a210a200720ca02460d000b20d8020d010c400b200d210520d802450d3f0b20d80220c8026a21d802200b200520c502746a20c9026a21d702410b21720c2e0b20d9022802182205450d3120d90228021022db02200520c502746a21dc02410221050c300b200b20ce026a200520cd02746a2205450d3c2005280210450d0c20c10220c6026a20052802143602000c3c0b201f41081023000b41a8bdc4004180011039000b411041081023000b411041081023000b200941081023000b200541011023000b200541011023000b200b41081023000b200941081023000b41940341041023000b41c40341041023000b41c40341041023000b41a8bec40041351039000b4102211f0c020b4102211f0c020b4103211f0c020b410121050c3c0b410121050c3b0b410121050c3a0b410121720c0d0b410221720c0e0b410321720c0f0b410521720c100b410721720c110b410021050c210b410021050c200b410121050c1f0b410121050c1e0b410121050c1d0b410221050c1c0b410221050c1b0b410221050c1a0b410321050c190b410421050c180b410421050c170b410421050c160b410421050c150b410421050c140b410421050c130b410421050c120b410421050c110b410421050c100b410421050c0f0b410421050c0e0b410421050c0d0b410021050c010b410121050b0340024002400240024002400240024002400240024002400240024002400240024002400240024020050e03000102020b207620744f0d020240024002400240024020752802002076202d7422206a22052d0000202a470d0020032005202d6a2205360290022008450d08200f200528020022054d0d0420082005202e746a2802002209450d00202f200e360200203020313a0000203220333a000020342009360200203520363a00002037200e360200203820393a0000203a2005360200203b202a3a0000203c203d3a0000203e203f3a0000204020413b0100204220433a000020442002360200204520363a00002046200e360200204720393a00002048200e360200204920313a0000204b204c3a0000200341c0056a20256a22772009360200204e20363a0000202920032f00b0043b00002029202e6a200341b0046a202e6a2d00003a0000200320393a00c0052003200e3602c40520732802002222207620286a221f490d0a2073207636020020752802002105200341b0046a202b6a220d2027360200200341b0046a204d6a227820753602002050200520206a2207204d6a220b3602002003201f3602b004200341b0046a202c6a22792005201f202d74227a6a227b3602002026200341c0056a36020020032022201f6b22743602b404200b2105024020072d0000220a2051460d00410021050340200720056a21090240200a206c712052470d002009204f6a280200205371450d002009202d6a28020010200b2005450d0320502009204a6a3602002005204d6a21052009204d6a2d0000220a2051470d000b200720056a204d6a21050b2005207b470d020c030b410121050c150b2009204d6a2205207b460d010b0340205020052209204d6a22053602000240024020092d0000220a2052460d00200a2051470d010c030b2009204f6a280200205371450d002009202d6a28020010200b200b2005470d000b0b024002400240024002402074450d00201f20702802142205470d0120272220200341c0056a22096b202d7622050d020c040b2075202610d903205028020022052079280200220b470d140c150b20202005202d7422056b210a207528020020056a2105200341c0056a22092027460d01034020262009204d6a360200200341a0036a200910d80320032d00a0032051460d13200520032903a0033703002005204f6a200341a0036a204f6a2903003703002073207328020020286a3602000240200a450d002005204d6a2105200a206b6a210a20262802002209200d280200470d010c030b0b200d2802002220202628020022096b202d762205450d020b02400240024002402078280200220b202d6a2207280200220a20226b20054f0d00202220056a227b2022490d39200a2028742222207b207b2022491b2222ad206886220c206988a70d39200ca7227b203f480d39200a450d01200b280200200a202d74207b1021220a0d020c0d0b200b280200210a0c020b207b1022220a450d0b0b200b200a360200200720223602000b200a201f20056a2207202d746a200a207a6a2074202d741085041a200320073602b0042007200b280208220a460d01207620056a202d74200a202d7422056b210a200b28020020056a210520092020460d00034020262009204d6a360200200341a0036a200910d80320032d00a0032051460d12200520032903a0033703002005204f6a200341a0036a204f6a290300370300200b204f6a2209200928020020286a360200200a450d022005204d6a2105200a206b6a210a20262802002209200d280200470d000b0b200320513a00a003205028020022052079280200220b470d110c120b200341a0036a204f6a2205203f360200200320673703a003200341a0036a202610d90320032802a003222220052802002209202d7422076a210b20032802a403217b2022210502402009450d00024002400240024020782802002220202d6a2274280200220520032802b404220d20032802b00422096a221f6b2007202d75220a4f0d00201f200a6a227a201f490d382005202874221f207a207a201f491b221fad206886220c206988a70d38200ca7227a203f480d382005450d0120202802002005202d74207a102122050d020c0d0b202028020021050c020b207a10222205450d0b0b202020053602002074201f3602000b20052009200a6a220a202d74221f6a20052009202d746a200d202d741085041a2003200a3602b00420222105200a20202802082209460d0020202802002205201f6a217420052009202d746a210a2022210903402007450d0e200341a0036a202e6a22052009206a6a2d00003a0000200320092f00013b01a00320092d0000220d2051460d0d2009202d6a290200210c2009202c6a280200211f200a200d3a0000200a202c6a201f360200200a202d6a200c37020020032f01a003210d200a206a6a20052d00003a0000200a20286a200d3b00002020204f6a2205200528020020286a3602002007206b6a21072009204d6a22052109200a204d6a220a2074470d000b0b2005200b460d0e0c0d0b200341c0056a20256a20283602002003206d3602a403204e200341a0036a3602002003206e3702c4052003206f3602c005200320034190026a3602a003200341b0046a200341c0056a102b20032802b0042205450d1c20032902b4042180012000200536020420004101360200200041086a2080013702002008450d28200f450d28200810200c280b20d402280200220b20c7026a210a200b2f0106220d20c502742109417f210502400240024003402009450d01200520ca026a210520cb0220c80220ca02200a280200220720d3024b1b200720d302461b2207450d03200920cc026a2109200a20c6026a210a200720ca02460d000b20d5020d010c160b200d210520d502450d150b20d50220c8026a21d502200b200520c502746a20c9026a21d402410121050c120b200b20ce026a200520cd02746a2205450d132005280210450d0720d10220bf026a20052802143602000c130b20db02222020c6026a21db022020280200210b200341e0006a21052003280264211f024003402005280200220720c7026a210a20072f0106222220c502742109417f210502400240024003402009450d01200520ca026a210520cb0220c80220ca02200a280200220d200b4b1b200d200b461b220d450d03200920cc026a2109200a20c6026a210a200d20ca02460d000b201f0d010c040b20222105201f450d030b201f20c8026a211f2007200520c502746a20c9026a21050c010b0b200720ce026a200520cd02746a2205450d002005280210450d03202020052802143602000b20db0220dc02470d070c110b41c8b3c4002076207410b501000b4186b2c40041cc001039000b41a8bec40041351039000b418cb8c400102f000b207b41081023000b207a41081023000b41a8bec40041351039000b410221050c080b2009204d6a2205200b470d010c020b200b2205200b460d010b03400240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a28020010200b2005204d6a2205200b470d000b0b207b450d00202210200b205028020022052079280200220b460d010b0340205020052209204d6a22053602000240024020092d0000220a2052460d00200a2051470d010c030b2009204f6a280200205371450d002009202d6a28020010200b200b2005470d000b0b024020032802b4042205450d00024020032802b004220b20782802002207204f6a220a2802002209460d00200728020022072009202d746a2007200b202d746a2005202d741085041a0b200a200520096a3602000b024020032d00c0052052470d00200341c0056a204f6a280200205371450d0020032802c40510200b0240204e2d00002052470d00200341c0056a202b6a280200205371450d00207728020010200b0240204b2d00002052470d002054280200205371450d00205528020010200b024020492d00002052470d002056280200205371450d00204828020010200b024020472d00002052470d002057280200205371450d00204628020010200b024020452d00002052470d002058280200205371450d00204428020010200b024020422d00002052470d002059280200205371450d00205a28020010200b024020402d00002052470d00205b280200205371450d00205c28020010200b0240203e2d00002052470d00205d280200205371450d00205e28020010200b0240203c2d00002052470d00205f280200205371450d00206028020010200b0240203b2d00002052470d002061280200205371450d00203a28020010200b024020382d00002052470d002062280200205371450d00203728020010200b024020352d00002052470d002063280200205371450d00203428020010200b024020322d00002052470d002064280200205371450d00206528020010200b024020302d00002052470d002066280200205371450d00202f28020010200b410f21050b200520766a2276207328020022744f0d0a410021050c000b0b20d90220c4026a22d90220da02460d0b410c2172410421050c090b20d10220d0026a22d10220d202460d0a410a2172410421050c080b20c701450d010b20c601450d0120c20110204102211f0c020b4102211f0c020b4102211f0c020b410121050c160b410121050c150b410121050c140b2070202b6a22702071460d0d41002172410421050c000b0b4186b2c40041cc001039000b20c10220c0026a22c10220c202460d024104211f410121050c100b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360207d412c6c2105207e41586a2109024003404100210a2005450d01200541546a2105200941286a210b2009412c6a22072109200b2d00004103470d000b200741086a2802002205450d00200541286c2109200728020041186a21054100210a0340200a20052d0000456a210a200541286a2105200941586a22090d000b0b207d412c6c2105207e41606a21090240024003402005450d01200541546a2105200941206a210b2009412c6a22072109200b2d00004104470d000b200728020021050c010b410021050b411021dc01200341c0056a41106a22dd01200341c8006a41106a280200360200410821de01200341c0056a41086a22df01200341c8006a41086a290300370300200320032903483703c00520034180016a200341c0056a10a10320bc01450d00410221e00120c10120bc014102746a21e1012005200a6a21e201410421e301417f21e40141940321e501410121e601410021e701417c21e801410521e901413421ea01200341a4076a21eb0141e00121ec01200341c0056a41e0016a21ed01411321ee0141d00121ef01200341c0056a41d0016a21f00141d70021f10120034184076a21f20141c00121f301200341c0056a41c0016a21f401412d21f501200341f4066a21f60141b00121f701200341c0056a41b0016a21f801411221f901200341e4066a21fa0141a00121fb01200341c0056a41a0016a21fc01410b21fd0141900121fe01200341c0056a4190016a21ff014106218002418001218102200341c0056a4180016a21820241f000218302200341c0056a41f0006a21840241840821850241e000218602200341c0056a41e0006a218702413721880220034194066a21890241d000218a02200341c0056a41d0006a218b0220034184066a218c0241c000218d02200341c0056a41c0006a218e024130218f02200341c0056a41306a2190024120219102200341c0056a41206a21920241d6002193024114219402200341c0056a41146a2195024204219602421c219702410f21980242202199024118219a024128219b024138219c0241c800219d0241d800219e0241e800219f0241f80021a00241880121a10241980121a20241a80121a30241b80121a40241c80121a50241d80121a60241e80121a702200341b7046a21a802418c0121a902428080808080804021aa024280808080808c0121ab02422821ac024280808080800c21ad02410921ae0241ffffffff0321af02200341cc036a21b002412421b102200341a0036a41246a21b202200341bc036a21b302200341ac036a21b402200341a4066a21b502200341b4066a21b602200341c4066a21b702200341d4066a21b80220034194076a21b902410321ba024103211f0c020b024020bd01450d0020c00110200b200341c0056a20034180016a418c011084041a200341b0046a200341c0056a10a303411021bf02200341b0046a41106a2802002205450d00412c21c00220032802b80422c1022005412c6c6a21c202410a21c302411c21c402410221c502410421c602410821c702417f21c80241940321c902410121ca02410021cb02417c21cc02410521cd02413421ce02410921cf02411421d0024104211f0c020b200341bc046a29020021800120032802b004210520032902b40421990120032802602003280264200328026810d703200020bf026a208001370200200041086a20990137020020002005360204200041003602002008450d06200f450d0620081020200424000f0b410121050c0c0b410121050c0b0b42ac808080c005210c0b200810200b2000200536020420004101360200200041086a200c3702000b200141086a280200217c0240200141106a2802002203450d002003412c6c2105207c210303402003104d2003412c6a2103200541546a22050d000b0b2001410c6a280200450d00207c10200b200424000f0b202120236a22212024470d010b200341c8006a41106a2205200141106a280200360200200341c8006a41086a227c200141086a290200370300200320012902003703482005280200227d20236c2105207c280200227e41586a217c0240024003402005450d01200541546a2105207c41286a2109207c20236a227f217c20092d00004108470d000b200341386a207f10980320032802382109200328023c21050c010b410021090b2005410020091b210a207d412c6c2105207e41586a217c200941c8d7c40020091b2181010240024003402005450d01200541546a2105207c41286a2109207c412c6a227f217c20092d0000410a470d000b200341306a207f10980320032802302109200328023421050c010b410021090b2005410020091b210b207d412c6c2105207e41586a217c200941c8d7c40020091b2182010240024003404100217f2005450d01200541546a2105207c41286a2109207c412c6a228301217c20092d00004109470d000b20830128020021840141012185010c010b41002185010b200342003702744180e5c20021860120034180e5c200360270411c218701208201200b411c6c6a2188014114218901208101200a41146c6a218a014104218b0141ff01218c014101217c4102218d0141cf00218e014110218f014120219001412821910141242192014134219301413c219401413821950141d00021960141c80021970141cc0021980142022180014220219901200341cc056a219a014108219b01200341c0056a41086a219c01417f219d01410d219e01419403219f01418c0321a001410621a101410b21a201410521a301411821a401418c0221a50141840221a60141fc0121a701417921a80141940221a90141c40321aa0141bc0321ab0141c40021ac0141ffff0321ad01410a21ae0141980321af0141f40121b00141b00321b101417a21b201416c21b30141fc0221b401417c21b50142808080807021b60142ffffffff0f21b701410021b801410021b901410021ba01410021bb01410021bc01410021bd01410421be01410421bf01410421c001410421c1010c010b4101211f0c010b4102211f0c010b410121050c010b410121050c000b0b1031000b1024000b130020004105360204200041c8b3c3003602000b13002000410836020420004194bcc3003602000b1300200041083602042000419cbcc3003602000b3201017f0240410810222202450d0020004288808080800137020420002002360200200242013700000f0b410841011023000b860100024002400240024002400240200041ff017122004101460d0020004102470d01410110222200450d03200041023a00000c020b410110222200450d03200041013a00000c010b410110222200450d03200041003a00000b20012802002001280204200041011003200010200f0b410141011023000b410141011023000b410141011023000bb20201027f230041106b2202240020024100360208200242013703000240412010222203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a20021098012002200041106a36020c2002410c6a2002109801200028022021032002200041286a280200220036020c2002410c6a2002103e02402000450d002003200041186c6a210003402002200336020c2002410c6a2002109801200341106a20021096012000200341186a2203470d000b0b200228020421032001280200200128020420022802002200200241086a280200100302402003450d00200010200b200241106a24000f0b412041011023000bfa0801067f230041106b220224002002410036020820024201370300200041106a2002103e2002200036020c2002410c6a200210980120022802042103200228020821040240024002400240024002400240024002400240024002400240024002400240024020002d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22034100480d0c2004450d0320022802002004200310212205450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22034100480d0b2004450d0420022802002004200310212205450d050c060b200228020021050c080b200228020021050c050b2003102222050d050b200341011023000b2003102222050d010b200341011023000b20022003360204200220053602000b200241086a200441016a2206360200200520046a41003a00000c020b20022003360204200220053602000b200241086a2206200441016a360200200520046a41013a00000240024002400240024020022802042203200628020022046b41204f0d00200441206a22062004490d0620034101742207200620062007491b22074100480d062003450d0120052003200710212205450d020c030b200441206a21060c030b2007102222050d010b200741011023000b2002200736020420022005360200200721030b200241086a2006360200200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a2900003700002004200041196a2900003700000b024002400240024002400240024002400240200041396a2d00004101470d0020032006470d08200341016a22042003490d0920034101742207200420042007491b22044100480d092003450d0120052003200410212205450d020c070b20032006470d05200341016a22002003490d0820034101742204200020002004491b22004100480d082003450d0220052003200010212205450d030c040b2004102222050d050b200441011023000b2000102222050d010b200041011023000b20022000360204200220053602000b200241086a2200200641016a360200200520066a41003a0000200228020421042001280200200128020420022802002203200028020010032004450d060c050b20022004360204200220053602000b200241086a2203200641016a360200200520066a41013a000002400240024020022802042205200328020022046b41204f0d00200441206a22032004490d0320054101742206200320032006491b22064100480d032005450d0120022802002005200610212203450d020c040b200228020021030c040b2006102222030d020b200641011023000b1024000b2002200636020420022003360200200621050b200241086a200441206a2206360200200320046a220441086a200041c2006a290000370000200441106a200041ca006a290000370000200441186a200041d2006a29000037000020042000413a6a290000370000200128020020012802042003200610032005450d010b200310200b200241106a24000b13002000410f360204200041e0cfc3003602000b130020004107360204200041deecc3003602000bb50707057f047e017f017e037f047e017f230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200141002001280200200128020420024180016a41202001280208100122062006417f461b2206412020064120491b20012802086a3602080240024002400240024002400240024002400240024002402006411f4d0d00200241e0006a41186a2003290300370300200241e0006a41106a2004290300370300200241e0006a41086a20052903003703002002200229038001370360200241c8006a2001108c012002290348a7450d01200241c8006a41106a290300210720022903502108200241306a2001108c012002290330a7450d02200241c0006a29030021092002290338210a200241286a2001108e012002280228450d09200228022c220bad42187e220c422088a70d05200ca72206417f4c0d052006450d0320061022220d450d06200b450d040c070b20004100360220200241a0016a24000f0b20004100360220200241a0016a24000f0b20004100360220200241a0016a24000f0b4108210d200b0d030b4100210f4200210c0c030b1031000b200641081023000b4200210c200241106a41106a210e410021054100210441002103200b210f02400340200241106a2001108c012002290310a7450d01200e290300211020022903182111200220011091012002290300a7450d01200341016a21062002290308211202402003200f470d002005200620062005491b220fad42187e2213422088a70d052013a722144100480d0502402003450d00200d200420141021220d0d010c070b20141022220d450d060b200d20046a2203201037030820032011370300200341106a2012370300200c4280808080107c210c200541026a2105200441186a2104200621032006200b490d000c020b0b200f450d01200d10200c010b200d450d0020024180016a41186a2201200241e0006a41186a29030037030020024180016a41106a2206200241e0006a41106a29030037030020024180016a41086a2203200241e0006a41086a2903003703002002200229036037038001200041186a20093703002000200a37031020002007370308200020083703002000200c200fad843702242000200d3602202000412c6a200229038001370200200041346a20032903003702002000413c6a2006290300370200200041c4006a2001290300370200200241a0016a24000f0b20004100360220200241a0016a24000f0b1024000b201441081023000b130020004118360204200041d8efc3003602000b02000bf30301087f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a1098012002200336023c2002413c6a200241306a1098012002280220210320022004280200220436023c2002413c6a200241306a103e0240024002402004450d00200441306c2105200241306a41086a21060340024002400240024020022802342207200628020022046b41204f0d00200441206a22082004490d0620074101742209200820082009491b22094100480d062007450d01200228023020072009102122070d020c070b200441206a2108200228023021070c020b200910222207450d050b20022009360234200220073602300b20062008360200200720046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a2900003700002004200341106a2900003700002002200336023c2002413c6a200241306a109801200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a2802003602000240200241246a280200450d00200241206a28020010200b200241c0006a24000f0b1024000b200941011023000b7101017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a103e2002200241086a36022c2002412c6a200241206a109801200041086a200228022836020020002002290320370200200241306a24000b3201017f0240410810222202450d00200042888080808001370204200020023602002002420c3700000f0b410841011023000b3401017f0240410410222202450d0020004284808080c00037020420002002360200200241c0843d3600000f0b410441011023000b3201017f0240410410222202450d0020004284808080c000370204200020023602002002413c3600000f0b410441011023000b3201017f0240410410222202450d0020004284808080c00037020420002002360200200241043600000f0b410441011023000b0900200042003702000ba30d04057f017e197f027e230041f0026b2204240002400240410d10222205450d00200541056a41002900fe9d44370000200541002900f99d443700002005410d412d10212205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41186a22064200370300200441a0026a41106a22074200370300200441a0026a41086a22084200370300200442003703a0022005412d200441a0026a1000200441e0016a41186a2006290300370300200441e0016a41106a2007290300370300200441e0016a41086a2008290300370300200420042903a0023703e001024002400240024002400240200441e0016a412041c8d7c400410041001001417f460d00200441003a00a002200441e0016a4120200441a0026a41014100100141016a41014d0d0520042d00a002220641034f0d052005102020064101460d0320064102470d01200441a0026a200110f80220042d00a0024101470d02200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a2002200310a90220043502384201852102200441386a41106a2903002103200441386a41086a29030021090c040b200510200b200441f8006a200110f80220042d00784101470d00200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2207290000370300200420042900793703a001200441a0026a200441a0016a10b101200441c0016a41186a22082005290000370300200441c0016a41106a220a2006290000370300200441c0016a41086a220b2007290000370300200420042900793703c00120042802c002220c450d00200441e0016a41186a220d2008290300370300200441e0016a41106a220e200a290300370300200441e0016a41086a220f200b290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2207200441a0026a41106a2208290300370300200441e0016a41386a2210200441a0026a41186a2211290300370300200441086a41086a2212200441cc026a2213290200370300200441086a41106a2214200441d4026a2215290200370300200441086a41186a2216200441dc026a2217290200370300200441086a41206a2218200441e4026a2219290200370300200441086a41286a221a200441ec026a221b280200360200200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221c2010290300370300200441386a41306a221d2007290300370300200441386a41286a221e2005290300370300200441386a41206a221f200429038002370300200441386a41186a2220200d290300370300200441386a41106a2221200e290300370300200441386a41086a2222200f290300370300200420042903e0013703382010201c2903003703002007201d2903003703002005201e290300370300200441e0016a41206a221c201f290300370300200d2020290300370300200e2021290300370300200f2022290300370300200420042903383703e001200441f8006a41186a2020290300370300200441f8006a41106a2021290300370300200441f8006a41086a202229030037030020042004290338370378201120102903003703002008200729030037030020062005290300370300200441c4026a2205200429030837020020132012290300370200201520142903003702002017201629030037020020192018290300370200201b201a2802003602002004200c3602c0022004201c2903003703a00220082008290300220920027c22233703002011201129030020037c2023200954ad7c37030020062903002109200420042903a002222320027c22243703a0022006200920037c2024202354ad7c370300200441c0016a20012002200310a90220043502c0012102200a2903002103200b2903002109200441f8006a200441a0026a10bc0302402005280200450d00200441a0026a41206a28020010200b200242018521020c020b420021020c010b200441a0026a20012002200310a90220043502a0024201852102200441b0026a2903002103200441a8026a29030021090b2000200937030820002002370300200041106a2003370300200441f0026a24000f0b419a88c00041331039000b410d41011023000b412d41011023000bdb0201047f230041d0006b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410f10b30202400240410e10222203450d00200341066a41002900d5cf43370000200341002900cfcf433700002003410e412e10212203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241306a41186a22004200370300200241306a41106a22044200370300200241306a41086a22054200370300200242003703302003412e200241306a1000200241106a41186a2000290300370300200241106a41106a2004290300370300200241106a41086a200529030037030020022002290330370310200241203602342002200241106a3602302001200241306a10ad0320031020200241d0006a24000f0b410e41011023000b412e41011023000b02000bec0301087f23004180016b22032400200341c0006a20011081030240024020032903404201520d002002417f732104200341c0006a41086a21020340200341086a41306a2205200241306a290300370300200341086a41286a2206200241286a290300370300200341086a41206a2207200241206a290300370300200341086a41186a2208200241186a290300370300200341086a41106a2209200241106a290300370300200341086a41086a220a200241086a29030037030020032002290300370308200341c0006a41306a2005290300370300200341c0006a41286a2006290300370300200341c0006a41206a2007290300370300200341c0006a41186a2008290300370300200341c0006a41106a20092903003703002002200a29030037030020032003290308370340200441016a2204450d02200341c0006a200110810320032903404201510d000b0b2000420037030020034180016a24000f0b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a29030037030020034180016a24000bd70502047f017e230041d0006b2203240002400240024002400240024002400240200241086a2802002204417f6a220520044f0d00200520044b0d002002280200220620054103746a2d000522054104460d02200341386a20012002200510c10320032d00384101470d012000200329023c370200200041086a200341c4006a280200360200200341d0006a24000f0b411810222202450d05200241106a41002900f6af44370000200241086a41002900eeaf44370000200241002900e6af4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341a8aac4003602382003200341206a3602102003200341106a3602482000200341386a102b2003280224450d0320032802201020200341d0006a24000f0b200241086a2802002204450d01200228020021060b200241086a2004417f6a2202360200200620024103746a290200220742808080808080c0ff0083428080808080808001520d020b411810222202450d03200241106a41002900f6af44370000200241086a41002900eeaf44370000200241002900e6af4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341a8aac4003602382003200341206a3602102003200341106a3602482000200341386a102b2003280224450d00200328022010200b200341d0006a24000f0b200141086a280200210220032007370308024020022007a7470d0020004100360200200341d0006a24000f0b2003412c6a4102360200200341cc006a410236020020034102360224200320023602342003420237023c20034188a9c4003602382003200341086a3602282003200341346a3602202003200341206a360248200341106a200341386a102b200041086a200341106a41086a28020036020020002003290310370200200341d0006a24000f0b411841011023000b411841011023000bc70301017f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005412c6a4102360200200541cc006a4102360200200541023602242005420337023c200541e4a6c40036023820052005410c6a3602282005200541086a3602202005200541206a360248200541106a200541386a102b200041086a200541106a41086a28020036020020002005290310370200200541d0006a24000f0b2001280200210220054100360234024020022802080d00200541cc006a4101360200200541023602142005420237023c200541f8adc4003602382005200541346a3602102005200541106a360248200541206a200541386a102b20052802202202450d002000200529022437020420002002360200200541d0006a24000f0b200541386a200141186a2202200141286a2203200410c103024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b200541386a20022003410010c103024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b20004100360200200541d0006a24000bbe0601037f230041d0006b22042400200420033a000f024002400240024020022802082205417f6a220620054f0d00200620054b0d00200141086a2802002105200228020020064103746a22062802002102024020062d0006450d0020052002460d040b02400240200520024d0d00200141086a2005417f6a2202360200200128020020026a2d000022024104460d0520024105470d01411810222202450d04200241106a41002900f6af44370000200241086a41002900eeaf44370000200241002900e6af4437000020044298808080800337022420042002360220200441c4006a41013602002004412a36024c20044201370234200441a8aac4003602302004200441206a3602482004200441c8006a360240200441106a200441306a102b02402004280224450d00200428022010200b200041013a0000200041046a20042903103702002000410c6a200441106a41086a280200360200200441d0006a24000f0b412b10222202450d02200041013a0000200241276a41002800e2a944360000200241206a41002900dba944370000200241186a41002900d3a944370000200241106a41002900cba944370000200241086a41002900c3a944370000200241002900bba944370000200041086a42ab808080b005370200200041046a2002360200200441d0006a24000f0b0240200341ff017122054104460d0020022005460d00200420023a0048200441206a410c6a412b360200200441c4006a41023602002004412b36022420044202370234200441e8a9c4003602302004200441c8006a36022820042004410f6a3602202004200441206a360240200441106a200441306a102b200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441d0006a24000f0b200041003a0000200020023a0001200441d0006a24000f0b02404118102222020d00411841011023000b2004421837023420042002360230200441306a4100411810cc0320042004280238220241186a3602382002200428023022056a411841e6afc400411810cd03200420042902343702342004200536023041c3a5c4004134200441306a10ce03000b412b41011023000b411841011023000b20004180083b0100200441d0006a24000b9d0601037f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005411c6a4102360200200541cc006a4102360200200541023602142005420337023c200541e4a6c40036023820052005410c6a3602182005200541086a3602102005200541106a360248200541206a200541386a102b200041086a200541206a41086a28020036020020002005290320370200200541d0006a24000f0b200541386a200141186a2203200141286a410010c103024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b2001280200210220054100360220024020022802080d00200541cc006a4101360200200541023602342005420237023c200541f8adc4003602382005200541206a3602302005200541306a360248200541106a200541386a102b20052802102202450d002000200529021437020420002002360200200541d0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d03200241016a22062002490d0520024101742207200620062007491b22064100480d052002450d01200328020020022006102122020d020c060b200541cc006a2202410136020020054102360234200520063602302005420137023c200541e0b0c4003602382005200541306a360248200541106a200541386a102b20052802102201450d032005200529021437021420052001360210200241013602002005412a3602342005420137023c200541a8aac4003602382005200541106a3602302005200541306a360248200541206a200541386a102b02402005280214450d00200528021010200b20052802202202450d032000200529022437020420002002360200200541d0006a24000f0b200610222202450d040b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2202200228020041016a3602000b20004100360200200541d0006a24000f0b1024000b200641011023000bb60401047f230041c0006b22032400200341286a200141186a2204200141286a2205200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d03200241016a22052002490d0520024101742206200520052006491b22054100480d052002450d01200428020020022005102122020d020c060b2003413c6a2201410136020020034102360214200320053602102003420137022c200341e0b0c4003602282003200341106a360238200341186a200341286a102b20032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341a8aac4003602282003200341186a3602102003200341106a3602382003200341286a102b0240200328021c450d00200328021810200b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200510222202450d040b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b1024000b200541011023000bf50301047f230041c0006b22032400200341286a200141186a2204200141286a200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d0320024101742206200520052006491b22054100480d032002450d0120042802002002200510212202450d020c040b2003413c6a2201410136020020034102360214200320053602102003420137022c200341e0b0c4003602282003200341106a360238200341186a200341286a102b20032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341a8aac4003602282003200341186a3602102003200341106a3602382003200341286a102b0240200328021c450d00200328021810200b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2005102222020d020b200541011023000b1024000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bb60401057f230041c0006b22032400200341286a200141186a2204200141286a2205200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d03200541016a22062005490d0520054101742207200620062007491b22064100480d052005450d01200428020020052006102122040d020c060b2003413c6a2201410136020020034102360214200320063602102003420137022c200341e0b0c4003602282003200341106a360238200341186a200341286a102b20032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341a8aac4003602282003200341186a3602102003200341106a3602382003200341286a102b0240200328021c450d00200328021810200b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200610222204450d040b2001411c6a2006360200200141186a2004360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b1024000b200641011023000bc00301057f230041c0006b220324002003200236020002402001280204220420024d0d00200041003a00002000200128020020026a2d00003a0001200341c0006a24000f0b2001280208417c6a21052001410c6a28020041037421010240024003402001450d012004200541046a2802006a22062004490d02200141786a2101200541086a2105200420024b21072006210420070d0020062104200620024d0d000b20052d00002104200041003a0000200020043a0001200341c0006a24000f0b20032004360204200341306a410c6a41023602002003412c6a4102360200200341023602342003420337021c200341b0b1c4003602182003200341046a360238200320033602302003200341306a360228200341086a200341186a102b200041013a00002000410c6a200341106a280200360200200041046a2003290308370200200341c0006a24000f0b0240412010222204450d00200041013a0000200441186a41002900a8b144370000200441106a41002900a0b144370000200441086a4100290098b14437000020044100290090b144370000200041086a42a08080808004370200200041046a2004360200200341c0006a24000f0b412041011023000bf50301057f230041c0006b22032400200341286a200141186a2204200141286a200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d05200541016a22062005490d0320054101742207200620062007491b22064100480d032005450d0120042802002005200610212205450d020c040b2003413c6a2201410136020020034102360214200320063602102003420137022c200341e0b0c4003602282003200341106a360238200341186a200341286a102b20032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341a8aac4003602282003200341186a3602102003200341106a3602382003200341286a102b0240200328021c450d00200328021810200b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2006102222050d020b200641011023000b1024000b2001411c6a2006360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bf50301047f230041c0006b22042400200441286a200141186a2205200141286a200210c103024020042d00284101470d002000200429022c370200200041086a200441346a280200360200200441c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d05200241016a22062002490d0320024101742207200620062007491b22064100480d032002450d0120052802002002200610212202450d020c040b2004413c6a2201410136020020044102360214200420063602102004420137022c200441e0b0c4003602282004200441106a360238200441186a200441286a102b20042802182202450d052004200429021c37021c20042002360218200141013602002004412a3602142004420137022c200441a8aac4003602282004200441186a3602102004200441106a3602382004200441286a102b0240200428021c450d00200428021810200b20042802002201450d052000200429020437020420002001360200200441c0006a24000f0b2006102222020d020b200641011023000b1024000b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20033a0000200141206a2201200128020041016a3602000b20004100360200200441c0006a24000bad0201027f230041106b220224000240024020002d00004104470d00200128021841c0cac40041082001411c6a28020028020c11000021010c010b2002200128021841abcac40041052001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41b0cac40010cf031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000b200241106a2400200141ff01714100470b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ec81c5003602082002200236021820012000200241086a10d3032101200241206a240020010bad0201027f230041106b220224000240024020002d00004104470d00200128021841e4a7c40041032001411c6a28020028020c11000021010c010b2002200128021841e7a7c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41f0a7c40010cf031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000b200241106a2400200141ff01714100470b810101017f0240200041046a280200220320016b20024f0d0002400240200120026a22022001490d0020034101742201200220022001491b22014100480d00024002402003450d0020002802002003200110212202450d010c030b2001102222020d020b200141011023000b1024000b20002002360200200041046a20013602000b0bea0101017f230041e0006b22042400200420013602082004200336020c024020012003470d002000200220011084041a200441e0006a24000f0b2004200441086a36024020042004410c6a360244200441c8006a41146a4100360200200441286a41146a4104360200200441346a4105360200200441106a41146a4103360200200441c8d7c4003602582004420137024c200441d0d2c4003602482004410536022c20044203370214200441fcd1c4003602102004200441c8006a3602382004200441c4006a3602302004200441c0006a3602282004200441286a360220200441106a418cd3c4001048000b6c01017f230041306b2203240020032001360204200320003602002003412c6a412d3602002003411c6a410236020020032002360228200341033602242003420237020c200341b8d4c400360208200320033602202003200341206a360218200341086a41c8d4c4001048000bf10202047f057e230041d0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d00410121042006280218418882c50041c082c50020051b4102410120051b2006411c6a28020028020c1100000d0120012000280200200228020c11040021040c010b024020050d0041012104200628021841c182c50041022006411c6a28020028020c1100000d01200028020021060b41012104200341013a00102006290210210720062902082108200341346a2205418c82c50036020020032006290218370308200629022021092006290228210a200320062d00303a00482006290200210b20032008370320200320073703282003200a370340200320093703382003200b3703182003200341086a3602302001200341186a200228020c1104000d00200341306a28020041a682c5004102200528020028020c11000021040b200041086a20043a00002000200028020441016a360204200341d0006a240020000b820201027f230041106b220224002002200128021841c882c50041052001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a4180b1c40010cf031a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000b200241106a2400200141ff01714100470b1600200028020022002802002000280208200110b4020b110020012000280200200028020810fd010b9d09010a7f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a360200200342808080808004370308200320003602204100210620034100360218200341003602102003200536023020032005360228024002400240024020022802082207450d0020022802002108200228020422092002410c6a2802002205200520094b1b220a450d01200020082802002008280204200128020c1100000d02200841086a2105200341386a2101200341346a210b200341306a210c41012106024003402001200741206a2d00003a00002003200741086a28020036020c20032007410c6a2802003602084100210202400240024002400240200741186a28020022004101460d00024020004102460d0020004103460d052007411c6a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b2007411c6a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b4188ddc4002000200410b501000b200341086a410c6a2004360200200341086a41086a20023602004100210202400240024002400240200741106a28020022004101460d00024020004102460d0020004103460d05200741146a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b200741146a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b4188ddc4002000200410b501000b200341086a41146a2004360200200341086a41106a200236020002400240024020072802004101470d00200741046a2802002202200b28020022044f0d02200c28020020024103746a21020c010b200341086a41206a22042802002202200341086a41246a280200460d032004200241086a3602000b2002280200200341086a200241046a2802001104000d052006200a4f0d04200541046a210220052802002104200541086a2105200741246a2107200641016a2106200341086a41186a28020020042002280200200341086a411c6a28020028020c110000450d010c050b0b4198ddc4002002200410b501000b41d8dbc400102f000b20022802002108200228020422092004200420094b1b220a450d00200020082802002008280204200128020c1100000d01200841086a2107200341206a2100200341246a21014101210603402005280200200341086a200541046a2802001104000d022006200a4f0d01200741046a210220072802002104200541086a2105200741086a2107200641016a2106200028020020042002280200200128020028020c110000450d000c020b0b200920064d0d01200341206a280200200820064103746a22072802002007280204200341246a28020028020c110000450d010b200341c0006a240041010f0b200341c0006a240041000bdc39030e7f017e017f230041c0006b220324002002280208220441586a2105200241106a2802002206412c6c210702400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024003402007450d01200741546a2107200541286a21082005412c6a2209210520082d00004104470d000b2006412c6c2107200441586a210503402007450d02200741546a2107200541286a21082005412c6a220a210520082d0000410b470d000b2006412c6c2107200441586a210503402007450d03200741546a2107200541286a21082005412c6a2204210520082d00004102470d000b200341106a2009109803200328021420014d0d03200328021020014102746a2207450d03200341086a2004109803200328020c200728020022074d0d04200328020820074104746a2207450d04200a41086a28020020014d0d05200a2802002109200341186a41086a420037030020034280808080c00037031820072d000d2108200341306a41026a220a2003412d6a41026a2d00003a0000200320032f002d3b0130411010222207450d3f200341206a220b4101360200200341186a410c6a220528020021062003200736021c200720064104746a220741003a000c2007410036020820072008410447220c3602042007200c360200200720032f01303b000d2007410f6a200a2d00003a00002005200528020041016a3602004100210802402009200141186c6a22072802142205450d002007410c6a2106200741146a210a200341306a410472210d4100210841002107034002402003280218220920084d0d00200341306a200341186a410010da0320032802304101460d0920082003280218220920032802342d000c1b2108200a28020021050b200720054f0d3e02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006280200220120074104746a2d0000220541ab014b0d00024020050eac01141e0707071e13120c181915110e0d0b17160f1004040404040404040404040404040505050505050505050a1a06060606080000000000000000000008000000000000000000000000000000000000000000000303030101010101010101010101010101010303030101010101010101010101010101010303030303030301010101010101030303030303030101010101010102020202020202020202020202020202020202020202020202140b200341306a200341186a410210db0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1f0c200b200341306a200341186a410210db0320032802300d272003280218220541016a22092005490d2820032009360218200741016a2207200a2802002205490d1e0c1f0b200341306a200341186a410110db0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1d0c1e0b200341306a200341186a410110db0320032802300d2b2003280218220541016a22092005490d2c20032009360218200741016a2207200a2802002205490d1c0c1d0b200341306a200341186a410110db0320032802300d2c2003280218220541016a22092005490d2d20032009360218200741016a2207200a2802002205490d1b0c1c0b200341306a200341186a410210db032003280230450d180c2f0b200941016a22052009490d2f20032005360218200741016a2207200a2802002205490d190c1a0b200120074104746a2d0001210e200341306a41026a2003412d6a41026a2d00003a0000200320032f002d3b0130200341246a2802002201200341206a280200470d01200141016a220f2001490d5b20014101742210200f200f2010491b2210ad4204862211422088a70d5b2011a722124100480d5b2001450d13200328021c200141047420121021220f0d140c5c0b200341306a200341186a410110db0320032802300d2e2003280218220541016a22092005490d3020032009360218200741016a2207200a2802002205490d170c180b200328021c210f0c130b200941016a22052009490d3d20032005360218200741016a2207200a2802002205490d150c160b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d140c150b200341306a200341186a200120074104746a41046a28020010da0320032802304101460d2f200341306a200341186a2003280234280204220510db0320032802300d41200341306a200341186a410110db0320032802300d4a2003280218220920056a22052009490d4b20032005360218200741016a2207200a2802002205490d130c140b200341306a200341186a410210db0320032802300d34200341306a200341186a410110db0320032802300d3e2003280218220541016a22092005490d4820032009360218200741016a2207200a2802002205490d120c130b200341306a200341186a410110db032003280230450d0f0c300b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d100c110b200341306a200341186a410110db032003280230450d0d0c2f0b200320041098032003280204200120074104746a41046a28020022054d0d2b2003280200220920054104746a2201450d2b200341306a200341186a200920054104746a28020810db0320032802300d3b2003280218220520012d000d4104476a22092005490d4320032009360218200741016a2207200a2802002205490d0e0c0f0b200341306a200341186a200120074104746a41046a28020010da0320032802304101460d32200341306a200341186a200328023428020410db0320032802300d38200341246a2802002205417f6a220920054f0d41200920054b0d41200328021c20094104746a41013a000c200741016a2207200a2802002205490d0d0c0e0b200341246a22052802002209450d2420052009417f6a2209360200200328021c20094104746a22052d000c4102460d2420052802002109200320052802082205360218200520096a22092005490d3f20032009360218200741016a2207200a2802002205490d0c0c0d0b200341246a2802002205417f6a220920054f0d31200920054b0d31200328021c20094104746a41013a000c200741016a2207200a2802002205490d0b0c0c0b200341306a200120074104746a41046a280200200210d60320032802304101460d25200341306a200341186a2003280234220528020810db0320032802300d392003280218220920052d000d4104476a22052009490d3c20032005360218200741016a2207200a2802002205490d0a0c0b0b200341306a200341186a410110db0320032802300d2d2003280218220541016a22092005490d3920032009360218200741016a2207200a2802002205490d090c0a0b200341306a200341186a410110db032003280230450d060c290b200341306a200341186a200120074104746a2209410c6a28020010da0320032802304101460d2120032802342802042101200941086a2802004102742105200941046a280200210903402005450d07200341306a200341186a200928020010da0320032802304101460d1b2005417c6a2105200941046a210920032802342802042001460d000c1c0b0b200341306a200341186a200c10db0320032802300d24200341246a2802002205417f6a220920054f0d30200920054b0d30200328021c20094104746a41013a000c200741016a2207200a2802002205490d060c070b200341306a200341186a410110db0320032802300d2e2003280218220541016a22092005490d3620032009360218200741016a2207200a2802002205490d050c060b20121022220f450d480b200341206a20103602002003200f36021c200341246a28020021010b200f20014104746a220141003a000c2001200936020820012005410347200e41044722057136020420012005360200200120032f01303b000d2001410f6a200341326a2d00003a0000200341246a2205200528020041016a3602000b200741016a2207200a2802002205490d010c020b200341306a200341186a200110db0320032802300d39200341246a2802002205417f6a220920054f0d3a200920054b0d3a200328021c20094104746a41013a000c200741016a2207200a2802002205490d000b0b2000410036020020002008360204200b280200450d5c200328021c1020200341c0006a24000f0b411310222207450d382007410f6a4100280085b944360000200741086a41002900feb844370000200741002900f6b844370000200041086a4293808080b0023702002000200736020420004101360200200341c0006a24000f0b410f10222207450d38200741076a4100290090b94437000020074100290089b944370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b410f10222207450d38200741076a410029009fb94437000020074100290098b944370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b412510222207450d392007411d6a41002900c4b944370000200741186a41002900bfb944370000200741106a41002900b7b944370000200741086a41002900afb944370000200741002900a7b944370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412510222207450d392007411d6a41002900c4b944370000200741186a41002900bfb944370000200741106a41002900b7b944370000200741086a41002900afb944370000200741002900a7b944370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412710222207450d3a2007411f6a41002900ebb944370000200741186a41002900e4b944370000200741106a41002900dcb944370000200741086a41002900d4b944370000200741002900ccb944370000200041086a42a7808080f0043702002000200736020420004101360200200341c0006a24000f0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a280200450d550c540b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d530c540b410e10222207450d3a200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d520c530b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d510c520b410e10222207450d39200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d500c510b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4f0c500b410e10222207450d38200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4e0c4f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4d0c4e0b410e10222207450d37200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4c0c4d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4b0c4c0b410e10222207450d36200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4a0c4b0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d490c4a0b412710222207450d352007411f6a41002900b7ba44370000200741186a41002900b0ba44370000200741106a41002900a8ba44370000200741086a41002900a0ba4437000020074100290098ba44370000200041086a42a7808080f0043702002000200736020420004101360200200341206a2802000d480c490b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d470c480b410e10222207450d34200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d460c470b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d450c460b411710222207450d332007410f6a4100290082ba44370000200741086a41002900fbb944370000200741002900f3b944370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d440c450b410e10222207450d33200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d430c440b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d420c430b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d410c420b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d400c410b410e10222207450d30200741066a41002900c5ba44370000200741002900bfba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d3f0c400b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3e0c3f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3d0c3e0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3c0c3d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3b0c3c0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3a0c3b0b410e10222207450d2b200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d390c3a0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d380c390b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d370c380b411710222207450d292007410f6a4100290082ba44370000200741086a41002900fbb944370000200741002900f3b944370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d360c370b410e10222207450d29200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d350c360b410e10222207450d29200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d340c350b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d330c340b411710222207450d282007410f6a4100290082ba44370000200741086a41002900fbb944370000200741002900f3b944370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d320c330b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d310c320b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d300c310b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2f0c300b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2e0c2f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2d0c2e0b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2c0c2d0b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2b0c2c0b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2a0c2b0b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d290c2a0b411710222207450d232007410f6a4100290082ba44370000200741086a41002900fbb944370000200741002900f3b944370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d280c290b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d270c280b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d260c270b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d250c260b410e10222207450d22200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d240c250b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d230c240b411710222207450d212007410f6a4100290082ba44370000200741086a41002900fbb944370000200741002900f3b944370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d220c230b411341011023000b410f41011023000b410f41011023000b41d0bac4002007200510b501000b412541011023000b412541011023000b411041041023000b412741011023000b1024000b201241041023000b410e41011023000b410e41011023000b410e41011023000b410e41011023000b410e41011023000b412741011023000b410e41011023000b411741011023000b410e41011023000b410e41011023000b410e41011023000b411741011023000b410e41011023000b410e41011023000b411741011023000b410e41011023000b410e41011023000b410e41011023000b410e41011023000b411741011023000b410e41011023000b410e41011023000b410e41011023000b411741011023000b200328021c10200b200341c0006a24000b1100200028020035020041012001109a020bbd0a020b7f017e230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c21020240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a200810980320032802182107200328021c21020c010b410021070b2002410020071b21092006412c6c2102200441586a2105200741c8d7c40020071b210a0240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a20081098032003280210210b2003280214210c0c010b4100210b0b2006412c6c2102200441586a2105200b41c8d7c400200b1b210d024002400240024002400240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210503402002450d09200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a200810980320032802082207200328020c41286c6a210803402008200722026b419f014d0d0320022d0018450d04200241c0006a2d0000450d05200241e8006a2d0000450d06200241a0016a210720024190016a2d00000d000b20024194016a210520010d060c090b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22050d080b200341cc006a41013602002003410236022c2003420237023c20034194b6c4003602382003200341206a3602282003200341286a360248200341d0006a200341386a102b2003290254210e200328025021020c0a0b20022008460d042002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c060b0b2005410c6a210720010d030c060b2002411c6a2105200241286a210720010d020c050b200241c4006a2105200241d0006a210720010d010c040b200241ec006a2105200241f8006a21072001450d030b02400240024003402001417f6a2101024002400240024003402008200722026b419f014d0d0120022d0018450d02200241c0006a2d0000450d03200241e8006a2d0000450d04200241a0016a210720024190016a2d00000d000b20010d040c070b20022008460d072002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c090b0b2005410c6a210720010d030c090b200241286a210720010d020c030b200241d0006a210720010d010c030b200241f8006a210720010d000b2003200241ec006a2802002202360224200920024b0d060c070b20032002411c6a2802002202360224200920024b0d050c060b2003200241c4006a2802002202360224200920024b0d040c050b200320024194016a2802002202360224200920024b0d030c040b41b7b5c40041dd001039000b41f5b4c40041c2001039000b200320052802002202360224200920024d0d010b200a20024104746a2202450d002000410036020020002002360204200341e0006a24000f0b200341dc006a4102360200200341cc006a4102360200200341023602542003420337023c200341a4b6c4003602382003200341206a3602582003200341246a3602502003200341d0006a360248200341286a200341386a102b200329022c210e200328022821020b2000200236020420004101360200200041086a200e370200200341e0006a24000bf50303047f017e017f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441386a2802002105200441346a2802002106200141016a2101200441c4006a2802004102460d030c010b0240024020002802002201450d0020003301044220862003ad842107410121040c010b2003ad210741002104410021010b200010202007a72103024002402007422088a7220620012f01064f0d00200121050c010b03400240024020012802002205450d00200441016a210420013301044220862003ad8421070c010b2003ad2107410021050b200110202007a72103200521012007422088a7220620052f01064f0d000b0b200520064102746a4198036a2802002100200520064105746a220141c4006a2802002108200141386a2802002105200141346a2802002106024020044101460d00410120046b210103402000280294032100200141016a22010d000b0b4100210120084102460d020b2002417f6a210202402005450d00200610200b20020d000b0b024020004180e5c200460d0020002802002101200010202001450d0020012802002105200110202005450d00024020052802002201450d000340200510202001210520012802002200210120000d000b0b200510200b0bcb0a03037f017e027f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002202417e6a2203412e4b0d0020030e2f061e220000141f18001d0a00000d0c1c26190b151b232111102728041a09080f24162503130520070201172a29120e060b200020023a00000f0b200020012d00013a00012000412b3a00000f0b200041046a200141046a2902003702002000412a3a00000f0b200041046a200141046a290200370200200041253a00000f0b200041046a200141046a2902003702002000411d3a00000f0b200041046a200141046a290200370200200041273a00000f0b200020012d00013a0001200041023a00000f0b200041046a200141046a290200370200200041293a00000f0b200041046a200141046a290200370200200041203a00000f0b200041046a200141046a2902003702002000411f3a00000f0b200020012d00013a0001200041046a200141046a2802003602002000410c3a00000f0b200041046a200141046a290200370200200041143a00000f0b200041046a200141046a280200360200200041103a00000f0b200041046a200141046a2802003602002000410f3a00000f0b200041086a200141086a290300370300200041303a00000f0b200041046a200141046a290200370200200041213a00000f0b200041046a200141046a2902003702002000411a3a00000f0b200041046a200141046a290200370200200041193a00000f0b200041046a200141046a2802003602002000412f3a00000f0b200041046a200141046a290200370200200041263a00000f0b200041046a200141046a280200360200200041073a00000f0b200041046a200141046a290200370200200041153a00000f0b200041046a200141046a290200370200200041233a00000f0b200020012d00013a00012000412c3a00000f0b200141086a2802002204ad2205421e88a70d142005420286a72203417f4c0d14200141046a28020021022003450d122003102222060d13200341041023000b200041046a200141046a280200360200200041133a00000f0b200041046a200141046a2902003702002000411e3a00000f0b200041046a200141046a290200370200200041163a00000f0b200041046a200141046a280200360200200041113a00000f0b200041046a200141046a2802003602002000410b3a00000f0b200020012d00013a0001200041033a00000f0b200041046a200141046a280200360200200041083a00000f0b200041046a200141046a290200370200200041283a00000f0b200041046a200141046a290200370200200041183a00000f0b200020012d00013a0001200041043a00000f0b200041046a200141046a290200370200200041173a00000f0b200041046a200141046a290200370200200041223a00000f0b200041046a200141046a290200370200200041243a00000f0b200041046a200141046a280200360200200041123a00000f0b200041046a200141046a2902003702002000411b3a00000f0b200041046a200141046a2902003702002000411c3a00000f0b200041086a200141086a2903003703002000412e3a00000f0b200041046a200141046a2802003602002000412d3a00000f0b410421060b02402004450d002004410274210720062103034020032002280200360200200341046a2103200241046a21022007417c6a22070d000b0b200041086a2004360200200041046a20063602002000410c6a2001410c6a280200360200200041093a00000f0b1031000b9e0302067f017e230041106b2202240002400240024002400240024002400240200041046a2802002203200028020822046b20012802042205200128020022066b41047622074f0d00200420076a22062004490d0320034101742204200620062004491b2206ad4204862208422088a70d032008a722044100480d032003450d0120002802002003410474200410212207450d020c040b2000280200210720062005460d040c050b2004102222070d020b200441081023000b1024000b20002007360200200041046a2006360200200041086a280200210420012802002206200141046a280200470d010b200241ac013a00000c010b2001200641106a3602002002200610d80320022d000041ac01460d00200441016a2103200720044104746a2106024003402003210420062002290300370300200641086a200241086a29030037030020012802002203200141046a280200460d012001200341106a3602002002200310d803200441016a2103200641106a210620022d000041ac01470d000c020b0b200241ac013a00000b200041086a2004360200200241106a24000ba10201027f02400240024002402001410c6a2802002203417f6a220420034d0d00411610222201450d01200020013602042001410e6a410029008ebc44370000200141086a4100290088bc4437000020014100290080bc44370000200041086a4296808080e002370200200041013602000f0b0240200420026b220220044d0d00411b10222201450d0220002001360204200141176a41002800adbc44360000200141106a41002900a6bc44370000200141086a410029009ebc4437000020014100290096bc44370000200041086a429b808080b003370200200041013602000f0b200320024d0d022000200141046a28020020024104746a360204200041003602000f0b411641011023000b411b41011023000b41b4bcc4002002200310b501000bf60201037f230041106b22032400024002402002450d0020032001410010da0320032802004101470d01200020034104722202290200370200200041086a200241086a280200360200200341106a24000f0b20004100360200200341106a24000f0b02400240024002402001280200220420032802042205280208470d0020052d000c450d0120004100360200200341106a24000f0b0240200420026b220220044d0d00410f10222202450d022000428f808080f00137020420002002360200200241076a41002900f8bb44370000200241002900f1bb44370000200341106a24000f0b2000410036020020012002360200200341106a24000f0b412510222202450d01200042a5808080d004370204200020023602002002411d6a41002900e9bb44370000200241186a41002900e4bb44370000200241106a41002900dcbb44370000200241086a41002900d4bb44370000200241002900ccbb44370000200341106a24000f0b410f41011023000b412541011023000bb20201027f230041106b2202240002400240200028020022002d00004104470d00200128021841c0cac40041082001411c6a28020028020c11000021010c010b2002200128021841abcac40041052001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41b0cac40010cf031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000b200241106a2400200141ff01714100470b0c0020002802002001109c030bd20201037f23004180016b22022400200028020021000240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff018341012001109a02210020024180016a240020000f0b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b2004418001102d000b2004418001102d000bdb0203027f017e017f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210020034120710d012000ac2204420020047d2000417f4a22001b20002001109a02210020024180016a240020000f0b20002802002103410021000340200220006a41ff006a2003410f712205413072200541d7006a2005410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712205413072200541376a2005410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141f8dac4004102200220036a4180016a410020036b109b02210020024180016a240020000f0b2003418001102d000b2000418001102d000bdd0202027f027e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d0120042004423f8722057c2005852004427f552001109a02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141f8dac4004102200220006a41800120006b109b02210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141f8dac4004102200220006a41800120006b109b02210020024180016a240020000f0b2000418001102d000b2000418001102d000b931001157f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024002400240024002400240024002400240024002400240024002400240024002400240024020042d00002200410d4b0d00024020000e0e000203040506070809140a0b0c0d000b200441086a280200450d13200441046a280200102020022003470d140c150b0240200441086a280200450d00200441046a28020010200b0240200441146a2802002200450d00200441186a280200450d00200010200b200441246a280200450d12200441206a280200102020022003470d130c140b0240200441086a280200450d00200441046a28020010200b200441146a280200450d11200441106a280200102020022003470d120c130b200441046a210502402004410c6a2802002201450d00200528020021002001410474210103400240200041046a280200450d00200028020010200b200041106a2100200141706a22010d000b0b200441086a280200450d102005280200102020022003470d110c120b200441046a210502402004410c6a2802002201450d0020052802002100200141286c210103400240200041046a280200450d00200028020010200b0240200041106a280200450d002000410c6a28020010200b200041286a2100200141586a22010d000b0b200441086a280200450d0f2005280200102020022003470d100c110b200441086a280200450d0e200441046a280200102020022003470d0f0c100b200441086a280200450d0d200441046a280200102020022003470d0e0c0f0b200441086a280200450d0c200441046a280200102020022003470d0d0c0e0b200441046a21062004410c6a2802002200450d0a2006280200220720004104746a2108410021000c050b200441046a210502402004410c6a2802002201450d0020052802002100200141146c210103400240200041046a280200450d00200028020010200b200041146a21002001416c6a22010d000b0b200441086a280200450d0a2005280200102020022003470d0b0c0c0b200441046a21092004410c6a2802002200450d072009280200220a2000411c6c6a210b410121000c030b200441046a210c2004410c6a2802002200450d05200c280200220d200041186c6a210e410221000c020b200441046a210f2004410c6a2802002200450d03200f28020022102000411c6c6a2111410321000c010b024002400240200441046a2d000022004102460d0020004101460d0120000d022004410c6a280200450d09200441086a280200102020022003470d0a0c0b0b2004410c6a2112200441146a2802002200450d032012280200221320004104746a2114410421000c020b2004410c6a21150240200441146a2802002201450d00201528020021002001410c6c21010340024020002802002205450d00200041046a280200450d00200510200b2000410c6a2100200141746a22010d000b0b200441106a280200450d072015280200102020022003470d080c090b2004410c6a280200450d06200441086a28020010200c060b0340024002400240024002400240024002400240024020000e050001020304040b024020072802082201450d0020072802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010200b200041106a2100200141706a22010d000b0b200741106a21000240200741046a280200450d00200728020010200b2000210720002008470d040c0e0b0240200a410c6a2802002201450d00200a2802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010200b200041106a2100200141706a22010d000b0b0240200a41086a280200450d00200a41046a28020010200b200a411c6a21000240200a41146a280200450d00200a28021010200b2000210a2000200b470d040c0c0b0240200d41046a280200450d00200d28020010200b0240200d41146a2802002201450d00200d28020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010200b200041106a2100200141706a22010d000b0b200d41186a21000240200d41106a280200450d00200d410c6a28020010200b2000210d2000200e470d040c0a0b02402010410c6a2802002201450d0020102802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010200b200041106a2100200141706a22010d000b0b0240201041086a280200450d00201041046a28020010200b2010411c6a21000240201041146a280200450d00201028021010200b2000211020002011470d040c080b2013221541106a2113024020152802042200450d0002402015410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d00200510200b2000410c6a2100200141746a22010d000b0b201541086a280200450d00201541046a28020010200b20132014470d040c060b410021000c040b410121000c030b410221000c020b410321000c010b410421000c000b0b200441106a280200450d042012280200102020022003470d050c060b200441086a280200450d03200f280200102020022003470d040c050b200441086a280200450d02200c280200102020022003470d030c040b200441086a280200450d012009280200102020022003470d020c030b200441086a280200450d002006280200102020022003470d010c020b20022003470d000b0b0be40601087f230041d0006b220224002000280200220041046a28020021032000280200210041012104200128021841c782c50041012001411c6a28020028020c11000021050240024002402003450d002002200036020402400240024020050d00024020012d00004104710d00200241046a2001108e0221044101210620034101460d020c030b41012104200141186a220528020041c582c50041012001411c6a28020028020c1100000d002001280200210741012104200241086a41086a41013a0000200241186a411c6a418c82c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022007360218200241186a41186a200241086a360200200220052902003703082002200141046a28020036021c200241046a200241186a108e020d00200241306a28020041a682c5004102200241346a28020028020c11000021040b4101210620034101470d010b4101210020040d020c030b200041046a21002003410274417c6a2103200141186a21072001411c6a210820042105034020022000360204200541ff0171210441012105024020040d000240200128020022044104710d002007280200418882c5004102200828020028020c1100000d01200241046a2001108e022105200041046a21002003417c6a22030d020c030b200241086a41086a20063a0000200241186a411c6a2209418c82c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022004360218200241186a41186a2204200241086a360200200220072902003703082002200141046a28020036021c200241046a200241186a108e020d00200428020041a682c5004102200928020028020c1100002105200041046a21002003417c6a22030d010c020b200041046a21002003417c6a22030d000b0b410121002005450d010b200241d0006a240020000f0b200141186a28020041c682c50041012001411c6a28020028020c1100002100200241d0006a240020000bc81401037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000022024101460d0020024102470d01200141046a280200200141086a2802002202470d03200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0720012802002002200410212203450d080c0f0b200141046a280200200141086a2802002202470d01200241016a22032002490d1020024101742204200320032004491b22044100480d102002450d0420012802002002200410212203450d050c0c0b200141046a280200200141086a2802002202470d02200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d0720012802002002200410212203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2004102222030d070b200441011023000b2004102222030d070b200441011023000b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a280200200110c3020f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d2020024101742204200320032004491b22044100480d202002450d0f20012802002002200410212203450d100c1b0b200141046a28020020042802002202470d03200241016a22032002490d1f20024101742204200320032004491b22044100480d1f2002450d0820012802002002200410212203450d090c180b200141046a280200200141086a2802002202470d03200241016a22032002490d1e20024101742204200320032004491b22044100480d1e2002450d0920012802002002200410212203450d0a0c150b200141046a280200200141086a2802002202470d03200241016a22032002490d1d20024101742204200320032004491b22044100480d1d2002450d0a20012802002002200410212203450d0b0c120b200141046a280200200141086a2802002202470d04200241016a22032002490d1c20024101742204200320032004491b22044100480d1c2002450d0d20012802002002200410212203450d0e0c0f0b200128020021030c150b200128020021030c120b200128020021030c0f0b200128020021030c140b200128020021030c0b0b2004102222030d0f0b200441011023000b2004102222030d0b0b200441011023000b2004102222030d070b200441011023000b2004102222030d0b0b200441011023000b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a280200200110c302200041146a280200200041186a280200200110c30202400240024002400240200141046a280200200141086a2802002202470d00200241016a22032002490d0720024101742204200320032004491b22044100480d072002450d0120012802002002200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a200041026a2d00003a00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a00000240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d1320024101742204200320032004491b22044100480d132002450d0f20012802002002200410212203450d100c1c0b200141046a28020020042802002202470d03200241016a22032002490d1220024101742204200320032004491b22044100480d122002450d0820012802002002200410212203450d090c190b200141046a280200200141086a2802002202470d03200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0920012802002002200410212203450d0a0c160b200141046a280200200141086a2802002202470d03200241016a22032002490d1020024101742204200320032004491b22044100480d102002450d0a20012802002002200410212203450d0b0c130b200141046a280200200141086a2802002202470d04200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d0d20012802002002200410212203450d0e0c100b200128020021030c160b200128020021030c130b200128020021030c100b200128020021030c150b200128020021030c0c0b2004102222030d100b200441011023000b2004102222030d0c0b200441011023000b2004102222030d080b200441011023000b2004102222030d0c0b200441011023000b2004102222030d020b200441011023000b1024000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a280200200110c302200041146a280200200041186a280200200110c302200041206a280200200041246a280200200110c3022000412c6a280200200041306a280200200110c3020be80701037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d0520022802002003200510212204450d060c170b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1020044101742203200520052003491b22034100480d102004450d0820022802002004200310212204450d090c140b200228020021040c160b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d08200228020020042003102122040d090c0f0b200228020021040c120b200241046a280200200241086a2802002203470d03200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d09200228020020032005102122040d0a0c0e0b2005102222040d110b200541011023000b200228020021040c050b200228020021040c070b2003102222040d0b0b200341011023000b200310222204450d060b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a2001410274410272360000200141037422010d0b0c0c0b200510222204450d040b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0420044101742203200520052003491b22034100480d042004450d01200228020020042003102122040d020c070b200228020021040c020b200310222204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a200136000020014103742201450d090c080b1024000b200341011023000b200541011023000b200341011023000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b0000200141037422010d020c030b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a000020014103742201450d010b200020016a210103402000280200200041046a280200200210c302200041086a22002001470d000b0b0bd50101027f200028020421020240024020002802004101470d002000410c6a2802002200200110c2022000450d01200041186c2103200241146a21000340200041706a280200200041746a280200200110c3022000417c6a2802002000280200200110c302200041186a2100200341686a22030d000c020b0b200041086a2802002200200110c2022000450d00200041186c2103200241146a21000340200041706a280200200041746a280200200110c3022000417c6a2802002000280200200110c302200041186a2100200341686a22030d000b0b0b2700200028020c200041106a280200100f200041146a3502001019200041186a350200101900000b080020002001100f0b06002000101a0b06002000101b0b2801017f02402002101a2203450d002003200020022001200120024b1b1084041a2000101b0b20030b1c01017f02402000101a2201450d002001410020001083041a0b20010b7601017f230041c0006b220024002000413336020c20004184d4c400360208200041346a412f360200200041246a41023602002000410336022c20004202370214200041b8d4c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8d4c4001048000b1c00200128021841c882c50041052001411c6a28020028020c1100000bba0101037f024002400240024002400240200028020022002802042203200028020822046b20024f0d00200420026a22052004490d0320034101742204200520052004491b22044100480d032003450d0120002802002003200410212203450d020c040b200028020021030c040b2004102222030d020b200441011023000b1024000b20002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a200120021084041a41000bba0401047f230041106b22022400200028020021000240024002400240024002400240024002400240024020014180014f0d00200028020822032000280204470d09200341016a22042003490d0520034101742205200420042005491b22044100480d052003450d0120002802002003200410212203450d020c080b2002410036020c0240024020014180104f0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b024020002802042204200028020822036b20014f0d00200320016a22052003490d0520044101742203200520052003491b22034100480d052004450d0320002802002004200310212204450d040c060b200028020021040c060b2004102222030d060b200441011023000b2003102222040d020b200341011023000b1024000b20002004360200200041046a2003360200200041086a28020021030b200041086a200320016a360200200420036a2002410c6a20011084041a0c020b20002003360200200041046a2004360200200041086a28020021030b200028020020036a20013a0000200041086a2200200028020041016a3602000b200241106a240041000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41ecd3c400200241086a10d3032101200241206a240020010b0c0042e5e4fca4e8e9bcef220b5501017f0240024002402001418080c400460d0041012104200028021820012000411c6a2802002802101104000d010b2002450d012000280218200220032000411c6a28020028020c11000021040b20040f0b41000bd30801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b21074180022108024003400240200820014f0d00200020086a2c000041bf7f4a0d020b2008417f6a21064100210520084101460d02200720086a21092006210820094101470d000c020b0b41002105200821060b200420063602142004200036021020044100410520051b36021c200441c8d7c40041fadac40020051b360218024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b20042002360220024002402002450d0020022001460d00200141016a210903400240200220014f0d00200020026a2c000041404e0d020b2002417f6a210820024101460d0220092002462106200821022006450d000c020b0b200221080b20082001460d02410121064100210502400240200020086a22092c000022024100480d002004200241ff0171360224200441286a21020c010b200020016a220621010240200941016a2006460d00200941026a2101200941016a2d0000413f7121050b2002411f712109024002400240200241ff017141e001490d004100210020062107024020012006460d00200141016a210720012d0000413f7121000b20002005410674722101200241ff017141f001490d0141002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d060c020b200520094106747221010c010b20012009410c747221010b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441ec006a4103360200200441e4006a4103360200200441c8006a41146a4130360200200441d4006a4131360200200441306a41146a4105360200200420023602582004410236024c20044205370234200441f0dbc4003602302004200441186a3602682004200441106a3602602004200441246a3602502004200441206a3602482004200441c8006a360240200441306a4198dcc4001048000b20042002200320081b360228200441c8006a41146a4103360200200441d4006a4103360200200441306a41146a41033602002004410236024c2004420337023420044180dbc4003602302004200441186a3602582004200441106a3602502004200441286a3602482004200441c8006a360240200441306a4198dbc4001048000b200441e4006a4103360200200441c8006a41146a4103360200200441d4006a4102360200200441306a41146a41043602002004410236024c20044204370234200441a8dbc4003602302004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a3602482004200441c8006a360240200441306a41c8dbc4001048000b41d8dbc400102f000b830101037f230041206b22022400024002402000280200200110f7030d002001411c6a2802002103200128021821042002411c6a4100360200200241c8d7c4003602182002420137020c20024180ddc40036020820042003200241086a10d303450d010b200241206a240041010f0b2000280204200110f7032101200241206a240020010b820c03037f017e167f410121020240200128021841272001411c6a2802002802101104000d00410221020240024002400240024002400240024002402000280200220341776a2200411e4b0d0041f4002104024020000e1f09000202030202020202020202020202020202020202020202070202020207090b41ee0021040c030b200341dc00460d050b200310f603450d02200341017267410276410773ad4280808080d0008421050c030b41f20021040b0c040b024002400240200341ffff034b0d0020034180fe0371410876210641c8ddc4002107410021084102210941b002210a4198dec400210b4198dec400210c417f210d4101210e200341ff0171210f410021020c010b0240200341ffff074b0d0020034180fe037141087621134183e3c40021144100211541022116419f01211741c5e3c400211841c5e3c4002119417f211a4101211b200341ff01712112410121020c010b200341ef83384b0d01200341e28b746a41e28d2c490d012003419fa8746a419f18490d01200341dee2746a410e490d01200341feffff0071419ef00a460d01200341a9b2756a4129490d01200341cb91756a410a4d0d01410121020c030b034002400240024002400240024002400240024002400240024020020e020001010b200720096a2110200820072d000122026a211102400240024020072d000022002006470d0020112008490d042011200a4f0d052008200b6a210003402002450d022002200d6a210220002d000021042000200e6a21002004200f470d000c100b0b200020064b0d0120112108201021072010200c470d090c010b20112108201021072010200c470d090b200341ffff0371210041c7e0c40021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e4183e3c400460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f20024183e3c400470d000b0b41012102200f4101710d0e0c0c0b201420166a2110201520142d000122026a211102400240024020142d000022002013470d0020112015490d05201120174f0d06201520186a210003402002450d022002201a6a210220002d000021042000201b6a210020042012470d000c0f0b0b200020134b0d01201121152010211420102019470d0a0c010b201121152010211420102019470d0a0b200341ffff0371210041e3e4c40021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41e0e7c400460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241e0e7c400470d000b0b41012102200f4101710d0d0c0b0b20082011102d000b201141af02102e000b20152011102d000b2011419e01102e000b41d8dbc400102f000b41d8dbc400102f000b410021020c030b410021020c020b410121020c010b410121020c000b0b200341017267410276410773ad4280808080d0008421050b410321020c010b0b200321040b200141186a210f2001411c6a210e02400340024002400240024002400240024020024101460d0041dc002100024020024102460d0020024103470d092005422088a741ff0171417f6a220241044b0d09024020020e050006040503000b200542ffffffff8f6083210541fd0021000c060b410121020c060b41002102200421000c050b200542ffffffff8f60834280808080c0008421050c030b200542ffffffff8f608342808080802084210541fb0021000c020b200542ffffffff8f608342808080803084210541f50021000c010b20042005a7220d410274411c7176410f712202413072200241d7006a2002410a491b21000240200d450d002005427f7c42ffffffff0f832005428080808070838421050c010b200542ffffffff8f60834280808080108421050b410321020b200f2802002000200e280200280210110400450d000b41010f0b200141186a28020041272001411c6a28020028021011040021020b20020b9b0201017f024002400240024002400240024020004180104f0d00200041037641f8ffffff017141e0e7c4006a21010c010b02402000418080044f0d00200041067641606a220141e0074f0d02200141f8e9c4006a2d0000220141c9004b0d03200141037441d0f4c4006a21010c010b2000410c7641706a22014180024f0d03200141d8f1c4006a2d00004106742000410676413f7172220141ff034b0d04200141a0f9c4006a2d0000220141364b0d05200141037441a0fdc4006a21010b200129030042012000413f71ad86834200520f0b41d8f3c400200141e00710b501000b41e8f3c400200141ca0010b501000b41f8f3c400200141800210b501000b4188f4c400200141800410b501000b4198f4c4002001413710b501000bb30201037f23004180016b220224000240024002400240200128020022034110710d0020034120710d012000ad41012001109a02210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141f8dac4004102200220036a4180016a410020036b109b02210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141f8dac4004102200220036a4180016a410020036b109b02210020024180016a240020000f0b2000418001102d000b2000418001102d000b0e00200035020041012001109a020bc50501077f41002104024020024103712205450d00410420056b2205450d00200220032005200520034b1b22046a210641002105200141ff017121072004210820022109024002400340200620096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210603402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2006470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b20002005360204200041013602000f0b200141ff017121070240024020034108490d002004200341786a220a4b0d00200741818284086c210502400340200220046a220941046a2802002005732208417f73200841fffdfb776a7120092802002005732209417f73200941fffdfb776a7172418081828478710d01200441086a2204200a4d0d000b0b200420034b0d010b200220046a2109200220036a2102200320046b2108410021050240024002400340200220096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210203402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2002470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b2000200520046a360204200041013602000f0b2000200520076a20046a360204200041003602000f0b20042003102d000b2701017f2000280200220128020020012802042000280204280200200028020828020010f303000be004010d7f230041306b2203240002402002450d00200341286a2104200041086a2105200341206a21062003411c6a2107200341246a2108200041046a210902400240024002400340024020052d0000450d002000280200418482c5004104200928020028020c1100000d020b2004410a3602002006428a8080801037030020072002360200200341106a41086a220a41003602002003200236021420032001360210200341086a410a2001200210f9030240024002400240024020032802084101470d00200328020c210b0340200a200b200a2802006a41016a220b36020002400240200b2008280200220c4f0d002003280214210d2007280200220e200b4f0d010c040b02402003280214220d200b490d00200c41054f0d062003280210200b200c6b220f6a220e2004460d05200e2004200c108604450d050b2007280200220e200b490d030b200d200e490d022003200341106a200c6a41176a2d00002003280210200b6a200e200b6b10f9032003280204210b20032802004101460d000b0b200a20072802003602000b200541003a00002002210b0c020b200541013a0000200f41016a210b0c010b200c4104102e000b2009280200210e2000280200210c0240200b452002200b4672220a0d002002200b4d0d042001200b6a2c000041bf7f4c0d040b200c2001200b200e28020c1100000d010240200a0d002002200b4d0d052001200b6a2c000041bf7f4c0d050b2001200b6a21012002200b6b22020d000c020b0b200341306a240041010f0b200341306a240041000f0b200120024100200b10f303000b20012002200b200210f303000b200341306a240041000b02000bfa0101017f230041106b220224002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a200110fb032101200241106a240020010b6101017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41a882c500200241086a10d3032101200241206a240020010b02000b0e0020002802002001200210fb030b810201017f230041106b22022400200028020021002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a200110fb032101200241106a240020010b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41a882c500200241086a10d3032101200241206a240020010b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f02400240200120004f0d002002450d012001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000c020b0b2002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b4401037f024002402002450d00410021030340200020036a2d00002204200120036a2d00002205470d02200341016a22032002490d000b41000f0b41000f0b200420056b0b3e01017f230041106b22052400200520012002200320044100108b04200529030021012000200541086a29030037030820002001370300200541106a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080bb70502037f057e230041306b2206240002400240024002400240024002400240024002400240024002400240024020024200510d002003500d012004500d03200479a7200279a76b2207413f4b0d0241ff0020076b2108200741016a21070c0c0b200450450d012005450d0520034200510d0d20054200370308200520012003823703000c060b2004500d0c20014200510d032004427f7c2209200483500d07200479a7200279a76b2207413e4d0d090b2005450d012005200137030020052002370308420021010c070b2003427f7c2209200383500d044100200379a741c1006a200279a76b22076b21080c080b420021010c050b02402005450d0020054200370300200520022004823703080b200220048021010c040b20034200510d070b200120038021010c020b02402005450d0020054200370308200520092001833703000b20034201510d04200641206a2001200220037aa7108a04200641286a2903002102200629032021010c040b02402005450d0020052001370300200520092002833703080b200220047a423f838821010b420021020c020b41ff0020076b2108200741016a21070b200620012002200841ff0071108904200641106a20012002200741ff0071108a04200641086a2903002102200641106a41086a290300210a20062903002101200629031021094200210b0340200a4201862009423f8884220c200c427f8520047c20094201862002423f88842209427f85220c20037c200c54ad7c423f87220c2004837d2009200c200383220d54ad7d210a2009200d7d2109420020024201862001423f8884842102200b2001420186842101200c420183220c210b2007417f6a22070d000b02402005450d00200520093703002005200a3703080b20024201862001423f88842102200c20014201868421010b2000200137030020002002370308200641306a24000f0b00000b0bd882050100418080c0000bcd8205746f6f206d616e7920696e737472756374696f6e730000003000100024000000c5291100170000004002000009000000547269656420746f20736872696e6b20746f2061206c617267657220636170616369747900000000800010000f0000000000000090001000020000000000000000000000a000100004000000000000004e65774163636f756e74496e64657800bde61000090000003b0110000c000000c000100022000000c82b110000000000e20010004100000023011000180000002041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e646578496e646963657320456e756d53657400000000000000000000617474656d707420746f20646976696465206279207a65726f000000a425110028000000940110004200000048000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f696e64696365732f7372632f6c69622e7273000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e727394011000420000004800000001000000496e64696365730000000000080310000b0000000000000000000000130310000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110024031000000000000000000034031000010000000000000001000000000000003c031000070000000101000000000000130310000f00000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000c82b1100440310000000000000000000540310000100000000000000010000004e657874456e756d536574543a3a4163636f756e74496e646578000032000000000000000100000033000000720310001f000000456e756d53657400320000000000000001000000340000005c031000160000002054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e000000e001100048000000870a00000e0000006001100019000000c003100047000000df00000018000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f70687261676d656e2e7273496e6469636573204e657874456e756d53657473746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c696420747970654e6f6e2d656d7074792066756e6374696f6e20626f64792065787065637465640000002e0510000f0000003d051000020000003f05100003000000a004100030000000d00410005e0000007d00000005000000617373657274696f6e206661696c65643a20636f6e746578742e6672616d655f737461636b2e69735f656d70747928292f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7761736d692d76616c69646174696f6e2d302e312e302f7372632f66756e632e7273417420696e737472756374696f6e202840293a2076616c69646174696f6e206572726f7200006c0510007c000000e8051000480000007a00000006000000657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f6d6f642e72733a617574683a436f6e73656e737573204f726967696e616c417574686f72697469657300a4251100280000006c0610004400000024010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e73656e7375732f7372632f6c69622e72736f66666c726570304e6f20606f66666c696e655f7265706f72746020666f756e6420696e2074686520696e686572656e742064617461210000071000190000002007100042000000520000001f000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e72730000000000002c0c10000600000000000000350000000000000000000000360000000000000000000000020000000000000000000000000000000000000037000000000000000000000000000000320c10000400000000000000380000000000000002000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000360c100009000000000000003900000000000000000000003a0000000000000000000000000000003b000000000000000000000002000000000000000000000000000000000000003f0c100009000000000000003c00000000000000000000003d0000000000000000000000000000003e00000000000000000000000200000000000000000000000000000000000000480c100007000000000000003f00000000000000000000004000000000000000000000000000000041000000000000000000000000000000420000000000000000000000000000004f0c10000800000000000000430000000000000000000000440000000000000000000000000000004500000000000000000000000000000046000000000000000000000000000000570c1000070000000000000047000000000000000000000048000000000000000000000000000000490000000000000000000000000000004a0000000000000000000000000000005e0c100007000000000000004b00000000000000000000004c0000000000000000000000000000004d0000000000000000000000000000004e000000000000000000000000000000650c100009000000000000004f00000000000000000000005000000000000000000000000000000051000000000000000000000000000000520000000000000000000000000000006e0c10000700000000000000530000000000000000000000540000000000000000000000000000005500000000000000000000000000000056000000000000000000000000000000750c10000e0000000000000057000000000000000000000058000000000000000000000000000000590000000000000000000000000000005a000000000000000000000000000000830c10000f000000000000005b00000000000000000000005c0000000000000000000000000000005d0000000000000000000000000000005e000000000000000000000000000000920c10001000000000000000380000000000000002000000000000000000000000000000000000005f00000000000000000000000200000000000000000000000000000000000000a20c10000700000000000000600000000000000000000000610000000000000000000000000000006200000000000000000000000000000063000000000000000000000000000000a90c10000800000000000000640000000000000000000000650000000000000000000000000000006600000000000000000000000000000067000000000000000000000000000000b10c10000800000000000000680000000000000000000000690000000000000000000000000000006a0000000000000000000000000000006b00000000000000000000000000000074ab100004000000000000006c00000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f000000000000000000000073797374656d6175726174696d657374616d70636f6e73656e737573696e646963657362616c616e63657373657373696f6e7374616b696e6764656d6f6372616379636f756e63696c636f756e63696c5f766f74696e67636f756e63696c5f6d6f74696f6e7366696e616c6974795f747261636b65726772616e6470617472656173757279636f6e747261637400000000000000f48b10001200000000000000088c1000010000000000000000000000208c1000010000000000000000000000f00d10000c00000000000000fc0d1000010000000000000000000000140e10000100000000000000000000001c0e10000600000000000000240e10000100000000000000000000003c0e1000010000000000000000000000440e10000e00000000000000540e10000100000000000000000000006c0e1000010000000000000000000000740e100008000000000000007c0e1000010000000000000000000000940e10000100000000000000000000009c0e10000b00000000000000a80e1000010000000000000000000000c00e1000010000000000000000000000c80e10000c00000000000000d40e1000010000000000000000000000ec0e100001000000000000006e6f74655f6f66666c696e65000000001710100007000000000000001e1010003d000000c30f10005400000072656d61726b000000000000bc0f10000700000000000000d3af100007000000a10f10001b0000007365745f686561705f70616765730000000000009c0f1000050000000000000061c51000030000005d0f10003f0000007365745f636f6465000000009fef10000300000000000000d3af1000070000004b0f1000120000007365745f73746f726167650000000000390f100005000000000000003e0f10000d0000001e0f10001b0000006b696c6c5f73746f7261676500000000120f10000400000000000000160f100008000000f40e10001e000000204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e6b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b204e6f74652074686174207468652070726576696f757320626c6f636b27732076616c696461746f72206d697373656420697473206f70706f7274756e69747920746f2070726f706f7365206120626c6f636b2e6f66666c696e653c543a3a496e686572656e744f66666c696e655265706f727420617320496e686572656e744f66666c696e655265706f72743e3a3a496e686572656e740000000000c0101000130000000000000000000000d31010001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100e81010000000000000000000c82b11000000000000000000000000004f726967696e616c417574686f7269746965735665633c543a3a53657373696f6e4b65793e00000032000000000000000100000070000000436f6e73656e7375737375627374726174652d6e6f646500df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000dd718d5cc53262d4010000007801759919ee83e5010000008811100028000000d0601000420000000d01000004000000446570726563617465642c20706c65617365207573652060417574686f726974696573417069602e3a6865617070616765733a636f6465006c0610004400000024010000010000006e6f7420616c6c6f77656420746f206661696c20696e2072756e74696d650000791410001c0000000413100044000000980000000300000055141000240000000413100044000000a0000000030000001d141000380000000413100044000000dd0000002a000000f5131000280000000413100044000000de00000032000000cd131000280000000413100044000000e00000002c000000a11310002c0000000413100044000000df0000004c0000006f13100032000000041310004400000014010000030000004469676573744974656d206e6f7420657175616c481310002700000004131000440000001c01000004000000dc121000280000000413100044000000220100000300000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f2070617920746865697220666565735472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e696e76616c6964206163636f756e7420696e646578626164206f726967696e3a20657870656374656420746f2062652061207468726573686f6c64206e756d626572206f6620636f756e63696c206d656d6265727300000000000028d210000800000000000000c8151000040000000000000000000000e8151000010000000000000000000000f01510000500000000000000f81510000500000000000000000000002016100002000000000000000000000030161000080000000000000034af100001000000000000000000000038161000010000000000000000000000401610000b0000000000000034af10000100000000000000000000004c161000010000000000000000000000a6361000080000000000000054161000020000000000000000000000641610000100000000000000bde610000900000027d310000d000000a3b010000400000062e71000030000009217100059000000566f746564000000bde6100009000000a3b01000040000007bef10000400000062e710000300000062e71000030000001317100042000000551710003d000000417070726f766564e216100031000000446973617070726f76656400ad16100035000000a3b01000040000007bef1000040000006c161000410000002041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e206173207533327320726573706563746976656c79292e2041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20753332292e416c69766520636f6e7472616374206f7220746f6d6273746f6e6520616c72656164792065786973747341757261204c61737454696d657374616d7054696d657374616d70204d656469616e54696d657374616d702055706461746554696d657374616d7020526563656e7448696e74737418100031000000a51810004b000000790000000400000046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e72730819100023000000a51810004b0000007a0000000400000046696e616c697a6564206865696768742061626f766520626c6f636b206e756d626572616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f776564007019100048000000810a00000a0000000000000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e7273a425110028000000d01910004600000042000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f6d6f74696f6e732e72730000301a100019000000501a10003f0000000c0100001e000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f617572612f7372632f6c69622e727374696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c4765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e74206461746100041b100022000000261b10003f000000d1000000030000004175726120736c6f74206475726174696f6e2063616e6e6f74206265207a65726f2e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f617572612f7372632f6c69622e7273000000801b100028000000261b10003f000000d7000000030000004f6e6c79206f6e6520626c6f636b206d617920626520617574686f7265642070657220736c6f742ec01b100033000000f31b10004a000000a800000005000000636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6163636f756e745f64622e727300000000000000689a10000700000000000000981c1000020000000000000000000000c82b1100000000000000000000000000889a10000400000000000000c81c1000030000000000000000000000c82b11000000000000000000000000006b4f10000900000000000000a2ef10000c000000000000002f9b10000800000000000000101d10001b000000000000002f9b10000800000000000000289b100007000000000000004f6d10000500000000000000b4dc10001600000000000000379b100007000000000000007bef100004000000426f783c3c542061732054726169743e3a3a50726f706f73616c3e436f756e63696c4d6f74696f6e7300000000000000f0e11000090000000000000000000000cc1e10000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d81e10000000000000000000e81e100001000000000000000100000000000000ee9e10000a0000000101000000000000289b10000700000000000000f01e10001600000000000000000000000000000000000000000000000000000000000000c82b1100501f10000000000000000000081f100001000000000000000000000000000000101f1000060000000101000000000000289b10000700000000000000161f10003a00000000000000000000000000000000000000000000000000000000000000c82b1100501f10000000000000000000601f100001000000000000000000000000000000c8e110000d000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100681f10000000000000000000781f10000100000000000000010000005665633c543a3a486173683e320000000000000001000000340000000e201000260000003c542061732054726169743e3a3a50726f706f73616c0000db1f100033000000566f74696e672850726f706f73616c496e6465782c207533322c205665633c543a3a4163636f756e7449643e2c205665633c543a3a4163636f756e7449643e2932000000000000000100000070000000921f10004900000032000000000000000100000033000000801f1000120000002050726f706f73616c7320736f206661722e20566f74657320666f72206120676976656e2070726f706f73616c3a202872657175697265645f7965735f766f7465732c207965735f766f746572732c206e6f5f766f74657273292e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e205468652028686173686573206f662920746865206163746976652070726f706f73616c732e626164207369676e617475726520696e2065787472696e73696354696d657374616d7020496e697469616c697a656454696d657374616d70204f72646572656448696e747354696d657374616d702057696e646f7753697a65616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b207165640000001321100043000000a51810004b000000b20000000400000054696d657374616d70205265706f72744c6174656e63797072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b20716564000000000000842110000a0000000000000090211000010000000000000000000000a8211000020000000000000066696e616c5f68696e7400000000000010221000040000000000000000f0100017000000b82110003d000000f52110001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e68696e74436f756e63696c4d6f74696f6e732050726f706f73616c4f6670726f706f736572206e6f74206f6e20636f756e63696c436f756e63696c4d6f74696f6e732050726f706f73616c436f756e74436f756e63696c4d6f74696f6e732050726f706f73616c73436f756e63696c4d6f74696f6e7320566f74696e67766f746572206e6f74206f6e20636f756e63696c70726f706f73616c206d7573742065786973746d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f72656400007019100048000000870a00000e000000d0191000460000004200000001000000626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e646578626164206f726967696e3a20657870656374656420746f20626520616e20696e686572656e74206f726967696e53797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e736963734c656e647572696e6720657865637574696f6e00a425110028000000e02310004c0000005c000000080000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f72756e74696d652e727353797374656d2045787472696e7369634461746153797374656d2044696765737453797374656d204e756d62657253797374656d2045787472696e73696373526f6f7453797374656d20426c6f636b4861736853797374656d204163636f756e744e6f6e6365707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a0909090971656453797374656d20506172656e744861736853797374656d2052616e646f6d4d6174657269616c0000005027100048000000870a00000e00000053797374656d204576656e7473000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e727353797374656d000000000000ec2b10000c00000001010000000000005a0211000c00000000000000f82b10000800000000000000000000000000000000000000000000000000000000000000c82b1100cc2c10000000000000000000002c100001000000000000000100000000000000082c10000e000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100302c10000000000000000000182c100001000000000000000000000000000000202c100010000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100302c10000000000000000000402c100001000000000000000000000000000000482c10000900000001010000000000008e0111000e00000000000000289b10000700000000000000000000000000000000000000000000000000000000000000c82b1100082d10000000000000000000542c1000010000000000000001000000000000005c2c10000d000000010100000000000062e710000300000000000000d3af10000700000000000000000000000000000000000000000000000000000000000000c82b11006c2c100000000000000000007c2c100001000000000000000100000000000000842c10000e0000000000000000000000922c10001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a42c10000000000000000000b42c100002000000000000000100000000000000c42c10000600000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100cc2c10000000000000000000dc2c100001000000000000000100000000000000e42c10000a0000000000000000000000289b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100082d10000000000000000000f02c100001000000000000000100000000000000f82c10000e0000000000000000000000289b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100082d10000000000000000000182d100001000000000000000100000000000000202d1000060000000000000000000000262d10000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100302d10000000000000000000402d100001000000000000000100000000000000482d10000600000000000000000000004e2d10001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100682d10000000000000000000782d10000100000000000000010000004163636f756e744e6f6e6365543a3a496e646578353010001f00000045787472696e736963436f756e740000073010002e000000416c6c45787472696e736963734c656e32000000000000000100000070000000b92f10004e000000426c6f636b48617368000000932f10002600000045787472696e7369634461746100000032000000000000000100000034000000442f10004f00000052616e646f6d4d6174657269616c2869382c205665633c543a3a486173683e2932000000000000000100000071000000872e100069000000f02e1000540000004e756d626572000032000000000000000100000072000000452e100042000000506172656e74486173680000292e10001c00000045787472696e73696373526f6f74000032000000000000000100000073000000e42d100045000000446967657374543a3a4469676573740032000000000000000100000034000000a82d10003c0000004576656e74735665633c4576656e745265636f72643c543a3a4576656e743e3e32000000000000000100000074000000802d100028000000204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e20536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e6720627566666572207769746820746865206069386020707265666978206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c206c656e67746820696e20627974657320666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e636f6465206973206e6f7420666f756e647072697374696e6520636f6465206973206e6f7420666f756e647468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f646500643210001e000000823210001f00000066756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2071656466756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2066756e6374696f6e5f73656374696f6e5f6c656e203d3d20636f64655f73656374696f6e5f6c656e3b2071656400004a3210001a000000253210000a0000002f3210001b00000073746172742066756e6374696f6e20657870656374656420746f20686176652074797065205b5d202d3e205b5d0000001432100011000000f431100020000000d431100020000000ac311000280000007365676d656e74206f66667365742073686f756c642072657475726e20493332746f6f206d616e79206d656d6f727920726567696f6e7320696e20696e6465782073706163653a20746f6f206d616e79207461626c657320696e20696e6465782073706163653a20747279696e6720746f20696d706f7274206d757461626c6520676c6f62616c206475706c6963617465206578706f72742046756e6374696f6e20232072656164696e672f76616c69646174696f6e206572726f723a204d697373696e6720626f647920666f722066756e6374696f6e206c656e677468206f662066756e6374696f6e2073656374696f6e206973202c207768696c65206c656e206f6620636f64652073656374696f6e2069732052657475726e207479706573206c656e6774682073686f756c642062652030206f722031000000000000004c3310000a000000000000005ce6100002000000000000000000000058331000010000000000000000000000603310000d000000000000002899100001000000000000000000000070331000010000000000000000000000dcae10000800000000000000783310000400000000000000000000009833100001000000000000004e65774163636f756e740000e33310001b0000005265617065644163636f756e74000000cc33100017000000bde6100009000000bde6100009000000c6e6100007000000c6e6100007000000a03310002c000000205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e76657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e7400000000000028d2100008000000000000003c361000020000000000000000000000c82b11000000000000000000000000004c361000060000000000000054361000030000000000000000000000c82b11000000000000000000000000006c361000070000000000000074361000020000000000000000000000c82b11000000000000000000000000008436100006000000000000008c361000010000000000000000000000c82b11000000000000000000000000009436100009000000000000008c361000010000000000000000000000c82b11000000000000000000000000009d36100009000000000000008c361000010000000000000000000000c82b1100000000000000000000000000a63610000800000000000000b0361000020000000000000000000000c82b1100000000000000000000000000c0361000090000000000000010af1000020000000000000000000000c82b1100000000000000000000000000c93610000b0000000000000028991000010000000000000000000000c82b11000000000000000000f036100009000000c6e61000070000005461626c65640000f036100009000000c6e6100007000000566410000e0000005374617274656400d43610000f000000e33610000d0000005061737365640000d43610000f0000004e6f7450617373656443616e63656c6c656445786563757465640000d43610000f0000007bef10000400000044656c656761746564556e64656c6567617465645265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e64657844656d6f637261637920566f74696e67506572696f6442616c616e63657320546f74616c49737375616e636542616c616e636573204578697374656e7469616c4465706f73697442616c616e636573205472616e73616374696f6e4261736546656542616c616e636573205472616e73616374696f6e4279746546656544656d6f637261637920566f74654f6644656d6f63726163792050726f787942616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e636544656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6642616c616e636573204c6f636b7344656d6f6372616379204465706f7369744f6673657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a090909716564000000a425110028000000cc25110050000000370100000900000000000000f43810000800000000000000fc3810000200000000000000000000002c3910000800000000000000000000006c3910000b0000000000000078391000030000000000000000000000c039100008000000000000007472616e73666572000000004ab710000400000000000000dbf010002300000000000000b9f4100005000000000000005b3b100013000000763b100036000000c82b110000000000ac3b100042000000ee3b100048000000363c1000450000007b3c10002d000000c82b110000000000a83c1000460000007365745f62616c616e636500000000009e6b10000300000000000000dbf010002300000000000000573b100004000000000000005b3b100013000000000000006e3b100008000000000000005b3b100013000000003a100025000000c82b110000000000253a100040000000653a100046000000ab3a100049000000f43a100036000000c82b1100000000002a3b10002d00000020536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e6365602920616e6420726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e66726565436f6d706163743c543a3a42616c616e63653e7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e42616c616e6365732056657374696e6742616c616e636573000000000000f04010000d0000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a05710000000000000000000084110000100000000000000010000000000000010411000120000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a057100000000000000000002441100001000000000000000100000000000000f4c510000b0000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a0571000000000000000000000c610000100000000000000010000000000000008c610000b0000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a0571000000000000000000014c61000010000000000000001000000000000001cc61000120000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a0571000000000000000000030c610000100000000000000010000000000000038c61000120000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a057100000000000000000005cc61000010000000000000001000000000000002c4110000700000001010000000000005a0211000c00000000000000334110001b00000000000000000000000000000000000000000000000000000000000000c82b11005459100000000000000000005041100001000000000000000000000000000000584110000b00000001010000000000005a0211000c00000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000c82b1100a05710000000000000000000644110000b000000000000000100000000000000bc4110000f00000001010000000000005a0211000c00000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000c82b1100a05710000000000000000000cc4110000b000000000000000100000000000000244210000500000001010000000000005a0211000c00000000000000294210002c00000000000000000000000000000000000000000000000000000000000000c82b110058421000000000000000000068421000010000000000000001000000546f74616c49737375616e6365543a3a42616c616e636500ce471000260000004578697374656e7469616c4465706f7369740000994710003500000056657374696e6756657374696e675363686564756c653c543a3a42616c616e63653e000063471000360000004672656542616c616e636500e944100027000000c82b1100000000001045100050000000604510005d000000bd45100055000000124610004f0000006146100051000000b246100015000000c82b110000000000c7461000570000001e47100045000000526573657276656442616c616e6365009e4210005d000000fb42100027000000c82b110000000000224310005b0000007d43100049000000c82b110000000000c64310005d000000234410002d000000c82b1100000000005044100053000000a3441000460000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00000032000000000000000100000034000000704210002e00000020416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e20546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e44656d6f6372616379204c61756e6368506572696f6400007049100039000000b049100048000000100200002d00000044656d6f6372616379205075626c696350726f70730000002049100048000000870a00000e00000044656d6f6372616379205075626c696344656c617944656d6f6372616379204e65787454616c6c7944656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7343616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d00000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f6f70732f61726974682e727300000000689a10000700000000000000084c1000020000000000000000000000384c1000010000000000000000000000404c10000600000000000000484c1000010000000000000000000000384c1000010000000000000000000000889a10000400000000000000604c1000020000000000000000000000904c1000020000000000000000000000a04c10000a00000000000000604c1000020000000000000000000000ac4c1000020000000000000000000000bc4c10001000000000000000cc4c1000030000000000000000000000144d10000100000000000000000000001c4d10001100000000000000304d1000010000000000000000000000484d1000010000000000000000000000504d10000d00000000000000604d1000020000000000000000000000904d1000010000000000000000000000984d10000900000000000000a44d1000010000000000000000000000bc4d1000010000000000000000000000c44d10000c00000000000000c82b1100000000000000000000000000d04d1000010000000000000000000000d84d10000c00000000000000a44d1000010000000000000000000000e44d1000010000000000000000000000ec4d10000800000000000000f44d1000020000000000000000000000244e10000100000000000000000000002c4e10000a00000000000000c82b1100000000000000000000000000384e10000100000000000000000000002f9b100008000000000000003e9b10001000000000000000b9f410000500000000000000bef41000150000006d501000280000007365636f6e640000000000002f9b100008000000000000005b5010001200000000000000364f100009000000000000003f4f10001800000000000000889a1000040000000000000057501000040000000a5010004d000000db4f10002f00000070726f78795f766f74650000794f100062000000db4f10002f00000073746172745f7265666572656e64756d000000002f9b100008000000000000003e9b100010000000000000006b4f10000900000000000000e33610000d00000000000000744f100005000000000000008e0111000e000000574f10001400000063616e63656c5f7265666572656e64756d00000000000000364f100009000000000000003f4f100018000000214f10001500000063616e63656c5f71756575656400000000000000184f1000040000000000000000f0100017000000000000001c4f10000500000000000000a2ef10000c000000f04e1000280000007365745f70726f787900000000000000eb4e100005000000000000005a0211000c000000c54e10002600000072657369676e5f70726f78799f4e10002600000072656d6f76655f70726f7879794e10002600000064656c656761746500000000604e100002000000000000005a0211000c00000000000000624e10000c000000000000006e4e10000b000000514e10000f000000756e64656c65676174650000404e10001100000020556e64656c656761746520766f74652e2044656c656761746520766f74652e746f6c6f636b5f706572696f64734c6f636b506572696f647320436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e77686963682052656d6f76652061207265666572656e64756d2e7265665f696e646578436f6d706163743c5265666572656e64756d496e6465783e2053746172742061207265666572656e64756d2e7468726573686f6c6464656c617920566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b566f7465436f6d706163743c50726f70496e6465783e2050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e44656d6f6372616379000000000000e05610000f0000000000000000000000f03610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100285810000000000000000000f056100001000000000000000100000000000000f85610000b0000000000000000000000035710002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100e45810000000000000000000305710000100000000000000010000000000000038571000090000000101000000000000f03610000900000000000000415710002100000000000000000000000000000000000000000000000000000000000000c82b110064571000000000000000000074571000010000000000000000000000000000007c5710000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100f457100000000000000000008857100001000000000000000100000000000000905710000e0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a05710000000000000000000b057100001000000000000000100000000000000b85710000b00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100c45710000000000000000000d457100001000000000000000100000000000000dc5710000e00000000000000000000006e4e10000b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100245910000000000000000000ec57100001000000000000000100000000000000899e10000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100f457100000000000000000001479100001000000000000000100000000000000045810000f0000000000000000000000d43610000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110028581000000000000000000014581000010000000000000001000000000000001c581000090000000000000000000000d43610000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100285810000000000000000000385810000100000000000000010000000000000040581000100000000101000000000000d43610000f00000000000000505810002d00000000000000000000000000000000000000000000000000000000000000c82b11005459100000000000000000008058100001000000000000000000000000000000885810000d00000001010000000000008e0111000e00000000000000955810002b00000000000000000000000000000000000000000000000000000000000000c82b1100c05810000000000000000000d058100001000000000000000100000000000000d8581000090000000101000000000000d43610000f00000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000c82b1100e45810000000000000000000f458100001000000000000000100000000000000fc581000060000000101000000000000025910001f00000000000000575010000400000000000000000000000000000000000000000000000000000000000000c82b110024591000000000000000000034591000030000000000000001000000000000004c5910000500000001010000000000005a0211000c000000000000005a0211000c00000000000000000000000000000000000000000000000000000000000000c82b110054591000000000000000000064591000010000000000000000000000000000006c5910000b00000001010100000000005a0211000c00000000000000775910001b00000000000000000000000000000000000000000000000000000000000000c82b1100945910000000000000000000a45910000100000000000000010000005075626c696350726f70436f756e7400215e10003d0000005075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0000015e1000200000004465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29000032000000000000000100000075000000e05d1000210000004c61756e6368506572696f64a75d1000390000004d696e696d756d4465706f7369740000320000000000000001000000760000005a5d10004d0000005075626c696344656c61790032000000000000000100000072000000255d1000350000004d61784c6f636b506572696f64730000af5c100076000000320000000000000001000000770000005265666572656e64756d436f756e7400615c10004e0000004e65787454616c6c79000000320000000000000001000000330000002f5c1000320000005265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29000000025c10002d000000446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e32000000000000000100000034000000d25b100030000000566f74657273466f7200000032000000000000000100000034000000a95b100029000000566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e74496429000000320000000000000001000000700000006a5a100075000000df5a100072000000515b10005800000050726f787900000032000000000000000100000070000000fc5910006e00000044656c65676174696f6e7328543a3a4163636f756e7449642c204c6f636b506572696f647329000032000000000000000100000078000000ac591000500000002047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e64756d73207374617274656420736f206661722e20546865206d6178696d756d206e756d626572206f66206164646974696f6e616c206c6f636b20706572696f6473206120766f746572206d6179206f6666657220746f20737472656e677468656e20746865697220766f74652e204d756c7469706c6573206f6620605075626c696344656c6179602e205468652064656c6179206265666f726520656e6163746d656e7420666f7220616c6c207075626c6963207265666572656e64612e20546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e20486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e6e6f7420656e6f75676820667265652066756e647300a4251100280000008c5e10004400000053000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f64656d6f63726163792f7372632f6c69622e7273a425110028000000e85e1000430000004e010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f62616c616e6365732f7372632f6c69622e727344656d6f6372616379204d696e696d756d4465706f73697476616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7744656d6f6372616379205075626c696350726f70436f756e7463616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f77616c726561647920612070726f787977726f6e672070726f78796e6f742064656c6567617465648c5e100044000000530000000100000044656d6f6372616379204d61784c6f636b506572696f6473766f74652068617320746f6f206772656174206120737472656e677468766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e42616c616e636573204372656174696f6e46656542616c616e636573205472616e73666572466565676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c756500e85e1000430000004e010000010000002d6110000d000000126110001b000000d060100042000000fe000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b00004461100010000000696e697469616c697a655f626c6f636b5c6110000f0000006170706c795f65787472696e736963007461100013000000696e686572656e745f65787472696e7369637300906110000f000000636865636b5f696e686572656e747300a86110001400000076616c69646174655f7472616e73616374696f6ec46110000f0000006f6666636861696e5f776f726b657200dc611000160000006772616e6470615f70656e64696e675f6368616e67650000fc611000150000006772616e6470615f666f726365645f6368616e67650000002c6210001d000000f81b1100130000009603000009000000617373657274696f6e206661696c65643a20696e646578203c206c656e0000006062100043000000860a000025000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962616c6c6f632f7665632e72730060621000430000008c0a00002c00000066696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e6400000000946310000b0000000000000010af1000020000000000000000000000a0631000010000000000000000000000a8631000100000000000000028991000010000000000000000000000b8631000010000000000000000000000c06310000c0000000000000054af1000010000000000000000000000cc631000010000000000000000000000d46310000e00000000000000e4631000020000000000000000000000f46310000100000000000000566f74657252656170656400b064100015000000426164526561706572536c6173686564a16410000f00000054616c6c7953746172746564646410003d00000054616c6c7946696e616c697a65640000566410000e000000566410000e000000fc6310005a00000020412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e5665633c4163636f756e7449643e20412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c20726561706572436f756e63696c205265676973746572496e666f4f66436f756e63696c20416374697665436f756e63696c10651000190000003065100048000000bb0100002d0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f6f70732f61726974682e727300000000306710000d0000000000000040671000020000000000000000000000706710000200000000000000000000008067100013000000000000004067100002000000000000000000000094671000020000000000000000000000a46710001300000000000000b867100004000000000000000000000018681000050000000000000000000000406810000d0000000000000050681000010000000000000000000000686810000100000000000000000000007068100010000000000000008068100001000000000000000000000098681000030000000000000000000000b06810000e00000000000000c068100003000000000000000000000008691000030000000000000000000000206910001100000000000000346910000100000000000000000000004c691000030000000000000000000000646910000d00000000000000746910000100000000000000000000008c691000030000000000000000000000a46910001900000000000000c0691000010000000000000000000000d8691000020000000000000000000000e86910001100000000000000c0691000010000000000000000000000fc69100002000000000000007365745f617070726f76616c73000000000000002970100005000000000000002e70100009000000000000004f6d10000500000000000000546d100012000000d16f100058000000c16f10001000000070726f78795f7365745f617070726f76616c73005c6f100065000000c16f100010000000726561705f696e6163746976655f766f7465720000000000336f10000e00000000000000a2ef10000c000000000000009e6b10000300000000000000dbf010002300000000000000416f10000900000000000000a2ef10000c000000000000004a6f10001200000000000000546d100012000000176e1000580000006f6e10005c000000cb6e100028000000c82b110000000000f36e100040000000726574726163745f766f746572000000000000004f6d10000500000000000000a2ef10000c000000cc6d10004b0000007375626d69745f63616e64696461637900000000c86d10000400000000000000a2ef10000c000000666d10001e000000c82b110000000000846d10004400000070726573656e745f77696e6e6572000000000000416d10000900000000000000dbf0100023000000000000004a6d10000500000000000000bef4100015000000000000004f6d10000500000000000000546d100012000000616c100059000000ba6c100069000000236d10001e0000007365745f646573697265645f736561747300000000000000ce6a10000500000000000000a2ef10000c000000a16b100059000000fa6b10005a000000546c10000d00000072656d6f76655f6d656d626572000000000000009e6b10000300000000000000dbf0100023000000d36a10005c0000002f6b1000500000007f6b10001f0000007365745f70726573656e746174696f6e5f6475726174696f6e00000000000000ce6a1000050000000000000000f0100017000000786a100056000000606a1000180000007365745f7465726d5f6475726174696f6e0000000c6a100054000000606a10001800000020536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722e20412074616c6c792077696c6c2068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e20546869732069732065666665637469766520696d6d6564696174656c792e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e2829606020607369676e6564602073686f756c642068617665206174206c6561737463616e646964617465746f74616c696e646578436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473766f7465735665633c626f6f6c3e436f756e63696c000000000000107810000d0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002078100000000000000000003078100001000000000000000100000000000000387810000a0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110044781000000000000000000054781000010000000000000001000000000000005c781000140000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11007078100000000000000000008078100001000000000000000100000000000000887810000a000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100947810000000000000000000a478100001000000000000000100000000000000ac7810001400000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100047910000000000000000000c078100001000000000000000100000000000000c8781000130000000000000000000000db7810000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100e47810000000000000000000f478100002000000000000000100000000000000899e10000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110004791000000000000000000014791000010000000000000001000000000000001c7910000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002879100000000000000000003879100001000000000000000100000000000000407910000c000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11005c7a100000000000000000004c79100001000000000000000100000000000000547910000d0000000000000000000000617910002300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc7a100000000000000000008479100004000000000000000100000000000000a4791000090000000000000000000000db7810000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11005c7a10000000000000000000b079100001000000000000000100000000000000b87910000b00000001010000000000005a0211000c000000000000002e7010000900000000000000000000000000000000000000000000000000000000000000c82b1100dc7a10000000000000000000c479100002000000000000000100000000000000d47910000e00000001010000000000005a0211000c00000000000000e27910001000000000000000000000000000000000000000000000000000000000000000c82b1100107a10000000000000000000f479100002000000000000000000000000000000047a10000c00000001010000000000005a0211000c00000000000000db7810000900000000000000000000000000000000000000000000000000000000000000c82b1100107a10000000000000000000207a100001000000000000000000000000000000287a1000060000000000000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc7a10000000000000000000307a100001000000000000000100000000000000387a10000a0000000000000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc7a10000000000000000000447a1000010000000000000001000000000000004c7a10000e000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11005c7a10000000000000000000c82b1100000000000000000001000000000000006c7a10000c0000000000000000000000787a10002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a07a10000000000000000000b07a100001000000000000000000000000000000b87a1000100000000000000000000000c87a10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc7a10000000000000000000ec7a100001000000000000000100000000000000f47a10000b0000000000000000000000ff7a10002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100207b10000000000000000000307b100001000000000000000000000043616e646964616379426f6e6400000032000000000000000100000079000000df80100041000000566f74696e67426f6e640000320000000000000001000000760000009d8010004200000050726573656e74536c617368506572566f7465723200000000000000010000007a0000005a801000430000004361727279436f756e7400003200000000000000010000007b0000000d8010004d00000050726573656e746174696f6e4475726174696f6ebe7f10004f000000496e6163746976654772616365506572696f64566f7465496e6465783200000000000000010000007c000000427f100068000000aa7f10001400000032000000000000000100000077000000147f10002e0000005465726d4475726174696f6e3200000000000000010000007d000000ee7e100026000000446573697265645365617473b47e10003a000000416374697665436f756e63696c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e877d10005b000000e27d10005c0000003e7e10005c0000009a7e10001a000000566f7465436f756e74000000467d100041000000417070726f76616c734f6600db7c10005b000000367d1000100000005265676973746572496e666f4f6628566f7465496e6465782c20753332290000667c10005f000000c57c1000160000004c6173744163746976654f6632000000000000000100000070000000267c100040000000566f7465727300000e7c10001800000043616e646964617465730000f27b10001c00000043616e646964617465436f756e740000320000000000000001000000330000004e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e2932000000000000000100000075000000aa7b100048000000536e617073686f7465645374616b65735665633c42616c616e63654f663c543e3e00000032000000000000000100000034000000707b10003a0000004c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e32000000000000000100000075000000387b1000380000002047657420746865206c6561646572626f6172642069662077653b726520696e207468652070726573656e746174696f6e2070686173652e20546865207374616b6573206173207468657920776572652061742074686520706f696e7420746861742074686520766f746520656e6465642e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e205468652070726573656e742063616e646964617465206c6973742e205468652070726573656e7420766f746572206c6973742e20546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722c2072657370656374696e6720746865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e2054686520746f74616c206e756d626572206f6620766f746573207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206d616e7920766f746520696e6465786573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e436f756e63696c20566f74696e67506572696f64f0821000390000003065100048000000100200002d000000436f756e63696c20446573697265645365617473436f756e63696c204e65787446696e616c697a65436f756e63696c205465726d4475726174696f6ea082100048000000810a00000a000000436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c20566f74657273436f756e63696c20536e617073686f7465645374616b6573436f756e63696c204361727279436f756e74436f756e63696c204c6561646572626f61726400a082100048000000870a00000e000000436f756e63696c2043616e64696461746573436f756e63696c2043616e646964617465436f756e74436f756e63696c20566f7465436f756e74436f756e63696c2043616e646964616379426f6e6466696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e000000000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000a425110028000000448310004400000064000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f73656174732e72736e6f7420612070726f7879436f756e63696c204c6173744163746976654f6663616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665626164207265706f7274657220696e646578436f756e63696c20496e6163746976654772616365506572696f64436f756e63696c20566f74696e67426f6e646261642074617267657420696e64657863616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f74657272657472616374696f6e20696e64657820696e76616c696472657472616374696f6e20696e646578206d69736d617463686475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e64737374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f63616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e746c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647363616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c656374656470726573656e7465642063616e646964617465206d7573742062652063757272656e74436f756e63696c2050726573656e74536c617368506572566f7465726475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c44831000440000006400000001000000436f756e63696c20417070726f76616c734f666e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520617070726f76616c20766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e6469646174657300ffffffff008810001c0000001c8810005a0000004d0000002800000048617368207461626c65206361706163697479206f766572666c6f772f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6861736862726f776e2d302e312e382f7372632f7261772f6d6f642e72735468657265206973206f6e6c79206f6e6520666174616c206572726f723b20716564496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473214e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f722154696d657374616d702044696455706461746500000000000000388910000e00000000000000488910000100000000000000000000005089100001000000000000004e6577417574686f72697469657300007c891000160000005889100024000000204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c2853657373696f6e4b65792c20753634293e3a6772616e6470613a617574683a6c656e00bc8910002b000000e789100044000000f70000000400000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74696d657374616d702f7372632f6c69622e727300448a100030000000e789100044000000e10000000400000054696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b8c8a10004e000000e789100044000000e20000000400000054696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f7754696d657374616d7020426c6f636b506572696f6454696d657374616d70204d696e696d756d506572696f64000000000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e7273208b100048000000810a00000a00000054696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e74206461746100000000000000f48b10001200000000000000088c1000010000000000000000000000208c100001000000000000007265706f72745f6d69736265686176696f72000000000000418c10000700000000000000d3af100007000000288c100019000000205265706f727420736f6d65206d69736265686176696f722e5f7265706f72744772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c697479204e657874466f726365644772616e64706146696e616c697479000000000000588d10000d0000000000000000000000658d10003200000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc9110000000000000000000c82b110000000000000000000000000000000000978d10000a00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc9110000000000000000000c82b110000000000000000000000000050656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265722c20543a3a53657373696f6e4b65793e4e657874466f72636564576974686472617720686173206265656e20636865636b65642061626f76653b0a09090909676f5f62656c6f775f73756273697374656e63652069732066616c736520616e642073756273697374656e6365203e206578697374656e6369616c5f6465706f7369743b0a0909090971656443616e20776974686472617720616e6420646f6e277420676f2062656c6f772073756273697374656e6365000000000000006c8e10000300000000000000708e1000010000000000000000000000888e1000080000000000000073657400000000000390100003000000000000000690100012000000c88e100016000000c82b110000000000de8e10005d0000003b8f10002f000000c82b1100000000006a8f100063000000c82b110000000000cd8f10003600000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920606d696e696d756d5f706572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d7000000000000000b49110000300000000000000000000004ca510000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100b89110000000000000000000c891100001000000000000000100000000000000d09110000b00000000000000000000004ca510000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc9110000000000000000000ec91100001000000000000000000000000000000f49110000d00000000000000000000004ca510000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11000492100000000000000000001492100004000000000000000100000000000000349210000900000000000000000000007bef10000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100409210000000000000000000509210000100000000000000010000004e6f770032000000000000000100000072000000ff93100024000000426c6f636b506572696f640032000000000000000100000070000000ae931000510000004d696e696d756d506572696f640000003200000000000000010000007e000000859210005a000000df9210005a0000003993100059000000929310001c00000044696455706461746500000032000000000000000100000070000000589210002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f20546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e204f6c642073746f72616765206974656d2070726f766964656420666f7220636f6d7061746962696c6974792e2052656d6f766520616674657220616c6c206e6574776f726b732075706772616465642e2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e53657373696f6e20466f7263696e674e657753657373696f6e00000000949410001000000000000000a4941000040000000000000000000000c4941000020000000000000000000000d49410000f00000000000000a4941000040000000000000000000000e4941000020000000000000054616c6c7943616e63656c6174696f6ea3b010000400000062e710000300000062e710000300000062e71000030000004f95100040000000279510002800000054616c6c795265666572656e64756d00f4941000330000002795100028000000204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d20766f74652e204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d2063616e63656c6c6174696f6e20766f74652e0000000000bc9510000a00000000000000c8951000010000000000000000000000d095100002000000000000004e657753657373696f6e0000579610000b000000e0951000550000003596100022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e426c6f636b4e756d626572626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d697420627920707269636553657373696f6e2043757272656e74496e64657853657373696f6e2053657373696f6e4c656e67746853657373696f6e2056616c696461746f727353657373696f6e204e6578744b6579466f72436f756e63696c566f74696e6720436f756e63696c566f74654f6630971000190000005097100048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f6f70732f61726974682e7273a425110028000000b09710003f00000066000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7375646f2f7372632f6c69622e727300a4251100280000000898100042000000a0000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f73657373696f6e2f7372632f6c69622e72730000a425110028000000649810004500000021000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f766f74696e672e7273000000000000000499100005000000000000000c991000010000000000000000000000149910000100000000000000000000001c9910000a000000000000002899100001000000000000000000000030991000010000000000000053756469640000007bef10000400000074991000180000004b65794368616e6765640000bde6100009000000389910003c00000020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e00000000689a10000700000000000000709a1000010000000000000000000000c82b1100000000000000000000000000889a100004000000000000008c9a1000020000000000000000000000c82b1100000000000000000000000000bc9a10000400000000000000c09a1000010000000000000000000000c82b1100000000000000000000000000d89a10001200000000000000ec9a1000010000000000000000000000c82b1100000000000000000000000000049b10001100000000000000ec9a1000010000000000000000000000c82b1100000000000000000070726f706f736500000000002f9b100008000000000000003e9b100010000000766f7465000000002f9b10000800000000000000289b10000700000000000000379b100007000000000000007bef1000040000007665746f000000001b9b10000d00000000000000289b1000070000007365745f636f6f6c6f66665f706572696f64000000000000159b1000060000000000000000f01000170000007365745f766f74696e675f706572696f64626c6f636b7370726f706f73616c5f68617368543a3a4861736870726f706f73616c617070726f7665426f783c543a3a50726f706f73616c3e436f756e63696c566f74696e6700000000007c9e10000d00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110014a510000000000000000000c82b110000000000000000000100000000000000899e10000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100989e10000000000000000000c82b110000000000000000000100000000000000a89e10001000000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100b89e10000000000000000000c89e100001000000000000000100000000000000f0e11000090000000000000000000000d09e10001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100eca410000000000000000000c82b110000000000000000000100000000000000ee9e10000a0000000101000000000000289b10000700000000000000f89e10000b00000000000000000000000000000000000000000000000000000000000000c82b1100dca510000000000000000000c82b110000000000000000000000000000000000039f10000e0000000101000000000000289b10000700000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000c82b1100eca410000000000000000000c82b110000000000000000000100000000000000119f10000d00000001010000000000001e9f100017000000000000007bef10000400000000000000000000000000000000000000000000000000000000000000c82b1100dca510000000000000000000c82b110000000000000000000000000000000000359f10000e0000000101000000000000289b10000700000000000000439f10002300000000000000000000000000000000000000000000000000000000000000c82b1100689f10000000000000000000c82b1100000000000000000000000000436f6f6c6f6666506572696f64566f74696e67506572696f640000003200000000000000010000007e000000456e61637444656c6179506572696f6432000000000000000100000072000000789f1000730000005665633c28543a3a426c6f636b4e756d6265722c20543a3a48617368293e50726f706f73616c4f66543a3a50726f706f73616c50726f706f73616c566f74657273436f756e63696c566f74654f6628543a3a486173682c20543a3a4163636f756e744964295665746f656450726f706f73616c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e29000032000000000000000100000075000000204e756d626572206f6620626c6f636b7320627920776869636820746f2064656c617920656e6163746d656e74206f66207375636365737366756c2c206e6f6e2d756e616e696d6f75732d636f756e63696c2d696e7374696761746564207265666572656e64756d2070726f706f73616c732e000000000070a01000070000000000000078a0100001000000000000000000000090a01000020000000000000000000000a0a010000a0000000000000068ed1000010000000000000000000000aca01000010000000000000000000000b4a010001100000000000000e8ed1000010000000000000000000000c8a0100001000000000000007365745f6b65790000000000b2a110000300000000000000b5a110000d00000041a110004000000081a11000310000007365745f6c656e6774680000e6a010005b000000666f7263655f6e65775f73657373696f6e000000d0a010001600000020466f726365732061206e65772073657373696f6e2e205365742061206e65772073657373696f6e206c656e6774682e20576f6e2774206b69636b20696e20756e74696c20746865206e6578742073657373696f6e206368616e6765202861742063757272656e74206c656e677468292e2053657473207468652073657373696f6e206b6579206f6620612076616c696461746f72202866756e6374696f6e2063616c6c65722920746f20606b6579602e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e6b6579543a3a53657373696f6e4b657953657373696f6e00000000000000d80211000a0000000000000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100eca410000000000000000000fca410000100000000000000010000000000000004a510000d00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110014a51000000000000000000024a51000010000000000000001000000000000002ca510000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110058a51000000000000000000038a510000100000000000000010000000000000040a510000c00000000000000000000004ca510000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110058a51000000000000000000068a510000100000000000000010000000000000070a510001100000000000000000000007bef10000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dca51000000000000000000084a51000030000000000000000000000000000009ca510001000000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dca510000000000000000000aca5100001000000000000000000000000000000b4a510000a00000001010000000000005a0211000c00000000000000b5a110000d00000000000000000000000000000000000000000000000000000000000000c82b1100dca510000000000000000000c0a5100001000000000000000000000000000000c8a510001100000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dca510000000000000000000eca5100001000000000000000000000032000000000000000100000034000000b3a710001f00000053657373696f6e4c656e6774680000003200000000000000010000007700000094a710001f00000043757272656e74496e64657876a710001e00000043757272656e745374617274543a3a4d6f6d656e74000000320000000000000001000000720000004ea7100028000000466f7263696e674e657753657373696f6e00000061a610005e000000bfa610006100000020a710002e0000004c6173744c656e6774684368616e676531a61000300000004e6578744b6579466f7200000da61000240000004e65787453657373696f6e4c656e67746800000032000000000000000100000070000000f4a510001900000020546865206e6578742073657373696f6e206c656e6774682e20546865206e657874206b657920666f72206120676976656e2076616c696461746f722e20426c6f636b206174207768696368207468652073657373696f6e206c656e677468206c617374206368616e6765642e204e65772073657373696f6e206973206265696e6720666f72636564206966207468697320656e747279206578697374733b20696e20776869636820636173652c2074686520626f6f6c65616e2076616c7565206973207472756520696620746865206e65772073657373696f6e2073686f756c6420626520636f6e736964657265642061206e6f726d616c20726f746174696f6e202872657761726461626c652920616e642066616c736520696620746865206e65772073657373696f6e2073686f756c6420626520636f6e7369646572656420657863657074696f6e616c2028736c61736861626c65292e2054696d657374616d70207768656e2063757272656e742073657373696f6e20737461727465642e2043757272656e7420696e646578206f66207468652073657373696f6e2e2043757272656e74206c656e677468206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e53657373696f6e204c6173744c656e6774684368616e6765000040a81000390000005097100048000000100200002d00000053657373696f6e2043757272656e74537461727453657373696f6e204e65787453657373696f6e4c656e677468000000000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f436f756e63696c566f74696e672050726f706f73616c73436f756e63696c566f74696e672050726f706f73616c4f66436f756e63696c566f74696e67205665746f656450726f706f73616c436f756e63696c566f74696e6720456e61637444656c6179506572696f6447757275206d656469746174696f6e70726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b207165646f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f5375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b657900b09710003f00000066000000010000000898100042000000a000000001000000436f756e63696c566f74696e6720566f74696e67506572696f6470726f706f73657220776f756c64206e6f74206265206f6e20636f756e63696c6475706c69636174652070726f706f73616c73206e6f7420616c6c6f77656470726f706f73616c206973207665746f6564436f756e63696c566f74696e672050726f706f73616c566f746572736f6e6c7920636f756e63696c6c6f7273206d617920766f7465206f6e20636f756e63696c2070726f706f73616c736120636f756e63696c6c6f72206d6179206e6f74207665746f20612070726f706f73616c2074776963656f6e6c7920636f756e63696c6c6f7273206d6179207665746f20636f756e63696c2070726f706f73616c7370726f706f73616c206d75737420657869737420746f206265207665746f6564436f756e63696c566f74696e6720436f6f6c6f6666506572696f64000000649810004500000021000000010000000000000074ab10000400000000000000709a100001000000000000000000000078ab100003000000000000000000000070a01000070000000000000090ab1000010000000000000000000000a8ab100003000000000000007375646f51ac10004e000000c82b1100000000001dac100034000000000000009fef10000300000000000000dbf0100023000000c0ab10005d000000c82b1100000000001dac1000340000002041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e5375646f000000000008ad10000300000000000000000000005a0211000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11000cad100000000000000000001cad10000100000000000000010000004b6579003200000000000000010000007f00000024ad1000210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e436f6e7472616374204163636f756e74436f756e746572436f6e74726163742053746f7261676553697a654f66667365742f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d332e352e312f7372632f636f6465632e727300000000000000dcae10000800000000000000e4ae1000030000000000000000000000fcae100001000000000000000000000004af10000c0000000000000010af100002000000000000000000000020af100001000000000000000000000028af10000a0000000000000034af10000100000000000000000000003caf100001000000000000000000000044af10000f0000000000000054af10000100000000000000000000005caf100001000000000000000000000064af10000a0000000000000070af100002000000000000000000000080af100002000000000000000000000090af1000080000000000000098af1000020000000000000000000000a8af100001000000000000005472616e73666572bde6100009000000bde6100009000000c6e6100007000000deb0100055000000496e7374616e746961746564bde6100009000000bde6100009000000a7b0100037000000436f646553746f7265640000a3b010000400000075b010002e0000005363686564756c65557064617465640062e710000300000045b0100030000000446973706174636865640000bde61000090000007bef100004000000daaf10004e00000028b010001d000000436f6e7472616374bde6100009000000d3af100007000000b0af10002300000020416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e5665633c75383e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e4861736820436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e44656164206f7220696e6578697374656e74206163636f756e7420686173206265656e206578656d70742061626f76653b2071656464656661756c743a436f6e7472616374204761735370656e74436f6e747261637420426c6f636b4761734c696d6974436f6e7472616374205072697374696e65436f6465436f6e747261637420436f646553746f72616765436f6e747261637420436f6e7472616374496e666f4f66436f6e7472616374204761735072696365436f6e74726163742052656e7442797465466565436f6e747261637420546f6d6273746f6e654465706f736974436f6e74726163742052656e744465706f7369744f6666736574436f6e7472616374205472616e73616374696f6e42617365466565436f6e7472616374205472616e73616374696f6e42797465466565000000ddb210003600000076ad10005b000000bc010000050000000000000000000000a0b210003d00000076ad10005b000000c301000005000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b207165640000000000f0b310000f0000000000000000b4100001000000000000000000000018b4100003000000000000000000000030b41000080000000000000038b4100002000000000000000000000068b410000200000000000000000000003dd91000040000000000000078b41000040000000000000000000000d8b4100007000000000000000000000010b51000060000000000000018b5100004000000000000000000000078b510000a0000000000000000000000c8b510000f00000000000000d8b5100002000000000000000000000008b6100005000000000000007570646174655f7363686564756c65000000000051bc1000080000000000000059bc100010000000e1bb10002d000000c82b1100000000000ebc1000430000007075745f636f6465000000008cb91000090000000000000095b910000f00000000000000ddbb10000400000000000000d3af10000700000051bb100057000000a8bb100035000000000000004ab710000400000000000000dbf010002300000000000000b9f410000500000000000000bef4100015000000000000008cb91000090000000000000095b910000f00000000000000b8b910000400000000000000d3af100007000000bcb9100042000000c82b110000000000feb910004a00000048ba10002c00000074ba100046000000baba1000520000000cbb10004500000063726561746500000000000083b910000900000000000000bef4100015000000000000008cb91000090000000000000095b910000f00000000000000a4b910000900000000000000adb910000b00000000000000b8b910000400000000000000d3af1000070000006cb710006a000000c82b110000000000d6b7100021000000c82b110000000000f7b710005000000047b810004100000088b810005b000000e3b81000570000003ab910002a00000064b910001f000000636c61696d5f73757263686172676500000000004ab7100004000000000000005a0211000c000000000000004eb710000a0000000000000058b710001400000030b610005c0000008cb6100045000000c82b110000000000d1b610004e0000001fb710002b00000020416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f6475636572206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e20496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e646573746175785f73656e6465724f7074696f6e3c543a3a4163636f756e7449643e20437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e746761735f6c696d6974436f6d706163743c543a3a4761733e636f64655f68617368436f6465486173683c543e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c653c543a3a4761733e0000000000000004c510001300000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100ccc71000000000000000000018c510000400000000000000010000000000000038c51000100000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc61000000000000000000048c510000100000000000000010000000000000050c5100011000000000000000000000061c510000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100ccc71000000000000000000064c510000200000000000000010000000000000074c510000b0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc61000000000000000000080c510000100000000000000010000000000000088c51000110000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc6100000000000000000009cc5100007000000000000000100000000000000d4c510000f0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc610000000000000000000e4c5100002000000000000000100000000000000f4c510000b0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc61000000000000000000000c610000100000000000000010000000000000008c610000b0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc61000000000000000000014c61000010000000000000001000000000000001cc61000120000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc61000000000000000000030c610000100000000000000010000000000000038c61000120000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc6100000000000000000005cc610000100000000000000010000000000000064c610000b0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110070c61000000000000000000080c610000100000000000000010000000000000088c610000b000000000000000000000093c610000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11009cc610000000000000000000acc6100001000000000000000100000000000000b4c610000d000000000000000000000093c610000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100c4c610000000000000000000d4c6100001000000000000000100000000000000dcc61000080000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100e4c610000000000000000000f4c6100001000000000000000100000000000000fcc6100008000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110004c71000000000000000000014c71000010000000000000001000000000000001cc710000d000000000000000000000093c610000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002cc7100000000000000000003cc710000100000000000000010000000000000044c7100008000000000000000000000093c610000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100ccc7100000000000000000004cc710000100000000000000010000000000000054c710000f000000000000000000000059bc10001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110064c71000000000000000000074c71000010000000000000001000000000000007cc710000c0000000101000000000000adb910000b00000000000000d3af10000700000000000000000000000000000000000000000000000000000000000000c82b110004c81000000000000000000088c710000100000000000000000000000000000090c710000b0000000101000000000000adb910000b000000000000009bc710001600000000000000000000000000000000000000000000000000000000000000c82b110004c810000000000000000000b4c7100001000000000000000000000000000000bcc710000e000000000000000000000061c510000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100ccc710000000000000000000dcc7100001000000000000000100000000000000e4c710000e00000001010000000000005a0211000c00000000000000f2c710000f00000000000000000000000000000000000000000000000000000000000000c82b110004c81000000000000000000014c810000100000000000000000000005369676e6564436c61696d48616e646963617000facd100038000000c82b11000000000032ce10004200000074ce10001a000000546f6d6273746f6e654465706f736974c5cd10003500000053746f7261676553697a654f66667365747536344ccd10004b00000097cd10002e00000052656e744279746546656500ffcc10004d00000052656e744465706f7369744f666673657400000087cb100041000000c8cb100016000000c82b110000000000decb10005a00000038cc1000560000008ecc100053000000e1cc10001e0000005375726368617267655265776172640034cb1000390000006dcb10001a0000005472616e73666572466565000fcb1000250000004372656174696f6e46656500e8ca1000270000005472616e73616374696f6e426173654665650000b1ca1000370000005472616e73616374696f6e427974654665650000320000000000000001000000760000006eca100043000000436f6e747261637446656500320000000000000001000000800000003eca10003000000043616c6c42617365466565543a3a476173000000320000000000000001000000810000000cca1000320000004372656174654261736546656500000032000000000000000100000082000000dec910002e00000047617350726963653200000000000000010000007a000000c0c910001e0000004d61784465707468320000000000000001000000830000008ec9100032000000426c6f636b4761734c696d69740000003200000000000000010000008400000052c910003c0000004761735370656e7432c910002000000043757272656e745363686564756c6500320000000000000001000000850000000dc91000250000005072697374696e65436f6465b4c8100059000000436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c650000005bc81000590000004163636f756e74436f756e74657200003200000000000000010000007200000046c8100015000000436f6e7472616374496e666f4f66436f6e7472616374496e666f3c543e000000320000000000000001000000700000001cc810002a0000002054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20546865207375627472696520636f756e7465722e2041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e20546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e20546865207072696365206f66206f6e6520756e6974206f66206761732e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c656420746f2072656d6f76616c206f66206120636f6e74726163742e2054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f66667365742074686520636f7374206f66206f6e6520627974652e204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e20427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c207468656e20697420776f756c6420706179203530302042552f6461792e205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e2053697a65206f66206120636f6e7472616374206174207468652074696d65206f66206372656174696f6e2e205468697320697320612073696d706c652077617920746f20656e73757265207468617420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e20546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e205768656e20636c61696d2073757263686167652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b656420666f722063757272656e745f626c6f636b202d2064656c61790000ddb210003600000076ad10005b000000f0010000050000000000000000000000000000000000000076ad10005b000000f701000005000000a425110028000000e0ce10004300000040010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6c69622e7273436f6e74726163742043757272656e745363686564756c656e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e74496e76616c69642073757263686172676520636c61696d3a206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e74436f6e7472616374205369676e6564436c61696d48616e6469636170436f6e747261637420537572636861726765526577617264000000e0ce1000430000004001000001000000436f6e7472616374204d61784465707468436f6e747261637420436f6e7472616374466565436f6e7472616374204372656174696f6e466565436f6e7472616374205472616e73666572466565436f6e74726163742043616c6c42617365466565436f6e7472616374204372656174654261736546656500b0d0100034000000e4d0100044000000a00000000300000074686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f657865632e7273320000000000000001000000860000008700000088000000890000008a0000008b0000000000000028d21000080000000000000030d2100001000000000000000000000038d2100001000000000000000000000040d21000080000000000000010e6100001000000000000000000000048d2100001000000000000000000000050d21000070000000000000058d2100003000000000000000000000070d2100001000000000000000000000078d21000050000000000000010e6100001000000000000000000000080d2100001000000000000000000000088d21000080000000000000010e6100001000000000000000000000090d21000010000000000000050726f706f73656427d310000d0000006ed310000e0000005370656e64696e6734d310003a000000417761726465640027d310000d000000c6e6100007000000bde610000900000007d31000200000004275726e74000000e4d2100023000000526f6c6c6f76657298d210004c000000205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e50726f706f73616c496e646578205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e547265617375727920506f7454726561737572792050726f706f73616c730000c0d3100019000000e0d3100048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f6f70732f61726974682e7273a42511002800000040d410004300000061000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74726561737572792f7372632f6c69622e727372656163686564206d6178696d756d2064657074682c2063616e6e6f74206372656174656e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e7469617465206665650000008c00000018000000040000008d0000008e0000008f0000009000000091000000920000006e6f7420656e6f7567682067617320746f20706179207472616e736665722066656562616c616e636520746f6f206c6f7720746f2073656e642076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7464657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756572656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c206665654d6f64756c65206973206e6f742076616c696443616e2774206465636f6465207761736d20636f6465756e6b6e6f776e206578706f72743a20657870656374696e67206f6e6c79206465706c6f7920616e642063616c6c2066756e6374696f6e73657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e61747572656d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72794f6e20656e74727920746f207468652066756e6374696f6e20606d6f64756c65602063616e277420626520604e6f6e65603b207165646d656d6f727976616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706543616e6e6f7420696d706f727420676c6f62616c736d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e6d6f64756c6520696d706f72747320606578745f7072696e746c6e60206275742064656275672066656174757265732064697361626c656443616e6e6f7420696d706f7274207461626c65736d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163654d656d6f727920696d706f7274206d757374206861766520746865206669656c64206e616d6520276d656d6f7279274d756c7469706c65206d656d6f727920696d706f72747320646566696e656452657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e4d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c65646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6563616c6c63616c6c2066756e6374696f6e2069736e2774206578706f727465646465706c6f792066756e6374696f6e2069736e2774206578706f727465646465706c6f796578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e66756e6374696f6e206861732061206e6f6e2d6578697374656e7420747970650000000000a4da10000d00000000000000b4da1000020000000000000000000000e4da1000030000000000000000000000fcda1000070000000000000004db10000100000000000000000000001cdb100001000000000000000000000024db1000090000000000000030db100004000000000000000000000090db100001000000000000000000000098db10000f00000000000000a8db1000010000000000000000000000c0db1000010000000000000000000000c8db10001000000000000000a8db1000010000000000000000000000d8db1000020000000000000070726f706f73655f7370656e6400000000000000b9f410000500000000000000bef41000150000000000000009de10000b00000000000000dbf01000230000005cdd10004b000000a7dd10004d000000f4dd1000150000007365745f706f74000000000055dd10000700000000000000bef410001500000028dd10002d000000636f6e66696775726500000000000000e6dc10000d00000000000000f3dc1000100000000000000003dd10001500000000000000bef41000150000000000000018dd10000c0000000000000000f01000170000000000000024dd10000400000000000000f3dc100010000000cadc10001c00000072656a6563745f70726f706f73616c0000000000a9dc10000b00000000000000b4dc1000160000006adc10003f000000617070726f76655f70726f706f73616ce8db1000570000003fdc10002b00000020417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e70726f706f73616c5f6964436f6d706163743c50726f706f73616c496e6465783e202852652d29636f6e6669677572652074686973206d6f64756c652e70726f706f73616c5f626f6e64436f6d706163743c5065726d696c6c3e70726f706f73616c5f626f6e645f6d696e696d756d7370656e645f706572696f646275726e20536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e6e65775f706f742050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e62656e65666963696172795472656173757279000000003ce110000c000000000000000000000048e110000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d8e11000000000000000000050e110000200000000000000010000000000000060e11000130000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100b0e11000000000000000000074e11000010000000000000001000000000000007ce110000b00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110088e11000000000000000000098e1100001000000000000000100000000000000a0e1100004000000000000000000000048e110000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d8e110000000000000000000a4e1100001000000000000000100000000000000ace11000030000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100b0e110000000000000000000c0e1100001000000000000000100000000000000c8e110000d000000000000000000000027d310000d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d8e110000000000000000000e8e1100001000000000000000100000000000000f0e1100009000000010100000000000027d310000d00000000000000f9e110002400000000000000000000000000000000000000000000000000000000000000c82b110020e21000000000000000000030e210000100000000000000000000000000000038e2100009000000000000000000000041e210001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110054e21000000000000000000064e2100001000000000000000100000050726f706f73616c426f6e645065726d696c6c00dde310005400000031e410003700000050726f706f73616c426f6e644d696e696d756d008be31000520000005370656e64506572696f64003200000000000000010000009300000069e31000220000004275726e25e3100044000000506f740032000000000000000100000076000000f2e210003300000050726f706f73616c436f756e7400000032000000000000000100000033000000c9e210002900000050726f706f73616c7350726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e00000032000000000000000100000070000000aae210001f000000417070726f76616c735665633c50726f706f73616c496e6465783e00320000000000000001000000340000006ce210003e0000002050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e2050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2050726f706f7274696f6e206f662066756e647320746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c61636520612070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f65736e27742e5472656173757279205370656e64506572696f64c0e4100039000000e0d3100048000000100200002d000000547265617375727920417070726f76616c735472656173757279204275726e00000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f50726f706f73657227732062616c616e636520746f6f206c6f7754726561737572792050726f706f73616c426f6e644d696e696d756d54726561737572792050726f706f73616c426f6e6454726561737572792050726f706f73616c436f756e744e6f2070726f706f73616c206174207468617420696e6465780040d410004300000061000000010000000000000008e61000060000000000000010e6100001000000000000000000000018e6100001000000000000000000000020e610000e0000000000000030e6100002000000000000000000000040e6100002000000000000000000000050e610000c000000000000005ce610000200000000000000000000006ce6100001000000000000005265776172640000c6e610000700000065e71000380000004f66666c696e655761726e696e670000bde610000900000062e7100003000000cde61000520000001fe71000430000004f66666c696e65536c617368bde6100009000000c6e610000700000074e6100049000000204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e4163636f756e74496442616c616e6365204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20676976656e20616e206f66666c696e652d7761726e696e6720286974206973207374696c6c2077697468696e20697473206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e75333220416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67204c65646765720000000000000074ea1000040000000000000078ea1000030000000000000000000000c0ea1000040000000000000000000000e0ea10000a00000000000000ecea100001000000000000000000000004eb100006000000000000000000000034eb100006000000000000003ceb100001000000000000000000000054eb10000a0000000000000000000000a4eb10001100000000000000c82b1100000000000000000000000000b8eb1000080000000000000000000000f8eb1000080000000000000000ec100001000000000000000000000018ec100005000000000000000000000040ec1000080000000000000048ec100001000000000000000000000060ec100005000000000000000000000088ec10000500000000000000c82b110000000000000000000000000090ec1000050000000000000000000000b8ec10000900000000000000c4ec1000010000000000000000000000dcec100005000000000000000000000004ed10000e0000000000000014ed10000100000000000000000000002ced100005000000000000000000000054ed1000140000000000000068ed100001000000000000000000000080ed100001000000000000000000000088ed1000140000000000000068ed10000100000000000000000000009ced1000010000000000000000000000a4ed10001300000000000000b8ed1000010000000000000000000000d0ed1000010000000000000000000000d8ed10000d00000000000000e8ed100001000000000000000000000000ee100002000000000000000000000010ee10001700000000000000b8ed100001000000000000000000000028ee100001000000000000000000000030ee1000110000000000000044ee10000100000000000000000000005cee10000100000000000000626f6e6400000000d1f010000a00000000000000dbf010002300000000000000b9f410000500000000000000bef41000150000000000000053f11000050000000000000058f11000110000009bf5100060000000fbf510001a000000c82b11000000000015f6100049000000626f6e645f65787472610000000000008df510000e00000000000000bef4100015000000d3f410005d00000030f5100009000000c82b11000000000039f5100054000000c82b1100000000007cf0100055000000756e626f6e64000000000000b9f410000500000000000000bef41000150000002ff310005500000084f3100040000000c4f310004d000000c82b11000000000011f410005200000063f4100030000000c82b110000000000fef0100055000000c82b11000000000093f410002600000077697468647261775f756e626f6e64656400000069f210004b000000c82b110000000000b4f210004d00000001f3100013000000c82b110000000000fef0100055000000c82b11000000000014f310001b00000076616c69646174650000000048f2100005000000000000004df210001c0000000ef210003a000000c82b11000000000045f0100037000000c82b110000000000fef01000550000006e6f6d696e61746500000000dff110000700000000000000e6f11000280000009bf1100044000000c82b11000000000045f0100037000000c82b110000000000fef01000550000006368696c6c00000069f1100032000000c82b11000000000045f0100037000000c82b110000000000fef01000550000007365745f70617965650000000000000053f11000050000000000000058f110001100000017f010002e000000c82b11000000000045f0100037000000c82b110000000000fef01000550000007365745f636f6e74726f6c6c6572000000000000d1f010000a00000000000000dbf010002300000017f010002e000000c82b11000000000045f0100037000000c82b1100000000007cf01000550000007365745f73657373696f6e735f7065725f657261000000009fef1000030000000000000000f0100017000000daef1000260000007365745f626f6e64696e675f6475726174696f6eaeef10002c0000007365745f76616c696461746f725f636f756e7400000000009fef10000300000000000000a2ef10000c0000007fef100020000000666f7263655f6e65775f657261000000000000006eef10000d000000000000007bef100004000000d6ee10004f00000025ef1000490000007365745f6f66666c696e655f736c6173685f677261636500b2ee1000240000007365745f696e76756c6e657261626c65730000000000000097ee10000a00000000000000a1ee10001100000064ee10003300000020536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72735665633c543a3a4163636f756e7449643e2053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e6170706c795f72657761726473626f6f6c2054686520696465616c206e756d626572206f662076616c696461746f72732e6e6577436f6d706163743c7533323e20546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20657261732e2053657420746865206e756d626572206f662073657373696f6e7320696e20616e206572612e436f6d706163743c543a3a426c6f636b4e756d6265723e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e636f6e74726f6c6c65723c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636520546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e76616c7565436f6d706163743c42616c616e63654f663c543e3e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f72207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c20626520746865206163636f756e74207468617420636f6e74726f6c732069742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e5374616b696e675374616b696e6720496e76756c6e657261626c65735374616b696e6720536c617368436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e6720526563656e746c794f66666c696e6576206973206e6f6e2d656d7074793b207165640090f7100048000000870a00000e0000005374616b696e67204f66666c696e65536c6173685374616b696e6720466f7263696e674e65774572614c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656468656164206f66205374616b696e672056616c696461746f72735374616b696e67205374616b65727300000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000380111000e000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110060041100000000000000000048011100010000000000000001000000000000005001110015000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11006801110000000000000000007801110001000000000000000100000000000000800111000e00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11009c0111000000000000000000ac01110001000000000000000100000000000000b40111000d0000000000000000000000c10111000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100c80111000000000000000000d80111000100000000000000010000000000000050e610000c0000000000000000000000c10111000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100e00111000000000000000000f001110001000000000000000100000000000000f801110011000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11006004110000000000000000000c02110001000000000000000100000000000000140211000f00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002402110000000000000000009ced100001000000000000000100000000000000340211000d0000000000000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d804110000000000000000004402110002000000000000000100000000000000540211000600000001010000000000005a0211000c000000000000005a0211000c00000000000000000000000000000000000000000000000000000000000000c82b11008804110000000000000000006802110001000000000000000000000000000000700211000600000001010000000000005a0211000c00000000000000760211003900000000000000000000000000000000000000000000000000000000000000c82b1100880411000000000000000000b002110001000000000000000000000000000000b80211000500000001010000000000005a0211000c0000000000000058f110001100000000000000000000000000000000000000000000000000000000000000c82b1100c00211000000000000000000d002110001000000000000000100000000000000d80211000a00000001010100000000005a0211000c000000000000004df210001c00000000000000000000000000000000000000000000000000000000000000c82b1100e40211000000000000000000f402110001000000000000000100000000000000fc0211000a00000001010100000000005a0211000c00000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000c82b1100d804110000000000000000000803110001000000000000000100000000000000100311000700000001010000000000005a0211000c00000000000000170311002400000000000000000000000000000000000000000000000000000000000000c82b11003c03110000000000000000004c031100040000000000000001000000000000006c0311000e0000000000000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d804110000000000000000007c03110001000000000000000100000000000000840311000a00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100080411000000000000000000900311000100000000000000010000000000000098031100140000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002c0411000000000000000000d801110001000000000000000100000000000000b8031100100000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002c0411000000000000000000c803110002000000000000000100000000000000d80311001200000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100880411000000000000000000ec03110001000000000000000000000000000000f40311001300000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100080411000000000000000000180411000100000000000000010000000000000020041100090000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002c04110000000000000000003c04110003000000000000000100000000000000540411000a00000001010000000000005a0211000c0000000000000062e710000300000000000000000000000000000000000000000000000000000000000000c82b11006004110000000000000000007004110001000000000000000100000000000000780411000d0000000000000000000000850411000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11008804110000000000000000009804110001000000000000000000000000000000a00411000f0000000000000000000000af0411002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d80411000000000000000000e804110001000000000000000100000056616c696461746f72436f756e7400001d0c11002a0000004d696e696d756d56616c696461746f72436f756e7400000032000000000000000100000094000000cd0b11005000000053657373696f6e73506572457261543a3a426c6f636b4e756d62657232000000000000000100000077000000a40b11002900000053657373696f6e52657761726450657262696c6c320000000000000001000000950000005c0b11004800000032000000000000000100000096000000080b1100540000004f66666c696e65536c6173684772616365000000ba0a11004e000000426f6e64696e674475726174696f6e0032000000000000000100000097000000496e76756c6e657261626c6573000000e6091100690000004f0a11006b000000426f6e646564543a3a4163636f756e7449640000a6091100400000004c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e0055091100510000005061796565000000320000000000000001000000700000001c0911003900000056616c696461746f7273000032000000000000000100000098000000cb081100510000004e6f6d696e61746f7273000072081100590000005374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0032000000000000000100000099000000b50711006c000000210811002d000000c82b1100000000004e0811002400000043757272656e74456c65637465640000760711003f00000043757272656e7445726100005f0711001700000043757272656e7453657373696f6e52657761726442616c616e63654f663c543e43757272656e74457261526577617264d20611005a0000002c071100330000004e65787453657373696f6e735065724572610000ae061100240000004c6173744572614c656e6774684368616e676500320000000000000001000000720000007606110038000000536c6f745374616b6500000032000000000000000100000076000000fa0511004c000000c82b1100000000004606110030000000536c617368436f756e740000320000000000000001000000330000008605110074000000466f7263696e674e6577457261282900320000000000000001000000700000006c0511001a000000526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e0032000000000000000100000034000000f00411007c000000204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202857686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e2057652061726520666f7263696e672061206e6577206572612e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e205468652073657373696f6e20696e6465782061742077686963682074686520657261206c656e677468206c617374206368616e6765642e20546865206e6578742076616c7565206f662073657373696f6e7320706572206572612e2054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e6420696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e20546865206c656e677468206f662061207374616b696e672065726120696e2073657373696f6e732e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e00a425110028000000600c11004200000019020000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f6c69622e72735374616b696e672043757272656e7453657373696f6e5265776172640000a00f110019000000500f110048000000bb0100002d0000005374616b696e672043757272656e744572615265776172645374616b696e67204c6173744572614c656e6774684368616e67655374616b696e672053657373696f6e73506572457261000000100f110039000000500f110048000000100200002d0000005374616b696e672043757272656e74456c65637465645374616b696e6720536c6f745374616b655374616b696e672043757272656e744572615374616b696e67204e65787453657373696f6e735065724572615374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e7468656164206f66205374616b696e67204e6f6d696e61746f72739a00000028000000040000009b0000009c00000000000000000000009d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090f7100048000000810a00000a0000005374616b696e672053657373696f6e5265776172645374616b696e6720506179656500000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000617474656d707420746f20646976696465206279207a65726f636f6e74726f6c6c657220616c726561647920706169726564737461736820616c726561647920626f6e6465646e6f7420612073746173686e6f74206120636f6e74726f6c6c65725374616b696e6720426f6e64696e674475726174696f6e756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d70747900000036111100230000000c1111002a000000600c1100420000001902000001000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e6578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d5f736565646578745f6e6f776578745f64697370617463685f63616c6c6578745f696e7075745f73697a656578745f696e7075745f636f70796578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e746578745f7365745f72656e745f616c6c6f77616e63656578745f72656e745f616c6c6f77616e63656578745f7072696e746c6e6d616b655f746f705f6672616d655f706f6c796d6f72706869632069732063616c6c6564207769746820656d707479206672616d6520737461636b746869732066756e6374696f6e2063616e27742062652063616c6c6564207769746820656d707479206672616d6520737461636b4d6973706c6163656420656c736520696e737472756374696f6e0000003c14110047000000831411000500000000141100370000003714110005000000cd13110017000000c4131100090000001616110014000000ac13110018000000c41311000900000016161100140000007c1311001d00000099131100130000004441110001000000546f6f206c61726765206d656d6f727920616c69676e6d656e7420325e20286578706563746564206174206d6f737420547279696e6720746f2075706461746520676c6f62616c20206f66207479706520547279696e6720746f20757064617465206c6f63616c20416e795370656369666963009e00000004000000040000009f0000004c6162656c7320696e2062725f7461626c6520706f696e747320746f20626c6f636b206f6620646966666572656e742074797065733a2020616e6420496620626c6f636b20776974686f757420656c736520726571756972656420746f2068617665204e6f526573756c7420626c6f636b20747970652e20427574206974206861732020747970659814110018000000b01411000b000000556e657870656374656420737461636b20686569676874202c20657870656374656420547279696e6720746f2061636365737320706172656e74206672616d6520737461636b2076616c7565732e0000f8141100170000000f1511001600000045787065637465642076616c7565206f66207479706520206f6e20746f70206f6620737461636b2e20476f74200000003015110007000000537461636b3a200000000100ba151100240000009015110006000000961511000e000000a4151100160000006c1511002400000090151100060000006d6178696d756d206d656d6f72792073697a65206d757374206265206174206d6f7374202070616765736d6178696d756d206c696d697420206973206c657373207468616e206d696e696d756d20696e697469616c206d656d6f72792073697a65206d757374206265206174206d6f7374200000f0151100260000001616110014000000547279696e6720746f20696e697469616c697a65207661726961626c65206f6620747970652020776974682076616c7565206f66207479706520496e69742065787072657373696f6e2073686f756c6420616c776179732062652077697468206c656e6774682032c116110007000000ea1611000b000000c116110007000000c8161100220000004e6f6e20636f6e7374616e74206f70636f646520696e20696e6974206578707245787072657373696f6e20646f65736e277420656e647320776974682060656e6460206f70636f6465476c6f62616c2020646f65736e277420657869737473206f72206e6f742079657420646566696e6564206973206d757461626c650000000817110010000000181711000f0000004d656d6f727920617420696e6465782020646f65736e27742065786973747300381711000f000000181711000f0000005461626c6520617420696e6465782000691b110012000000181711000f000000681711000e000000181711000f0000005479706520617420696e646578200000d617110010000000181711000f000000a817110010000000c81711000e000000a817110010000000b817110010000000457870656374656420676c6f62616c2020746f20626520696d6d757461626c6520746f206265206d757461626c65476c6f62616c20617420696e646578206e6f6e2d656d70747920737461636b206578706563746564000010181100200000003018110012000000747279696e6720746f206765742076616c756520617420706f736974696f6e20206f6e20737461636b206f662073697a6520636865636b656420636f75706c65206f66206c696e65732061626f7665006818110015000000657863656564656420737461636b206c696d6974200000009e0000000400000004000000a00000004c6f63616c732072616e6765206e6f7420696e2033322d6269742072616e6765c818110022000000ea18110015000000ff18110007000000547279696e6720746f20616363657373206c6f63616c207769746820696e64657820207768656e20746865726520617265206f6e6c7920206c6f63616c7366756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e6473101a1100650000002301000017000000e01911002500000043616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a2000000000000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a09090909716564691b1100120000007b1b11000f0000003c1b11000a000000461b1100140000005a1b11000f0000005369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e76676173a01b11005800000088000000160000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e727300241c11001c000000f81b1100130000007704000009000000617373657274696f6e206661696c65643a20656e64203c3d206c656e581c11001e000000f81b1100130000006e03000009000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e4e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e46756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64737461636b206d757374206265206e6f6e2d656d707479737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e64000000601d11006c000000c8000000110000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e7273747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e6473000000501e110048000000810a00000a0000000000000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e72735d1f1100120000006f1f11000c0000006066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e64556e726561636861626c654e6f70426c6f636b00009e0000000400000004000000a10000004c6f6f704966456c7365456e644272009e0000000400000004000000050000004272496642725461626c65009e0000000400000004000000a200000052657475726e43616c6c43616c6c496e64697265637400009e0000000400000004000000a300000044726f7053656c6563744765744c6f63616c5365744c6f63616c5465654c6f63616c476574476c6f62616c536574476c6f62616c4933324c6f61644936344c6f61644633324c6f61644636344c6f61644933324c6f616438534933324c6f616438554933324c6f61643136534933324c6f61643136554936344c6f616438534936344c6f616438554936344c6f61643136534936344c6f61643136554936344c6f61643332534936344c6f616433325549333253746f726549363453746f726546333253746f726546363453746f726549333253746f72653849333253746f7265313649363453746f72653849363453746f7265313649363453746f7265333243757272656e744d656d6f727947726f774d656d6f7279493332436f6e7374009e0000000400000004000000a4000000493634436f6e73749e0000000400000004000000a5000000463332436f6e7374463634436f6e73749e00000004000000040000001e00000049333245717a49333245714933324e654933324c74534933324c74554933324774534933324774554933324c65534933324c655549333247655349333247655549363445717a49363445714936344e654936344c74534936344c74554936344774534936344774554936344c65534936344c655549363447655349363447655546333245714633324e654633324c7446333247744633324c65463332476546363445714636344e654636344c7446363447744636344c654636344765493332436c7a49333243747a493332506f70636e744933324164644933325375624933324d756c493332446976534933324469765549333252656d5349333252656d55493332416e644933324f72493332586f7249333253686c4933325368725349333253687255493332526f746c493332526f7472493634436c7a49363443747a493634506f70636e744936344164644936345375624936344d756c493634446976534936344469765549363452656d5349363452656d55493634416e644936344f72493634586f7249363453686c4936345368725349363453687255493634526f746c493634526f74724633324162734633324e65674633324365696c463332466c6f6f724633325472756e634633324e656172657374463332537172744633324164644633325375624633324d756c4633324469764633324d696e4633324d6178463332436f70797369676e4636344162734636344e65674636344365696c463634466c6f6f724636345472756e634636344e656172657374463634537172744636344164644636345375624636344d756c4636344469764636344d696e4636344d6178463634436f70797369676e493332577261704936344933325472756e63534633324933325472756e63554633324933325472756e63534636344933325472756e6355463634493634457874656e6453493332493634457874656e64554933324936345472756e63534633324936345472756e63554633324936345472756e63534636344936345472756e6355463634463332436f6e7665727453493332463332436f6e7665727455493332463332436f6e7665727453493634463332436f6e766572745549363446333244656d6f7465463634463634436f6e7665727453493332463634436f6e7665727455493332463634436f6e7665727453493634463634436f6e766572745549363446363450726f6d6f74654633324933325265696e746572707265744633324936345265696e746572707265744636344633325265696e746572707265744933324636345265696e7465727072657449363456616c75659e00000004000000040000009f0000004e6f526573756c74493332493634463332463634547261696c696e6744617461556e6578706563746564456f66496e76616c696444617461802511000b000000492f4f204572726f723a2000a425110028000000cc251100500000008700000009000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e7273a425110028000000cc25110050000000900000000900000061757261736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214175726120696e686572656e742064617461206e6f7420666f756e644578706c69636974207265706f7274696e67206e6f7420616c6c6f77656474696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e00000000502711001000000000000000c82b110000000000000000000000000060271100010000000000000000000000682711000f00000000000000c82b110000000000000000000000000078271100010000000000000045787472696e73696353756363657373952711002500000045787472696e7369634661696c656400802711001500000020416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e7273c027110019000000e027110050000000550000002200000048617368206e6f7420657175616c000070281100190000009028110048000000070100002a000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e727352756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e670000142911002d000000412911000c0000004d29110003000000617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20582911003400000064657374696e6174696f6e20616e6420736f7572636520736c69636573206861766520646966666572656e74206c656e67746873f42c1100180000004508000009000000b429110011000000c529110017000000ea020000050000006361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e7273702a11004600000063010000130000009e0000000400000004000000a6000000a7000000a80000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f7200c82b1100000000002441110002000000582a110015000000e7030000050000007372632f6c6962636f72652f726573756c742e72730000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f666d742f6d6f642e7273010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202020202020202020202020202020202020202020203030303030303030303030303030303040404040400000000000000000000000000d82b110020000000f82b110012000000320000000000000001000000a9000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e64657820697320303030313032303330343035303630373038303931303131313231333134313531363137313831393230323132323233323432353236323732383239333033313332333333343335333633373338333934303431343234333434343534363437343834393530353135323533353435353536353735383539363036313632363336343635363636373638363937303731373237333734373537363737373837393830383138323833383438353836383738383839393039313932393339343935393639373938393900000c2d110006000000122d110022000000f42c110018000000030a0000050000007372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820542d1100160000006a2d11000d000000f42c110018000000090a000005000000736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d003e2e11000b000000ba40110016000000772d110001000000282e110016000000e107000009000000984011000e000000a640110004000000aa40110010000000772d110001000000282e110016000000e507000005000000584011002b00000083401100150000005b010000150000003e2e11000b000000492e1100260000006f2e110008000000772e110006000000772d110001000000282e110016000000f2070000050000007372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f662060000000c62e110002000000b02e1100160000005404000011000000b02e110016000000480400002800000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e00010305050606030706080809110a1c0b190c140d120e160f0410031212130916011705180219031a071c021d011f1620032b062c022d0b2e01300331023202a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f1838586898b8c98a0a4a6a8a9acbabebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74759697c9ff2f5f262e2fa7afb7bfc7cfd7df9a409798308f1fffceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100856070207150d500443032d03010411060f0c3a041d250d064c206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082a0682ff1118082f112d032010210f808c048297190b158894052f053b07020e180980af31740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880ba3d35040a06380846080c06740b1e035a0459098083181c0a1609460a808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b0210011104120513111402150217021a021c051d0824016a036b02bc02d102d40cd509d602d702da01e005e802ee20f004f9040c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1c848509379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a2225c5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d03f71727b5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a80a64e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b5f2148080a80a65e22450b0a060d1338080a362c041080c03c64530c0181004808531d398107460a1d03474937030e080a0639070a8136198107839a66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b65450b2f101140021e97f20e82f3a50d811f51818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b87d580d7294b050a0402831144814b3c06010455051b3402810e2c04640c560a0d035c043d391d0d2c040907020e06809a83d50b0d030a06740c59270c0438080a0628081e520c046703290d0a06030d30600e8592000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f20503a11004a000000a03c110000020000a03e11003700000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b0200010202020203020202020402050602020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202070202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202303a1100200000002700000019000000303a1100200000002800000020000000303a1100200000002a00000019000000303a1100200000002b00000018000000303a1100200000002c0000002000000000000000000000007372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21b003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000d0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c813000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d000000000000001e1f20000000000021002200232425000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027280000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000002b2c00002d0000000000000000000000000000000000000000000000000000000000002e2f300000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000000000320033000000000000000000000000000000000000000000000000000034350000353535360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff06fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db07000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f662060426f72726f774572726f72426f72726f774d75744572726f72000000c82b11000000000083401100150000000c04000005000000202020202c200000aa0000000c00000004000000ab000000ac000000ad0000003a202c0a9e0000000400000004000000ae000000af000000b000000028280a2c290a5d5b4572726f7200a9d302046e616d6501a0d3028c04000e6578745f626c616b65325f32353601146578745f6765745f73746f726167655f696e746f020c6578745f74776f785f313238030f6578745f7365745f73746f7261676504166578745f73616e64626f785f6d656d6f72795f6e6577051b6578745f73616e64626f785f6d656d6f72795f74656172646f776e06176578745f73616e64626f785f696e7374616e746961746507126578745f73616e64626f785f696e766f6b65081d6578745f73616e64626f785f696e7374616e63655f74656172646f776e09116578745f636c6561725f73746f726167650a1f6578745f6765745f616c6c6f63617465645f6368696c645f73746f726167650b156578745f7365745f6368696c645f73746f726167650c176578745f636c6561725f6368696c645f73746f726167650d126578745f737232353531395f7665726966790e126578745f656432353531395f7665726966790f0e6578745f7072696e745f7574663810166578745f73616e64626f785f6d656d6f72795f67657411166578745f73616e64626f785f6d656d6f72795f73657412196578745f6765745f616c6c6f63617465645f73746f7261676513106578745f73746f726167655f726f6f7414186578745f73746f726167655f6368616e6765735f726f6f7415166578745f6b696c6c5f6368696c645f73746f72616765160d6578745f7072696e745f68657817166578745f6368696c645f73746f726167655f726f6f7418236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74190d6578745f7072696e745f6e756d1a0a6578745f6d616c6c6f631b086578745f667265651c303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68326533613936366566633562316538641d553c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68386234376533366466613065306633391e683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68306631383032666638373032363130641f6b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6833386530623464613031316336666238200e5f5f727573745f6465616c6c6f63210e5f5f727573745f7265616c6c6f63220c5f5f727573745f616c6c6f632308727573745f6f6f6d2434616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a6866373434393834373332393266386333257d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6832303636383663343338663666636136266f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6837613634306438613866643666326437276f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6832333637646566663566343136633964286c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6834663139653464663965666439373465296f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68643331666130323765323366623065322a443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68643635316366363931363039356134342b25616c6c6f633a3a666d743a3a666f726d61743a3a68303034623839663964653732303363302c793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68363862353432346131666332623061372d36636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a68363230653236323832656635653638312e34636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68303037626566626164653137393433382f29636f72653a3a70616e69636b696e673a3a70616e69633a3a6865383132333465353163393337356333306b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68393563343737646462366266626161373148616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a683030623835623061636366396233616132723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a686236313835393339633435303661376533723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6863336366623435623638643439393461343a73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861653763313631316663393962353662353f73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6834326666396134336535383734656661364473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6838323665323138616161643165656562373473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a6864333634616664353761343262353462384e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837656563343764333834623739616432392e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a68636239353637313034383865313135393a7f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a68383336373865373437336232633139373b86013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a68616465366139636362306162613036613c483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a68353164643364383037303666353531353d3873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e743a3a68616261373133376566316164663362303e633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68373166656565646266343162363262393f4b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6864386362343736653364326464643061406a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6866666432653962373436636463633635414b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a686531623066356638356639313637663742613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a686463663566623838623739396539313543613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68316132303336373331663031333365374448616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a686138313166363237396631393932633345473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6864653265653634653565613634386337465c3c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a686237383862363662343536376465333647323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6834326136316364393265383533373735482d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a6836346332626564633330326635316333496b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68333638323438323031363361326138324a783c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68643362303333613462653438656538614b713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68313736393835613433343766653936664c713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68333461393266386165613639303032344d30636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68323635356136306438653935383733644e6f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68326464623661616261303865343139344f743c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a56617255696e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a683666386561353034346161303330633650457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6834633439633363353430383738626163517c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68303562333237616561633834336131335227636f72653a3a7374723a3a66726f6d5f757466383a3a68343933363934636466666462393961355386017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a683232376233316430653934333637633054613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a686339333866666162356161393761643555613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6863663732666235653666303036323339567a3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173682c4469676573744974656d3e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864333266656534306633646534336262575d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864323739373035393730393361393038584e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835633138616437396361613832663461593773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68376362343961303932326633386335365a3773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68653031343437613732353762376239325b3773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68616337653664616438373933393639355c34636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a68333932646266363830373033616331665d5a3c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a68366463666634646363323431383332655e7b3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a68356337323064386662393732353830635f87013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a68663262613261616664643263323661386087013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a68373739336438353634613239356130666180013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a68343836366137383633653430333530666282013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a68386665353837666130373661336337636382013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a68643537653961656161626634333565376482013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a68643838396365343863313236353337396583013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a68663437616233626432393939356163616685013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a68336462373931623064626563313130336784013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a68323734373265653764343739343438346883013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a6864656265643663613864356561636337698d013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a68323366353930626464323936643433326a87013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d5f736565643a3a68323965623761643331306361373265646b7f3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a68613165616332613561653435393932636c89013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a68666333363634616435326666653037346d86013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f73697a653a3a68353132633566643039306233616263366e86013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f636f70793a3a68663162633434333739313132336362646f88013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a68613539663762643237653436616664377088013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a68666539323630336535303861333764367189013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6835633138643536396562363464316137728e013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f72656e745f616c6c6f77616e63653a3a6831346463616233663531306361343039738a013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72656e745f616c6c6f77616e63653a3a68383032303166303638303233356566647483013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7072696e746c6e3a3a6837343437363637306263633265663435753273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a686532343566363230396134396361333176135f5f727573745f616c6c6f635f7a65726f656477a7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a6831353433316137663739313265653536784473726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a683437353738353738376537363466306279673c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a68616338306331366661663464363438307a406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a68306634333331303666373834643765387b39636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a68346536303162343935373338373136317c4173726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68656134336638333362346539653230327d4673726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68353862646534643937323231313365317e3c73726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68303266656534326138623162353038347f416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a68356465633132613738653434626165618001426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a68313439353766626462643839316663628101416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a68656365633235393066333333643431358201416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a68626333623933643239396339326330398301436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a68643161626232666431353966633137658401416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c3a3a68343866656332653938373236343764628501486e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f766f74696e673a3a68396438393662356230313636396139348601496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f6d6f74696f6e733a3a68653962643133623766303139643831348701416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a68623438333161376630333930653534658801426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a68373865653565666333666534643531358901426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e74726163743a3a68326133383461353031393266646662398a013e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a68663264306638323939663336303166648b01796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a68353832313432306164633736653631648c015e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68613739633364356363363665386664618d01723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68303062636238666635303361636264398e015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68646531623631383464373561333730338f014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68643465333665373130373832636437319001880173726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a6465636f64653a3a683633373832623731303961613438356591015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861343134666465386261306665373564920130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6863636133316432326363656135376438930130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6863636133316432326363656135376438940130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683131373930303864353832366134336695017c6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a68656231633432613431323363313663389601633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68363165636238393138616362396166329701753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68613137336532393731643635393565329801643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683766336362323932336263646165346599018b0173726d6c5f636f6e74726163743a3a5f494d504c5f454e434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a656e636f64655f746f3a3a68343430343136343231333263323530639a014d3c6e6f64655f72756e74696d653a3a4c6f67206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a68633038346231396237313266396237339b0189013c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d5265663c486173682c417574686f7269747949642c5365616c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a68646261333662363139346564653833359c014473726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a53746f726167655665633a3a6974656d3a3a68373139303062323035616637336630329d013973726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a617574686f7269746965733a3a68343038353535343163633266346539659e014773726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a736176655f6f726967696e616c5f617574686f7269746965733a3a68383437653232666634356365386131659f016f73726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a6861333839396434626334653233343664a001c2013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c436f6e746578743e3e3a3a636865636b3a3a6834366365636264333331323239373737a1013873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6163636f756e745f6e6f6e63653a3a6833643239643930613461396339376431a20188013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4d616b655061796d656e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f7061796d656e743a3a6836323935353739653866616662356665a301593c6e6f64655f72756e74696d653a3a43616c6c2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6861346539613037363866363937613261a4015d3c73726d6c5f636f6e74726163743a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6837653664666462653637653539313266a501653c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838303834373539626563303566383636a601633c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6835366633613635376461356462373264a701643c73726d6c5f636f756e63696c3a3a766f74696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838376132303732353462383938313530a8015e3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838643737366338303662386630613062a9015c3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838386435363161356433333734356261aa014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834393238336662363864373066653635ab01960173726d6c5f74726561737572793a3a5f494d504c5f4445434f44455f464f525f50726f706f73616c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f74726561737572793a3a50726f706f73616c3c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6834653438373836333062656535663738ac0191013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a6866363534623330326338336231336534ad01573c28292061732073726d6c5f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643c496d62616c616e63653e3e3a3a6f6e5f756e62616c616e6365643a3a6838633736333230393634366233386333ae018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a6834653062623039373036356263356262af013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a6838396536313438396264613866353661b0018a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6832376365633730626362663061343433b101f0023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63652c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3e3a3a6765743a3a6832356435343532363764623034373566b2013373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a6861353239626466383364353932356536b3017e3c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173683a3a6830643131633461373334623061386361b401483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6837636464303135353361336332643061b50136636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a6861323065303937653030363965363431b6014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a6861393835353266613731313531323332b701493c73726d6c5f636f6e73656e7375733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865316333313632626337646536373130b8017e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6865383636636333626635386362363235b901796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6834373165653232396365326561386663ba015e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838386332396639323262366634323137bb01723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830373933353066363562356266623962bc015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833316266643265393032313933303730bd014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834653436383366653237643434306365be014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831646530343266353038666634613536bf0183023c6e6f64655f72756e74696d653a3a4c6f6720617320636f72653a3a636f6e766572743a3a46726f6d3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c7072696d69746976655f74797065733a3a483235362c3c7375627374726174655f7072696d6974697665733a3a656432353531393a3a5369676e61747572652061732073725f7072696d6974697665733a3a7472616974733a3a5665726966793e3a3a5369676e65722c7375627374726174655f7072696d6974697665733a3a656432353531393a3a5369676e61747572653e3e3e3a3a66726f6d3a3a6834373632383937613236393432353630c0014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862326234393362653130323461646464c1014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866373232616438633733623739643938c201ea033c6e6f64655f72756e74696d653a3a52756e74696d65206173207375627374726174655f636c69656e743a3a72756e74696d655f6170693a3a72756e74696d655f6465636c5f666f725f436f72653a3a436f72653c73725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c7536342c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362c6e6f64655f72756e74696d653a3a4c6f673e2c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c3c73726d6c5f696e64696365733a3a4d6f64756c653c6e6f64655f72756e74696d653a3a52756e74696d653e2061732073725f7072696d6974697665733a3a7472616974733a3a5374617469634c6f6f6b75703e3a3a536f757263652c7536342c6e6f64655f72756e74696d653a3a43616c6c2c73725f7072696d6974697665733a3a416e795369676e61747572653e3e3e3e3a3a617574686f7269746965733a3a6837356462316130363836613465333064c301773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6832376464623831376430383663383666c40185013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a6835306465303261386564656132306330c501773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6832353934643734363261373862393836c601793c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6865313338303461333538336365333931c701b7013c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f3c543e3e3e3a3a6765743a3a6835373231376631373263623463303233c8017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6832643732356538623262663734306238c9017e3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6866666132303631363165346339356632ca01723c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6863636434653264326665376639613764cb018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a6830343261373466343233633463326261cc014473726d6c5f737570706f72743a3a7472616974733a3a5369676e6564496d62616c616e63653c422c503e3a3a6d657267653a3a6862613364666434396539373238636638cd01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6830643536303136353934616436346232ce01653c73726d6c5f62616c616e6365733a3a696d62616c616e6365733a3a4e65676174697665496d62616c616e63653c542c493e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831303539623536353038306463316335cf01653c73726d6c5f62616c616e6365733a3a696d62616c616e6365733a3a506f736974697665496d62616c616e63653c542c493e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6834356666353933636361333334336636d0017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6834633231313733336235313964316233d1012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6861336261373064346433396663643430d2017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6864373865303330663937613638376532d3017d3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6832663139316632366464633036323334d4017f3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6838643937636365356635323833633038d50182013c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6865303937326339666663313235323439d601763c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6864336334656235313832643632316539d7012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6865643838383361383066353136666335d8014373726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6834316233306132333732346339383435d9014873726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6831396433623464373736633861336531da014d73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6839396531373966653134373733303937db014e73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a6866343665663331633764323134346337dc01b5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862656437653634343135663535616236dd013573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a6865313464623830646534396138303232de017f3c284b2c204c2c204d2c204e2c204f2c20502c20512c20522c20532c20542c20552c20562c20572c20582c20592c205a292061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6831653833653562376335356533353431df013673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6832643330373663306334353936613763e0013673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a6835666630336536373834303663666637e101523c28522c2053292061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e4368616e67653c543e3e3a3a6f6e5f73657373696f6e5f6368616e67653a3a6864663661313631663931643062323364e2014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830383630333338646262666664366438e3013873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a6830656335383537626132356261396463e4013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835303736373766376266653764383138e5018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a6861616665663362333834326266613930e6013f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a6838393063346438363365336162333737e7013d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a6863376437303133343130356364653034e8014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837356339306238663034663663356634e9018d013c73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6866363939363434303163626163326262ea01a9013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6832626436383832366434613233663734eb013573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a6832303339313163353833623963386364ec013d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a6836346666646630376562656332346332ed018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a6833353737613333346138316264343935ee013e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a6832316137323237653838313836363963ef01ef013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6835303639643632363536333831663137f0013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835356532666436653266306430613961f1014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864653066633038396339336439363137f2013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6833373862343463323466323565343133f3014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838636436363962656232643139323538f4014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830353732653163626434623539396565f5013b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6863316535376330306138653364383331f6016b3c73726d6c5f6772616e6470613a3a53746f72656450656e64696e674368616e67653c4e2c53657373696f6e4b65793e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833663364663165323564343838656438f7013673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a6864383665393233303865303430626233f80189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a6837643833376236626464343035653735f901573c28292061732073726d6c5f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643c496d62616c616e63653e3e3a3a6f6e5f756e62616c616e6365643a3a6865303838653235643162366131303639fa012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6832343535316534646531393365326230fb014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835386631306138316338343533313866fc01323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6830363261643234613830353562306235fd012c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6866396237376336633333386230306334fe01443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837343339666464333634663035353865ff01483c73726d6c5f636f6e74726163743a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68306235376333666564313566646630668002463c616c6c6f633a3a626f7865643a3a426f783c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683333633661303333616463363039613381024e3c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68363231366236633736636533313862308202493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68396137646137393938623231303465308302473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683864646434363261643163633963373284024173726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a69735f636f756e63696c6c6f723a3a683337386265343765383237363365636385023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683831396538666437303236343763333586024c73726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a68316261663332643735323364323963368702453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683462366433666331316635336332353888024573726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a683132393536303335366639363863393589023573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a696e697469616c697a653a3a68636132626636633833373836393862368a024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68666665336563623961363333636133628b023673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a72616e646f6d5f736565643a3a68613531633461663633353835653334348c02643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a68613630336434333435623263393864668d02443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68313832356332343366643836643935398e02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68393965636234656638323165643761658f02463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a686639393338333334613666346533393490023e73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683033373138336664643634613863636291024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a683633313534336134326532316437346392024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68323362643265383836313433623966369302663c73726d6c5f73797374656d3a3a5f5f476574427974655374727563744576656e74733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68646334303233346232373163636535389402693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683736363532366430303137366431323295026e3c73726d6c5f73797374656d3a3a5f5f4765744279746553747275637452616e646f6d4d6174657269616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686438613539336337663663636430663996023373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a683539646464626663383466393436386297023873726d6c5f636f6e74726163743a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a683163646361653730636339383338613398024173726d6c5f636f6e74726163743a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a6839636435636432396338626435366533990249636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68313439623963316534376334393935639a022f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68643633663230363439343866313563329b0235636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68396664316139393965326363313634329c022e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a68333264373262626231373433313937629d02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68363665323265343562316233656162629e02483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68366531613831323530393639376662619f02aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6833623434666634336337393064623831a0024173726d6c5f737570706f72743a3a7472616974733a3a496d62616c616e63653a3a6d617962655f73756273756d653a3a6834653464373436626138333462373737a1023d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6836343038393833396665346533616138a2023e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a6834623761623131363432326461386338a3023673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a6838643931326264643836656431353363a402483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6832636638393930663338366137383734a5024273726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f6e616d653a3a6838346361363737646637663261373636a6024773726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6838363665326634393566623163303263a7026f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744372656174696f6e4665653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862353235323166666362336565626663a8023473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a6862396534373634653837613464636530a9028e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a6864323330376463666431313538303264aa0281013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6866303731303838643939393161373262ab02e8013c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c206938292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832376538323936333266336566386539ac02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6832333963626266336662653937623438ad023c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6866363765363265613431316363653139ae024173726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6836626664663766393538323964373530af024673726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6861623934613639346166353132323461b0026e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838366339613663363138663731663465b102703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830386237306138356238353265656331b202b5013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6863306365306131326135656338643161b30289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6861313037626262653031646332646133b402313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833326530616561323664303766306338b502303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837346537366133383937353165343431b602443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837343339666464333634663035353865b702b50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a6866623934316439653836376439333837b8023573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a6865383465303932666638396239616430b902483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6865333061613064663934613130633364ba020c436f72655f76657273696f6ebb0212436f72655f657865637574655f626c6f636bbc02af0173725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a5f494d504c5f4445434f44455f464f525f426c6f636b3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c4865616465722c45787472696e7369633e3e3a3a6465636f64653a3a6863343939373766653936636334386632bd024173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a6832353466613837623166313132343739be026c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a6831666334623038643464356636623730bf0215436f72655f696e697469616c697a655f626c6f636bc00210436f72655f617574686f726974696573c102114d657461646174615f6d65746164617461c202603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6835626233656130316462356365306162c302433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6861386165663834663163376663623131c402623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6830326536393333633865613033323665c502623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6839343137396332363131646231653438c602623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6833383737333836666366346633663263c7021c426c6f636b4275696c6465725f6170706c795f65787472696e736963c8021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636bc90220426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373ca025d3c7375627374726174655f696e686572656e74733a3a496e686572656e7444617461206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6863393164663866366662353865616639cb023873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a6838653239383931336562376461336165cc021c426c6f636b4275696c6465725f636865636b5f696e686572656e7473cd02477375627374726174655f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a6835346165656337616435356364623235ce0218426c6f636b4275696c6465725f72616e646f6d5f73656564cf022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6ed002214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572d102214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765d202204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765d3021e4772616e6470614170695f6772616e6470615f617574686f726974696573d402513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6861323537343263666131303361343063d50215417572614170695f736c6f745f6475726174696f6ed6021a417574686f7269746965734170695f617574686f726974696573d702693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6833303361366665383461343233613966d802693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6834623830643935643239663336376439d9026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6864343162313437313063333865326236da023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6832626335656566326166663036363734db023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6837643933313731353764653466343164dc024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831346533666630666439653562366161dd024173726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863383639386566386631323134386663de024573726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6866616366626262363163613334393035df024673726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6861363662386466306636313235306463e0024b73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836636261306163313530613439336166e102733c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744c6561646572626f6172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866663433653263346130373032323533e202713c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f7465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862396632333033396136323731643435e302743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563745465726d4475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839636630626331663238303635393839e402743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f74696e67506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838613266343135386665663631303131e5027b3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374496e6163746976654772616365506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837616237316264376630613762613665e602723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744361727279436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837643730396664333436376662623866e7027c3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637450726573656e74536c617368506572566f7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836343435323230313431616333333862e802753c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637443616e646964616379426f6e643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836646462343361383463653465363637e9024373726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a6833376664636563356336363230623032ea023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a6836303738663133663064373165303231eb023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a6861653733306434396564623530656162ec02416861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a7472795f776974685f63617061636974793a3a6833393631353830336231306664363132ed023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6836623831613362373437343962663538ee023a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861343534303736323961623463373438ef023f73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6839316161363135356137346130303966f0024473726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6838303461363365656332643533633264f1024173726d6c5f636f6e74726163743a3a72656e743a3a7472795f65766963745f6f725f616e645f7061795f72656e743a3a6861353362616139663436326436346430f2023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830356661336163663335316633393262f3023c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861356636386561656562343634306164f4024173726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6830333336616136336339633035666362f5024673726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830323461666139363030623563303661f602703c73726d6c5f74696d657374616d703a3a5f5f476574427974655374727563744d696e696d756d506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862316431626163316637333861303764f702673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6865613365616431373761313463353465f802b4013c73726d6c5f7374616b696e673a3a426f6e6465643c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6830313233326237306164393335313336f9024273726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862386434663132653164323239366339fa024773726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6836393631333461626262306266353738fb024c73726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6837316161363937343363613036626330fc023a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862356237623565333431636635396164fd023f73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6863666230383762323734663762313736fe024473726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6861633936383838633330343835333939ff022e73726d6c5f636f6e74726163743a3a6761733a3a6275795f6761733a3a68646365363631333963333366376631618003f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68393538383639623831323661393433358103d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a686232323537616134303636666332373282036f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a686365393934623961633232343732313483033b73726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a7665746f5f6f663a3a686564303531353463363430356534396284033773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683534316234393864633430376235303985033c73726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683034343832616165316364626134373386034173726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68303233373433656330653362633938358703613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68373262646465363965613037313261658803303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683331396466633566313063353638383589033b73726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68373036356538393636623165333165648a034073726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68663962346130373034356630393330378b034573726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68376334363965626365393339333764638c03703c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e7472616374496e666f4f663c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68343663326231626132666561363337328d03703c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744163636f756e74436f756e7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68643061336366356230363832313966648e03713c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68303830633662333035646635346230628f036f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374426c6f636b4761734c696d69743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683333616333313931336138616434393590036a3c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744d617844657074683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683836653830663963663234663865666691036f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374437265617465426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686437616664656631393335393435656592036d3c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443616c6c426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683733356230386465326131326363353493036d3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e74726163744665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68663834326336636233373831613063629403483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a683866376461336138613634616433323295033473726d6c5f636f6e74726163743a3a436f6e6669673c543e3a3a7072656c6f61643a3a683536633430383235393032356134333396033073726d6c5f636f6e74726163743a3a657865633a3a7472616e736665723a3a6832623162646636343130633934396139970330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68363031363032343335313535363830359803467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a686265353032383931343639373330373499034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a68363761353135643933396538656335349a03397761736d695f76616c69646174696f6e3a3a76616c69646174655f6d656d6f72795f747970653a3a68616537366466616236313736613561379b03347761736d695f76616c69646174696f6e3a3a657870725f636f6e73745f747970653a3a68396132396161353130363036313065309c03553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68323663636432393964303536656431329d03473c7761736d695f76616c69646174696f6e3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68663361333261663363383232376366379e034a7761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a737465703a3a68323061346235333934306364623139349f03457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6865366334623561376335396366373636a00348616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6836393863383461356539303237316234a1033c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a6833346434666534343661363066636634a203537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a6834613339666461663636663035666339a303a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a6863316163323235376166643336366438a4033a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a6835386239383664613662653961386231a5032d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a6865373063333837666238333536346236a603507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a6862626531666534313739373336316638a7033c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a6830633033303732326336613132313739a8033b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830656262653664663863666534633462a9034073726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832633130633762616136626461633861aa034573726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6839636562326636336661643835616633ab036d3c73726d6c5f74726561737572793a3a5f5f476574427974655374727563745370656e64506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837666565643232623865633635323961ac033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6834303133333637306533346265393230ad033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835643935343733343763653231656464ae033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6863393137356334643235643162326237af033a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6834393164653164383037393433626634b0033f73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6865386163363234363032303366616136b103aa0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63652c426c6f636b4e756d6265723e3e3a3a6465636f64653a3a6838353835306336346561333534326633b2034473726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6861633531333035663433303636626234b30330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830326164366239623231373536326562b403683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866313363633865313331316136386637b5036b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835613062343361383037366664613961b603703c73726d6c5f7374616b696e673a3a5f5f47657442797465537472756374426f6e64696e674475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865323838613532663062336239653635b7036d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866646163393138633931313864316662b8036e3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637453657373696f6e5265776172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861643230393464653265333266393335b903763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834303939323431366332666464356363ba0344636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a6835313935393064653537373436613937bb033773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a6832616239306330366236303565663264bc033973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6863373438326561393133346366396532bd0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6832663066313333366634346139343733be033e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a6866343233336639653335353936653839bf03347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f6c6162656c3a3a6864366365346237643436656665656363c003547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f73746f72653a3a6865373637633139356366666565343364c103347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f76616c75653a3a6832666661363331333762346161303437c203537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6c6f61643a3a6839323137323536346234356432383239c303547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f72656c6f703a3a6862333161613864376633643830643331c403557761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f746573746f703a3a6865336636383338623564646439363938c503547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f62696e6f703a3a6838306437313634383164303839613636c603407761736d695f76616c69646174696f6e3a3a7574696c3a3a4c6f63616c733a3a747970655f6f665f6c6f63616c3a3a6837356430643762626238353635316639c703537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f756e6f703a3a6836663939353264366532373932306461c803547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6376746f703a3a6866356430656364623630303033643132c903553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a426c6f636b5479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864356431653264633437346334393464ca034e3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6865303763376366323765393231303937cb03543c7761736d695f76616c69646174696f6e3a3a66756e633a3a537461636b56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862386164623361313938373237386637cc0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832666263636334336632373438306535cd033b636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a6834626264343232393037633263656634ce032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6866336231383831333937313532373931cf0339636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a6862393165306464623363646530613936d0034c3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839663665366631613061323065313536d103303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862653332343265636534313937326664d203453c616c6c6f633a3a737472696e673a3a537472696e6720617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6865383232383163363336643663323036d30323636f72653a3a666d743a3a77726974653a3a6864323336313062353362373333383936d40341707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6861303766366438356332383066396431d503323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6834336266323736653234366132356534d6033f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6834356438393230323362326163333330d703613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831626630323563336161343738626331d803593c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831386165666338663061666665636235d903533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6862663862363631613030383835626363da0346707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6838663764323864306135303132383631db034b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6833626631633865326537653535393639dc03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838363032633631343862663834623033dd03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839366536353534383961333834303034de03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837666333643032306232636139626136df03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838333935666530363132653435393861e003303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6866656238656238313733313437313965e103463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833306533373831636265363334623763e203303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864343832313936386265613832376637e3039c0173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f7261676546756e6374696f6e547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f7261676546756e6374696f6e547970653e3a3a656e636f64655f746f3a3a6861633630663631376638663866366463e403423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6863386362396435663831653137653435e503623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865613735376337343864366466386131e60311727573745f626567696e5f756e77696e64e7034e73725f696f3a3a696d703a3a6578743a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6832666561303536396339663237376639e8030a5f5f72675f616c6c6f63e9030c5f5f72675f6465616c6c6f63ea030c5f5f72675f7265616c6c6f63eb03115f5f72675f616c6c6f635f7a65726f6564ec032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6830626539663036613337326361663465ed033e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864383465363962636438366635393534ee033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6832323737666634316639666336343065ef033b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6861643733613534306538646564616461f0033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6863613031376263366634613537636536f103313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6836343762373638373864336135646264f20343636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a6863346462323038393365323564366633f3032e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a6839323262396462613163316331616434f4034a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6866323838326631333737333536653963f503323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6836346364616437356533656439393830f6033d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a6834613663626664323038323765616338f7034e636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68313439623963316534376334393935632e32313135f80334636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a6864633430366164396336343538353333f9032e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a6864656634383536363638376464383561fa038001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a6834373265323933316464376639643539fb03533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6864356464623965323366393563613365fc0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6836646538373161663933663439393036fd032f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a6831633836306263303131396334636563fe032e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a6838393036336562363362626432323033ff0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683035316634653030353938636336313680043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a683063636130623236663536343732653981043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a686565653064616262376531623438656182043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68303332376639313166636562316331338304066d656d7365748404066d656d6370798504076d656d6d6f76658604066d656d636d708704095f5f756469767469338804085f5f6d756c74693389043f636f6d70696c65725f6275696c74696e733a3a696e743a3a73686966743a3a727573745f693132385f73686c3a3a68303735336131656530316466313739338a043f636f6d70696c65725f6275696c74696e733a3a696e743a3a73686966743a3a727573745f753132385f7368723a3a68633934343437646462326666336637658b040c5f5f756469766d6f6474693400590970726f64756365727302086c616e677561676501045275737404323031380c70726f6365737365642d62790105727573746325312e33362e302d6e696768746c79202861313963663138633720323031392d30352d303629", + "0xfd0cbba69a04d769ddcdbb15f5123c98041978f5241f33f78f62b48e3a02b740": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0xdade128e67a5ed110063f56a01ab6bbf": "0x0000000000000000", + "0x4e62513de81454ce76df887573f7f98b101eb4585b1485a222b7db599f4e93e2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0xbd393c7a86c2574659297d84a8c369613134cd3b80b8b92f816e3ff845991bf4": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332", + "0xe18ad90fcd74459141a97efeed86f463": "0x0800000000000000", + "0x472b8f236d06a2ff7f1e9b2e848ef1d5": "0x0080e03779c311000000000000000000", + "0xfc2dc4b8bb0b9ca8f01a73a726f7c7f5": "0x00e1000000000000", + "0x62f532424b7b1c52f522857315040f27": "0x00407a10f35a00000000000000000000", + "0xb7b6ec0f25eb1ed8b91d05f697d7a874": "0x0c00000000000000", + "0x3a617574683a00000000": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332", + "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0x0000c16ff28623000000000000000000", + "0xabe32953315ab8fe7b2b925eba5f4c80": "0x00e40b54020000000000000000000000", + "0xfbb77d814ac81cfe0ef7030e8bd686f0": "0xe803000000000000", + "0x5286264f4d2ddb5a0d2950bf3bcfb9f6": "0x10000000000000000000000000000000", + "0xd8bc278604e9f924a948f47f58be8f89": "0x04000000000000000000000000000000", + "0x0e0cdac0d4de97c54f3ae216b003fa81": "0x0c00000000000000", + "0x125dc846383907f5846f72ce53ca0e4b": "0x00ca9a3b000000000000000000000000", + "0xd437fe93b0bd0a5d67d30d85d010edc2": "0x40420f00", + "0x59b17352bea17cb7dec6dde697de7db4": "0x6400000000000000", + "0xb8f48a8c01f629d6dc877f64892bed49": "0x0000000000000000", + "0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000", + "0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000", + "0xdee5bbb035d9ebc2c9338b5aedf744d7": "0x4038000000000000", + "0x121725e2f949944d00a8c011c0db54ae07b84a6ca772adf3c65417345d91522d": "0x0000c16ff28623000000000000000000", + "0x3a617574683a03000000": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", + "0x4a8b1a5c7681353a6a320553abbbca49": "0x4038000000000000", + "0x90d5871cf3f4d0a3642cf2043a7d8eda": "0x0010a5d4e80000000000000000000000", + "0xa36baa0f89eff09b2facf282f27a11ba": "0x50c30000", + "0x96f2cbaf8156f12db4af0b59d3e56f8f": "0x0010a5d4e80000000000000000000000", + "0x92f53c21a80e624b3c606bc8ec0ce2a3003c4fe385bed33998bf4dc79b8970f2": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d650f0000c16ff286230f0000c16ff2862300", + "0xc63b8a0db7e72fd87c88d8dcf4777b883f86728613c57148c4e5cdceb05b7a1a": "0x0c0001f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", + "0x8b4621d5f16433d6024b5a31547c59ee24e749e051dbb4bc7e64502f2a4f62fb": "0x66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", + "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", + "0x366a192e1ce90bf109f11cf4d4bdab1ce310d835c09411b1be3ad53814e33196": "0x0c000001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", + "0x74d5dca6735bab024bc25136daaab7c0": "0x06", + "0xc1fdc3d212357bc2fa98f2a77b941f0c": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d6568655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde789c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x2d5205eddfc20f1a616c0391abb78a3920e823abe7ed33cfd7945dd1a1bf8651": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0x934302c5ec4cb4f73a395e2184ab0aa6": "0x00e40b54020000000000000000000000", + "0x15b569617561081f097bbc5c5a059d2f7ccf6d23be534cffa33fb544946a6a92": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", + "0x2b89d3b6f46fc8a3aee48c9cb06d7670": "0x0010a5d4e80000000000000000000000", + "0xd9c94b41dc87728ebf0a966d2e9ad9c0": "0x3200000000000000", + "0xfe7030fd433199728c516e4392091aa5": "0x0080c6a47e8d03000000000000000000", + "0x90e2849b965314409e8bc00011f3004f": "0x04000000", + "0x24b2518f9a9ee24ab0b62346d83d90b0": "0x11080000", + "0x686f6c72b7b80bad8dba022335cb7c9e4556ac7ea200008da8046e3178eb89c1": "0x0f0000c16ff286230f0000c16ff2862300", + "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", + "0xfff675c76ad8a5dfbd7db9a4e80f7c0ece595ad1878d2b6fca6086b2483a055b": "0x0000c16ff28623000000000000000000", + "0x2ec6e5652282d579398fb8fdfa531ef6": "0x0000000000000000", + "0xf541ffd8c90d7124a5298d6c1e2c0d40": "0x0300000000000000", + "0x8366297e853b97a38cca0f62019a717b": "0x00000000000000000000000000000000", + "0xc98362e2ca21b342cc749022ed9b560e4d29ec9862a960c2538c314f1d279635": "0x149ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e3180973474718099c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0x26ac4a74e1ba94e0e7dbfc3b2aea083cf3c0f0d80eb999c7cebb340ee8934da9": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde780f0000c16ff286230f0000c16ff2862300", + "0x93940e78496482b15b64783020bbdfa0": "0x6400000000000000", + "0x6e45a8645fa8f905c49fecfef3d06c67": "0x01000000", + "0x3a6772616e6470613a617574683a00000000": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993320100000000000000", + "0xa5e869ecc1b914a6b0cf5f02b874f5eb90f1739fbd3edd01e5835d1517fd9f72": "0x781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", + "0x46cef122497fefa60faf6c66d3ef05caf9870446796ae11f0a4f734fee993d8b": "0x00", + "0x51322b89410377cf0f1bdeeafd212f07": "0xe8030000000000000000000000000000", + "0x34de7fc8c73e4252b9e09a9e3bf602f8": "0x6400000000000000", + "0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000", + "0xbf18c0c65fb39f32ee7c8016685c0a6056f8f924192efb2655be9a692d0b03b6": "0x00", + "0xbc3717660105a864bd63dcd430de64128d58bd0917fa8dd75aee827cf086e19c": "0x0000c16ff28623000000000000000000", + "0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000", + "0x7935e46f94f24b82716c0142e2271de9": "0x8070000000000000", + "0x3a617574683a02000000": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440", + "0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000", + "0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300", + "0x656abc4530eb4c1692051ca24c867220aa8d62e4a9686b432f760de7455e8f95": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440", + "0x24586f4898a5a637b755b658ec163d00": "0x00407a10f35a00000000000000000000", + "0x7e6064dc0e78ffebb59b3053826a9467": "0x10781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc152666bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", + "0x1ba14d232d3c301a93e35f55e3d7aef2d98dbb9cc0ce48f457b81b421e0f704d": "0x0000c16ff28623000000000000000000", + "0x71020fee971bd00e8248d1830b8cffbe5b9cf4de1ea2911a1665c44fd70ab6f3": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630f0000c16ff286230f0000c16ff2862300", + "0x4ac2684a5a20e7a5adf17ed7aa792a3f6334a0505f02b2a44c3934d36cc4ee0a": "0xc8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e", + "0x0c5cbeca89340ea96c6f8fe1442df463": "0x0010a5d4e80000000000000000000000", + "0x1b4b2c8255b431edbbb5a4f5c7dcde69": "0x0010a5d4e80000000000000000000000", + "0x3a6772616e6470613a617574683a6c656e": "0x04000000", + "0x3a617574683a6c656e": "0x04000000", + "0xe7ea0ae62a742dc4e1a569cdb99af499": "0x0200000000000000", + "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", + "0x50a63a871aced22e88ee6466fe5aa5d9": "0x9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809", + "0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0c0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x1066bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", + "0x3a6772616e6470613a617574683a03000000": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef0100000000000000", + "0x3a617574683a01000000": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f", + "0xca0bd0e7fdd2e3998e5245f7c228191c": "0x96000000000000000000000000000000", + "0xf718f07ec955fb94f1b3069713461089": "0x0010a5d4e80000000000000000000000", + "0x99e2aba8a2b7c8ccba2d740fb86adb0c": "0x00", + "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", + "0x52c9048efbfc40fd1e312b7bed451dee": "0x06000000", + "0x2b334d6ac6698775ed17edf8cd3cbd9dae56cead0d69cb54f6af6aaecba544d8": "0x0f0000c16ff286230f0000c16ff2862300", + "0xbde3e43a2a348359d103d64bc95928146bdd9ae3490e26da38d2e4d19c137507": "0x0000a0dec5adc9353600000000000000", + "0x7c79972b34b7e51bdd5f168ba3accd35fbec396be75dfad19dd1121327f1a1ad": "0x0c000168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde7800", + "0x0e4944cfd98d6f4cc374d16f5a4e3f9c": "0x0000000000000000", + "0x3b7d32346a3315a351084927a27d06a7": "0x0010a5d4e80000000000000000000000" + } + } +} diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index b09d55c6e9b6ce732c75907cd36ef26faf0aa536..242c5078f5f39390f9e357b3154f45691e9c9b52 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -18,12 +18,12 @@ use primitives::{ed25519::Public as AuthorityId, ed25519, sr25519, Pair, crypto::UncheckedInto}; use node_primitives::AccountId; -use node_runtime::{ConsensusConfig, CouncilSeatsConfig, CouncilVotingConfig, DemocracyConfig, +use node_runtime::{ConsensusConfig, CouncilSeatsConfig, DemocracyConfig, SessionConfig, StakingConfig, StakerStatus, TimestampConfig, BalancesConfig, TreasuryConfig, SudoConfig, ContractConfig, GrandpaConfig, IndicesConfig, Permill, Perbill}; pub use node_runtime::GenesisConfig; use substrate_service; -use hex_literal::{hex, hex_impl}; +use hex_literal::hex; use substrate_telemetry::TelemetryEndpoints; const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -31,40 +31,41 @@ const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; /// Specialized `ChainSpec`. pub type ChainSpec = substrate_service::ChainSpec; -/// Emberic Elm testnet generator -pub fn emberic_elm_config() -> Result { - ChainSpec::from_embedded(include_bytes!("../res/emberic-elm.json")) +/// Flaming Fir testnet generator +pub fn flaming_fir_config() -> Result { + ChainSpec::from_embedded(include_bytes!("../res/flaming-fir.json")) } fn staging_testnet_config_genesis() -> GenesisConfig { // stash, controller, session-key // generated with secret: - // for i in 1 2 3 4 ; do for j in stash controller; do subkey inspect "$secret"/elm/$j/$i; done; done + // for i in 1 2 3 4 ; do for j in stash controller; do subkey inspect "$secret"/fir/$j/$i; done; done // and - // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 inspect "$secret"//elm//$j//$i; done; done - + // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 inspect "$secret"//fir//$j//$i; done; done let initial_authorities: Vec<(AccountId, AccountId, AuthorityId)> = vec![( - hex!["72b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c"].unchecked_into(), // 5Ef78yxqfaxVzrFCemYcSgwVtMV85ywykhLNm5WKTsZV22HZ - hex!["f0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19"].unchecked_into(), // 5HWfszmRMbzcjGmumYkkHtNJbi9y428JHgPeftVenvDgVUjh - hex!["e29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed"].unchecked_into(), // 5HBoHDLMR4jPwB6BCLyd2qfYBHytFhGs8fsa1h5PzhYd3WBq + hex!["9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12"].unchecked_into(), // 5Fbsd6WXDGiLTxunqeK5BATNiocfCqu9bS1yArVjCgeBLkVy + hex!["781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276"].unchecked_into(), // 5EnCiV7wSHeNhjW3FSUwiJNkcc2SBkPLn5Nj93FmbLtBjQUq + hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC ),( - hex!["2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e17"].unchecked_into(), // 5CqiScHtxUatcQpck1tUks51o3pSjKsdCi2CLEHvMM7tc4Qi - hex!["eacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267"].unchecked_into(), // 5HNZXnSgw21idbuegTC1J8Txkja97RPnnWkX68ewnrJDec2Z - hex!["e19b6b89729a41638e57dead9c993425287d386fa4963306b63f018732843495"].unchecked_into(), // 5HAWoPYfyYFHjacy8H2MDmHra7jVrPtBfFMPgd8CadpSqotL + hex!["68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78"].unchecked_into(), // 5ERawXCzCWkjVq3xz1W5KGNtVx2VdefvZ62Bw1FEuZW4Vny2 + hex!["c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e"].unchecked_into(), // 5Gc4vr42hH1uDZc93Nayk5G7i687bAQdHHc9unLuyeawHipF + hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE ),( - hex!["fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e"].unchecked_into(), // 5HpF9orzkmJ9ga3yrzNS9ckifxF3tbQjadEmCEiZJQ2fPgun - hex!["f06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5c"].unchecked_into(), // 5HVwyfB3LRsFXm7frEHDYyhwdpTYDRWxEqDKBYVyLi6DsPXq - hex!["1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f44"].unchecked_into(), // 5ChJ5wjqy2HY1LZw1EuQPGQEHgaS9sFu9yDD6KRX7CzwidTN + hex!["547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65"].unchecked_into(), // 5DyVtKWPidondEu8iHZgi6Ffv9yrJJ1NDNLom3X9cTDi98qp + hex!["9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526"].unchecked_into(), // 5FeD54vGVNpFX3PndHPXJ2MDakc462vBCD5mgtWRnWYCpZU9 + hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d ),( - hex!["60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743"].unchecked_into(), // 5EFByrDMMa2m9hv4jrpykXaUyqjJ9XZH81kJE4JBa1Sz2psT - hex!["2a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678"].unchecked_into(), // 5D22qQJsLm2JUh8pEfrKahbkW21QQrHTkm4vUteei67fadLd - hex!["f54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf077"].unchecked_into(), // 5HcLeWrsfL9RuGp94pn1PeFxP7D1587TTEZzFYgFhKCPZLYh + hex!["f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663"].unchecked_into(), // 5HYZnKWe5FVZQ33ZRJK1rG3WaLMztxWrrNDb1JRwaHHVWyP9 + hex!["66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f"].unchecked_into(), // 5EPQdAQ39WQNLCRjWsCk5jErsCitHiY5ZmjfWzzbXDoAoYbn + hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 )]; - // generated with secret: subkey inspect "$secret"/elm + + // generated with secret: subkey inspect "$secret"/fir let endowed_accounts: Vec = vec![ - hex!["c224ccba63292331623bbf06a55f46607824c2580071a80a17c53cab2f999e2f"].unchecked_into(), //5GTG5We6twtoF6S4kUXJ77rWBsHBoHLS3JVf5KvvnxKdGQZr + hex!["9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809"].unchecked_into(), // 5Ff3iXP75ruzroPWRP2FYBHWnmGGBSb63857BgnzCoXNxfPo ]; + const MILLICENTS: u128 = 1_000_000_000; const CENTS: u128 = 1_000 * MILLICENTS; // assume this is worth about a cent. const DOLLARS: u128 = 100 * CENTS; @@ -107,8 +108,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { }), staking: Some(StakingConfig { current_era: 0, - offline_slash: Perbill::from_billionths(1_000_000), - session_reward: Perbill::from_billionths(2_065), + offline_slash: Perbill::from_parts(1_000_000), + session_reward: Perbill::from_parts(2_065), current_session_reward: 0, validator_count: 7, sessions_per_era: 12, @@ -118,30 +119,21 @@ fn staging_testnet_config_genesis() -> GenesisConfig { stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), invulnerables: initial_authorities.iter().map(|x| x.1.clone()).collect(), }), - democracy: Some(DemocracyConfig { - launch_period: 10 * MINUTES, // 1 day per public referendum - voting_period: 10 * MINUTES, // 3 days to discuss & vote on an active referendum - minimum_deposit: 50 * DOLLARS, // 12000 as the minimum deposit for a referendum - public_delay: 10 * MINUTES, - max_lock_periods: 6, - }), + democracy: Some(DemocracyConfig::default()), council_seats: Some(CouncilSeatsConfig { active_council: vec![], candidacy_bond: 10 * DOLLARS, voter_bond: 1 * DOLLARS, + voting_fee: 2 * DOLLARS, present_slash_per_voter: 1 * CENTS, carry_count: 6, presentation_duration: 1 * DAYS, approval_voting_period: 2 * DAYS, term_duration: 28 * DAYS, desired_seats: 0, + decay_ratio: 0, inactive_grace_period: 1, // one additional vote should go by before an inactive voter can be reaped. }), - council_voting: Some(CouncilVotingConfig { - cooloff_period: 4 * DAYS, - voting_period: 1 * DAYS, - enact_delay_period: 0, - }), timestamp: Some(TimestampConfig { minimum_period: SECS_PER_BLOCK / 2, // due to the nature of aura the slots are 2*period }), @@ -152,6 +144,12 @@ fn staging_testnet_config_genesis() -> GenesisConfig { burn: Permill::from_percent(50), }), contract: Some(ContractConfig { + signed_claim_handicap: 2, + rent_byte_price: 4, + rent_deposit_offset: 1000, + storage_size_offset: 8, + surcharge_reward: 150, + tombstone_deposit: 16, transaction_base_fee: 1 * CENTS, transaction_byte_fee: 10 * MILLICENTS, transfer_fee: 1 * CENTS, @@ -238,7 +236,14 @@ pub fn testnet_genesis( const STASH: u128 = 1 << 20; const ENDOWMENT: u128 = 1 << 20; + let council_desired_seats = (endowed_accounts.len() / 2 - initial_authorities.len()) as u32; let mut contract_config = ContractConfig { + signed_claim_handicap: 2, + rent_byte_price: 4, + rent_deposit_offset: 1000, + storage_size_offset: 8, + surcharge_reward: 150, + tombstone_deposit: 16, transaction_base_fee: 1, transaction_byte_fee: 0, transfer_fee: 0, @@ -290,32 +295,23 @@ pub fn testnet_genesis( stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), invulnerables: initial_authorities.iter().map(|x| x.1.clone()).collect(), }), - democracy: Some(DemocracyConfig { - launch_period: 9, - voting_period: 18, - minimum_deposit: 10, - public_delay: 0, - max_lock_periods: 6, - }), + democracy: Some(DemocracyConfig::default()), council_seats: Some(CouncilSeatsConfig { active_council: endowed_accounts.iter() .filter(|&endowed| initial_authorities.iter().find(|&(_, controller, _)| controller == endowed).is_none()) .map(|a| (a.clone(), 1000000)).collect(), candidacy_bond: 10, voter_bond: 2, + voting_fee: 5, present_slash_per_voter: 1, carry_count: 4, presentation_duration: 10, approval_voting_period: 20, term_duration: 1000000, - desired_seats: (endowed_accounts.len() / 2 - initial_authorities.len()) as u32, + desired_seats: council_desired_seats, + decay_ratio: council_desired_seats / 3, inactive_grace_period: 1, }), - council_voting: Some(CouncilVotingConfig { - cooloff_period: 75, - voting_period: 20, - enact_delay_period: 0, - }), timestamp: Some(TimestampConfig { minimum_period: 2, // 2*2=4 second block time. }), @@ -369,7 +365,7 @@ pub fn local_testnet_config() -> ChainSpec { } #[cfg(test)] -mod tests { +pub(crate) mod tests { use super::*; use service_test; use crate::service::Factory; @@ -380,13 +376,41 @@ mod tests { genesis } + fn local_testnet_genesis_instant_single() -> GenesisConfig { + let mut genesis = testnet_genesis( + vec![ + get_authority_keys_from_seed("Alice"), + ], + get_account_id_from_seed("Alice"), + None, + false, + ); + genesis.timestamp = Some(TimestampConfig { minimum_period: 1 }); + genesis + } + + /// Local testnet config (single validator - Alice) + pub fn integration_test_config_with_single_authority() -> ChainSpec { + ChainSpec::from_genesis( + "Integration Test", + "test", + local_testnet_genesis_instant_single, + vec![], + None, + None, + None, + None, + ) + } + /// Local testnet config (multivalidator Alice + Bob) - pub fn integration_test_config() -> ChainSpec { + pub fn integration_test_config_with_two_authorities() -> ChainSpec { ChainSpec::from_genesis("Integration Test", "test", local_testnet_genesis_instant, vec![], None, None, None, None) } #[test] + #[ignore] fn test_connectivity() { - service_test::connectivity::(integration_test_config()); + service_test::connectivity::(integration_test_config_with_two_authorities()); } } diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs new file mode 100644 index 0000000000000000000000000000000000000000..a2ac6f5b2917eb7aca502216941a3f63cab945fc --- /dev/null +++ b/node/cli/src/factory_impl.rs @@ -0,0 +1,259 @@ +// Copyright 2019 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 . + +//! Implementation of the transaction factory trait, which enables +//! using the cli to manufacture transactions and distribute them +//! to accounts. + +use rand::{Rng, SeedableRng}; +use rand::rngs::StdRng; + +use parity_codec::Decode; +use keyring::sr25519::Keyring; +use node_primitives::Hash; +use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, BalancesCall}; +use primitives::sr25519; +use primitives::crypto::Pair; +use parity_codec::Encode; +use sr_primitives::generic::Era; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT}; +use substrate_service::ServiceFactory; +use transaction_factory::RuntimeAdapter; +use transaction_factory::modes::Mode; +use crate::service; +use inherents::InherentData; +use timestamp; +use finality_tracker; + +// TODO get via api: >::minimum_period(). See #2587. +const MINIMUM_PERIOD: u64 = 99; + +pub struct FactoryState { + block_no: N, + + mode: Mode, + start_number: u64, + rounds: u64, + round: u64, + block_in_round: u64, + num: u64, +} + +type Number = <::Header as HeaderT>::Number; + +impl RuntimeAdapter for FactoryState { + type AccountId = node_primitives::AccountId; + type Balance = node_primitives::Balance; + type Block = node_primitives::Block; + type Phase = sr_primitives::generic::Phase; + type Secret = sr25519::Pair; + type Index = node_primitives::Index; + + type Number = Number; + + fn new( + mode: Mode, + num: u64, + rounds: u64, + ) -> FactoryState { + FactoryState { + mode, + num: num, + round: 0, + rounds, + block_in_round: 0, + block_no: 0, + start_number: 0, + } + } + + fn block_no(&self) -> Self::Number { + self.block_no + } + + fn block_in_round(&self) -> Self::Number { + self.block_in_round + } + + fn rounds(&self) -> Self::Number { + self.rounds + } + + fn num(&self) -> Self::Number { + self.num + } + + fn round(&self) -> Self::Number { + self.round + } + + fn start_number(&self) -> Self::Number { + self.start_number + } + + fn mode(&self) -> &Mode { + &self.mode + } + + fn set_block_no(&mut self, val: Self::Number) { + self.block_no = val; + } + + fn set_block_in_round(&mut self, val: Self::Number) { + self.block_in_round = val; + } + + fn set_round(&mut self, val: Self::Number) { + self.round = val; + } + + fn transfer_extrinsic( + &self, + sender: &Self::AccountId, + key: &Self::Secret, + destination: &Self::AccountId, + amount: &Self::Number, + prior_block_hash: &::Hash, + ) -> ::Extrinsic { + let index = self.extract_index(&sender, prior_block_hash); + let phase = self.extract_phase(*prior_block_hash); + + sign::(CheckedExtrinsic { + signed: Some((sender.clone(), index)), + function: Call::Balances( + BalancesCall::transfer( + indices::address::Address::Id( + destination.clone().into() + ), + (*amount).into() + ) + ) + }, key, &prior_block_hash, phase) + } + + fn inherent_extrinsics(&self) -> InherentData { + let timestamp = self.block_no * MINIMUM_PERIOD; + + let mut inherent = InherentData::new(); + inherent.put_data(timestamp::INHERENT_IDENTIFIER, ×tamp) + .expect("Failed putting timestamp inherent"); + inherent.put_data(finality_tracker::INHERENT_IDENTIFIER, &self.block_no) + .expect("Failed putting finalized number inherent"); + inherent + } + + fn minimum_balance() -> Self::Number { + // TODO get correct amount via api. See #2587. + 1337 + } + + fn master_account_id() -> Self::AccountId { + Keyring::Alice.pair().public() + } + + fn master_account_secret() -> Self::Secret { + Keyring::Alice.pair() + } + + /// Generates a random `AccountId` from `seed`. + fn gen_random_account_id(seed: &Self::Number) -> Self::AccountId { + let pair: sr25519::Pair = sr25519::Pair::from_seed(gen_seed_bytes(*seed)); + pair.public().into() + } + + /// Generates a random `Secret` from `seed`. + fn gen_random_account_secret(seed: &Self::Number) -> Self::Secret { + let pair: sr25519::Pair = sr25519::Pair::from_seed(gen_seed_bytes(*seed)); + pair + } + + fn extract_index( + &self, + _account_id: &Self::AccountId, + _block_hash: &::Hash, + ) -> Self::Index { + // TODO get correct index for account via api. See #2587. + // This currently prevents the factory from being used + // without a preceding purge of the database. + if self.mode == Mode::MasterToN || self.mode == Mode::MasterTo1 { + self.block_no() + } else { + match self.round() { + 0 => + // if round is 0 all transactions will be done with master as a sender + self.block_no(), + _ => + // if round is e.g. 1 every sender account will be new and not yet have + // any transactions done + 0 + } + } + } + + fn extract_phase( + &self, + _block_hash: ::Hash + ) -> Self::Phase { + // TODO get correct phase via api. See #2587. + // This currently prevents the factory from being used + // without a preceding purge of the database. + self.block_no + } +} + +fn gen_seed_bytes(seed: u64) -> [u8; 32] { + let mut rng: StdRng = SeedableRng::seed_from_u64(seed); + + let mut seed_bytes = [0u8; 32]; + for i in 0..32 { + seed_bytes[i] = rng.gen::(); + } + seed_bytes +} + +/// Creates an `UncheckedExtrinsic` containing the appropriate signature for +/// a `CheckedExtrinsics`. +fn sign( + xt: CheckedExtrinsic, + key: &sr25519::Pair, + prior_block_hash: &Hash, + phase: u64, +) -> ::Extrinsic { + let s = match xt.signed { + Some((signed, index)) => { + let era = Era::mortal(256, phase); + let payload = (index.into(), xt.function, era, prior_block_hash); + let signature = payload.using_encoded(|b| { + if b.len() > 256 { + key.sign(&sr_io::blake2_256(b)) + } else { + key.sign(b) + } + }).into(); + UncheckedExtrinsic { + signature: Some((indices::address::Address::Id(signed), signature, payload.0, era)), + function: payload.1, + } + } + None => UncheckedExtrinsic { + signature: None, + function: xt.function, + }, + }; + + let e = Encode::encode(&s); + Decode::decode(&mut &e[..]).expect("Failed to decode signed unchecked extrinsic") +} diff --git a/node/cli/src/lib.rs b/node/cli/src/lib.rs index f0c28133c2da2d1b19409a7303f5123c8e4bf0a1..ab1fd03ae7b24eb7afc4a4ba44a710f143bc09c9 100644 --- a/node/cli/src/lib.rs +++ b/node/cli/src/lib.rs @@ -22,32 +22,99 @@ pub use cli::error; pub mod chain_spec; mod service; +mod factory_impl; use tokio::prelude::Future; use tokio::runtime::{Builder as RuntimeBuilder, Runtime}; -pub use cli::{VersionInfo, IntoExit, NoCustom}; +pub use cli::{VersionInfo, IntoExit, NoCustom, SharedParams}; use substrate_service::{ServiceFactory, Roles as ServiceRoles}; use std::ops::Deref; use log::info; +use structopt::{StructOpt, clap::App}; +use cli::{AugmentClap, GetLogFilter}; +use crate::factory_impl::FactoryState; +use transaction_factory::RuntimeAdapter; /// The chain specification option. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub enum ChainSpec { /// Whatever the current runtime is, with just Alice as an auth. Development, /// Whatever the current runtime is, with simple Alice/Bob auths. LocalTestnet, - /// The Emberic Elm testnet. - EmbericElm, + /// The Flaming Fir testnet. + FlamingFir, /// Whatever the current runtime is with the "global testnet" defaults. StagingTestnet, } +/// Custom subcommands. +#[derive(Clone, Debug, StructOpt)] +pub enum CustomSubcommands { + /// The custom factory subcommmand for manufacturing transactions. + #[structopt( + name = "factory", + about = "Manufactures num transactions from Alice to random accounts. \ + Only supported for development or local testnet." + )] + Factory(FactoryCmd), +} + +impl GetLogFilter for CustomSubcommands { + fn get_log_filter(&self) -> Option { + None + } +} + +/// The `factory` command used to generate transactions. +/// Please note: this command currently only works on an empty database! +#[derive(Debug, StructOpt, Clone)] +pub struct FactoryCmd { + /// How often to repeat. This option only has an effect in mode `MasterToNToM`. + #[structopt(long="rounds", default_value = "1")] + pub rounds: u64, + + /// MasterToN: Manufacture `num` transactions from the master account + /// to `num` randomly created accounts, one each. + /// + /// MasterTo1: Manufacture `num` transactions from the master account + /// to exactly one other randomly created account. + /// + /// MasterToNToM: Manufacture `num` transactions from the master account + /// to `num` randomly created accounts. + /// From each of these randomly created accounts manufacture + /// a transaction to another randomly created account. + /// Repeat this `rounds` times. If `rounds` = 1 the behavior + /// is the same as `MasterToN`.{n} + /// A -> B, A -> C, A -> D, ... x `num`{n} + /// B -> E, C -> F, D -> G, ...{n} + /// ... x `rounds` + /// + /// These three modes control manufacturing. + #[structopt(long="mode", default_value = "MasterToN")] + pub mode: transaction_factory::Mode, + + /// Number of transactions to generate. In mode `MasterNToNToM` this is + /// the number of transactions per round. + #[structopt(long="num", default_value = "8")] + pub num: u64, + + #[allow(missing_docs)] + #[structopt(flatten)] + pub shared_params: SharedParams, +} + +impl AugmentClap for FactoryCmd { + fn augment_clap<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { + FactoryCmd::augment_clap(app) + } +} + /// Get a chain config from a spec setting. impl ChainSpec { pub(crate) fn load(self) -> Result { Ok(match self { - ChainSpec::EmbericElm => chain_spec::emberic_elm_config()?, + ChainSpec::FlamingFir => chain_spec::flaming_fir_config()?, ChainSpec::Development => chain_spec::development_config(), ChainSpec::LocalTestnet => chain_spec::local_testnet_config(), ChainSpec::StagingTestnet => chain_spec::staging_testnet_config(), @@ -58,7 +125,7 @@ impl ChainSpec { match s { "dev" => Some(ChainSpec::Development), "local" => Some(ChainSpec::LocalTestnet), - "" | "elm" | "emberic-elm" => Some(ChainSpec::EmbericElm), + "" | "fir" | "flaming-fir" => Some(ChainSpec::FlamingFir), "staging" => Some(ChainSpec::StagingTestnet), _ => None, } @@ -78,9 +145,9 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul T: Into + Clone, E: IntoExit, { - cli::parse_and_execute::( + let ret = cli::parse_and_execute::( load_spec, &version, "substrate-node", args, exit, - |exit, _custom_args, config| { + |exit, _cli_args, _custom_args, config| { info!("{}", version.name); info!(" version {}", config.full_version()); info!(" by Parity Technologies, 2017-2019"); @@ -103,7 +170,35 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul ), }.map_err(|e| format!("{:?}", e)) } - ).map_err(Into::into).map(|_| ()) + ); + + match &ret { + Ok(Some(CustomSubcommands::Factory(cli_args))) => { + let config = cli::create_config_with_db_path::( + load_spec, + &cli_args.shared_params, + &version, + )?; + + match ChainSpec::from(config.chain_spec.id()) { + Some(ref c) if c == &ChainSpec::Development || c == &ChainSpec::LocalTestnet => {}, + _ => panic!("Factory is only supported for development and local testnet."), + } + + let factory_state = FactoryState::new( + cli_args.mode.clone(), + cli_args.num, + cli_args.rounds, + ); + transaction_factory::factory::>( + factory_state, + config, + ).map_err(|e| format!("Error in transaction factory: {}", e))?; + + Ok(()) + }, + _ => ret.map_err(Into::into).map(|_| ()) + } } fn run_until_exit( @@ -118,8 +213,8 @@ fn run_until_exit( { let (exit_send, exit) = exit_future::signal(); - let executor = runtime.executor(); - cli::informant::start(&service, exit.clone(), executor.clone()); + let informant = cli::informant::build(&service); + runtime.executor().spawn(exit.until(informant).map(|_| ())); let _ = runtime.block_on(e.into_exit()); exit_send.fire(); diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 96a531a4ef7f18faa40f196e81586239892e12a8..1458392b0f5fe1af914bfcda71742fcf5ab1b225 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -21,16 +21,18 @@ use std::sync::Arc; use std::time::Duration; -use client; +use client::{self, LongestChain}; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; -use grandpa; +use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use node_executor; use primitives::{Pair as PairT, ed25519}; +use futures::prelude::*; use node_primitives::Block; use node_runtime::{GenesisConfig, RuntimeApi}; use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, FullClient, LightClient, LightBackend, FullExecutor, LightExecutor, TaskExecutor, + error::{Error as ServiceError}, }; use transaction_pool::{self, txpool::{Pool as TransactionPool}}; use inherents::InherentDataProviders; @@ -86,21 +88,23 @@ construct_service_factory! { let proposer = Arc::new(substrate_basic_authorship::ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - inherents_pool: service.inherents_pool(), }); let client = service.client(); - executor.spawn(start_aura( + let select_chain = service.select_chain() + .ok_or(ServiceError::SelectChainRequired)?; + let aura = start_aura( SlotDuration::get_or_compute(&*client)?, key.clone(), client, + select_chain, block_import.clone(), proposer, service.network(), - service.on_exit(), service.config.custom.inherent_data_providers.clone(), service.config.force_authoring, - )?); + )?; + executor.spawn(aura.select(service.on_exit()).then(|_| Ok(()))); info!("Running Grandpa session as Authority {}", key.public()); } @@ -130,17 +134,17 @@ construct_service_factory! { }, Some(_) => { let telemetry_on_connect = TelemetryOnConnect { - on_exit: Box::new(service.on_exit()), - telemetry_connection_sinks: service.telemetry_on_connect_stream(), - executor: &executor, + on_exit: Box::new(service.on_exit()), + telemetry_connection_sinks: service.telemetry_on_connect_stream(), + executor: &executor, }; let grandpa_config = grandpa::GrandpaParams { - config: config, - link: link_half, - network: service.network(), - inherent_data_providers: service.config.custom.inherent_data_providers.clone(), - on_exit: service.on_exit(), - telemetry_on_connect: Some(telemetry_on_connect), + config: config, + link: link_half, + network: service.network(), + inherent_data_providers: service.config.custom.inherent_data_providers.clone(), + on_exit: service.on_exit(), + telemetry_on_connect: Some(telemetry_on_connect), }; executor.spawn(grandpa::run_grandpa_voter(grandpa_config)?); }, @@ -152,11 +156,11 @@ construct_service_factory! { LightService = LightComponents { |config, executor| >::new(config, executor) }, FullImportQueue = AuraImportQueue - { |config: &mut FactoryFullConfiguration , client: Arc>| { + { |config: &mut FactoryFullConfiguration , client: Arc>, select_chain: Self::SelectChain| { let slot_duration = SlotDuration::get_or_compute(&*client)?; let (block_import, link_half) = - grandpa::block_import::<_, _, _, RuntimeApi, FullClient>( - client.clone(), client.clone() + grandpa::block_import::<_, _, _, RuntimeApi, FullClient, _>( + client.clone(), client.clone(), select_chain )?; let block_import = Arc::new(block_import); let justification_import = block_import.clone(); @@ -167,6 +171,8 @@ construct_service_factory! { slot_duration, block_import, Some(justification_import), + None, + None, client, NothingExtra, config.custom.inherent_data_providers.clone(), @@ -174,22 +180,61 @@ construct_service_factory! { }}, LightImportQueue = AuraImportQueue { |config: &FactoryFullConfiguration, client: Arc>| { + #[allow(deprecated)] + let fetch_checker = client.backend().blockchain().fetcher() + .upgrade() + .map(|fetcher| fetcher.checker().clone()) + .ok_or_else(|| "Trying to start light import queue without active fetch checker")?; + let block_import = grandpa::light_block_import::<_, _, _, RuntimeApi, LightClient>( + client.clone(), Arc::new(fetch_checker), client.clone() + )?; + let block_import = Arc::new(block_import); + let finality_proof_import = block_import.clone(); + let finality_proof_request_builder = finality_proof_import.create_finality_proof_request_builder(); + import_queue::<_, _, _, ed25519::Pair>( SlotDuration::get_or_compute(&*client)?, - client.clone(), + block_import, None, + Some(finality_proof_import), + Some(finality_proof_request_builder), client, NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) + }}, + SelectChain = LongestChain, Self::Block> + { |config: &FactoryFullConfiguration, client: Arc>| { + #[allow(deprecated)] + Ok(LongestChain::new(client.backend().clone())) } }, + FinalityProofProvider = { |client: Arc>| { + Ok(Some(Arc::new(GrandpaFinalityProofProvider::new(client.clone(), client)) as _)) + }}, } } #[cfg(test)] mod tests { + use std::sync::Arc; + use consensus::CompatibleDigestItem; + use consensus_common::{Environment, Proposer, ImportBlock, BlockOrigin, ForkChoiceStrategy}; + use node_primitives::DigestItem; + use node_runtime::{Call, BalancesCall, UncheckedExtrinsic}; + use parity_codec::{Compact, Encode, Decode}; + use primitives::{ + crypto::Pair as CryptoPair, ed25519::Pair, blake2_256, + sr25519::Public as AddressPublic, + }; + use sr_primitives::{generic::{BlockId, Era, Digest}, traits::{Block, Digest as DigestT}, OpaqueExtrinsic}; + use timestamp; + use finality_tracker; + use keyring::{ed25519::Keyring as AuthorityKeyring, sr25519::Keyring as AccountKeyring}; + use substrate_service::ServiceFactory; + use crate::service::Factory; + #[cfg(feature = "rhd")] fn test_sync() { use {service_test, Factory}; @@ -201,7 +246,7 @@ mod tests { let keys: Vec<&ed25519::Pair> = vec![&*alice, &*bob]; let dummy_runtime = ::tokio::runtime::Runtime::new().unwrap(); let block_factory = |service: &::FullService| { - let block_id = BlockId::number(service.client().info().unwrap().chain.best_number); + let block_id = BlockId::number(service.client().info().chain.best_number); let parent_header = service.client().header(&block_id).unwrap().unwrap(); let consensus_net = ConsensusNetwork::new(service.network(), service.client().clone()); let proposer_factory = consensus::ProposerFactory { @@ -237,4 +282,107 @@ mod tests { service_test::sync::(chain_spec::integration_test_config(), block_factory, extrinsic_factory); } + #[test] + #[ignore] + fn test_sync() { + let chain_spec = crate::chain_spec::tests::integration_test_config_with_single_authority(); + + let alice = Arc::new(AuthorityKeyring::Alice.pair()); + let mut slot_num = 1u64; + let block_factory = |service: &::FullService| { + let mut inherent_data = service.config.custom.inherent_data_providers + .create_inherent_data().unwrap(); + inherent_data.replace_data(finality_tracker::INHERENT_IDENTIFIER, &1u64); + inherent_data.replace_data(timestamp::INHERENT_IDENTIFIER, &(slot_num * 10)); + + let parent_id = BlockId::number(service.client().info().chain.best_number); + let parent_header = service.client().header(&parent_id).unwrap().unwrap(); + let proposer_factory = Arc::new(substrate_basic_authorship::ProposerFactory { + client: service.client(), + transaction_pool: service.transaction_pool(), + }); + let mut digest = Digest::::default(); + digest.push(>::aura_pre_digest(slot_num * 10 / 2)); + let proposer = proposer_factory.init(&parent_header, &[]).unwrap(); + let new_block = proposer.propose( + inherent_data, + digest, + ::std::time::Duration::from_secs(1), + ).expect("Error making test block"); + + let (new_header, new_body) = new_block.deconstruct(); + let pre_hash = new_header.hash(); + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let to_sign = pre_hash.encode(); + let signature = alice.sign(&to_sign[..]); + let item = >::aura_seal( + signature, + ); + slot_num += 1; + + ImportBlock { + origin: BlockOrigin::File, + header: new_header, + justification: None, + post_digests: vec![item], + body: Some(new_body), + finalized: true, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + } + }; + + let bob = Arc::new(AccountKeyring::Bob.pair()); + let charlie = Arc::new(AccountKeyring::Charlie.pair()); + + let mut index = 0; + let extrinsic_factory = |service: &::FullService| { + let amount = 1000; + let to = AddressPublic::from_raw(bob.public().0); + let from = AddressPublic::from_raw(charlie.public().0); + let genesis_hash = service.client().block_hash(0).unwrap().unwrap(); + let signer = charlie.clone(); + + let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); + let era = Era::immortal(); + let raw_payload = (Compact(index), function, era, genesis_hash); + let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { + signer.sign(&blake2_256(payload)[..]) + } else { + signer.sign(payload) + }); + let xt = UncheckedExtrinsic::new_signed( + index, + raw_payload.1, + from.into(), + signature.into(), + era, + ).encode(); + let v: Vec = Decode::decode(&mut xt.as_slice()).unwrap(); + + index += 1; + OpaqueExtrinsic(v) + }; + + service_test::sync::( + chain_spec, + block_factory, + extrinsic_factory, + ); + } + + #[test] + #[ignore] + fn test_consensus() { + use super::Factory; + + service_test::consensus::( + crate::chain_spec::tests::integration_test_config_with_two_authorities(), + vec![ + "//Alice".into(), + "//Bob".into(), + ], + ) + } } diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index 72d1407d425528c8d9a8a3dcaf467c5dd63f8946..89b448ec90141481644a2dd7faa7df59031e0567 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-executor" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." edition = "2018" diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index d1a8e0cda35839791e2bdf893a5b1b5c6246e955..05dc424d496b2fc8c908e84823352c3adb1b3d2e 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -33,18 +33,18 @@ mod tests { use parity_codec::{Encode, Decode, Joiner}; use keyring::{AuthorityKeyring, AccountKeyring}; use runtime_support::{Hashable, StorageValue, StorageMap, traits::Currency}; - use state_machine::{CodeExecutor, Externalities, TestExternalities}; + use state_machine::{CodeExecutor, Externalities, TestExternalities as CoreTestExternalities}; use primitives::{twox_128, blake2_256, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, NativeOrEncoded}; use node_primitives::{Hash, BlockNumber, AccountId}; - use runtime_primitives::traits::{Header as HeaderT, Hash as HashT}; - use runtime_primitives::{generic, generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; + use runtime_primitives::traits::{Header as HeaderT, Hash as HashT, Digest, DigestItem}; + use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; use {balances, indices, session, system, staking, consensus, timestamp, treasury, contract}; use contract::ContractAddressFor; use system::{EventRecord, Phase}; use node_runtime::{Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, BuildStorage, GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, System, - SystemConfig, GrandpaConfig, IndicesConfig, Event, Log}; + SystemConfig, GrandpaConfig, IndicesConfig, Event}; use wabt; use primitives::map; @@ -52,6 +52,8 @@ mod tests { const COMPACT_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm"); const GENESIS_HASH: [u8; 32] = [69u8; 32]; + type TestExternalities = CoreTestExternalities; + fn alice() -> AccountId { AccountKeyring::Alice.into() } @@ -258,7 +260,7 @@ mod tests { fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { let three = AccountId::from_raw([3u8; 32]); - TestExternalities::new_with_code(code, GenesisConfig { + let mut ext = TestExternalities::new_with_code(code, GenesisConfig { consensus: Some(Default::default()), system: Some(SystemConfig { changes_trie_config: if support_changes_trie { Some(ChangesTrieConfiguration { @@ -314,7 +316,6 @@ mod tests { }), democracy: Some(Default::default()), council_seats: Some(Default::default()), - council_voting: Some(Default::default()), timestamp: Some(Default::default()), treasury: Some(Default::default()), contract: Some(Default::default()), @@ -322,7 +323,9 @@ mod tests { grandpa: Some(GrandpaConfig { authorities: vec![], }), - }.build_storage().unwrap().0) + }.build_storage().unwrap().0); + ext.changes_trie_storage().insert(0, GENESIS_HASH.into(), Default::default()); + ext } fn construct_block( @@ -442,8 +445,10 @@ mod tests { ] ); - let digest = generic::Digest::::default(); - assert_eq!(Header::decode(&mut &block2.0[..]).unwrap().digest, digest); + // session change => consensus authorities change => authorities change digest item appears + let digest = Header::decode(&mut &block2.0[..]).unwrap().digest; + assert_eq!(digest.logs().len(), 1); + assert!(digest.logs()[0].as_authorities_change().is_some()); (block1, block2) } @@ -488,7 +493,8 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), @@ -497,23 +503,28 @@ mod tests { bob().into(), 69, 0 - )) + )), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Spending(0)) + event: Event::treasury(treasury::RawEvent::Spending(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Burnt(0)) + event: Event::treasury(treasury::RawEvent::Burnt(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Rollover(0)) + event: Event::treasury(treasury::RawEvent::Rollover(0)), + topics: vec![], }, ]); }); @@ -535,7 +546,8 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), @@ -546,11 +558,13 @@ mod tests { 5, 0 ) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(2), @@ -561,27 +575,33 @@ mod tests { 15, 0 ) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(2), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::session(session::RawEvent::NewSession(1)) + event: Event::treasury(treasury::RawEvent::Spending(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Spending(0)) + event: Event::treasury(treasury::RawEvent::Burnt(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Burnt(0)) + event: Event::treasury(treasury::RawEvent::Rollover(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Rollover(0)) + event: Event::session(session::RawEvent::NewSession(1)), + topics: vec![], }, ]); }); @@ -745,7 +765,13 @@ mod tests { runtime_io::with_externalities(&mut t, || { // Verify that the contract constructor worked well and code of TRANSFER contract is actually deployed. - assert_eq!(&contract::CodeHashOf::::get(addr).unwrap(), &transfer_ch); + assert_eq!( + &contract::ContractInfoOf::::get(addr) + .and_then(|c| c.get_alive()) + .unwrap() + .code_hash, + &transfer_ch + ); }); } @@ -856,7 +882,7 @@ mod tests { None, ).0.unwrap(); - assert!(t.storage_changes_root(Default::default(), 0).is_some()); + assert!(t.storage_changes_root(GENESIS_HASH.into()).unwrap().is_some()); } #[test] @@ -866,7 +892,7 @@ mod tests { let mut t = new_test_ext(COMPACT_CODE, true); WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); - assert!(t.storage_changes_root(Default::default(), 0).is_some()); + assert!(t.storage_changes_root(GENESIS_HASH.into()).unwrap().is_some()); } #[cfg(feature = "benchmarks")] diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index 1141a2455ec5eba7623f58ab80cebaa7b666fb38..db40d91346ec10b344d7083800598f99bf6742a0 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index d5f8cc3d96e6c8888be04b20053072811a88c67c..2135ad672ff87725349e216fe553be1df96edd21 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -19,7 +19,6 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] use runtime_primitives::{ generic, traits::{Verify, BlakeTwo256}, OpaqueExtrinsic, AnySignature @@ -58,9 +57,10 @@ pub type Hash = primitives::H256; /// A timestamp: seconds since the unix epoch. pub type Timestamp = u64; +/// Digest item type. +pub type DigestItem = generic::DigestItem; /// Header type. -/// -pub type Header = generic::Header>; +pub type Header = generic::Header; /// Block type. pub type Block = generic::Block; /// Block ID. diff --git a/node/rpc-client/Cargo.toml b/node/rpc-client/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..ea255808e463e47d2f6c0d3bdf15044b0b827815 --- /dev/null +++ b/node/rpc-client/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "node-rpc-client" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +env_logger = "0.6" +futures = "0.1.26" +hyper = "0.12" +jsonrpc-core-client = { version = "12.0.0", features = ["http", "ws"] } +log = "0.4" +node-primitives = { path = "../primitives" } +substrate-rpc = { path = "../../core/rpc", version = "2.0.0" } diff --git a/node/rpc-client/src/main.rs b/node/rpc-client/src/main.rs new file mode 100644 index 0000000000000000000000000000000000000000..fe057bcbeaf4236661d5109513138a93a7e894f7 --- /dev/null +++ b/node/rpc-client/src/main.rs @@ -0,0 +1,70 @@ +// Copyright 2019 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 . + +#![warn(missing_docs)] + +//! Example substrate RPC client code. +//! +//! This module shows how you can write a Rust RPC client that connects to a running +//! substrate node and use staticly typed RPC wrappers. + +use futures::Future; +use hyper::rt; +use node_primitives::Hash; +use substrate_rpc::author::{ + AuthorClient, + hash::ExtrinsicOrHash, +}; +use jsonrpc_core_client::{ + transports::http, + RpcError, +}; + +fn main() { + env_logger::init(); + + rt::run(rt::lazy(|| { + let uri = "http://localhost:9933"; + + http::connect(uri) + .and_then(|client: AuthorClient| { + remove_all_extrinsics(client) + }) + .map_err(|e| { + println!("Error: {:?}", e); + }) + })) +} + +/// Remove all pending extrinsics from the node. +/// +/// The example code takes `AuthorClient` and first: +/// 1. Calls the `pending_extrinsics` method to get all extrinsics in the pool. +/// 2. Then calls `remove_extrinsic` passing the obtained raw extrinsics. +/// +/// As the resul of running the code the entire content of the transaction pool is going +/// to be removed and the extrinsics are going to be temporarily banned. +fn remove_all_extrinsics(client: AuthorClient) -> impl Future { + client.pending_extrinsics() + .and_then(move |pending| { + client.remove_extrinsic( + pending.into_iter().map(|tx| ExtrinsicOrHash::Extrinsic(tx.into())).collect() + ) + }) + .map(|removed| { + println!("Removed extrinsics: {:?}", removed); + }) +} diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index f8e0e047bc9b89b2d14bb4f255b75212610f9c23..486a5b80a01bfc5095cae70366d0daf7f1518545 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-runtime" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -34,7 +34,6 @@ sudo = { package = "srml-sudo", path = "../../srml/sudo", default-features = fal node-primitives = { path = "../primitives", default-features = false } consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives", default-features = false } rustc-hex = { version = "2.0", optional = true } -hex-literal = { version = "0.1.0", optional = true } serde = { version = "1.0", optional = true } substrate-keyring = { path = "../../core/keyring", optional = true } consensus_authorities = { package = "substrate-consensus-authorities", path = "../../core/consensus/authorities", default-features = false } @@ -73,7 +72,6 @@ std = [ "client/std", "consensus_aura/std", "rustc-hex", - "hex-literal", "substrate-keyring", "offchain-primitives/std", "consensus_authorities/std", diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 340220160ecbb1d03e50026b0832bcbd583e8935..427ee8d1fca78922a92b2cdeb76afdf23bba84c8 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -21,8 +21,8 @@ #![recursion_limit="256"] use rstd::prelude::*; -use support::construct_runtime; -use substrate_primitives::u32_trait::{_2, _4}; +use support::{construct_runtime, parameter_types}; +use substrate_primitives::u32_trait::{_1, _2, _3, _4}; use node_primitives::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, AuthorityId, Signature, AuthoritySignature }; @@ -34,11 +34,10 @@ use client::{ use runtime_primitives::{ApplyResult, generic, create_runtime_str}; use runtime_primitives::transaction_validity::TransactionValidity; use runtime_primitives::traits::{ - BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, CurrencyToVoteHandler, - AuthorityIdFor, + BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, AuthorityIdFor, Convert, }; use version::RuntimeVersion; -use council::{motions as council_motions, voting as council_voting}; +use council::{motions as council_motions}; #[cfg(feature = "std")] use council::seats as council_seats; #[cfg(any(feature = "std", test))] @@ -59,8 +58,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 65, - impl_version: 65, + spec_version: 92, + impl_version: 93, apis: RUNTIME_API_VERSIONS, }; @@ -73,6 +72,20 @@ pub fn native_version() -> NativeVersion { } } +pub struct CurrencyToVoteHandler; + +impl CurrencyToVoteHandler { + fn factor() -> u128 { (Balances::total_issuance() / u64::max_value() as u128).max(1) } +} + +impl Convert for CurrencyToVoteHandler { + fn convert(x: u128) -> u64 { (x / Self::factor()) as u64 } +} + +impl Convert for CurrencyToVoteHandler { + fn convert(x: u128) -> u128 { x * Self::factor() } +} + impl system::Trait for Runtime { type Origin = Origin; type Index = Index; @@ -137,21 +150,43 @@ impl staking::Trait for Runtime { type Reward = (); } +const MINUTES: BlockNumber = 6; +const BUCKS: Balance = 1_000_000_000_000; + +parameter_types! { + pub const LaunchPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; + pub const VotingPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; + pub const EmergencyVotingPeriod: BlockNumber = 3 * 24 * 60 * MINUTES; + pub const MinimumDeposit: Balance = 100 * BUCKS; + pub const EnactmentPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; + pub const CooloffPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; +} impl democracy::Trait for Runtime { - type Currency = Balances; type Proposal = Call; type Event = Event; + type Currency = Balances; + type EnactmentPeriod = EnactmentPeriod; + type LaunchPeriod = LaunchPeriod; + type VotingPeriod = VotingPeriod; + type EmergencyVotingPeriod = EmergencyVotingPeriod; + type MinimumDeposit = MinimumDeposit; + type ExternalOrigin = council_motions::EnsureProportionAtLeast<_1, _2, AccountId>; + type ExternalMajorityOrigin = council_motions::EnsureProportionAtLeast<_2, _3, AccountId>; + type EmergencyOrigin = council_motions::EnsureProportionAtLeast<_1, _1, AccountId>; + type CancellationOrigin = council_motions::EnsureProportionAtLeast<_2, _3, AccountId>; + type VetoOrigin = council_motions::EnsureMember; + type CooloffPeriod = CooloffPeriod; } impl council::Trait for Runtime { type Event = Event; type BadPresentation = (); type BadReaper = (); + type BadVoterIndex = (); + type LoserCandidate = (); + type OnMembersChanged = CouncilMotions; } -impl council::voting::Trait for Runtime { - type Event = Event; -} impl council::motions::Trait for Runtime { type Origin = Origin; @@ -161,8 +196,8 @@ impl council::motions::Trait for Runtime { impl treasury::Trait for Runtime { type Currency = Balances; - type ApproveOrigin = council_motions::EnsureMembers<_4>; - type RejectOrigin = council_motions::EnsureMembers<_2>; + type ApproveOrigin = council_motions::EnsureMembers<_4, AccountId>; + type RejectOrigin = council_motions::EnsureMembers<_2, AccountId>; type Event = Event; type MintedForSpending = (); type ProposalRejection = (); @@ -201,7 +236,7 @@ construct_runtime!( UncheckedExtrinsic = UncheckedExtrinsic { System: system::{default, Log(ChangesTrieRoot)}, - Aura: aura::{Module, Inherent(Timestamp)}, + Aura: aura::{Module, Inherent(Timestamp), Log(PreRuntime)}, Timestamp: timestamp::{Module, Call, Storage, Config, Inherent}, Consensus: consensus::{Module, Call, Storage, Config, Log(AuthoritiesChange), Inherent}, Indices: indices, @@ -210,8 +245,7 @@ construct_runtime!( Staking: staking::{default, OfflineWorker}, Democracy: democracy, Council: council::{Module, Call, Storage, Event}, - CouncilVoting: council_voting, - CouncilMotions: council_motions::{Module, Call, Storage, Event, Origin}, + CouncilMotions: council_motions::{Module, Call, Storage, Event, Origin}, CouncilSeats: council_seats::{Config}, FinalityTracker: finality_tracker::{Module, Call, Inherent}, Grandpa: grandpa::{Module, Call, Storage, Config, Log(), Event}, @@ -236,7 +270,7 @@ pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Balances, AllModules>; +pub type Executive = executive::Executive, Balances, Runtime, AllModules>; impl_runtime_apis! { impl client_api::Core for Runtime { @@ -251,10 +285,6 @@ impl_runtime_apis! { fn initialize_block(header: &::Header) { Executive::initialize_block(header) } - - fn authorities() -> Vec> { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl client_api::Metadata for Runtime { diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index b14c919bb3d056f14b30d405fb164ef2298038f2..050cbdcb7e73cf3798c7b819a8ed7e513242042d 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -1,5 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aes-ctr" version = "0.3.0" @@ -33,7 +38,7 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.10" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -44,12 +49,12 @@ name = "aio-limited" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -79,7 +84,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -87,27 +92,26 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.14" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -115,19 +119,22 @@ name = "backtrace-sys" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "base-x" -version = "0.2.4" +name = "base58" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "base58" -version = "0.1.0" +name = "base64" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "bigint" @@ -179,10 +186,10 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -198,7 +205,7 @@ dependencies = [ [[package]] name = "block-padding" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -209,9 +216,14 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -250,12 +262,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.30" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -263,8 +275,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -273,7 +285,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -289,12 +301,28 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -346,7 +374,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -360,7 +388,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -380,7 +408,7 @@ name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -388,7 +416,7 @@ name = "crossbeam-utils" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -399,7 +427,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -440,14 +468,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -457,13 +485,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -482,11 +510,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" @@ -502,7 +525,7 @@ version = "1.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -510,7 +533,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -529,7 +552,7 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -543,15 +566,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "error-chain" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -559,7 +574,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -568,10 +583,10 @@ name = "failure_derive" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -581,33 +596,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fixed-hash" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "fnv" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "foreign-types" -version = "0.3.2" +name = "flate2" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "fnv" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -631,7 +646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -639,7 +654,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -672,7 +687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -682,7 +697,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -692,10 +707,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -717,7 +732,7 @@ name = "heapsize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -725,7 +740,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -735,16 +750,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -779,6 +794,16 @@ dependencies = [ "hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "http" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "httparse" version = "1.3.3" @@ -816,7 +841,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -829,21 +862,26 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -874,53 +912,51 @@ name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" -version = "0.2.50" +version = "0.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -929,64 +965,74 @@ dependencies = [ "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -996,28 +1042,28 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1026,54 +1072,55 @@ dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1081,103 +1128,107 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-secio" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1185,26 +1236,57 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-websocket" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1229,12 +1311,20 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1269,7 +1359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1278,17 +1368,44 @@ dependencies = [ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1296,25 +1413,14 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "mio-extras" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mio-uds" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1334,7 +1440,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1347,66 +1453,65 @@ name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "node-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "node-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "node-primitives 1.0.0", + "node-primitives 2.0.0", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-aura 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-contract 1.0.0", - "srml-council 1.0.0", - "srml-democracy 1.0.0", - "srml-executive 1.0.0", - "srml-finality-tracker 1.0.0", - "srml-grandpa 1.0.0", - "srml-indices 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-sudo 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "srml-treasury 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-keyring 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-aura 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-contract 2.0.0", + "srml-council 2.0.0", + "srml-democracy 2.0.0", + "srml-executive 2.0.0", + "srml-finality-tracker 2.0.0", + "srml-grandpa 2.0.0", + "srml-indices 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-sudo 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "srml-treasury 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-keyring 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "node-runtime-wasm" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "node-runtime 1.0.0", + "node-runtime 2.0.0", ] [[package]] @@ -1430,23 +1535,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1467,31 +1576,6 @@ name = "opaque-debug" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "openssl" -version = "0.10.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-sys" -version = "0.9.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "owning_ref" version = "0.3.3" @@ -1520,7 +1604,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1528,15 +1612,15 @@ name = "parity-codec-derive" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1544,24 +1628,31 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multihash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-wasm" version = "0.31.3" @@ -1597,15 +1688,25 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1613,11 +1714,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1625,31 +1726,46 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste-impl" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1667,28 +1783,23 @@ name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pkg-config" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1701,12 +1812,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1716,7 +1827,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.27" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1724,7 +1835,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.4.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1752,7 +1863,7 @@ name = "quote" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1760,7 +1871,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1770,10 +1881,10 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1783,9 +1894,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1793,17 +1904,17 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1811,7 +1922,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1846,12 +1957,12 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1861,10 +1972,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1872,7 +1983,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1890,7 +2001,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1901,7 +2012,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1915,7 +2026,7 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1923,24 +2034,24 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1951,17 +2062,17 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1977,19 +2088,32 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2002,51 +2126,38 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.0.0" -source = "git+https://github.com/w3f/schnorrkel#3179838da9dd4896c12bb910e7c42477a3250641" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "schnorrkel" -version = "0.1.0" +name = "scopeguard" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "scopeguard" -version = "0.3.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "secp256k1" -version = "0.12.0" +name = "sct" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2069,20 +2180,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2090,9 +2201,20 @@ name = "serde_json" version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha-1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2117,7 +2239,7 @@ name = "sha2" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2125,10 +2247,10 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2148,16 +2270,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -2165,7 +2277,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2199,7 +2311,25 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2214,380 +2344,368 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-api-macros" -version = "1.0.0" +version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-io" -version = "1.0.0" +version = "2.0.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-sandbox" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-std" -version = "1.0.0" +version = "2.0.0" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-version" -version = "1.0.0" +version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "srml-aura" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-inherents 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-balances" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", ] [[package]] name = "srml-consensus" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-contract" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-sandbox 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-sandbox 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-primitives 2.0.0", "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-council" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-democracy 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-democracy 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-democracy" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-executive" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-finality-tracker" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-grandpa" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-finality-tracker 1.0.0", - "srml-session 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-finality-grandpa-primitives 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-finality-tracker 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-finality-grandpa-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-indices" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-metadata" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-session" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", ] [[package]] name = "srml-staking" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-session 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", ] [[package]] name = "srml-sudo" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-support-procedural 1.0.0", - "srml-system 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-support-procedural 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-support" -version = "1.0.0" +version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-metadata 1.0.0", - "srml-support-procedural 1.0.0", - "substrate-inherents 1.0.0", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-metadata 2.0.0", + "srml-support-procedural 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-support-procedural" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "srml-support-procedural-tools 1.0.0", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "srml-support-procedural-tools 2.0.0", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "srml-support-procedural-tools-derive 1.0.0", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "srml-support-procedural-tools-derive 2.0.0", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-system" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "substrate-primitives 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-timestamp" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-treasury" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", ] [[package]] @@ -2605,50 +2723,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -2668,240 +2742,240 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" +version = "0.2.1" +source = "git+https://github.com/paritytech/substrate-bip39#44307fda4ea17fe97aeb93af317fbc8f6ed34193" dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-client" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-trie 2.0.0", ] [[package]] name = "substrate-consensus-aura-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-consensus-authorities" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-consensus-common" -version = "1.0.0" +version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-executor" -version = "1.0.0" +version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-version 1.0.0", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-serializer 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-version 2.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-serializer 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-finality-grandpa-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-inherents" -version = "1.0.0" +version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "substrate-keyring" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", + "sr-primitives 2.0.0", "strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-offchain-primitives" -version = "0.1.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-panic-handler" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-serializer" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-state-machine" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-trie 1.0.0", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-telemetry" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-trie" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2913,35 +2987,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "subtle" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.31" +version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "termcolor" version = "1.0.4" @@ -2955,9 +3024,9 @@ name = "termion" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2974,14 +3043,14 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tiny-bip39" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3006,31 +3075,32 @@ name = "tk-listen" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3041,17 +3111,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-current-thread" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3059,19 +3129,19 @@ name = "tokio-dns-unofficial" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-executor" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3079,9 +3149,9 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3090,7 +3160,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3100,25 +3170,38 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-sync" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3127,38 +3210,46 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-trace-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3167,9 +3258,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3181,11 +3272,11 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3194,10 +3285,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3232,7 +3323,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3250,11 +3341,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3277,7 +3368,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3314,11 +3405,6 @@ name = "utf8-ranges" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "vcpkg" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "version_check" version = "0.1.5" @@ -3331,85 +3417,97 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasmi" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3423,20 +3521,38 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3449,7 +3565,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3471,7 +3587,7 @@ name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3484,28 +3600,10 @@ name = "wincolor" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -3517,21 +3615,21 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3546,45 +3644,68 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" -"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" +"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" "checksum aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f10b352bc3fc08ae24dc5d2d3ddcac153678533986122dc283d747b12071000" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9893d63fc3b1c44231e667da6836a33f27d8b6b3bdc82f83da5dfd579d1b6528" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" -"checksum backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5a90e2b463010cd0e0ce9a11d4a9d5d58d9f41d4a6ba3dcaf9e68b466e88b4" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" +"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" -"checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d" +"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" +"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" -"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" -"checksum cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)" = "d01c69d08ff207f231f07196e30f84c70f1c815b04f980f8b7b01ff01f05eb92" -"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" +"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" "checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" @@ -3596,36 +3717,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" +"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" "checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -"checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" +"checksum curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" -"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" +"checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" -"checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac" +"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" "checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" "checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" +"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" @@ -3633,60 +3751,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" "checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" -"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8e04cb7a5051270ef3fa79f8c7604d581ecfa73d520e74f554e45541c4b5881a" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" -"checksum hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" -"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc2928beef125e519d69ae1baa8c37ea2e0d3848545217f6db0179c5eb1d639" +"checksum hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" +"checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" +"checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" +"checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" -"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" -"checksum libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0231edab431064b30b7749484a39735eb36492cef4658c372c9059e58c3003aa" -"checksum libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a3bad2ed26297112847678683dd221473a0d44297250b61f004e1b35e72493" -"checksum libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f765f103b680cbed910b02bfdbdcfce5b1142899c93e51acb960bf59b6f81b1" -"checksum libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b129d20cc8cbb6ce5da8361045649c024659173e246c5dfbf20ae06071c046a" -"checksum libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70d68816b8435d6788399416eb2f0a6974fb1d15c4be5c30141f87c8e81746df" -"checksum libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "718ca645a065fd70855ca6042a7df686c24cd21add750c37a82c811fbd1e5c43" -"checksum libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbe27c623a6a720efd5d704347838972062f89149a9c3cd149748da60bdcd3e0" -"checksum libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9bc1a5d85f4812cae6367b49a432763fe28997bac7c530dc55b70ec18a78aa7" -"checksum libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe5a858342a1cc89464474f7edc4bae1da649b9c823a3e04d9fb494493601746" -"checksum libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc6b5185c50a52a12e7bbe2ee7799059e24de4e52ab25edbfd26c8ab8515d317" -"checksum libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7905c1431ad115bee83405770629a27d6f17153ad02ec9670a7347998ef20e22" -"checksum libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc17626763ded57da8fed73187c2d9f6ebb89d30838673c430315bf560c7e4db" -"checksum libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2409d08b809ab1a74269597f7da2829d117cc11b9ed3343af33fc20831619726" -"checksum libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258cdc6742945c8f6402997bbbf36733588e2db18e5a0014da6d46e3ccfb92cf" -"checksum libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b5691e2ba2720d42bd1e93d6b90239fa9235c1956ef6a5f1dd499a7ae2767be" -"checksum libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ab0b9ca050105fd94229c48911c0c84aef4d6b86a53d1b6df81d938354e47e" -"checksum libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" -"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" -"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" @@ -3694,40 +3820,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" +"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d" -"checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" -"checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" +"checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f50392d1265092fbee9273414cc40eb6d47d307bd66222c477bb8450c8504f9d" -"checksum paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a3cd512fe3a55e8933b2dcad913e365639db86d512e4004c3084b86864d9467a" +"checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" +"checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" +"checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66" +"checksum proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0c1dd4172a1e1f96f709341418f49b11ea6c2d95d53dca08c0f74cbd332d9cf3" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" @@ -3741,123 +3867,125 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" -"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" -"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" +"checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" -"checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" -"checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4070f3906e65249228094cf97b04a90799fba04468190bbbcfa812309cf86e32" +"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" -"checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" -"checksum serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6eabf4b5914e88e24eea240bb7c9f9a2cbc1bbbe8d961d381975ec3c6b806c" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" +"checksum serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "101b495b109a3e3ca8c4cbe44cf62391527cdfb6ba15821c5ce80bcd5ea23f9f" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" -"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a3edad410e603184d656e2abded5fd4d3d6e93d5763d21130dbaf99795db74eb" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1635afd059cbfac7d5b1274f0c44cec110c1e013c48e8bbc22e07e52696cf887" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" +"checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b4cfac95805274c6afdb12d8f770fa2d27c045953e7b630a81801953699a9a" -"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" "checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5388a470627f97a01a6e13389ced797a42b1611f9de7e0f6ca705675ac55297" +"checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" -"checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" +"checksum tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" +"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" -"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" +"checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" -"checksum tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" +"checksum tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" +"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" +"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" -"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +"checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" -"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" +"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" -"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" -"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" -"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" -"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" -"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" -"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" -"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" -"checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" +"checksum wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" +"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" "checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" -"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" -"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" -"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/node/runtime/wasm/Cargo.toml b/node/runtime/wasm/Cargo.toml index b6490a047ed19c938e5d15fd99bda9eedae90d99..e98d4cb918a916577c63a3de5298c0510bdc08c8 100644 --- a/node/runtime/wasm/Cargo.toml +++ b/node/runtime/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-runtime-wasm" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/node/runtime/wasm/build.sh b/node/runtime/wasm/build.sh index f0b7c961bda7b9253fb8054ba01059afa1c04e9c..9a9f412bfcf169f50198f8eda438e1f450da7bd2 100755 --- a/node/runtime/wasm/build.sh +++ b/node/runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release +CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release $@ for i in node_runtime do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm diff --git a/node/src/main.rs b/node/src/main.rs index 5ff0d7ff3b0e68fae90eca12154bd1409d866d80..15b603e7a2706abe220785213169ea02273520f6 100644 --- a/node/src/main.rs +++ b/node/src/main.rs @@ -43,9 +43,7 @@ impl cli::IntoExit for Exit { } } -error_chain::quick_main!(run); - -fn run() -> cli::error::Result<()> { +fn main() { let version = VersionInfo { name: "Substrate Node", commit: env!("VERGEN_SHA_SHORT"), @@ -55,5 +53,9 @@ fn run() -> cli::error::Result<()> { description: "Generic substrate node", support_url: "https://github.com/paritytech/substrate/issues/new", }; - cli::run(::std::env::args(), Exit, version) + + if let Err(e) = cli::run(::std::env::args(), Exit, version) { + eprintln!("Error starting the node: {}\n\n{:?}", e, e); + std::process::exit(1) + } } diff --git a/scripts/build.sh b/scripts/build.sh index 9cacf74dbb07a6ca5b135959d3e08b11a3da50a0..8b3557159b5ce43a5b67bd51894fe1cd916b85d5 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -5,21 +5,21 @@ set -e PROJECT_ROOT=`git rev-parse --show-toplevel` -source `dirname "$0"`/common.sh +source "`dirname \"$0\"`/common.sh" export CARGO_INCREMENTAL=0 # Save current directory. pushd . -cd $ROOT +cd -- "$ROOT" for SRC in "${SRCS[@]}" do echo "*** Building wasm binaries in $SRC" cd "$PROJECT_ROOT/$SRC" - ./build.sh + ./build.sh $@ cd - >> /dev/null done diff --git a/scripts/docker/Dockerfile b/scripts/docker/Dockerfile index 6ad477664441705ed7a6c716eda40fb28263524e..2bdf49e2fcec22240420837b001018bdb9ffe79d 100644 --- a/scripts/docker/Dockerfile +++ b/scripts/docker/Dockerfile @@ -1,24 +1,39 @@ FROM debian:stretch-slim -LABEL maintainer "devops-team@parity.io" -LABEL description="Substrate: The platform for blockchain innovators" -RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get upgrade -y && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - libssl1.1 \ - ca-certificates \ - curl && \ - apt-get autoremove -y && \ - apt-get clean && \ - find /var/lib/apt/lists/ -type f -not -name lock -delete +# metadata +ARG VCS_REF +ARG BUILD_DATE -COPY ./substrate /usr/local/bin +LABEL io.parity.image.authors="devops-team@parity.io" \ + io.parity.image.vendor="Parity Technologies" \ + io.parity.image.title="parity/substrate" \ + io.parity.image.description="Substrate: The platform for blockchain innovators." \ + io.parity.image.source="https://github.com/paritytech/substrate/blob/${VCS_REF}/scripts/docker/Dockerfile" \ + io.parity.image.revision="${VCS_REF}" \ + io.parity.image.created="${BUILD_DATE}" \ + io.parity.image.documentation="https://wiki.parity.io/Parity-Substrate" +# show backtraces +ENV RUST_BACKTRACE 1 -RUN useradd -m -u 1000 -U -s /bin/sh -d /substrate substrate -USER substrate +# install tools and dependencies +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get upgrade -y && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y \ + libssl1.1 \ + ca-certificates \ + curl && \ +# apt cleanup + apt-get autoremove -y && \ + apt-get clean && \ + find /var/lib/apt/lists/ -type f -not -name lock -delete; \ +# add user + useradd -m -u 1000 -U -s /bin/sh -d /substrate substrate + +# add substrate binary to docker image +COPY ./substrate /usr/local/bin -ENV RUST_BACKTRACE 1 +USER substrate # check if executable works in this container RUN /usr/local/bin/substrate --version diff --git a/scripts/flamingfir-deploy.sh b/scripts/flamingfir-deploy.sh new file mode 100755 index 0000000000000000000000000000000000000000..13be56dfbd2f5bb77143ee2df1a71cb55819d30b --- /dev/null +++ b/scripts/flamingfir-deploy.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +RETRY_COUNT=10 +RETRY_ATTEMPT=0 +SLEEP_TIME=15 +TARGET_HOST="$1" +COMMIT=$(cat artifacts/VERSION) +DOWNLOAD_URL="https://releases.parity.io/substrate/x86_64-debian:stretch/${COMMIT}/substrate" +POST_DATA='{"extra_vars":{"artifact_path":"'${DOWNLOAD_URL}'","target_host":"'${TARGET_HOST}'"}}' + +JOB_ID=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" --header "Content-type: application/json" --post-data "${POST_DATA}" https://ansible-awx.parity.io/api/v2/job_templates/32/launch/ | jq .job) + +echo "Launched job: $JOB_ID" + + +while [ ${RETRY_ATTEMPT} -le ${RETRY_COUNT} ] ; do + export RETRY_RESULT=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" https://ansible-awx.parity.io/api/v2/jobs/${JOB_ID}/ | jq .status) + RETRY_ATTEMPT=$(( $RETRY_ATTEMPT +1 )) + sleep $SLEEP_TIME + if [ $(echo $RETRY_RESULT | egrep -e successful -e failed) ] ; then + break + fi +done + +AWX_OUTPUT=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" https://ansible-awx.parity.io/api/v2/jobs/${JOB_ID}/stdout?format=txt_download) + +echo "AWX job log:" +echo "${AWX_OUTPUT}" + + +JOB_STATUS=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" https://ansible-awx.parity.io/api/v2/jobs/${JOB_ID}/ | jq .status ) + +echo "===================================" +echo -e "Ansible AWX Remote Job: ${JOB_ID} \x1B[31mStatus: ${JOB_STATUS}\x1B[0m" +echo "===================================" diff --git a/scripts/gitlab/check_line_width.sh b/scripts/gitlab/check_line_width.sh new file mode 100755 index 0000000000000000000000000000000000000000..f382d630b183c6396115cc1e76e77dfab4c20047 --- /dev/null +++ b/scripts/gitlab/check_line_width.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# +# check if line width of rust source files is not beyond x characters +# + + +BASE_BRANCH="origin/master" +LINE_WIDTH="121" +GOOD_LINE_WIDTH="101" + + +git diff --name-only ${BASE_BRANCH}...${CI_COMMIT_SHA} \*.rs | ( while read file +do + if [ ! -f ${file} ]; + then + echo "Skipping removed file." + elif git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} | grep -q "^+.\{${LINE_WIDTH}\}" + then + if [ -z "${FAIL}" ] + then + echo "| warning!" + echo "| Lines should not be longer than 120 characters." + echo "| " + echo "| see more https://wiki.parity.io/Substrate-Style-Guide" + echo "|" + FAIL="true" + fi + echo "| file: ${file}" + git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} \ + | grep -n "^+.\{${LINE_WIDTH}\}" + echo "|" + else + if git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} | grep -q "^+.\{${GOOD_LINE_WIDTH}\}" + then + if [ -z "${FAIL}" ] + then + echo "| warning!" + echo "| Lines should be longer than 100 characters only in exceptional circumstances!" + echo "| " + echo "| see more https://wiki.parity.io/Substrate-Style-Guide" + echo "|" + fi + echo "| file: ${file}" + git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} \ + | grep -n "^+.\{${LINE_WIDTH}\}" + echo "|" + fi + fi +done + +test -z "${FAIL}" +) diff --git a/scripts/node-template-release/Cargo.toml b/scripts/node-template-release/Cargo.toml index 2dfc0b5255348242b8727971cc2768ae88fa2094..34aadc971f1aaa78b2f53860e668d294cee52eb0 100644 --- a/scripts/node-template-release/Cargo.toml +++ b/scripts/node-template-release/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template-release" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/scripts/node-template-release/src/main.rs b/scripts/node-template-release/src/main.rs index 871cc078ed0c70fd73be54e953064bff328f7e4d..470d34ef0d8837f335e5842e8168b49a1511ab51 100644 --- a/scripts/node-template-release/src/main.rs +++ b/scripts/node-template-release/src/main.rs @@ -137,7 +137,7 @@ fn write_cargo_toml(path: &Path, cargo_toml: CargoToml) { /// Build and test the generated node-template fn build_and_test(path: &Path, cargo_tomls: &[PathBuf]) { // Build wasm - assert!(Command::new(path.join("build.sh")).current_dir(path).status().expect("Compiles wasm").success()); + assert!(Command::new(path.join("./scripts/build.sh")).current_dir(path).status().expect("Compiles wasm").success()); // Build node assert!(Command::new("cargo").args(&["build", "--all"]).current_dir(path).status().expect("Compiles node").success()); diff --git a/scripts/update-deps.sh b/scripts/update-deps.sh new file mode 100755 index 0000000000000000000000000000000000000000..cd6b7c853825ed42a0b55d32018b81207a3d1642 --- /dev/null +++ b/scripts/update-deps.sh @@ -0,0 +1,9 @@ +#!/bin/sh -- +set -eu +case $0 in + (/*) dir=${0%/*}/;; + (*/*) dir=./${0%/*};; + (*) dir=.;; +esac + +find "$dir/.." -name Cargo.lock -execdir cargo update \; diff --git a/srml/assets/Cargo.toml b/srml/assets/Cargo.toml index 066dd42ffdfc9cfc4309b3e7fef987754a1e5d99..88a443db94cdb80c3b48e8f1407193b3e16ad8d2 100644 --- a/srml/assets/Cargo.toml +++ b/srml/assets/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-assets" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } parity-codec = { version = "3.3", default-features = false } # Needed for various traits. In our case, `OnFinalize`. diff --git a/srml/aura/Cargo.toml b/srml/aura/Cargo.toml index b22fea8ffdcd3b7d716fa31fb80267e7584620bf..82027871b4bb4c55a44219bfe79695d64d980a37 100644 --- a/srml/aura/Cargo.toml +++ b/srml/aura/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-aura" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" parity-codec = { version = "3.3", default-features = false, features = ["derive"] } serde = { version = "1.0", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } @@ -19,7 +18,7 @@ session = { package = "srml-session", path = "../session", default-features = fa [dev-dependencies] lazy_static = "1.0" -parking_lot = "0.7.1" +parking_lot = "0.8.0" substrate-primitives = { path = "../../core/primitives" } runtime_io = { package = "sr-io", path = "../../core/sr-io" } consensus = { package = "srml-consensus", path = "../consensus" } diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index e5eb3674cdf6b2e09783cbe97c3ad3c6c7551b3b..597618c1428a7b3ddb2cb8f850d1f75107b77ea0 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -51,16 +51,19 @@ pub use timestamp; use rstd::{result, prelude::*}; +use parity_codec::{Encode, Decode}; use srml_support::storage::StorageValue; use srml_support::{decl_storage, decl_module}; -use primitives::traits::{As, Zero}; +use primitives::traits::{SaturatedConversion, Saturating, Zero, One}; use timestamp::OnTimestampSet; +use rstd::marker::PhantomData; #[cfg(feature = "std")] use timestamp::TimestampInherentData; -use parity_codec::{Encode, Decode}; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; +#[cfg(feature = "std")] +use serde::Serialize; mod mock; mod tests; @@ -90,6 +93,20 @@ impl AuraInherentData for InherentData { } } +/// Logs in this module. +pub type Log = RawLog; + +/// Logs in this module. +/// +/// The type parameter distinguishes logs belonging to two different runtimes, +/// which should not be mixed. +#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[derive(Encode, Decode, PartialEq, Eq, Clone)] +pub enum RawLog { + /// AuRa inherent digests + PreRuntime([u8; 4], Vec, PhantomData), +} + /// Provides the slot duration inherent data for `Aura`. #[cfg(feature = "std")] pub struct InherentDataProvider { @@ -154,7 +171,7 @@ pub trait Trait: timestamp::Trait { decl_storage! { trait Store for Module as Aura { /// The last timestamp. - LastTimestamp get(last) build(|_| T::Moment::sa(0)): T::Moment; + LastTimestamp get(last) build(|_| 0.into()): T::Moment; } } @@ -163,7 +180,7 @@ decl_module! { } /// A report of skipped authorities in Aura. -#[derive(Clone, Encode, Decode, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] pub struct AuraReport { // The first skipped slot. @@ -192,43 +209,41 @@ impl AuraReport { impl Module { /// Determine the Aura slot-duration based on the Timestamp module configuration. - pub fn slot_duration() -> u64 { + pub fn slot_duration() -> T::Moment { // we double the minimum block-period so each author can always propose within // the majority of its slot. - >::minimum_period().as_().saturating_mul(2) + >::minimum_period().saturating_mul(2.into()) } fn on_timestamp_set(now: T::Moment, slot_duration: T::Moment) { let last = Self::last(); ::LastTimestamp::put(now.clone()); - if last == T::Moment::zero() { + if last.is_zero() { return; } - assert!(slot_duration > T::Moment::zero(), "Aura slot duration cannot be zero."); + assert!(!slot_duration.is_zero(), "Aura slot duration cannot be zero."); let last_slot = last / slot_duration.clone(); - let first_skipped = last_slot.clone() + T::Moment::sa(1); + let first_skipped = last_slot.clone() + One::one(); let cur_slot = now / slot_duration; assert!(last_slot < cur_slot, "Only one block may be authored per slot."); if cur_slot == first_skipped { return } - let slot_to_usize = |slot: T::Moment| { slot.as_() as usize }; - - let skipped_slots = cur_slot - last_slot - T::Moment::sa(1); + let skipped_slots = cur_slot - last_slot - One::one(); H::handle_report(AuraReport { - start_slot: slot_to_usize(first_skipped), - skipped: slot_to_usize(skipped_slots), + start_slot: first_skipped.saturated_into::(), + skipped: skipped_slots.saturated_into::(), }) } } impl OnTimestampSet for Module { fn on_timestamp_set(moment: T::Moment) { - Self::on_timestamp_set::(moment, T::Moment::sa(Self::slot_duration())) + Self::on_timestamp_set::(moment, Self::slot_duration()) } } @@ -265,9 +280,9 @@ impl ProvideInherent for Module { _ => return Ok(()), }; - let timestamp_based_slot = timestamp.as_() / Self::slot_duration(); + let timestamp_based_slot = timestamp / Self::slot_duration(); - let seal_slot = data.aura_inherent_data()?; + let seal_slot = data.aura_inherent_data()?.saturated_into(); if timestamp_based_slot == seal_slot { Ok(()) diff --git a/srml/aura/src/tests.rs b/srml/aura/src/tests.rs index e74c7dace2ff3fd6179f755e05add387f1bc7f92..3e20613c48f6119befbd3a1cede6004fedb5f5bc 100644 --- a/srml/aura/src/tests.rs +++ b/srml/aura/src/tests.rs @@ -73,7 +73,7 @@ fn aura_reports_offline() { } with_externalities(&mut new_test_ext(vec![0, 1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); let slot_duration = Aura::slot_duration(); Aura::on_timestamp_set::(5 * slot_duration, slot_duration); @@ -82,7 +82,7 @@ fn aura_reports_offline() { // no slashing when last step was 0. assert_eq!(SLASH_COUNTS.lock().as_slice(), &[0, 0, 0, 0]); - System::initialize(&2, &header.hash(), &Default::default()); + System::initialize(&2, &header.hash(), &Default::default(), &Default::default()); Aura::on_timestamp_set::(8 * slot_duration, slot_duration); let _header = System::finalize(); diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..0f189dfcdadfd702010cebca8798a94b021d0c43 --- /dev/null +++ b/srml/babe/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "srml-babe" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +hex-literal = "0.1.4" +parity-codec = { version = "3.5.1", default-features = false, features = ["derive"] } +serde = { version = "1.0.90", optional = true } +inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } +rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } +primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +srml-support = { path = "../support", default-features = false } +system = { package = "srml-system", path = "../system", default-features = false } +timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } +staking = { package = "srml-staking", path = "../staking", default-features = false } +session = { package = "srml-session", path = "../session", default-features = false } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives", default-features = false } + +[dev-dependencies] +lazy_static = "1.3.0" +parking_lot = "0.8.0" +substrate-primitives = { path = "../../core/primitives" } +runtime_io = { package = "sr-io", path = "../../core/sr-io" } +consensus = { package = "srml-consensus", path = "../consensus" } + +[features] +default = ["std"] +std = [ + "serde", + "parity-codec/std", + "rstd/std", + "srml-support/std", + "primitives/std", + "system/std", + "timestamp/std", + "staking/std", + "inherents/std", + "babe-primitives/std", +] diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..e969dee74bfa7b40f7bab3dc2859b515340fee09 --- /dev/null +++ b/srml/babe/src/lib.rs @@ -0,0 +1,169 @@ +// Copyright 2019 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 . + +//! Consensus extension module for BABE consensus. + +#![cfg_attr(not(feature = "std"), no_std)] +#![forbid(unsafe_code)] +pub use timestamp; + +use rstd::{result, prelude::*, marker::PhantomData}; +use srml_support::{decl_storage, decl_module}; +use timestamp::{OnTimestampSet, Trait}; +use primitives::traits::{SaturatedConversion, Saturating}; +#[cfg(feature = "std")] +use timestamp::TimestampInherentData; +use parity_codec::{Encode, Decode}; +use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; +#[cfg(feature = "std")] +use inherents::{InherentDataProviders, ProvideInherentData}; +#[cfg(feature = "std")] +use serde::Serialize; + +/// The BABE inherent identifier. +pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"babeslot"; + +/// The type of the BABE inherent. +pub type InherentType = u64; + +/// Auxiliary trait to extract BABE inherent data. +pub trait BabeInherentData { + /// Get BABE inherent data. + fn babe_inherent_data(&self) -> result::Result; + /// Replace BABE inherent data. + fn babe_replace_inherent_data(&mut self, new: InherentType); +} + +impl BabeInherentData for InherentData { + fn babe_inherent_data(&self) -> result::Result { + self.get_data(&INHERENT_IDENTIFIER) + .and_then(|r| r.ok_or_else(|| "BABE inherent data not found".into())) + } + + fn babe_replace_inherent_data(&mut self, new: InherentType) { + self.replace_data(INHERENT_IDENTIFIER, &new); + } +} + +/// Logs in this module. +pub type Log = RawLog; + +/// Logs in this module. +/// +/// The type parameter distinguishes logs belonging to two different runtimes, +/// which should not be mixed. +#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[derive(Encode, Decode, PartialEq, Eq, Clone)] +pub enum RawLog { + /// BABE inherent digests + PreRuntime([u8; 4], Vec, PhantomData), +} + +/// Provides the slot duration inherent data for BABE. +#[cfg(feature = "std")] +pub struct InherentDataProvider { + slot_duration: u64, +} + +#[cfg(feature = "std")] +impl InherentDataProvider { + pub fn new(slot_duration: u64) -> Self { + Self { + slot_duration + } + } +} + +#[cfg(feature = "std")] +impl ProvideInherentData for InherentDataProvider { + fn on_register( + &self, + providers: &InherentDataProviders, + ) -> result::Result<(), RuntimeString> { + if !providers.has_provider(×tamp::INHERENT_IDENTIFIER) { + // Add the timestamp inherent data provider, as we require it. + providers.register_provider(timestamp::InherentDataProvider) + } else { + Ok(()) + } + } + + fn inherent_identifier(&self) -> &'static inherents::InherentIdentifier { + &INHERENT_IDENTIFIER + } + + fn provide_inherent_data( + &self, + inherent_data: &mut InherentData, + ) -> result::Result<(), RuntimeString> { + let timestamp = inherent_data.timestamp_inherent_data()?; + let slot_num = timestamp / self.slot_duration; + inherent_data.put_data(INHERENT_IDENTIFIER, &slot_num) + } + + fn error_to_string(&self, error: &[u8]) -> Option { + RuntimeString::decode(&mut &error[..]).map(Into::into) + } +} + +decl_storage! { + trait Store for Module as Babe { + // The last timestamp. + LastTimestamp get(last): T::Moment; + } +} + +decl_module! { + pub struct Module for enum Call where origin: T::Origin { } +} + +impl Module { + /// Determine the BABE slot duration based on the Timestamp module configuration. + pub fn slot_duration() -> T::Moment { + // we double the minimum block-period so each author can always propose within + // the majority of their slot. + >::minimum_period().saturating_mul(2.into()) + } +} + +impl OnTimestampSet for Module { + fn on_timestamp_set(_moment: T::Moment) { } +} + +impl ProvideInherent for Module { + type Call = timestamp::Call; + type Error = MakeFatalError; + const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; + + fn create_inherent(_: &InherentData) -> Option { + None + } + + fn check_inherent(call: &Self::Call, data: &InherentData) -> result::Result<(), Self::Error> { + let timestamp = match call { + timestamp::Call::set(ref timestamp) => timestamp.clone(), + _ => return Ok(()), + }; + + let timestamp_based_slot = (timestamp / Self::slot_duration()).saturated_into::(); + let seal_slot = data.babe_inherent_data()?; + if timestamp_based_slot == seal_slot { + Ok(()) + } else { + Err(RuntimeString::from("timestamp set in block doesn’t match slot in seal").into()) + } + } +} diff --git a/srml/balances/Cargo.toml b/srml/balances/Cargo.toml index 804ee603646f4c98a01c471b2e739f18eb4141a3..6c000294ba12e057c864d2f0f3add72b7a93c565 100644 --- a/srml/balances/Cargo.toml +++ b/srml/balances/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-balances" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.3", default-features = false, features = ["derive"] } diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 601affa3d341f338f6fc6a942ee83492ee99371e..61bcd5780d82536fc11a362a4f0ac907d756717f 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -51,7 +51,8 @@ //! deleted, then the account is said to be dead. //! - **Imbalance:** A condition when some funds were credited or debited without equal and opposite accounting //! (i.e. a difference between total issuance and account balances). Functions that result in an imbalance will -//! return an object of the `Imbalance` trait that must be handled. +//! return an object of the `Imbalance` trait that can be managed within your runtime logic. (If an imbalance is +//! simply dropped, it should automatically maintain any book-keeping such as total issuance.) //! - **Lock:** A freeze on a specified amount of an account's free balance until a specified block number. Multiple //! locks always operate over the same funds, so they "overlay" rather than "stack". //! - **Vesting:** Similar to a lock, this is another, but independent, liquidity restriction that reduces linearly @@ -105,7 +106,7 @@ //! pub type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; //! //! # fn main() {} -//!``` +//! ``` //! //! The Staking module uses the `LockableCurrency` trait to lock a stash account's funds: //! @@ -155,7 +156,7 @@ use srml_support::traits::{ }; use srml_support::dispatch::Result; use primitives::traits::{ - Zero, SimpleArithmetic, As, StaticLookup, Member, CheckedAdd, CheckedSub, + Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug, Saturating }; use system::{IsDeadAccount, OnNewAccount, ensure_signed}; @@ -167,7 +168,8 @@ pub use self::imbalances::{PositiveImbalance, NegativeImbalance}; pub trait Subtrait: system::Trait { /// The balance of an account. - type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + As + As + MaybeSerializeDebug; + type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + + MaybeSerializeDebug + From; /// A function that is invoked when the free-balance has fallen below the existential deposit and /// has been reduced to zero. @@ -181,7 +183,8 @@ pub trait Subtrait: system::Trait { pub trait Trait: system::Trait { /// The balance of an account. - type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + As + As + MaybeSerializeDebug; + type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + + MaybeSerializeDebug + From; /// A function that is invoked when the free-balance has fallen below the existential deposit and /// has been reduced to zero. @@ -236,10 +239,12 @@ pub struct VestingSchedule { pub per_block: Balance, } -impl> VestingSchedule { +impl VestingSchedule { /// Amount locked at block `n`. - pub fn locked_at>(&self, n: BlockNumber) -> Balance { - if let Some(x) = Balance::sa(n.as_()).checked_mul(&self.per_block) { + pub fn locked_at(&self, n: BlockNumber) -> Balance + where Balance: From + { + if let Some(x) = Balance::from(n).checked_mul(&self.per_block) { self.offset.max(x) - x } else { Zero::zero() @@ -276,10 +281,8 @@ decl_storage! { /// Information regarding the vesting of a given account. pub Vesting get(vesting) build(|config: &GenesisConfig| { config.vesting.iter().filter_map(|&(ref who, begin, length)| { - let begin: u64 = begin.as_(); - let length: u64 = length.as_(); - let begin: T::Balance = As::sa(begin); - let length: T::Balance = As::sa(length); + let begin = >::from(begin); + let length = >::from(length); config.balances.iter() .find(|&&(ref w, _)| w == who) @@ -379,7 +382,8 @@ impl, I: Instance> Module { /// Get the amount that is currently being vested and cannot be transferred out of this account. pub fn vesting_balance(who: &T::AccountId) -> T::Balance { if let Some(v) = Self::vesting(who) { - Self::free_balance(who).min(v.locked_at(>::block_number())) + Self::free_balance(who) + .min(v.locked_at::(>::block_number())) } else { Zero::zero() } @@ -710,9 +714,14 @@ where if locks.is_empty() { return Ok(()) } + let now = >::block_number(); - if Self::locks(who).into_iter() - .all(|l| now >= l.until || new_balance >= l.amount || !l.reasons.contains(reason)) + if locks.into_iter() + .all(|l| + now >= l.until + || new_balance >= l.amount + || !l.reasons.contains(reason) + ) { Ok(()) } else { @@ -1007,7 +1016,7 @@ where impl, I: Instance> MakePayment for Module { fn make_payment(transactor: &T::AccountId, encoded_len: usize) -> Result { - let encoded_len = >::sa(encoded_len as u64); + let encoded_len = T::Balance::from(encoded_len as u32); let transaction_fee = Self::transaction_base_fee() + Self::transaction_byte_fee() * encoded_len; let imbalance = Self::withdraw( transactor, diff --git a/srml/consensus/Cargo.toml b/srml/consensus/Cargo.toml index ef3e943c8d74a85aa9c9ddf0119d0f5c342feaa4..bcb16a825a963f03adc31c453d8f7a40e571d776 100644 --- a/srml/consensus/Cargo.toml +++ b/srml/consensus/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-consensus" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } substrate-primitives = { path = "../../core/primitives", default-features = false } diff --git a/srml/consensus/src/lib.rs b/srml/consensus/src/lib.rs index ba56e6e4e35c5daae60875a78945c56e3689e4aa..4613981ec5d9e80b52e5598491665883f86dfa5e 100644 --- a/srml/consensus/src/lib.rs +++ b/srml/consensus/src/lib.rs @@ -136,13 +136,13 @@ use srml_support::storage::StorageValue; use srml_support::storage::unhashed::StorageVec; use primitives::traits::{MaybeSerializeDebug, Member}; use substrate_primitives::storage::well_known_keys; -use system::{ensure_signed, ensure_inherent}; +use system::{ensure_signed, ensure_none}; use inherents::{ ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError }; #[cfg(any(feature = "std", test))] -use substrate_primitives::ed25519::Public as AuthorityId; +use substrate_primitives::sr25519::Public as AuthorityId; mod mock; mod tests; @@ -221,6 +221,7 @@ impl>> InherentOfflineReport for InstantFinalityRepo } } +/// Logs in this module. pub type Log = RawLog< ::SessionKey, >; @@ -298,7 +299,7 @@ decl_module! { /// Note that the previous block's validator missed its opportunity to propose a block. fn note_offline(origin, offline: ::Inherent) { - ensure_inherent(origin)?; + ensure_none(origin)?; T::InherentOfflineReport::handle_report(offline); } diff --git a/srml/consensus/src/tests.rs b/srml/consensus/src/tests.rs index bf8b3a09f37686ba3b47979cdb45e8bd1b589486..471cdf4979097ffa71a9a578ee1f339b2d5a6e95 100644 --- a/srml/consensus/src/tests.rs +++ b/srml/consensus/src/tests.rs @@ -26,7 +26,7 @@ use inherents::{InherentData, ProvideInherent}; #[test] fn authorities_change_logged() { with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Consensus::set_authorities(&[UintAuthorityId(4), UintAuthorityId(5), UintAuthorityId(6)]); Consensus::on_finalize(1); let header = System::finalize(); @@ -47,7 +47,7 @@ fn authorities_change_logged() { #[test] fn partial_authorities_change_logged() { with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&2, &Default::default(), &Default::default()); + System::initialize(&2, &Default::default(), &Default::default(), &Default::default()); Consensus::set_authorities(&[UintAuthorityId(2), UintAuthorityId(4), UintAuthorityId(5)]); Consensus::on_finalize(2); let header = System::finalize(); @@ -68,7 +68,7 @@ fn partial_authorities_change_logged() { #[test] fn authorities_change_is_not_logged_when_not_changed() { with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Consensus::on_finalize(1); let header = System::finalize(); assert_eq!(header.digest, testing::Digest { @@ -80,7 +80,7 @@ fn authorities_change_is_not_logged_when_not_changed() { #[test] fn authorities_change_is_not_logged_when_changed_back_to_original() { with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Consensus::set_authorities(&[UintAuthorityId(4), UintAuthorityId(5), UintAuthorityId(6)]); Consensus::set_authorities(&[UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]); Consensus::on_finalize(1); @@ -94,7 +94,7 @@ fn authorities_change_is_not_logged_when_changed_back_to_original() { #[test] fn offline_report_can_be_excluded() { with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); assert!(Consensus::create_inherent(&InherentData::new()).is_none()); let offline_report: Vec = vec![0]; @@ -110,7 +110,7 @@ fn set_and_kill_storage_work() { use srml_support::storage; with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); let item = (vec![42u8], vec![42u8]); diff --git a/srml/contract/COMPLEXITY.md b/srml/contract/COMPLEXITY.md index 9b304055f766cf3907974fee98f78f9a117baa91..d87525a982291d20c6480ed24301780255c6dc23 100644 --- a/srml/contract/COMPLEXITY.md +++ b/srml/contract/COMPLEXITY.md @@ -83,9 +83,27 @@ The size of the arguments and the return value depends on the exact function in `AccountDb` is an abstraction that supports collecting changes to accounts with the ability to efficiently reverting them. Contract execution contexts operate on the AccountDb. All changes are flushed into underlying storage only after origin transaction succeeds. -Today `AccountDb` is implemented as a cascade of overlays with the direct storage at the bottom. Each overlay is represented by a `Map`. On a commit from an overlay to an overlay, maps are merged. On commit from an overlay to the bottommost `AccountDb` all changes are flushed to the storage. On revert, the overlay is just discarded. +## Relation to the underlying storage -## get_storage, get_code, get_balance +At present, `AccountDb` is implemented as a cascade of overlays with the direct storage at the bottom. The direct +storage `AccountDb` leverages child tries. Each overlay is represented by a `Map`. On a commit from an overlay to an +overlay, maps are merged. On commit from an overlay to the bottommost `AccountDb` all changes are flushed to the storage +and on revert, the overlay is just discarded. + +> ℹ️ The underlying storage has a overlay layer implemented as a `Map`. If the runtime reads a storage location and the +> respective key doesn't exist in the overlay, then the underlying storage performs a DB access, but the value won't be +> placed into the overlay. The overlay is only filled with writes. +> +> This means that the overlay can be abused in the following ways: +> +> - The overlay can be inflated by issuing a lot of writes to unique locations, +> - Deliberate cache misses can be induced by reading non-modified storage locations, + +It also worth noting that the performance degrades with more state stored in the trie. Due to this +there is not negligible chance that gas schedule will be updated for all operations that involve +storage access. + +## get_storage, get_code_hash, get_rent_allowance, get_balance, contract_exists These functions check the local cache for a requested value and, if it is there, the value is returned. Otherwise, these functions will ask an underlying `AccountDb` for the value. This means that the number of lookups is proportional to the depth of the overlay cascade. If the value can't be found before reaching the bottommost `AccountDb`, then a DB read will be performed (in case `get_balance` the function `free_balance` will be invoked). @@ -95,7 +113,7 @@ These functions return an owned value as its result, so memory usage depends on **complexity**: The memory complexity is proportional to the size of the value. The computational complexity is proportional to the depth of the overlay cascade and the size of the value; the cost is dominated by the DB read though. -## set_storage, set_code, set_balance +## set_storage, set_balance, set_rent_allowance These functions only modify the local `Map`. @@ -105,6 +123,12 @@ While these functions only modify the local `Map`, if changes made by them are c **complexity**: Each lookup has a logarithmical computing time to the number of already inserted entries. No additional memory is required. +## create_contract + +Calls `contract_exists` and if it doesn't exist, do not modify the local `Map` similarly to `set_rent_allowance`. + +**complexity**: The computational complexity is proportional to the depth of the overlay cascade and the size of the value; the cost is dominated by the DB read though. No additional memory is required. + ## commit In this function, all cached values will be inserted into the underlying `AccountDb` or into the storage. @@ -152,20 +176,36 @@ Assuming marshaled size of a balance value is of the constant size we can neglec This function receives input data for the contract execution. The execution consists of the following steps: -1. Loading code from the DB. -2. `transfer`-ing funds between the caller and the destination account. -3. Executing the code of the destination account. -4. Committing overlayed changed to the underlying `AccountDb`. +1. Checking rent payment. +2. Loading code from the DB. +3. `transfer`-ing funds between the caller and the destination account. +4. Executing the code of the destination account. +5. Committing overlayed changed to the underlying `AccountDb`. **Note** that the complexity of executing the contract code should be considered separately. -Loading code most probably will trigger a DB read, since the code is immutable and therefore will not get into the cache (unless a suicide removes it). +Checking for rent involves 2 unconditional DB reads: `ContractInfoOf` and `block_number` +and on top of that at most once per block: + +- DB read to `free_balance` and +- `rent_deposit_offset` and +- `rent_byte_price` and +- `Currency::minimum_balance` and +- `tombstone_deposit`. +- Calls to `ensure_can_withdraw`, `withdraw`, `make_free_balance_be` can perform arbitrary logic and should be considered separately, +- `child_storage_root` +- `kill_child_storage` +- mutation of `ContractInfoOf` + +Loading code most likely will trigger a DB read, since the code is immutable and therefore will not get into the cache (unless a suicide removes it, or it has been created in the same call chain). Also, `transfer` can make up to 2 DB reads and up to 2 DB writes (if flushed to the storage) in the standard case. If removal of the source account takes place then it will additionally perform a DB write per one storage entry that the account has. Finally, all changes are `commit`-ted into the underlying overlay. The complexity of this depends on the number of changes performed by the code. Thus, the pricing of storage modification should account for that. -**complexity**: Up to 3 DB reads. DB read of the code is of dynamic size. There can also be up to 2 DB writes (if flushed to the storage). Additionally, if the source account removal takes place a DB write will be performed per one storage entry that the account has. +**complexity**: +- Only for the first invocation of the contract: up to 5 DB reads and one DB write as well as logic executed by `ensure_can_withdraw`, `withdraw`, `make_free_balance_be`. +- On top of that for every invocation: Up to 5 DB reads. DB read of the code is of dynamic size. There can also be up to 2 DB writes (if flushed to the storage). Additionally, if the source account removal takes place a DB write will be performed per one storage entry that the account has. ## Create @@ -179,7 +219,7 @@ This function takes the code of the constructor and input data. Creation of a co **Note** that the complexity of executing the constructor code should be considered separately. -**Note** that the complexity of `DetermineContractAddress` hook should be considered separately as well. Most probably it will use some kind of hashing over the code of the constructor and input data. The default `SimpleAddressDeterminator` does precisely that. +**Note** that the complexity of `DetermineContractAddress` hook should be considered separately as well. Most likely it will use some kind of hashing over the code of the constructor and input data. The default `SimpleAddressDeterminator` does precisely that. **Note** that the constructor returns code in the owned form and it's obtained via return facilities, which should have take fee for the return value. @@ -218,9 +258,11 @@ This function receives a `key` as an argument. It consists of the following step Key is of a constant size. Therefore, the sandbox memory load can be considered to be of constant complexity. -However, a read from the contract's storage can hit the DB, and the size of this read is dynamical. +Unless the value is cached, a DB read will be performed. The size of the value is not known until the read is +performed. Moreover, the DB read has to be synchronous and no progress can be made until the value is fetched. -**complexity**: The memory and computing complexity is proportional to the size of the fetched value. +**complexity**: The memory and computing complexity is proportional to the size of the fetched value. This function performs a +DB read. ## ext_call @@ -236,7 +278,7 @@ It consists of the following steps: 1. Loading `callee` buffer from the sandbox memory (see sandboxing memory get) and then decoding it. 2. Loading `value` buffer from the sandbox memory and then decoding it. 3. Loading `input_data` buffer from the sandbox memory. -4. Invoking `call` executive function. +4. Invoking the executive function `call`. Loading of `callee` and `value` buffers should be charged. This is because the sizes of buffers are specified by the calling code, even though marshaled representations are, essentially, of constant size. This can be fixed by assigning an upper bound for sizes of `AccountId` and `Balance`. @@ -292,11 +334,13 @@ This function serializes the address of the caller into the scratch buffer. **complexity**: Assuming that the address is of constant size, this function has constant complexity. -## ext_random_seed +## ext_random -This function serializes the current block's random seed into the scratch buffer. +This function serializes a random number generated by the given subject into the scratch buffer. +The complexity of this function highly depends on the complexity of `System::random`. `max_subject_len` +limits the size of the subject buffer. -**complexity**: Assuming that the random seed is of constant size, this function has constant complexity. +**complexity**: The complexity of this function depends on the implementation of `System::random`. ## ext_now @@ -318,6 +362,8 @@ This function copies slice of data from the input buffer to the sandbox memory. ## ext_scratch_size +This function returns the size of the scratch buffer. + **complexity**: This function is of constant complexity. ## ext_scratch_copy @@ -327,3 +373,26 @@ This function copies slice of data from the scratch buffer to the sandbox memory 1. Storing a specified slice of the scratch buffer into the sandbox memory (see sandboxing memory set) **complexity**: The computing complexity of this function is proportional to the length of the slice. No additional memory is required. + +## ext_set_rent_allowance + +This function receives the following argument: + +- `value` buffer of a marshaled `Balance`, + +It consists of the following steps: + +1. Loading `value` buffer from the sandbox memory and then decoding it. +2. Invoking `set_rent_allowance` AccountDB function. + +**complexity**: Complexity is proportional to the size of the `value`. This function induces a DB write of size proportional to the `value` size (if flushed to the storage), so should be priced accordingly. + +## ext_rent_allowance + +It consists of the following steps: + +1. Invoking `get_rent_allowance` AccountDB function. +2. Serializing the rent allowance of the current contract into the scratch buffer. + +**complexity**: Assuming that the rent allowance is of constant size, this function has constant complexity. This +function performs a DB read. diff --git a/srml/contract/Cargo.toml b/srml/contract/Cargo.toml index 28ca8f9eb9cf10fb19843d9f64ac270dc5ce0e77..7c04758171beb0eeb15916df4043127b0be0a65c 100644 --- a/srml/contract/Cargo.toml +++ b/srml/contract/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-contract" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -22,9 +22,10 @@ timestamp = { package = "srml-timestamp", path = "../timestamp", default-feature [dev-dependencies] wabt = "~0.7.4" assert_matches = "1.1" -hex-literal = "0.1.0" +hex-literal = "0.2.0" consensus = { package = "srml-consensus", path = "../consensus" } balances = { package = "srml-balances", path = "../balances" } +hex = "0.3" [features] default = ["std"] diff --git a/srml/contract/src/account_db.rs b/srml/contract/src/account_db.rs index fdf36ee8aca1762a891af2bcc67d55dcc4301880..2421eab00abb187582503dda96b1866d3d91726b 100644 --- a/srml/contract/src/account_db.rs +++ b/srml/contract/src/account_db.rs @@ -16,20 +16,28 @@ //! Auxilliaries to help with managing partial changes to accounts state. -use super::{CodeHash, CodeHashOf, Trait, TrieId, AccountInfoOf, BalanceOf, AccountInfo, TrieIdGenerator}; +use super::{ + AliveContractInfo, BalanceOf, CodeHash, ContractInfo, ContractInfoOf, Module, Trait, TrieId, + TrieIdGenerator, +}; use crate::exec::StorageKey; -use system; use rstd::cell::RefCell; use rstd::collections::btree_map::{BTreeMap, Entry}; use rstd::prelude::*; -use runtime_primitives::traits::Zero; -use srml_support::{StorageMap, traits::{UpdateBalanceOutcome, - SignedImbalance, Currency, Imbalance}, storage::child}; +use runtime_io::blake2_256; +use runtime_primitives::traits::{Bounded, Zero}; +use srml_support::traits::{Currency, Imbalance, SignedImbalance, UpdateBalanceOutcome}; +use srml_support::{storage::child, StorageMap}; +use system; +// Note: we don't provide Option because we can't create +// the trie_id in the overlay, thus we provide an overlay on the fields +// specifically. pub struct ChangeEntry { balance: Option>, - /// In the case the outer option is None, the code_hash remains untouched, while providing `Some(None)` signifies a removing of the code in question - code: Option>>, + /// If None, the code_hash remains untouched. + code_hash: Option>, + rent_allowance: Option>, storage: BTreeMap>>, } @@ -37,8 +45,9 @@ pub struct ChangeEntry { impl Default for ChangeEntry { fn default() -> Self { ChangeEntry { + rent_allowance: Default::default(), balance: Default::default(), - code: Default::default(), + code_hash: Default::default(), storage: Default::default(), } } @@ -50,10 +59,15 @@ pub trait AccountDb { /// Account is used when overlayed otherwise trie_id must be provided. /// This is for performance reason. /// - /// Trie id can be None iff account doesn't have an associated trie id in >. + /// Trie id is None iff account doesn't have an associated trie id in >. /// Because DirectAccountDb bypass the lookup for this association. fn get_storage(&self, account: &T::AccountId, trie_id: Option<&TrieId>, location: &StorageKey) -> Option>; - fn get_code(&self, account: &T::AccountId) -> Option>; + /// If account has an alive contract then return the code hash associated. + fn get_code_hash(&self, account: &T::AccountId) -> Option>; + /// If account has an alive contract then return the rent allowance associated. + fn get_rent_allowance(&self, account: &T::AccountId) -> Option>; + /// Returns false iff account has no alive contract nor tombstone. + fn contract_exists(&self, account: &T::AccountId) -> bool; fn get_balance(&self, account: &T::AccountId) -> BalanceOf; fn commit(&mut self, change_set: ChangeSet); @@ -62,10 +76,16 @@ pub trait AccountDb { pub struct DirectAccountDb; impl AccountDb for DirectAccountDb { fn get_storage(&self, _account: &T::AccountId, trie_id: Option<&TrieId>, location: &StorageKey) -> Option> { - trie_id.and_then(|id| child::get_raw(id, location)) + trie_id.and_then(|id| child::get_raw(id, &blake2_256(location))) + } + fn get_code_hash(&self, account: &T::AccountId) -> Option> { + >::get(account).and_then(|i| i.as_alive().map(|i| i.code_hash)) } - fn get_code(&self, account: &T::AccountId) -> Option> { - >::get(account) + fn get_rent_allowance(&self, account: &T::AccountId) -> Option> { + >::get(account).and_then(|i| i.as_alive().map(|i| i.rent_allowance)) + } + fn contract_exists(&self, account: &T::AccountId) -> bool { + >::exists(account) } fn get_balance(&self, account: &T::AccountId) -> BalanceOf { T::Currency::free_balance(account) @@ -83,42 +103,63 @@ impl AccountDb for DirectAccountDb { continue; } } - if changed.code.is_some() || !changed.storage.is_empty() { - let mut info = if !>::exists(&address) { - let info = AccountInfo { - trie_id: ::TrieIdGenerator::trie_id(&address), - storage_size: 0, - }; - >::insert(&address, &info); + + if changed.code_hash.is_some() + || changed.rent_allowance.is_some() + || !changed.storage.is_empty() + { + let old_info = match >::get(&address) { + Some(ContractInfo::Alive(alive)) => Some(alive), + None => None, + // Cannot commit changes to tombstone contract + Some(ContractInfo::Tombstone(_)) => continue, + }; + + let mut new_info = if let Some(info) = old_info.clone() { info + } else if let Some(code_hash) = changed.code_hash { + AliveContractInfo:: { + code_hash, + storage_size: >::storage_size_offset(), + trie_id: ::TrieIdGenerator::trie_id(&address), + deduct_block: >::block_number(), + rent_allowance: >::max_value(), + last_write: None, + } } else { - >::get(&address).unwrap() + // No contract exist and no code_hash provided + continue; }; - if let Some(code) = changed.code { - if let Some(code) = code { - >::insert(&address, code); - } else { - >::remove(&address); - } + if let Some(rent_allowance) = changed.rent_allowance { + new_info.rent_allowance = rent_allowance; + } + + if let Some(code_hash) = changed.code_hash { + new_info.code_hash = code_hash; + } + + if !changed.storage.is_empty() { + new_info.last_write = Some(>::block_number()); } - let mut new_storage_size = info.storage_size; for (k, v) in changed.storage.into_iter() { - if let Some(value) = child::get_raw(&info.trie_id[..], &k) { - new_storage_size -= value.len() as u64; + if let Some(value) = child::get_raw(&new_info.trie_id[..], &blake2_256(&k)) { + new_info.storage_size -= value.len() as u32; } if let Some(value) = v { - new_storage_size += value.len() as u64; - child::put_raw(&info.trie_id[..], &k, &value[..]); + new_info.storage_size += value.len() as u32; + child::put_raw(&new_info.trie_id[..], &blake2_256(&k), &value[..]); } else { - child::kill(&info.trie_id[..], &k); + child::kill(&new_info.trie_id[..], &blake2_256(&k)); } } - if new_storage_size != info.storage_size { - info.storage_size = new_storage_size; - >::insert(&address, info); + if old_info + .map(|old_info| old_info != new_info) + .unwrap_or(true) + { + >::insert(&address, ContractInfo::Alive(new_info)); } } } @@ -136,12 +177,10 @@ impl AccountDb for DirectAccountDb { } pub struct OverlayAccountDb<'a, T: Trait + 'a> { local: RefCell>, - underlying: &'a AccountDb, + underlying: &'a dyn AccountDb, } impl<'a, T: Trait> OverlayAccountDb<'a, T> { - pub fn new( - underlying: &'a AccountDb, - ) -> OverlayAccountDb<'a, T> { + pub fn new(underlying: &'a dyn AccountDb) -> OverlayAccountDb<'a, T> { OverlayAccountDb { local: RefCell::new(ChangeSet::new()), underlying, @@ -165,12 +204,31 @@ impl<'a, T: Trait> OverlayAccountDb<'a, T> { .insert(location, value); } - pub fn set_code(&mut self, account: &T::AccountId, code: Option>) { + /// Return an error if contract already exists (either if it is alive or tombstone) + pub fn create_contract( + &mut self, + account: &T::AccountId, + code_hash: CodeHash, + ) -> Result<(), &'static str> { + if self.contract_exists(account) { + return Err("Alive contract or tombstone already exists"); + } + + let mut local = self.local.borrow_mut(); + let contract = local.entry(account.clone()).or_insert_with(|| Default::default()); + + contract.code_hash = Some(code_hash); + contract.rent_allowance = Some(>::max_value()); + + Ok(()) + } + /// Assume contract exists + pub fn set_rent_allowance(&mut self, account: &T::AccountId, rent_allowance: BalanceOf) { self.local .borrow_mut() .entry(account.clone()) .or_insert(Default::default()) - .code = Some(code); + .rent_allowance = Some(rent_allowance); } pub fn set_balance(&mut self, account: &T::AccountId, balance: BalanceOf) { self.local @@ -190,12 +248,26 @@ impl<'a, T: Trait> AccountDb for OverlayAccountDb<'a, T> { .cloned() .unwrap_or_else(|| self.underlying.get_storage(account, trie_id, location)) } - fn get_code(&self, account: &T::AccountId) -> Option> { + fn get_code_hash(&self, account: &T::AccountId) -> Option> { self.local .borrow() .get(account) - .and_then(|a| a.code.clone()) - .unwrap_or_else(|| self.underlying.get_code(account)) + .and_then(|changes| changes.code_hash) + .or_else(|| self.underlying.get_code_hash(account)) + } + fn get_rent_allowance(&self, account: &T::AccountId) -> Option> { + self.local + .borrow() + .get(account) + .and_then(|changes| changes.rent_allowance) + .or_else(|| self.underlying.get_rent_allowance(account)) + } + fn contract_exists(&self, account: &T::AccountId) -> bool { + self.local + .borrow() + .get(account) + .map(|a| a.code_hash.is_some()) + .unwrap_or_else(|| self.underlying.contract_exists(account)) } fn get_balance(&self, account: &T::AccountId) -> BalanceOf { self.local @@ -211,12 +283,9 @@ impl<'a, T: Trait> AccountDb for OverlayAccountDb<'a, T> { match local.entry(address) { Entry::Occupied(e) => { let mut value = e.into_mut(); - if changed.balance.is_some() { - value.balance = changed.balance; - } - if changed.code.is_some() { - value.code = changed.code; - } + value.balance = changed.balance.or(value.balance); + value.code_hash = changed.code_hash.or(value.code_hash); + value.rent_allowance = changed.rent_allowance.or(value.rent_allowance); value.storage.extend(changed.storage.into_iter()); } Entry::Vacant(e) => { diff --git a/srml/contract/src/exec.rs b/srml/contract/src/exec.rs index 4e3d34c30fb8a400ce15452d550aca2a1b4981ab..7a16c9d60dc7c0ca0ffbf0033224eae1b4adc808 100644 --- a/srml/contract/src/exec.rs +++ b/srml/contract/src/exec.rs @@ -14,12 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use super::{CodeHash, Config, ContractAddressFor, Event, RawEvent, Trait, TrieId, BalanceOf, AccountInfoOf}; +use super::{CodeHash, Config, ContractAddressFor, Event, RawEvent, Trait, + TrieId, BalanceOf, ContractInfoOf}; use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb}; use crate::gas::{GasMeter, Token, approx_gas_for_balance}; use rstd::prelude::*; -use runtime_primitives::traits::{CheckedAdd, CheckedSub, Zero}; +use runtime_primitives::traits::{Bounded, CheckedAdd, CheckedSub, Zero}; use srml_support::{StorageMap, traits::{WithdrawReason, Currency}}; use timestamp; @@ -28,6 +29,9 @@ pub type CallOf = ::Call; pub type MomentOf = ::Moment; pub type SeedOf = ::Hash; +/// A type that represents a topic of an event. At the moment a hash is used. +pub type TopicOf = ::Hash; + #[cfg_attr(test, derive(Debug))] pub struct InstantiateReceipt { pub address: AccountId, @@ -102,11 +106,19 @@ pub trait Ext { /// Returns a reference to the timestamp of the current block fn now(&self) -> &MomentOf; - /// Returns a reference to the random seed for the current block - fn random_seed(&self) -> &SeedOf; + /// Returns a random number for the current block with the given subject. + fn random(&self, subject: &[u8]) -> SeedOf; + + /// Deposit an event with the given topics. + /// + /// There should not be any duplicates in `topics`. + fn deposit_event(&mut self, topics: Vec>, data: Vec); + + /// Set rent allowance of the contract + fn set_rent_allowance(&mut self, rent_allowance: BalanceOf); - /// Deposit an event. - fn deposit_event(&mut self, data: Vec); + /// Rent allowance of the contract + fn rent_allowance(&self) -> BalanceOf; } /// Loader is a companion of the `Vm` trait. It loads an appropriate abstract @@ -182,6 +194,15 @@ impl VmExecResult { } } +/// Struct that records a request to deposit an event with a list of topics. +#[cfg_attr(any(feature = "std", test), derive(Debug, PartialEq, Eq))] +pub struct IndexedEvent { + /// A list of topics this event will be deposited with. + pub topics: Vec, + /// The event to deposit. + pub event: Event, +} + /// A trait that represent a virtual machine. /// /// You can view a virtual machine as something that takes code, an input data buffer, @@ -231,7 +252,7 @@ pub struct ExecutionContext<'a, T: Trait + 'a, V, L> { pub self_trie_id: Option, pub overlay: OverlayAccountDb<'a, T>, pub depth: usize, - pub events: Vec>, + pub events: Vec>, pub calls: Vec<(T::AccountId, T::Call)>, pub config: &'a Config, pub vm: &'a V, @@ -249,7 +270,8 @@ where /// The specified `origin` address will be used as `sender` for pub fn top_level(origin: T::AccountId, cfg: &'a Config, vm: &'a V, loader: &'a L) -> Self { ExecutionContext { - self_trie_id: >::get(&origin).map(|s| s.trie_id), + self_trie_id: >::get(&origin) + .and_then(|i| i.as_alive().map(|i| i.trie_id.clone())), self_account: origin, overlay: OverlayAccountDb::::new(&DirectAccountDb), depth: 0, @@ -263,7 +285,8 @@ where fn nested(&self, overlay: OverlayAccountDb<'a, T>, dest: T::AccountId) -> Self { ExecutionContext { - self_trie_id: >::get(&dest).map(|s| s.trie_id), + self_trie_id: >::get(&dest) + .and_then(|i| i.as_alive().map(|i| i.trie_id.clone())), self_account: dest, overlay, depth: self.depth + 1, @@ -295,7 +318,11 @@ where return Err("not enough gas to pay base call fee"); } - let dest_code_hash = self.overlay.get_code(&dest); + // Assumption: pay_rent doesn't collide with overlay because + // pay_rent will be done on first call and dest contract and balance + // cannot be changed before the first call + crate::rent::pay_rent::(&dest); + let mut output_data = Vec::new(); let (change_set, events, calls) = { @@ -315,7 +342,7 @@ where )?; } - if let Some(dest_code_hash) = dest_code_hash { + if let Some(dest_code_hash) = self.overlay.get_code_hash(&dest) { let executable = self.loader.load_main(&dest_code_hash)?; output_data = self .vm @@ -326,7 +353,6 @@ where caller: self.self_account.clone(), value_transferred: value, timestamp: timestamp::Module::::now(), - random_seed: system::Module::::random_seed(), }, input_data, empty_output_buf, @@ -369,15 +395,11 @@ where &self.self_account, ); - if self.overlay.get_code(&dest).is_some() { - // It should be enough to check only the code. - return Err("contract already exists"); - } - let (change_set, events, calls) = { let mut overlay = OverlayAccountDb::new(&self.overlay); - - overlay.set_code(&dest, Some(code_hash.clone())); + + overlay.create_contract(&dest, code_hash.clone())?; + let mut nested = self.nested(overlay, dest.clone()); // Send funds unconditionally here. If the `endowment` is below existential_deposit @@ -400,7 +422,6 @@ where caller: self.self_account.clone(), value_transferred: endowment, timestamp: timestamp::Module::::now(), - random_seed: system::Module::::random_seed(), }, input_data, EmptyOutputBuf::new(), @@ -409,7 +430,10 @@ where .into_result()?; // Deposit an instantiation event. - nested.events.push(RawEvent::Instantiated(self.self_account.clone(), dest.clone())); + nested.events.push(IndexedEvent { + event: RawEvent::Instantiated(self.self_account.clone(), dest.clone()), + topics: Vec::new(), + }); (nested.overlay.into_change_set(), nested.events, nested.calls) }; @@ -536,8 +560,10 @@ fn transfer<'a, T: Trait, V: Vm, L: Loader>( if transactor != dest { ctx.overlay.set_balance(transactor, new_from_balance); ctx.overlay.set_balance(dest, new_to_balance); - ctx.events - .push(RawEvent::Transfer(transactor.clone(), dest.clone(), value)); + ctx.events.push(IndexedEvent { + event: RawEvent::Transfer(transactor.clone(), dest.clone(), value), + topics: Vec::new(), + }); } Ok(()) @@ -548,7 +574,6 @@ struct CallContext<'a, 'b: 'a, T: Trait + 'b, V: Vm + 'b, L: Loader> { caller: T::AccountId, value_transferred: BalanceOf, timestamp: T::Moment, - random_seed: T::Hash, } impl<'a, 'b: 'a, T, E, V, L> Ext for CallContext<'a, 'b, T, V, L> @@ -614,16 +639,28 @@ where self.value_transferred } - fn random_seed(&self) -> &T::Hash { - &self.random_seed + fn random(&self, subject: &[u8]) -> SeedOf { + system::Module::::random(subject) } fn now(&self) -> &T::Moment { &self.timestamp } - fn deposit_event(&mut self, data: Vec) { - self.ctx.events.push(RawEvent::Contract(self.ctx.self_account.clone(), data)); + fn deposit_event(&mut self, topics: Vec, data: Vec) { + self.ctx.events.push(IndexedEvent { + topics, + event: RawEvent::Contract(self.ctx.self_account.clone(), data), + }); + } + + fn set_rent_allowance(&mut self, rent_allowance: BalanceOf) { + self.ctx.overlay.set_rent_allowance(&self.ctx.self_account, rent_allowance) + } + + fn rent_allowance(&self) -> BalanceOf { + self.ctx.overlay.get_rent_allowance(&self.ctx.self_account) + .unwrap_or(>::max_value()) // Must never be triggered actually } } @@ -640,8 +677,8 @@ where #[cfg(test)] mod tests { use super::{ - ExecFeeToken, ExecutionContext, Ext, Loader, EmptyOutputBuf, TransferFeeKind, TransferFeeToken, - Vm, VmExecResult, InstantiateReceipt, RawEvent, + BalanceOf, ExecFeeToken, ExecutionContext, Ext, Loader, EmptyOutputBuf, TransferFeeKind, TransferFeeToken, + Vm, VmExecResult, InstantiateReceipt, RawEvent, IndexedEvent, }; use crate::account_db::AccountDb; use crate::gas::GasMeter; @@ -666,7 +703,7 @@ mod tests { } #[derive(Clone)] - struct MockExecutable<'a>(Rc VmExecResult + 'a>); + struct MockExecutable<'a>(Rc VmExecResult + 'a>); impl<'a> MockExecutable<'a> { fn new(f: impl Fn(MockCtx) -> VmExecResult + 'a) -> Self { @@ -763,7 +800,7 @@ mod tests { with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); - ctx.overlay.set_code(&BOB, Some(exec_ch)); + ctx.overlay.create_contract(&BOB, exec_ch).unwrap(); assert_matches!( ctx.call(BOB, value, &mut gas_meter, &data, EmptyOutputBuf::new()), @@ -998,7 +1035,7 @@ mod tests { with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(origin, &cfg, &vm, &loader); - ctx.overlay.set_code(&BOB, Some(return_ch)); + ctx.overlay.create_contract(&BOB, return_ch).unwrap(); let result = ctx.call( dest, @@ -1026,7 +1063,7 @@ mod tests { with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); - ctx.overlay.set_code(&BOB, Some(input_data_ch)); + ctx.overlay.create_contract(&BOB, input_data_ch).unwrap(); let result = ctx.call( BOB, @@ -1038,7 +1075,7 @@ mod tests { assert_matches!(result, Ok(_)); }); - // This one tests passing the input data into a contract via call. + // This one tests passing the input data into a contract via instantiate. with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); @@ -1085,7 +1122,7 @@ mod tests { with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); - ctx.overlay.set_code(&BOB, Some(recurse_ch)); + ctx.overlay.create_contract(&BOB, recurse_ch).unwrap(); let result = ctx.call( BOB, @@ -1132,8 +1169,8 @@ mod tests { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(origin, &cfg, &vm, &loader); - ctx.overlay.set_code(&dest, Some(bob_ch)); - ctx.overlay.set_code(&CHARLIE, Some(charlie_ch)); + ctx.overlay.create_contract(&dest, bob_ch).unwrap(); + ctx.overlay.create_contract(&CHARLIE, charlie_ch).unwrap(); let result = ctx.call( dest, @@ -1175,8 +1212,8 @@ mod tests { with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); - ctx.overlay.set_code(&BOB, Some(bob_ch)); - ctx.overlay.set_code(&CHARLIE, Some(charlie_ch)); + ctx.overlay.create_contract(&BOB, bob_ch).unwrap(); + ctx.overlay.create_contract(&CHARLIE, charlie_ch).unwrap(); let result = ctx.call( BOB, @@ -1242,10 +1279,16 @@ mod tests { // Check that the newly created account has the expected code hash and // there are instantiation event. - assert_eq!(ctx.overlay.get_code(&created_contract_address).unwrap(), dummy_ch); + assert_eq!(ctx.overlay.get_code_hash(&created_contract_address).unwrap(), dummy_ch); assert_eq!(&ctx.events, &[ - RawEvent::Transfer(ALICE, created_contract_address, 100), - RawEvent::Instantiated(ALICE, created_contract_address), + IndexedEvent { + event: RawEvent::Transfer(ALICE, created_contract_address, 100), + topics: Vec::new(), + }, + IndexedEvent { + event: RawEvent::Instantiated(ALICE, created_contract_address), + topics: Vec::new(), + } ]); } ); @@ -1283,7 +1326,7 @@ mod tests { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); ctx.overlay.set_balance(&ALICE, 1000); - ctx.overlay.set_code(&BOB, Some(creator_ch)); + ctx.overlay.create_contract(&BOB, creator_ch).unwrap(); assert_matches!( ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), &[], EmptyOutputBuf::new()), @@ -1294,11 +1337,20 @@ mod tests { // Check that the newly created account has the expected code hash and // there are instantiation event. - assert_eq!(ctx.overlay.get_code(&created_contract_address).unwrap(), dummy_ch); + assert_eq!(ctx.overlay.get_code_hash(&created_contract_address).unwrap(), dummy_ch); assert_eq!(&ctx.events, &[ - RawEvent::Transfer(ALICE, BOB, 20), - RawEvent::Transfer(BOB, created_contract_address, 15), - RawEvent::Instantiated(BOB, created_contract_address), + IndexedEvent { + event: RawEvent::Transfer(ALICE, BOB, 20), + topics: Vec::new(), + }, + IndexedEvent { + event: RawEvent::Transfer(BOB, created_contract_address, 15), + topics: Vec::new(), + }, + IndexedEvent { + event: RawEvent::Instantiated(BOB, created_contract_address), + topics: Vec::new(), + }, ]); } ); @@ -1334,7 +1386,7 @@ mod tests { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); ctx.overlay.set_balance(&ALICE, 1000); - ctx.overlay.set_code(&BOB, Some(creator_ch)); + ctx.overlay.create_contract(&BOB, creator_ch).unwrap(); assert_matches!( ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), &[], EmptyOutputBuf::new()), @@ -1344,9 +1396,37 @@ mod tests { // The contract wasn't created so we don't expect to see an instantiation // event here. assert_eq!(&ctx.events, &[ - RawEvent::Transfer(ALICE, BOB, 20), + IndexedEvent { + event: RawEvent::Transfer(ALICE, BOB, 20), + topics: Vec::new(), + }, ]); } ); } + + #[test] + fn rent_allowance() { + let vm = MockVm::new(); + let mut loader = MockLoader::empty(); + let rent_allowance_ch = loader.insert(|ctx| { + assert_eq!(ctx.ext.rent_allowance(), >::max_value()); + ctx.ext.set_rent_allowance(10); + assert_eq!(ctx.ext.rent_allowance(), 10); + VmExecResult::Ok + }); + + with_externalities(&mut ExtBuilder::default().build(), || { + let cfg = Config::preload(); + let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); + + let result = ctx.instantiate( + 0, + &mut GasMeter::::with_limit(10000, 1), + &rent_allowance_ch, + &[], + ); + assert_matches!(result, Ok(_)); + }); + } } diff --git a/srml/contract/src/gas.rs b/srml/contract/src/gas.rs index b7244169c4f94a8af1b75449a9575a0e2e23f045..1ea519634463c7ed232e99f1ad9c363247c0ca20 100644 --- a/srml/contract/src/gas.rs +++ b/srml/contract/src/gas.rs @@ -16,7 +16,7 @@ use crate::{GasSpent, Module, Trait, BalanceOf, NegativeImbalanceOf}; use runtime_primitives::BLOCK_FULL; -use runtime_primitives::traits::{As, CheckedMul, CheckedSub, Zero}; +use runtime_primitives::traits::{CheckedMul, CheckedSub, Zero, SaturatedConversion}; use srml_support::{StorageValue, traits::{OnUnbalanced, ExistenceRequirement, WithdrawReason, Currency, Imbalance}}; #[cfg(test)] @@ -212,7 +212,7 @@ pub fn buy_gas( // Buy the specified amount of gas. let gas_price = >::gas_price(); - let cost = >>::as_(gas_limit.clone()) + let cost = gas_limit.clone().into() .checked_mul(&gas_price) .ok_or("overflow multiplying gas limit by price")?; @@ -248,18 +248,17 @@ pub fn refund_unused_gas( >::mutate(|block_gas_spent| *block_gas_spent += gas_spent); // Refund gas left by the price it was bought at. - let refund = >>::as_(gas_left) * gas_meter.gas_price; + let refund = gas_left.into() * gas_meter.gas_price; let refund_imbalance = T::Currency::deposit_creating(transactor, refund); if let Ok(imbalance) = imbalance.offset(refund_imbalance) { T::GasPayment::on_unbalanced(imbalance); } } -/// A little handy utility for converting a value in balance units into approximitate value in gas units +/// A little handy utility for converting a value in balance units into approximate value in gas units /// at the given gas price. pub fn approx_gas_for_balance(gas_price: BalanceOf, balance: BalanceOf) -> T::Gas { - let amount_in_gas: BalanceOf = balance / gas_price; - >>::sa(amount_in_gas) + (balance / gas_price).saturated_into::() } /// A simple utility macro that helps to match against a @@ -316,7 +315,7 @@ mod tests { struct DoubleTokenMetadata { multiplier: u64, } - /// A simple token that charges for the given amount multipled to + /// A simple token that charges for the given amount multiplied to /// a multiplier taken from a given metadata. #[derive(Copy, Clone, PartialEq, Eq, Debug)] struct DoubleToken(u64); @@ -324,7 +323,7 @@ mod tests { impl Token for DoubleToken { type Metadata = DoubleTokenMetadata; fn calculate_amount(&self, metadata: &DoubleTokenMetadata) -> u64 { - // Probably you want to use saturating mul in producation code. + // Probably you want to use saturating mul in production code. self.0 * metadata.multiplier } } diff --git a/srml/contract/src/lib.rs b/srml/contract/src/lib.rs index 490e3878a04972d7ae3f675f82b39722a1735505..0111ce7840204e6112045579fe32349c6770eceb 100644 --- a/srml/contract/src/lib.rs +++ b/srml/contract/src/lib.rs @@ -83,6 +83,7 @@ mod gas; mod account_db; mod exec; mod wasm; +mod rent; #[cfg(test)] mod tests; @@ -93,12 +94,16 @@ use crate::account_db::{AccountDb, DirectAccountDb}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; use substrate_primitives::crypto::UncheckedFrom; -use rstd::prelude::*; -use rstd::marker::PhantomData; +use rstd::{prelude::*, marker::PhantomData, convert::TryFrom}; use parity_codec::{Codec, Encode, Decode}; -use runtime_primitives::traits::{Hash, As, SimpleArithmetic,Bounded, StaticLookup}; +use runtime_io::blake2_256; +use runtime_primitives::traits::{ + Hash, SimpleArithmetic, Bounded, StaticLookup, Zero, MaybeSerializeDebug, Member +}; use srml_support::dispatch::{Result, Dispatchable}; -use srml_support::{Parameter, StorageMap, StorageValue, decl_module, decl_event, decl_storage, storage::child}; +use srml_support::{ + Parameter, StorageMap, StorageValue, decl_module, decl_event, decl_storage, storage::child +}; use srml_support::traits::{OnFreeBalanceZero, OnUnbalanced, Currency}; use system::{ensure_signed, RawOrigin}; use substrate_primitives::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX; @@ -117,14 +122,109 @@ pub trait ComputeDispatchFee { fn compute_dispatch_fee(call: &Call) -> Balance; } -#[derive(Encode,Decode,Clone,Debug)] +/// Information for managing an acocunt and its sub trie abstraction. +/// This is the required info to cache for an account +#[derive(Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum ContractInfo { + Alive(AliveContractInfo), + Tombstone(TombstoneContractInfo), +} + +impl ContractInfo { + /// If contract is alive then return some alive info + pub fn get_alive(self) -> Option> { + if let ContractInfo::Alive(alive) = self { + Some(alive) + } else { + None + } + } + /// If contract is alive then return some reference to alive info + pub fn as_alive(&self) -> Option<&AliveContractInfo> { + if let ContractInfo::Alive(ref alive) = self { + Some(alive) + } else { + None + } + } + /// If contract is alive then return some mutable reference to alive info + pub fn as_alive_mut(&mut self) -> Option<&mut AliveContractInfo> { + if let ContractInfo::Alive(ref mut alive) = self { + Some(alive) + } else { + None + } + } + + /// If contract is tombstone then return some alive info + pub fn get_tombstone(self) -> Option> { + if let ContractInfo::Tombstone(tombstone) = self { + Some(tombstone) + } else { + None + } + } + /// If contract is tombstone then return some reference to tombstone info + pub fn as_tombstone(&self) -> Option<&TombstoneContractInfo> { + if let ContractInfo::Tombstone(ref tombstone) = self { + Some(tombstone) + } else { + None + } + } + /// If contract is tombstone then return some mutable reference to tombstone info + pub fn as_tombstone_mut(&mut self) -> Option<&mut TombstoneContractInfo> { + if let ContractInfo::Tombstone(ref mut tombstone) = self { + Some(tombstone) + } else { + None + } + } +} + +pub type AliveContractInfo = + RawAliveContractInfo, BalanceOf, ::BlockNumber>; + /// Information for managing an account and its sub trie abstraction. /// This is the required info to cache for an account. -pub struct AccountInfo { - /// Unique ID for the subtree encoded as a byte. +// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. +#[derive(Encode, Decode, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct RawAliveContractInfo { + /// Unique ID for the subtree encoded as a bytes vector. pub trie_id: TrieId, /// The size of stored value in octet. - pub storage_size: u64, + pub storage_size: u32, + /// The code associated with a given account. + pub code_hash: CodeHash, + /// Pay rent at most up to this value. + pub rent_allowance: Balance, + /// Last block rent has been payed. + pub deduct_block: BlockNumber, + /// Last block child storage has been written. + pub last_write: Option, +} + +pub type TombstoneContractInfo = + RawTombstoneContractInfo<::Hash, ::Hashing>; + +// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. +#[derive(Encode, Decode, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct RawTombstoneContractInfo(H, PhantomData); + +impl RawTombstoneContractInfo +where + H: Member + MaybeSerializeDebug + AsRef<[u8]> + AsMut<[u8]> + Copy + Default + rstd::hash::Hash, + Hasher: Hash, +{ + fn new(storage_root: &[u8], code_hash: H) -> Self { + let mut buf = Vec::new(); + storage_root.using_encoded(|encoded| buf.extend_from_slice(encoded)); + buf.extend_from_slice(code_hash.as_ref()); + RawTombstoneContractInfo(Hasher::hash(&buf[..]), PhantomData) + } } /// Get a trie id (trie id must be unique and collision resistant depending upon its context). @@ -155,7 +255,10 @@ where fn trie_id(account_id: &T::AccountId) -> TrieId { // Note that skipping a value due to error is not an issue here. // We only need uniqueness, not sequence. - let new_seed = AccountCounter::mutate(|v| v.wrapping_add(1)); + let new_seed = >::mutate(|v| { + *v = v.wrapping_add(1); + *v + }); let mut buf = Vec::new(); buf.extend_from_slice(account_id.as_ref()); @@ -171,7 +274,8 @@ where } pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; -pub type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +pub type NegativeImbalanceOf = + <::Currency as Currency<::AccountId>>::NegativeImbalance; pub trait Trait: timestamp::Trait { type Currency: Currency; @@ -182,8 +286,8 @@ pub trait Trait: timestamp::Trait { /// The overarching event type. type Event: From> + Into<::Event>; - // `As` is needed for wasm-utils - type Gas: Parameter + Default + Codec + SimpleArithmetic + Bounded + Copy + As> + As + As; + type Gas: Parameter + Default + Codec + SimpleArithmetic + Bounded + Copy + + Into> + TryFrom>; /// A function type to get the contract address given the creator. type DetermineContractAddress: ContractAddressFor, Self::AccountId>; @@ -229,10 +333,10 @@ where pub struct DefaultDispatchFeeComputor(PhantomData); impl ComputeDispatchFee> for DefaultDispatchFeeComputor { fn compute_dispatch_fee(call: &T::Call) -> BalanceOf { - let encoded_len = call.using_encoded(|encoded| encoded.len()); + let encoded_len = call.using_encoded(|encoded| encoded.len() as u32); let base_fee = >::transaction_base_fee(); let byte_fee = >::transaction_byte_fee(); - base_fee + byte_fee * as As>::sa(encoded_len as u64) + base_fee + byte_fee * encoded_len.into() } } @@ -244,7 +348,7 @@ decl_module! { /// Updates the schedule for metering contracts. /// /// The schedule must have a greater version than the stored schedule. - fn update_schedule(schedule: Schedule) -> Result { + pub fn update_schedule(schedule: Schedule) -> Result { if >::current_schedule().version >= schedule.version { return Err("new schedule must have a greater version than current"); } @@ -257,7 +361,7 @@ decl_module! { /// Stores the given binary Wasm code into the chain's storage and returns its `codehash`. /// You can instantiate contracts only with stored code. - fn put_code( + pub fn put_code( origin, #[compact] gas_limit: T::Gas, code: Vec @@ -284,7 +388,7 @@ decl_module! { /// * If the account is a regular account, any value will be transferred. /// * If no account exists and the call value is not less than `existential_deposit`, /// a regular account will be created and any value will be transferred. - fn call( + pub fn call( origin, dest: ::Source, #[compact] value: BalanceOf, @@ -308,11 +412,16 @@ decl_module! { let result = ctx.call(dest, value, &mut gas_meter, &data, exec::EmptyOutputBuf::new()); if let Ok(_) = result { - // Commit all changes that made it thus far into the persistant storage. + // Commit all changes that made it thus far into the persistent storage. DirectAccountDb.commit(ctx.overlay.into_change_set()); // Then deposit all events produced. - ctx.events.into_iter().for_each(Self::deposit_event); + ctx.events.into_iter().for_each(|indexed_event| { + >::deposit_event_indexed( + &*indexed_event.topics, + ::Event::from(indexed_event.event).into(), + ); + }); } // Refund cost of the unused gas. @@ -340,7 +449,7 @@ decl_module! { /// after the execution is saved as the `code` of the account. That code will be invoked /// upon any call received by this account. /// - The contract is initialized. - fn create( + pub fn create( origin, #[compact] endowment: BalanceOf, #[compact] gas_limit: T::Gas, @@ -362,11 +471,16 @@ decl_module! { let result = ctx.instantiate(endowment, &mut gas_meter, &code_hash, &data); if let Ok(_) = result { - // Commit all changes that made it thus far into the persistant storage. + // Commit all changes that made it thus far into the persistent storage. DirectAccountDb.commit(ctx.overlay.into_change_set()); // Then deposit all events produced. - ctx.events.into_iter().for_each(Self::deposit_event); + ctx.events.into_iter().for_each(|indexed_event| { + >::deposit_event_indexed( + &*indexed_event.topics, + ::Event::from(indexed_event.event).into(), + ); + }); } // Refund cost of the unused gas. @@ -384,6 +498,117 @@ decl_module! { result.map(|_| ()) } + /// Allows block producers to claim a small reward for evicting a contract. If a block producer + /// fails to do so, a regular users will be allowed to claim the reward. + /// + /// If contract is not evicted as a result of this call, no actions are taken and + /// the sender is not eligible for the reward. + fn claim_surcharge(origin, dest: T::AccountId, aux_sender: Option) { + let origin = origin.into(); + let (signed, rewarded) = match origin { + Ok(system::RawOrigin::Signed(ref account)) if aux_sender.is_none() => { + (true, account) + }, + Ok(system::RawOrigin::None) if aux_sender.is_some() => { + (false, aux_sender.as_ref().expect("checked above")) + }, + _ => return Err("Invalid surcharge claim: origin must be signed or \ + inherent and auxiliary sender only provided on inherent") + }; + + // Add some advantage for block producers (who send unsigned extrinsics) by + // adding a handicap: for signed extrinsics we use a slightly older block number + // for the eviction check. This can be viewed as if we pushed regular users back in past. + let handicap = if signed { + >::signed_claim_handicap() + } else { + Zero::zero() + }; + + // If poking the contract has lead to eviction of the contract, give out the rewards. + if rent::try_evict::(&dest, handicap) == rent::RentOutcome::Evicted { + T::Currency::deposit_into_existing(rewarded, Self::surcharge_reward())?; + } + } + + /// Allows a contract to restore a tombstone by giving its storage. + /// + /// The contract that wants to restore (i.e. origin of the call, or `msg.sender` in Solidity terms) will compute a + /// tombstone with its storage and the given code_hash. If the computed tombstone + /// match the destination one, the destination contract is restored with the rent_allowance` specified, + /// while the origin sends all its funds to the destination and is removed. + fn restore_to( + origin, + dest: T::AccountId, + code_hash: CodeHash, + rent_allowance: BalanceOf, + delta: Vec + ) { + let origin = ensure_signed(origin)?; + + let mut origin_contract = >::get(&origin) + .and_then(|c| c.get_alive()) + .ok_or("Cannot restore from inexisting or tombstone contract")?; + + let current_block = >::block_number(); + + if origin_contract.last_write == Some(current_block) { + return Err("Origin TrieId written in the current block"); + } + + let dest_tombstone = >::get(&dest) + .and_then(|c| c.get_tombstone()) + .ok_or("Cannot restore to inexisting or alive contract")?; + + let last_write = if !delta.is_empty() { + Some(current_block) + } else { + origin_contract.last_write + }; + + let key_values_taken = delta.iter() + .filter_map(|key| { + child::get_raw(&origin_contract.trie_id, &blake2_256(key)).map(|value| { + child::kill(&origin_contract.trie_id, &blake2_256(key)); + (key, value) + }) + }) + .collect::>(); + + let tombstone = >::new( + // This operation is cheap enough because last_write (delta not included) + // is not this block as it has been checked earlier. + &runtime_io::child_storage_root(&origin_contract.trie_id)[..], + code_hash, + ); + + if tombstone != dest_tombstone { + for (key, value) in key_values_taken { + child::put_raw(&origin_contract.trie_id, &blake2_256(key), &value); + } + + return Err("Tombstones don't match"); + } + + origin_contract.storage_size -= key_values_taken.iter() + .map(|(_, value)| value.len() as u32) + .sum::(); + + >::remove(&origin); + >::insert(&dest, ContractInfo::Alive(RawAliveContractInfo { + trie_id: origin_contract.trie_id, + storage_size: origin_contract.storage_size, + code_hash, + rent_allowance, + deduct_block: current_block, + last_write, + })); + + let origin_free_balance = T::Currency::free_balance(&origin); + T::Currency::make_free_balance_be(&origin, >::zero()); + T::Currency::deposit_creating(&dest, origin_free_balance); + } + fn on_finalize() { >::kill(); } @@ -420,6 +645,29 @@ decl_event! { decl_storage! { trait Store for Module as Contract { + /// Number of block delay an extrinsic claim surcharge has. + /// + /// When claim surchage is called by an extrinsic the rent is checked + /// for current_block - delay + SignedClaimHandicap get(signed_claim_handicap) config(): T::BlockNumber; + /// The minimum amount required to generate a tombstone. + TombstoneDeposit get(tombstone_deposit) config(): BalanceOf; + /// Size of a contract at the time of creation. This is a simple way to ensure + /// that empty contracts eventually gets deleted. + StorageSizeOffset get(storage_size_offset) config(): u32; + /// Price of a byte of storage per one block interval. Should be greater than 0. + RentByteFee get(rent_byte_price) config(): BalanceOf; + /// The amount of funds a contract should deposit in order to offset + /// the cost of one byte. + /// + /// Let's suppose the deposit is 1,000 BU (balance units)/byte and the rent is 1 BU/byte/day, + /// then a contract with 1,000,000 BU that uses 1,000 bytes of storage would pay no rent. + /// But if the balance reduced to 500,000 BU and the storage stayed the same at 1,000, + /// then it would pay 500 BU/day. + RentDepositOffset get(rent_deposit_offset) config(): BalanceOf; + /// Reward that is received by the party whose touch has led + /// to removal of a contract. + SurchargeReward get(surcharge_reward) config(): BalanceOf; /// The fee required to make a transfer. TransferFee get(transfer_fee) config(): BalanceOf; /// The fee required to create an account. @@ -429,23 +677,21 @@ decl_storage! { /// The fee to be paid for making a transaction; the per-byte portion. TransactionByteFee get(transaction_byte_fee) config(): BalanceOf; /// The fee required to create a contract instance. - ContractFee get(contract_fee) config(): BalanceOf = BalanceOf::::sa(21); + ContractFee get(contract_fee) config(): BalanceOf = 21.into(); /// The base fee charged for calling into a contract. - CallBaseFee get(call_base_fee) config(): T::Gas = T::Gas::sa(135); + CallBaseFee get(call_base_fee) config(): T::Gas = 135.into(); /// The base fee charged for creating a contract. - CreateBaseFee get(create_base_fee) config(): T::Gas = T::Gas::sa(175); + CreateBaseFee get(create_base_fee) config(): T::Gas = 175.into(); /// The price of one unit of gas. - GasPrice get(gas_price) config(): BalanceOf = BalanceOf::::sa(1); + GasPrice get(gas_price) config(): BalanceOf = 1.into(); /// The maximum nesting level of a call/create stack. MaxDepth get(max_depth) config(): u32 = 100; /// The maximum amount of gas that could be expended per block. - BlockGasLimit get(block_gas_limit) config(): T::Gas = T::Gas::sa(1_000_000); + BlockGasLimit get(block_gas_limit) config(): T::Gas = 10_000_000.into(); /// Gas spent so far in this block. GasSpent get(gas_spent): T::Gas; /// Current cost schedule for contracts. CurrentSchedule get(current_schedule) config(): Schedule = Schedule::default(); - /// The code associated with a given account. - pub CodeHashOf: map T::AccountId => Option>; /// A mapping from an original code hash to the original code, untouched by instrumentation. pub PristineCode: map CodeHash => Option>; /// A mapping between an original code hash and instrumented wasm code, ready for execution. @@ -453,14 +699,16 @@ decl_storage! { /// The subtrie counter. pub AccountCounter: u64 = 0; /// The code associated with a given account. - pub AccountInfoOf: map T::AccountId => Option; + pub ContractInfoOf: map T::AccountId => Option>; } } impl OnFreeBalanceZero for Module { fn on_free_balance_zero(who: &T::AccountId) { - >::remove(who); - >::get(who).map(|info| child::kill_storage(&info.trie_id)); + if let Some(ContractInfo::Alive(info)) = >::get(who) { + child::kill_storage(&info.trie_id); + } + >::remove(who); } } @@ -516,8 +764,11 @@ pub struct Schedule { /// Gas cost to deposit an event; the per-byte portion. pub event_data_per_byte_cost: Gas, + /// Gas cost to deposit an event; the cost per topic. + pub event_per_topic_cost: Gas, + /// Gas cost to deposit an event; the base. - pub event_data_base_cost: Gas, + pub event_base_cost: Gas, /// Gas cost per one byte read from the sandbox memory. pub sandbox_data_read_cost: Gas, @@ -525,6 +776,9 @@ pub struct Schedule { /// Gas cost per one byte written to the sandbox memory. pub sandbox_data_write_cost: Gas, + /// The maximum number of topics supported by an event. + pub max_event_topics: u32, + /// Maximum allowed stack height. /// /// See https://wiki.parity.io/WebAssembly-StackHeight to find out @@ -537,23 +791,29 @@ pub struct Schedule { /// Whether the `ext_println` function is allowed to be used contracts. /// MUST only be enabled for `dev` chains, NOT for production chains pub enable_println: bool, + + /// The maximum length of a subject used for PRNG generation. + pub max_subject_len: u32, } -impl> Default for Schedule { +impl> Default for Schedule { fn default() -> Schedule { Schedule { version: 0, - put_code_per_byte_cost: Gas::sa(1), - grow_mem_cost: Gas::sa(1), - regular_op_cost: Gas::sa(1), - return_data_per_byte_cost: Gas::sa(1), - event_data_per_byte_cost: Gas::sa(1), - event_data_base_cost: Gas::sa(1), - sandbox_data_read_cost: Gas::sa(1), - sandbox_data_write_cost: Gas::sa(1), + put_code_per_byte_cost: 1.into(), + grow_mem_cost: 1.into(), + regular_op_cost: 1.into(), + return_data_per_byte_cost: 1.into(), + event_data_per_byte_cost: 1.into(), + event_per_topic_cost: 1.into(), + event_base_cost: 1.into(), + sandbox_data_read_cost: 1.into(), + sandbox_data_write_cost: 1.into(), + max_event_topics: 4, max_stack_height: 64 * 1024, max_memory_pages: 16, enable_println: false, + max_subject_len: 32, } } } diff --git a/srml/contract/src/rent.rs b/srml/contract/src/rent.rs new file mode 100644 index 0000000000000000000000000000000000000000..3baf043b90d37d16ceefd29e141f5c727a5d3eb0 --- /dev/null +++ b/srml/contract/src/rent.rs @@ -0,0 +1,194 @@ +// Copyright 2019 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 . + +use crate::{BalanceOf, ContractInfo, ContractInfoOf, Module, TombstoneContractInfo, Trait}; +use runtime_primitives::traits::{Bounded, CheckedDiv, CheckedMul, Saturating, Zero, + SaturatedConversion}; +use srml_support::traits::{Currency, ExistenceRequirement, Imbalance, WithdrawReason}; +use srml_support::StorageMap; + +#[derive(PartialEq, Eq, Copy, Clone)] +#[must_use] +pub enum RentOutcome { + /// Exempted from rent iff: + /// * rent is offset completely by the `rent_deposit_offset`, + /// * or rent has already been paid for this block number, + /// * or account doesn't have a contract, + /// * or account has a tombstone. + Exempted, + /// Evicted iff: + /// * rent exceed rent allowance, + /// * or can't withdraw the rent, + /// * or go below subsistence threshold. + Evicted, + /// The outstanding dues were paid or were able to be paid. + Ok, +} + +/// Evict and optionally pay dues (or check account can pay them otherwise) at the current +/// block number (modulo `handicap`, read on). +/// +/// `pay_rent` gives an ability to pay or skip paying rent. +/// `handicap` gives a way to check or pay the rent up to a moment in the past instead +/// of current block. +/// +/// NOTE: This function acts eagerly, all modification are committed into the storage. +fn try_evict_or_and_pay_rent( + account: &T::AccountId, + handicap: T::BlockNumber, + pay_rent: bool, +) -> RentOutcome { + let contract = match >::get(account) { + None | Some(ContractInfo::Tombstone(_)) => return RentOutcome::Exempted, + Some(ContractInfo::Alive(contract)) => contract, + }; + + let current_block_number = >::block_number(); + + // How much block has passed since the last deduction for the contract. + let blocks_passed = { + // Calculate an effective block number, i.e. after adjusting for handicap. + let effective_block_number = current_block_number.saturating_sub(handicap); + let n = effective_block_number.saturating_sub(contract.deduct_block); + if n.is_zero() { + // Rent has already been paid + return RentOutcome::Exempted; + } + n + }; + + let balance = T::Currency::free_balance(account); + + // An amount of funds to charge per block for storage taken up by the contract. + let fee_per_block = { + let free_storage = balance + .checked_div(&>::rent_deposit_offset()) + .unwrap_or_else(Zero::zero); + + let effective_storage_size = + >::from(contract.storage_size).saturating_sub(free_storage); + + effective_storage_size + .checked_mul(&>::rent_byte_price()) + .unwrap_or(>::max_value()) + }; + + if fee_per_block.is_zero() { + // The rent deposit offset reduced the fee to 0. This means that the contract + // gets the rent for free. + return RentOutcome::Exempted; + } + + // The minimal amount of funds required for a contract not to be evicted. + let subsistence_threshold = T::Currency::minimum_balance() + >::tombstone_deposit(); + + let dues = fee_per_block + .checked_mul(&blocks_passed.saturated_into::().into()) + .unwrap_or(>::max_value()); + + let dues_limited = dues.min(contract.rent_allowance); + let rent_allowance_exceeded = dues > contract.rent_allowance; + let is_below_subsistence = balance < subsistence_threshold; + let go_below_subsistence = balance.saturating_sub(dues_limited) < subsistence_threshold; + let can_withdraw_rent = T::Currency::ensure_can_withdraw( + account, + dues_limited, + WithdrawReason::Fee, + balance.saturating_sub(dues_limited), + ) + .is_ok(); + + if !rent_allowance_exceeded && can_withdraw_rent && !go_below_subsistence { + // Collect dues + + if pay_rent { + let imbalance = T::Currency::withdraw( + account, + dues, + WithdrawReason::Fee, + ExistenceRequirement::KeepAlive, + ) + .expect( + "Withdraw has been checked above; + go_below_subsistence is false and subsistence > existencial_deposit; + qed", + ); + + >::mutate(account, |contract| { + let contract = contract + .as_mut() + .and_then(|c| c.as_alive_mut()) + .expect("Dead or inexistent account has been exempt above; qed"); + + contract.rent_allowance -= imbalance.peek(); // rent_allowance is not exceeded + contract.deduct_block = current_block_number; + }) + } + + RentOutcome::Ok + } else { + // Evict + + if can_withdraw_rent && !go_below_subsistence { + T::Currency::withdraw( + account, + dues, + WithdrawReason::Fee, + ExistenceRequirement::KeepAlive, + ) + .expect("Can withdraw and don't go below subsistence"); + } else if !is_below_subsistence { + T::Currency::make_free_balance_be(account, subsistence_threshold); + } else { + T::Currency::make_free_balance_be(account, >::zero()); + } + + if !is_below_subsistence { + // The contract has funds above subsistence deposit and that means it can afford to + // leave tombstone. + + // Note: this operation is heavy. + let child_storage_root = runtime_io::child_storage_root(&contract.trie_id); + + let tombstone = >::new( + &child_storage_root[..], + contract.code_hash, + ); + >::insert(account, ContractInfo::Tombstone(tombstone)); + runtime_io::kill_child_storage(&contract.trie_id); + } + + RentOutcome::Evicted + } +} + +/// Make account paying the rent for the current block number +/// +/// NOTE: This function acts eagerly. +pub fn pay_rent(account: &T::AccountId) { + let _ = try_evict_or_and_pay_rent::(account, Zero::zero(), true); +} + +/// Evict the account if it should be evicted at the given block number. +/// +/// `handicap` gives a way to check or pay the rent up to a moment in the past instead +/// of current block. E.g. if the contract is going to be evicted at the current block, +/// `handicap=1` can defer the eviction for 1 block. +/// +/// NOTE: This function acts eagerly. +pub fn try_evict(account: &T::AccountId, handicap: T::BlockNumber) -> RentOutcome { + try_evict_or_and_pay_rent::(account, handicap, false) +} diff --git a/srml/contract/src/tests.rs b/srml/contract/src/tests.rs index d6fa2677dfafdb9d5162e1ea3b7cb3d0a7d1cec1..7a19fdb1d6563add4d481c341b349e7fefdb424a 100644 --- a/srml/contract/src/tests.rs +++ b/srml/contract/src/tests.rs @@ -19,27 +19,28 @@ #![allow(unused)] +use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb}; +use crate::{ + BalanceOf, ComputeDispatchFee, ContractAddressFor, ContractInfo, ContractInfoOf, GenesisConfig, + Module, RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, TrieIdGenerator, +}; +use assert_matches::assert_matches; +use hex_literal::*; +use parity_codec::{Decode, Encode, KeyedVec}; +use runtime_io; use runtime_io::with_externalities; -use runtime_primitives::testing::{Digest, DigestItem, H256, Header, UintAuthorityId}; +use runtime_primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, H256}; use runtime_primitives::traits::{BlakeTwo256, IdentityLookup}; use runtime_primitives::BuildStorage; -use runtime_io; -use srml_support::{storage::child, StorageMap, assert_ok, impl_outer_event, impl_outer_dispatch, - impl_outer_origin, traits::Currency}; -use substrate_primitives::Blake2Hasher; -use system::{self, Phase, EventRecord}; -use {wabt, balances, consensus}; -use hex_literal::*; -use assert_matches::assert_matches; -use crate::{ - ContractAddressFor, GenesisConfig, Module, RawEvent, - Trait, ComputeDispatchFee, TrieIdGenerator, TrieId, - AccountInfo, AccountInfoOf, TrieIdFromParentCounter +use srml_support::{ + assert_ok, impl_outer_dispatch, impl_outer_event, impl_outer_origin, storage::child, + traits::Currency, StorageMap, StorageValue }; -use substrate_primitives::storage::well_known_keys; -use parity_codec::{Encode, Decode, KeyedVec}; use std::sync::atomic::{AtomicUsize, Ordering}; -use crate::account_db::{DirectAccountDb, OverlayAccountDb, AccountDb}; +use substrate_primitives::storage::well_known_keys; +use substrate_primitives::Blake2Hasher; +use system::{self, EventRecord, Phase}; +use {balances, consensus, wabt}; mod contract { // Re-export contents of the root. This basically @@ -63,7 +64,7 @@ impl_outer_dispatch! { } } -#[derive(Clone, Eq, PartialEq)] +#[derive(Clone, Eq, PartialEq, Debug)] pub struct Test; impl system::Trait for Test { type Origin = Origin; @@ -118,18 +119,21 @@ impl ContractAddressFor for DummyContractAddressFor { } } -static KEY_COUNTER: AtomicUsize = AtomicUsize::new(0); - pub struct DummyTrieIdGenerator; impl TrieIdGenerator for DummyTrieIdGenerator { fn trie_id(account_id: &u64) -> TrieId { use substrate_primitives::storage::well_known_keys; + let new_seed = >::mutate(|v| { + *v = v.wrapping_add(1); + *v + }); + // TODO: see https://github.com/paritytech/substrate/issues/2325 let mut res = vec![]; res.extend_from_slice(well_known_keys::CHILD_STORAGE_KEY_PREFIX); res.extend_from_slice(b"default:"); - res.extend_from_slice(&KEY_COUNTER.fetch_add(1, Ordering::Relaxed).to_le_bytes()); + res.extend_from_slice(&new_seed.to_le_bytes()); res.extend_from_slice(&account_id.to_le_bytes()); res } @@ -145,6 +149,7 @@ impl ComputeDispatchFee for DummyComputeDispatchFee { const ALICE: u64 = 1; const BOB: u64 = 2; const CHARLIE: u64 = 3; +const DJANGO: u64 = 4; pub struct ExtBuilder { existential_deposit: u64, @@ -206,8 +211,14 @@ impl ExtBuilder { ); t.extend( GenesisConfig:: { - transaction_base_fee: 0, - transaction_byte_fee: 0, + signed_claim_handicap: 2, + rent_byte_price: 4, + rent_deposit_offset: 10_000, + storage_size_offset: 8, + surcharge_reward: 150, + tombstone_deposit: 16, + transaction_base_fee: 2, + transaction_byte_fee: 6, transfer_fee: self.transfer_fee, creation_fee: self.creation_fee, contract_fee: 21, @@ -231,13 +242,7 @@ fn refunds_unused_gas() { with_externalities(&mut ExtBuilder::default().build(), || { Balances::deposit_creating(&0, 100_000_000); - assert_ok!(Contract::call( - Origin::signed(0), - 1, - 0, - 100_000, - Vec::new() - )); + assert_ok!(Contract::call(Origin::signed(0), 1, 0, 100_000, Vec::new())); assert_eq!(Balances::free_balance(&0), 100_000_000 - (2 * 135)); }); @@ -256,10 +261,14 @@ fn account_removal_removes_storage() { // Set up two accounts with free balance above the existential threshold. { Balances::deposit_creating(&1, 110); - AccountInfoOf::::insert(1, &AccountInfo { + ContractInfoOf::::insert(1, &ContractInfo::Alive(RawAliveContractInfo { trie_id: trie_id1.clone(), - storage_size: 0, - }); + storage_size: Contract::storage_size_offset(), + deduct_block: System::block_number(), + code_hash: H256::repeat_byte(1), + rent_allowance: 40, + last_write: None, + })); let mut overlay = OverlayAccountDb::::new(&DirectAccountDb); overlay.set_storage(&1, key1.clone(), Some(b"1".to_vec())); @@ -267,10 +276,14 @@ fn account_removal_removes_storage() { DirectAccountDb.commit(overlay.into_change_set()); Balances::deposit_creating(&2, 110); - AccountInfoOf::::insert(2, &AccountInfo { + ContractInfoOf::::insert(2, &ContractInfo::Alive(RawAliveContractInfo { trie_id: trie_id2.clone(), - storage_size: 0, - }); + storage_size: Contract::storage_size_offset(), + deduct_block: System::block_number(), + code_hash: H256::repeat_byte(2), + rent_allowance: 40, + last_write: None, + })); let mut overlay = OverlayAccountDb::::new(&DirectAccountDb); overlay.set_storage(&2, key1.clone(), Some(b"3".to_vec())); @@ -287,16 +300,15 @@ fn account_removal_removes_storage() { // Verify that all entries from account 1 is removed, while // entries from account 2 is in place. { - // let a: ::AccountId = 1; - assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key1).is_none()); - assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key2).is_none()); + assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key1).is_none()); + assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key2).is_none()); assert_eq!( - >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key1), + >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key1), Some(b"3".to_vec()) ); assert_eq!( - >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key2), + >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key2), Some(b"4".to_vec()) ); } @@ -307,14 +319,16 @@ fn account_removal_removes_storage() { const CODE_RETURN_FROM_START_FN: &str = r#" (module (import "env" "ext_return" (func $ext_return (param i32 i32))) - (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32))) + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) (import "env" "memory" (memory 1 1)) (start $start) (func $start (call $ext_deposit_event - (i32.const 8) - (i32.const 4) + (i32.const 0) ;; The topics buffer + (i32.const 0) ;; The topics buffer's length + (i32.const 8) ;; The data buffer + (i32.const 4) ;; The data buffer's length ) (call $ext_return (i32.const 8) @@ -331,7 +345,7 @@ const CODE_RETURN_FROM_START_FN: &str = r#" (data (i32.const 8) "\01\02\03\04") ) "#; -const HASH_RETURN_FROM_START_FN: [u8; 32] = hex!("abb4194bdea47b2904fe90b4fd674bd40d96f423956627df8c39d2b1a791ab9d"); +const HASH_RETURN_FROM_START_FN: [u8; 32] = hex!("66c45bd7c473a1746e1d241176166ef53b1f207f56c5e87d1b6650140704181b"); #[test] fn instantiate_and_call_and_deposit_event() { @@ -342,11 +356,7 @@ fn instantiate_and_call_and_deposit_event() { || { Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contract::put_code( - Origin::signed(ALICE), - 100_000, - wasm, - )); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); // Check at the end to get hash on error easily let creation = Contract::create( @@ -361,33 +371,39 @@ fn instantiate_and_call_and_deposit_event() { EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::CodeStored(HASH_RETURN_FROM_START_FN.into())), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::NewAccount(BOB, 100) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)) + event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Contract(BOB, vec![1, 2, 3, 4])) + event: MetaEvent::contract(RawEvent::Contract(BOB, vec![1, 2, 3, 4])), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)) + event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)), + topics: vec![], } ]); assert_ok!(creation); - assert!(AccountInfoOf::::exists(BOB)); + assert!(ContractInfoOf::::exists(BOB)); }, ); } @@ -414,7 +430,7 @@ const HASH_DISPATCH_CALL: [u8; 32] = hex!("49dfdcaf9c1553be10634467e95b8e71a3bc1 fn dispatch_call() { // This test can fail due to the encoding changes. In case it becomes too annoying // let's rewrite so as we use this module controlled call or we serialize it in runtime. - let encoded = parity_codec::Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); + let encoded = Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); assert_eq!(&encoded[..], &hex!("00000300000000000000C8")[..]); let wasm = wabt::wat2wasm(CODE_DISPATCH_CALL).unwrap(); @@ -424,11 +440,7 @@ fn dispatch_call() { || { Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contract::put_code( - Origin::signed(ALICE), - 100_000, - wasm, - )); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); // Let's keep this assert even though it's redundant. If you ever need to update the // wasm source this test will fail and will show you the actual hash. @@ -436,10 +448,12 @@ fn dispatch_call() { EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::CodeStored(HASH_DISPATCH_CALL.into())), + topics: vec![], }, ]); @@ -463,24 +477,29 @@ fn dispatch_call() { EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::CodeStored(HASH_DISPATCH_CALL.into())), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::NewAccount(BOB, 100) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)) + event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)) + event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)), + topics: vec![], }, // Dispatching the call. @@ -488,21 +507,722 @@ fn dispatch_call() { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::NewAccount(CHARLIE, 50) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::Transfer(BOB, CHARLIE, 50, 0) - ) + ), + topics: vec![], }, // Event emited as a result of dispatch. EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Dispatched(BOB, true)) + event: MetaEvent::contract(RawEvent::Dispatched(BOB, true)), + topics: vec![], } ]); }, ); } + +const CODE_SET_RENT: &str = r#" +(module + (import "env" "ext_dispatch_call" (func $ext_dispatch_call (param i32 i32))) + (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) + (import "env" "ext_set_rent_allowance" (func $ext_set_rent_allowance (param i32 i32))) + (import "env" "ext_input_size" (func $ext_input_size (result i32))) + (import "env" "ext_input_copy" (func $ext_input_copy (param i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + ;; insert a value of 4 bytes into storage + (func $call_0 + (call $ext_set_storage + (i32.const 1) + (i32.const 1) + (i32.const 0) + (i32.const 4) + ) + ) + + ;; remove the value inserted by call_1 + (func $call_1 + (call $ext_set_storage + (i32.const 1) + (i32.const 0) + (i32.const 0) + (i32.const 0) + ) + ) + + ;; transfer 50 to ALICE + (func $call_2 + (call $ext_dispatch_call + (i32.const 68) + (i32.const 11) + ) + ) + + ;; do nothing + (func $call_else) + + (func $assert (param i32) + (block $ok + (br_if $ok + (get_local 0) + ) + (unreachable) + ) + ) + + ;; Dispatch the call according to input size + (func (export "call") + (local $input_size i32) + (set_local $input_size + (call $ext_input_size) + ) + (block $IF_ELSE + (block $IF_2 + (block $IF_1 + (block $IF_0 + (br_table $IF_0 $IF_1 $IF_2 $IF_ELSE + (get_local $input_size) + ) + (unreachable) + ) + (call $call_0) + return + ) + (call $call_1) + return + ) + (call $call_2) + return + ) + (call $call_else) + ) + + ;; Set into storage a 4 bytes value + ;; Set call set_rent_allowance with input + (func (export "deploy") + (local $input_size i32) + (call $ext_set_storage + (i32.const 0) + (i32.const 1) + (i32.const 0) + (i32.const 4) + ) + (set_local $input_size + (call $ext_input_size) + ) + (call $ext_input_copy + (i32.const 0) + (i32.const 0) + (get_local $input_size) + ) + (call $ext_set_rent_allowance + (i32.const 0) + (get_local $input_size) + ) + ) + + ;; Encoding of 10 in balance + (data (i32.const 0) "\28") + + ;; Encoding of call transfer 50 to CHARLIE + (data (i32.const 68) "\00\00\03\00\00\00\00\00\00\00\C8") +) +"#; + +// Use test_hash_and_code test to get the actual hash if the code changed. +const HASH_SET_RENT: [u8; 32] = hex!("21d6b1d59aa6038fcad632488e9026893a1bbb48581774c771b8f24320697f05"); + +/// Input data for each call in set_rent code +mod call { + pub fn set_storage_4_byte() -> Vec { vec![] } + pub fn remove_storage_4_byte() -> Vec { vec![0] } + pub fn transfer() -> Vec { vec![0, 0] } + pub fn null() -> Vec { vec![0, 0, 0] } +} + +/// Test correspondance of set_rent code and its hash. +/// Also test that encoded extrinsic in code correspond to the correct transfer +#[test] +fn test_set_rent_code_and_hash() { + // This test can fail due to the encoding changes. In case it becomes too annoying + // let's rewrite so as we use this module controlled call or we serialize it in runtime. + let encoded = Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); + assert_eq!(&encoded[..], &hex!("00000300000000000000C8")[..]); + + let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); + + // If you ever need to update the wasm source this test will fail + // and will show you the actual hash. + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::CodeStored(HASH_SET_RENT.into())), + topics: vec![], + }, + ]); + } + ); +} + +#[test] +fn storage_size() { + let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + // Storage size + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 30_000, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4); + + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::set_storage_4_byte())); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4 + 4); + + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::remove_storage_4_byte())); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4); + } + ); +} + +#[test] +fn deduct_blocks() { + let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 30_000, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Check creation + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000); + + // Advance 4 blocks + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent through call + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + + // Check result + let rent = (8 + 4 - 3) // storage size = size_offset + deploy_set_storage - deposit_offset + * 4 // rent byte price + * 4; // blocks to rent + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000 - rent); + assert_eq!(bob_contract.deduct_block, 5); + assert_eq!(Balances::free_balance(BOB), 30_000 - rent); + + // Advance 7 blocks more + System::initialize(&12, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent through call + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + + // Check result + let rent_2 = (8 + 4 - 2) // storage size = size_offset + deploy_set_storage - deposit_offset + * 4 // rent byte price + * 7; // blocks to rent + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000 - rent - rent_2); + assert_eq!(bob_contract.deduct_block, 12); + assert_eq!(Balances::free_balance(BOB), 30_000 - rent - rent_2); + + // Second call on same block should have no effect on rent + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000 - rent - rent_2); + assert_eq!(bob_contract.deduct_block, 12); + assert_eq!(Balances::free_balance(BOB), 30_000 - rent - rent_2); + } + ); +} + +#[test] +fn call_contract_removals() { + removals(|| Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null()).is_ok()); +} + +#[test] +fn inherent_claim_surcharge_contract_removals() { + removals(|| Contract::claim_surcharge(Origin::NONE, BOB, Some(ALICE)).is_ok()); +} + +#[test] +fn signed_claim_surcharge_contract_removals() { + removals(|| Contract::claim_surcharge(Origin::signed(ALICE), BOB, None).is_ok()); +} + +#[test] +fn claim_surcharge_malus() { + // Test surcharge malus for inherent + claim_surcharge(4, || Contract::claim_surcharge(Origin::NONE, BOB, Some(ALICE)).is_ok(), true); + claim_surcharge(3, || Contract::claim_surcharge(Origin::NONE, BOB, Some(ALICE)).is_ok(), true); + claim_surcharge(2, || Contract::claim_surcharge(Origin::NONE, BOB, Some(ALICE)).is_ok(), true); + claim_surcharge(1, || Contract::claim_surcharge(Origin::NONE, BOB, Some(ALICE)).is_ok(), false); + + // Test surcharge malus for signed + claim_surcharge(4, || Contract::claim_surcharge(Origin::signed(ALICE), BOB, None).is_ok(), true); + claim_surcharge(3, || Contract::claim_surcharge(Origin::signed(ALICE), BOB, None).is_ok(), false); + claim_surcharge(2, || Contract::claim_surcharge(Origin::signed(ALICE), BOB, None).is_ok(), false); + claim_surcharge(1, || Contract::claim_surcharge(Origin::signed(ALICE), BOB, None).is_ok(), false); +} + +/// Claim surcharge with the given trigger_call at the given blocks. +/// if removes is true then assert that the contract is a tombstonedead +fn claim_surcharge(blocks: u64, trigger_call: impl Fn() -> bool, removes: bool) { + let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 100, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Advance blocks + System::initialize(&blocks, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent through call + assert!(trigger_call()); + + if removes { + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + } else { + assert!(ContractInfoOf::::get(BOB).unwrap().get_alive().is_some()); + } + } + ); +} + +/// Test for all kind of removals for the given trigger: +/// * if balance is reached and balance > subsistence threshold +/// * if allowance is exceeded +/// * if balance is reached and balance < subsistence threshold +fn removals(trigger_call: impl Fn() -> bool) { + let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + // Balance reached and superior to subsistence threshold + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm.clone())); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 100, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + + // Advance blocks + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent through call + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + + // Advance blocks + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + } + ); + + // Allowance exceeded + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm.clone())); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 1_000, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(100u32).encode() // rent allowance + )); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 100); + + // Advance blocks + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent through call + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + + // Advance blocks + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + } + ); + + // Balance reached and inferior to subsistence threshold + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm.clone())); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 50+Balances::minimum_balance(), + 100_000, HASH_SET_RENT.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + + // Transfer funds + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::transfer())); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + + // Advance blocks + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent through call + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).is_none()); + + // Advance blocks + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).is_none()); + } + ); +} + +const CODE_CHECK_DEFAULT_RENT_ALLOWANCE: &str = r#" +(module + (import "env" "ext_rent_allowance" (func $ext_rent_allowance)) + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func $assert (param i32) + (block $ok + (br_if $ok + (get_local 0) + ) + (unreachable) + ) + ) + + (func (export "call")) + + (func (export "deploy") + ;; fill the scratch buffer with the rent allowance. + (call $ext_rent_allowance) + + ;; assert $ext_scratch_size == 8 + (call $assert + (i32.eq + (call $ext_scratch_size) + (i32.const 8) + ) + ) + + ;; copy contents of the scratch buffer into the contract's memory. + (call $ext_scratch_copy + (i32.const 8) ;; Pointer in memory to the place where to copy. + (i32.const 0) ;; Offset from the start of the scratch buffer. + (i32.const 8) ;; Count of bytes to copy. + ) + + ;; assert that contents of the buffer is equal to >::max_value(). + (call $assert + (i64.eq + (i64.load + (i32.const 8) + ) + (i64.const 0xFFFFFFFFFFFFFFFF) + ) + ) + ) +) +"#; +const HASH_CHECK_DEFAULT_RENT_ALLOWANCE: [u8; 32] = hex!("4f9ec2b94eea522cfff10b77ef4056c631045c00978a457d283950521ecf07b6"); + +#[test] +fn default_rent_allowance_on_create() { + let wasm = wabt::wat2wasm(CODE_CHECK_DEFAULT_RENT_ALLOWANCE).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 30_000, + 100_000, + HASH_CHECK_DEFAULT_RENT_ALLOWANCE.into(), + vec![], + )); + + // Check creation + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, >::max_value()); + + // Advance blocks + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent through call + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + + // Check contract is still alive + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive(); + assert!(bob_contract.is_some()) + } + ); +} + +const CODE_RESTORATION: &str = r#" +(module + (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) + (import "env" "ext_dispatch_call" (func $ext_dispatch_call (param i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func (export "call") + (call $ext_dispatch_call + (i32.const 200) ;; Pointer to the start of encoded call buffer + (i32.const 115) ;; Length of the buffer + ) + ) + (func (export "deploy") + ;; Data to restore + (call $ext_set_storage + (i32.const 0) + (i32.const 1) + (i32.const 0) + (i32.const 4) + ) + + ;; ACL + (call $ext_set_storage + (i32.const 100) + (i32.const 1) + (i32.const 0) + (i32.const 4) + ) + ) + + ;; Data to restore + (data (i32.const 0) "\28") + + ;; ACL + (data (i32.const 100) "\01") + + ;; Call + (data (i32.const 200) "\01\05\02\00\00\00\00\00\00\00\21\d6\b1\d5\9a\a6\03\8f\ca\d6\32\48\8e\90" + "\26\89\3a\1b\bb\48\58\17\74\c7\71\b8\f2\43\20\69\7f\05\32\00\00\00\00\00\00\00\08\01\00\00" + "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01" + "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" + "\00" + ) +) +"#; +const HASH_RESTORATION: [u8; 32] = hex!("b393bfa8de97b02f08ba1580b46100a80c9489a97c8d870691c9ff7236b29bc7"); + +#[test] +fn restorations_dirty_storage_and_different_storage() { + restoration(true, true); +} + +#[test] +fn restorations_dirty_storage() { + restoration(false, true); +} + +#[test] +fn restoration_different_storage() { + restoration(true, false); +} + +#[test] +fn restoration_success() { + restoration(false, false); +} + +fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: bool) { + let acl_key = { + let mut s = [0u8; 32]; + s[0] = 1; + s + }; + + // This test can fail due to the encoding changes. In case it becomes too annoying + // let's rewrite so as we use this module controlled call or we serialize it in runtime. + let encoded = hex::encode(Encode::encode(&Call::Contract(super::Call::restore_to( + BOB, + HASH_SET_RENT.into(), + ::Balance::from(50u32), + vec![acl_key, acl_key], + )))); + + let literal = "0105020000000000000021d6b1d59aa6038fcad632488e9026893a1bbb48581774c771b8f243206\ + 97f053200000000000000080100000000000000000000000000000000000000000000000000000000000000010\ + 0000000000000000000000000000000000000000000000000000000000000"; + + assert_eq!(encoded, literal); + assert_eq!(115, hex::decode(literal).unwrap().len()); + + let restoration_wasm = wabt::wat2wasm(CODE_RESTORATION).unwrap(); + let set_rent_wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, restoration_wasm)); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, set_rent_wasm)); + + // If you ever need to update the wasm source this test will fail + // and will show you the actual hash. + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::CodeStored(HASH_RESTORATION.into())), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::CodeStored(HASH_SET_RENT.into())), + topics: vec![], + }, + ]); + + assert_ok!(Contract::create( + Origin::signed(ALICE), + 30_000, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(0u32).encode() + )); + + // Check creation + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 0); + + if test_different_storage { + assert_ok!(Contract::call( + Origin::signed(ALICE), + BOB, 0, 100_000, + call::set_storage_4_byte()) + ); + } + + // Advance 4 blocks + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Trigger rent through call + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + + Balances::deposit_creating(&CHARLIE, 1_000_000); + assert_ok!(Contract::create( + Origin::signed(CHARLIE), + 30_000, + 100_000, HASH_RESTORATION.into(), + ::Balance::from(0u32).encode() + )); + + let django_trie_id = ContractInfoOf::::get(DJANGO).unwrap() + .get_alive().unwrap().trie_id; + + if !test_restore_to_with_dirty_storage { + // Advance 1 blocks + System::initialize(&6, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + } + + assert_ok!(Contract::call( + Origin::signed(ALICE), + DJANGO, 0, 100_000, + vec![], + )); + + if test_different_storage || test_restore_to_with_dirty_storage { + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + let django_contract = ContractInfoOf::::get(DJANGO).unwrap() + .get_alive().unwrap(); + assert_eq!(django_contract.storage_size, 16); + assert_eq!(django_contract.trie_id, django_trie_id); + assert_eq!(django_contract.deduct_block, System::block_number()); + } else { + let bob_contract = ContractInfoOf::::get(BOB).unwrap() + .get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 50); + assert_eq!(bob_contract.storage_size, 12); + assert_eq!(bob_contract.trie_id, django_trie_id); + assert_eq!(bob_contract.deduct_block, System::block_number()); + assert!(ContractInfoOf::::get(DJANGO).is_none()); + } + } + ); +} diff --git a/srml/contract/src/wasm/code_cache.rs b/srml/contract/src/wasm/code_cache.rs index 0c71fe8cb5b8f9584a86467a01589cca345ea929..da92272c3803a7b9cae15fd26e5fb17861b7cbae 100644 --- a/srml/contract/src/wasm/code_cache.rs +++ b/srml/contract/src/wasm/code_cache.rs @@ -29,7 +29,7 @@ use crate::gas::{GasMeter, Token}; use crate::wasm::{prepare, runtime::Env, PrefabWasmModule}; use crate::{CodeHash, CodeStorage, PristineCode, Schedule, Trait}; use rstd::prelude::*; -use runtime_primitives::traits::{As, CheckedMul, Hash, Bounded}; +use runtime_primitives::traits::{CheckedMul, Hash, Bounded}; use srml_support::StorageMap; /// Gas metering token that used for charging storing code into the code storage. @@ -37,16 +37,15 @@ use srml_support::StorageMap; /// Specifies the code length in bytes. #[cfg_attr(test, derive(Debug, PartialEq, Eq))] #[derive(Copy, Clone)] -pub struct PutCodeToken(u64); +pub struct PutCodeToken(u32); impl Token for PutCodeToken { type Metadata = Schedule; fn calculate_amount(&self, metadata: &Schedule) -> T::Gas { - let code_len_in_gas = >::sa(self.0); metadata .put_code_per_byte_cost - .checked_mul(&code_len_in_gas) + .checked_mul(&self.0.into()) .unwrap_or_else(|| Bounded::max_value()) } } @@ -63,7 +62,7 @@ pub fn save( // The first time instrumentation is on the user. However, consequent reinstrumentation // due to the schedule changes is on governance system. if gas_meter - .charge(schedule, PutCodeToken(original_code.len() as u64)) + .charge(schedule, PutCodeToken(original_code.len() as u32)) .is_out_of_gas() { return Err("there is not enough gas for storing the code"); diff --git a/srml/contract/src/wasm/env_def/macros.rs b/srml/contract/src/wasm/env_def/macros.rs index 0b112a825858d06b45760ec6c60c67821486fdc5..32d02f5abea76f9bd536377878efb257a26216dc 100644 --- a/srml/contract/src/wasm/env_def/macros.rs +++ b/srml/contract/src/wasm/env_def/macros.rs @@ -167,7 +167,7 @@ macro_rules! register_func { /// will panic if called with unexpected arguments. /// /// It's up to the user of this macro to check signatures of wasm code to be executed -/// and reject the code if any imported function has a mismached signature. +/// and reject the code if any imported function has a mismatched signature. macro_rules! define_env { ( $init_name:ident , < E: $ext_ty:tt > , $( $name:ident ( $ctx:ident $( , $names:ident : $params:ty )* ) @@ -195,7 +195,7 @@ macro_rules! define_env { mod tests { use parity_wasm::elements::FunctionType; use parity_wasm::elements::ValueType; - use runtime_primitives::traits::{As, Zero}; + use runtime_primitives::traits::Zero; use sandbox::{self, ReturnValue, TypedValue}; use crate::wasm::tests::MockExt; use crate::wasm::Runtime; @@ -256,7 +256,7 @@ mod tests { #[test] fn macro_define_func() { define_func!( ext_gas (_ctx, amount: u32) => { - let amount = <::Gas as As>::sa(amount); + let amount = ::Gas::from(amount); if !amount.is_zero() { Ok(()) } else { @@ -308,7 +308,7 @@ mod tests { define_env!(Env, , ext_gas( _ctx, amount: u32 ) => { - let amount = <::Gas as As>::sa(amount); + let amount = ::Gas::from(amount); if !amount.is_zero() { Ok(()) } else { diff --git a/srml/contract/src/wasm/mod.rs b/srml/contract/src/wasm/mod.rs index 51db3b2e5652f7fca6c8dc65bc5f24c0b3b7677b..d86678d383e0955fa0b2364f6d8f876c85ff721b 100644 --- a/srml/contract/src/wasm/mod.rs +++ b/srml/contract/src/wasm/mod.rs @@ -155,8 +155,8 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a, T> { Err(err @ sandbox::Error::Execution) => to_execution_result(runtime, Some(err)), Err(_err @ sandbox::Error::Module) => { // `Error::Module` is returned only if instantiation or linking failed (i.e. - // wasm bianry tried to import a function that is not provided by the host). - // This shouldn't happen because validation proccess ought to reject such binaries. + // wasm binary tried to import a function that is not provided by the host). + // This shouldn't happen because validation process ought to reject such binaries. // // Because panics are really undesirable in the runtime code, we treat this as // a trap for now. Eventually, we might want to revisit this. @@ -177,9 +177,10 @@ mod tests { use crate::exec::{CallReceipt, Ext, InstantiateReceipt, EmptyOutputBuf, StorageKey}; use crate::gas::GasMeter; use crate::tests::{Test, Call}; - use wabt; use crate::wasm::prepare::prepare_contract; use crate::CodeHash; + use wabt; + use hex_literal::hex; #[derive(Debug, PartialEq, Eq)] struct DispatchEntry(Call); @@ -200,12 +201,13 @@ mod tests { #[derive(Default)] pub struct MockExt { storage: HashMap>, + rent_allowance: u64, creates: Vec, transfers: Vec, dispatches: Vec, - events: Vec>, + // (topics, data) + events: Vec<(Vec, Vec)>, next_account_id: u64, - random_seed: H256, } impl Ext for MockExt { type T = Test; @@ -274,12 +276,20 @@ mod tests { &1111 } - fn random_seed(&self) -> &H256{ - &self.random_seed + fn random(&self, subject: &[u8]) -> H256 { + H256::from_slice(subject) + } + + fn deposit_event(&mut self, topics: Vec, data: Vec) { + self.events.push((topics, data)) + } + + fn set_rent_allowance(&mut self, rent_allowance: u64) { + self.rent_allowance = rent_allowance; } - fn deposit_event(&mut self, data: Vec) { - self.events.push(data) + fn rent_allowance(&self) -> u64 { + self.rent_allowance } } @@ -1105,11 +1115,12 @@ mod tests { .unwrap(); } - const CODE_RANDOM_SEED: &str = r#" + const CODE_RANDOM: &str = r#" (module - (import "env" "ext_random_seed" (func $ext_random_seed)) + (import "env" "ext_random" (func $ext_random (param i32 i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_return" (func $ext_return (param i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -1123,7 +1134,10 @@ mod tests { (func (export "call") ;; This stores the block random seed in the scratch buffer - (call $ext_random_seed) + (call $ext_random + (i32.const 40) ;; Pointer in memory to the start of the subject buffer + (i32.const 32) ;; The subject buffer's length + ) ;; assert $ext_scratch_size == 32 (call $assert @@ -1140,59 +1154,71 @@ mod tests { (i32.const 32) ;; Count of bytes to copy. ) - ;; assert the contents of the buffer in 4 x i64 parts matches 1,2,3,4. - (call $assert (i64.eq (i64.load (i32.const 8)) (i64.const 1))) - (call $assert (i64.eq (i64.load (i32.const 16)) (i64.const 2))) - (call $assert (i64.eq (i64.load (i32.const 24)) (i64.const 3))) - (call $assert (i64.eq (i64.load (i32.const 32)) (i64.const 4))) + ;; return the data from the contract + (call $ext_return + (i32.const 8) + (i32.const 32) + ) ) (func (export "deploy")) + + ;; [8,40) is reserved for the result of PRNG. + + ;; the subject used for the PRNG. [40,72) + (data (i32.const 40) + "\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F" + "\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F" + ) ) "#; #[test] - fn random_seed() { + fn random() { let mut mock_ext = MockExt::default(); - let seed: [u8; 32] = [ - 1,0,0,0,0,0,0,0, - 2,0,0,0,0,0,0,0, - 3,0,0,0,0,0,0,0, - 4,0,0,0,0,0,0,0, - ]; - mock_ext.random_seed = H256::from_slice(&seed); let mut gas_meter = GasMeter::with_limit(50_000, 1); + + let mut return_buf = Vec::new(); execute( - CODE_RANDOM_SEED, + CODE_RANDOM, &[], - &mut Vec::new(), + &mut return_buf, &mut mock_ext, &mut gas_meter, ) .unwrap(); + + // The mock ext just returns the same data that was passed as the subject. + assert_eq!( + &return_buf, + &hex!("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F") + ); } const CODE_DEPOSIT_EVENT: &str = r#" (module - (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32))) + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func (export "call") (call $ext_deposit_event - (i32.const 8) ;; Pointer to the start of encoded call buffer + (i32.const 32) ;; Pointer to the start of topics buffer + (i32.const 33) ;; The length of the topics buffer. + (i32.const 8) ;; Pointer to the start of the data buffer (i32.const 13) ;; Length of the buffer ) ) (func (export "deploy")) (data (i32.const 8) "\00\01\2A\00\00\00\00\00\00\00\E5\14\00") + + ;; Encoded Vec>, the buffer has length of 33 bytes. + (data (i32.const 32) "\04\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33" + "\33\33\33\33\33\33\33\33\33") ) "#; #[test] fn deposit_event() { - // This test can fail due to the encoding changes. In case it becomes too annoying - // let's rewrite so as we use this module controlled call or we serialize it in runtime. - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); execute( @@ -1203,11 +1229,105 @@ mod tests { &mut gas_meter ) .unwrap(); + + assert_eq!(mock_ext.events, vec![ + (vec![H256::repeat_byte(0x33)], + vec![0x00, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0x14, 0x00]) + ]); + assert_eq!(gas_meter.gas_left(), 50_000 - - 4 // Explicit - - 13 - 1 // Deposit event - - 13 // read memory + - 6 // Explicit + - 13 - 1 - 1 // Deposit event + - (13 + 33) // read memory + ); + } + + const CODE_DEPOSIT_EVENT_MAX_TOPICS: &str = r#" +(module + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func (export "call") + (call $ext_deposit_event + (i32.const 32) ;; Pointer to the start of topics buffer + (i32.const 161) ;; The length of the topics buffer. + (i32.const 8) ;; Pointer to the start of the data buffer + (i32.const 13) ;; Length of the buffer + ) + ) + (func (export "deploy")) + + (data (i32.const 8) "\00\01\2A\00\00\00\00\00\00\00\E5\14\00") + + ;; Encoded Vec>, the buffer has length of 161 bytes. + (data (i32.const 32) "\14" +"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" +"\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02" +"\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03" +"\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04" +"\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05") +) +"#; + + #[test] + fn deposit_event_max_topics() { + // Checks that the runtime traps if there are more than `max_topic_events` topics. + let mut mock_ext = MockExt::default(); + let mut gas_meter = GasMeter::with_limit(50_000, 1); + + assert_eq!( + execute( + CODE_DEPOSIT_EVENT_MAX_TOPICS, + &[], + &mut Vec::new(), + &mut mock_ext, + &mut gas_meter + ), + Err("during execution"), + ); + } + + const CODE_DEPOSIT_EVENT_DUPLICATES: &str = r#" +(module + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func (export "call") + (call $ext_deposit_event + (i32.const 32) ;; Pointer to the start of topics buffer + (i32.const 129) ;; The length of the topics buffer. + (i32.const 8) ;; Pointer to the start of the data buffer + (i32.const 13) ;; Length of the buffer + ) + ) + (func (export "deploy")) + + (data (i32.const 8) "\00\01\2A\00\00\00\00\00\00\00\E5\14\00") + + ;; Encoded Vec>, the buffer has length of 129 bytes. + (data (i32.const 32) "\10" +"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" +"\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02" +"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" +"\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04") +) +"#; + + #[test] + fn deposit_event_duplicates() { + // Checks that the runtime traps if there are duplicates. + let mut mock_ext = MockExt::default(); + let mut gas_meter = GasMeter::with_limit(50_000, 1); + + assert_eq!( + execute( + CODE_DEPOSIT_EVENT_DUPLICATES, + &[], + &mut Vec::new(), + &mut mock_ext, + &mut gas_meter + ), + Err("during execution"), ); - assert_eq!(mock_ext.events, vec![vec![0, 1, 42, 0, 0, 0, 0, 0, 0, 0, 229, 20, 0]]); } } diff --git a/srml/contract/src/wasm/prepare.rs b/srml/contract/src/wasm/prepare.rs index 53883451b4236bb031b90fb3a61ad9d71aede5d9..d780cc1a28328ac6c467fefb7f2094d8988080c0 100644 --- a/srml/contract/src/wasm/prepare.rs +++ b/srml/contract/src/wasm/prepare.rs @@ -26,7 +26,7 @@ use parity_wasm::elements::{self, Internal, External, MemoryType, Type}; use pwasm_utils; use pwasm_utils::rules; use rstd::prelude::*; -use runtime_primitives::traits::As; +use runtime_primitives::traits::{UniqueSaturatedInto, SaturatedConversion}; struct ContractModule<'a, Gas: 'a> { /// A deserialized module. The module is valid (this is Guaranteed by `new` method). @@ -38,7 +38,7 @@ struct ContractModule<'a, Gas: 'a> { schedule: &'a Schedule, } -impl<'a, Gas: 'a + As + Clone> ContractModule<'a, Gas> { +impl<'a, Gas: 'a + From + UniqueSaturatedInto + Clone> ContractModule<'a, Gas> { /// Creates a new instance of `ContractModule`. /// /// Returns `Err` if the `original_code` couldn't be decoded or @@ -85,10 +85,10 @@ impl<'a, Gas: 'a + As + Clone> ContractModule<'a, Gas> { fn inject_gas_metering(&mut self) -> Result<(), &'static str> { let gas_rules = rules::Set::new( - self.schedule.regular_op_cost.clone().as_(), + self.schedule.regular_op_cost.clone().saturated_into(), Default::default(), ) - .with_grow_cost(self.schedule.grow_mem_cost.clone().as_()) + .with_grow_cost(self.schedule.grow_mem_cost.clone().saturated_into()) .with_forbidden_floats(); let module = self @@ -318,7 +318,7 @@ pub fn prepare_contract( (initial, Some(maximum)) => MemoryDefinition { initial, maximum }, (_, None) => { // Maximum number of pages should be always declared. - // This isn't a hard requirement and can be treated as a maxiumum set + // This isn't a hard requirement and can be treated as a maximum set // to configured maximum. return Err("Maximum number of pages should be always declared."); } diff --git a/srml/contract/src/wasm/runtime.rs b/srml/contract/src/wasm/runtime.rs index 1c48d248d2973647edd5d3fac91d79b530aa9c57..873464c5bea0a743577611e23113c93db6978828 100644 --- a/srml/contract/src/wasm/runtime.rs +++ b/srml/contract/src/wasm/runtime.rs @@ -17,14 +17,17 @@ //! Environment definition of the wasm smart-contract runtime. use crate::{Schedule, Trait, CodeHash, ComputeDispatchFee, BalanceOf}; -use crate::exec::{Ext, VmExecResult, OutputBuf, EmptyOutputBuf, CallReceipt, InstantiateReceipt, StorageKey}; +use crate::exec::{ + Ext, VmExecResult, OutputBuf, EmptyOutputBuf, CallReceipt, InstantiateReceipt, StorageKey, + TopicOf, +}; use crate::gas::{GasMeter, Token, GasMeterResult, approx_gas_for_balance}; use sandbox; use system; use rstd::prelude::*; use rstd::mem; use parity_codec::{Decode, Encode}; -use runtime_primitives::traits::{As, CheckedMul, CheckedAdd, Bounded}; +use runtime_primitives::traits::{CheckedMul, CheckedAdd, Bounded, SaturatedConversion}; /// Enumerates all possible *special* trap conditions. /// @@ -108,9 +111,9 @@ pub enum RuntimeToken { ReturnData(u32), /// Dispatch fee calculated by `T::ComputeDispatchFee`. ComputedDispatchFee(Gas), - /// The given number of bytes is read from the sandbox memory and - /// deposit in as an event. - DepositEvent(u32), + /// (topic_count, data_bytes): A buffer of the given size is posted as an event indexed with the + /// given number of topics. + DepositEvent(u32, u32), } impl Token for RuntimeToken { @@ -119,20 +122,35 @@ impl Token for RuntimeToken { fn calculate_amount(&self, metadata: &Schedule) -> T::Gas { use self::RuntimeToken::*; let value = match *self { - Explicit(amount) => Some(>::sa(amount)), + Explicit(amount) => Some(amount.into()), ReadMemory(byte_count) => metadata .sandbox_data_read_cost - .checked_mul(&>::sa(byte_count)), + .checked_mul(&byte_count.into()), WriteMemory(byte_count) => metadata .sandbox_data_write_cost - .checked_mul(&>::sa(byte_count)), + .checked_mul(&byte_count.into()), ReturnData(byte_count) => metadata .return_data_per_byte_cost - .checked_mul(&>::sa(byte_count)), - DepositEvent(byte_count) => metadata - .event_data_per_byte_cost - .checked_mul(&>::sa(byte_count)) - .and_then(|e| e.checked_add(&metadata.event_data_base_cost)), + .checked_mul(&byte_count.into()), + DepositEvent(topic_count, data_byte_count) => { + let data_cost = metadata + .event_data_per_byte_cost + .checked_mul(&data_byte_count.into()); + + let topics_cost = metadata + .event_per_topic_cost + .checked_mul(&topic_count.into()); + + data_cost + .and_then(|data_cost| { + topics_cost.and_then(|topics_cost| { + data_cost.checked_add(&topics_cost) + }) + }) + .and_then(|data_and_topics_cost| + data_and_topics_cost.checked_add(&metadata.event_base_cost) + ) + }, ComputedDispatchFee(gas) => Some(gas), }; @@ -322,7 +340,7 @@ define_env!(Env, , let nested_gas_limit = if gas == 0 { ctx.gas_meter.gas_left() } else { - <::Gas as As>::sa(gas) + gas.saturated_into() }; let ext = &mut ctx.ext; let call_outcome = ctx.gas_meter.with_nested(nested_gas_limit, |nested_meter| { @@ -395,7 +413,7 @@ define_env!(Env, , let nested_gas_limit = if gas == 0 { ctx.gas_meter.gas_left() } else { - <::Gas as As>::sa(gas) + gas.saturated_into() }; let ext = &mut ctx.ext; let instantiate_outcome = ctx.gas_meter.with_nested(nested_gas_limit, |nested_meter| { @@ -509,16 +527,25 @@ define_env!(Env, , Ok(()) }, - // Load the latest block RNG seed into the scratch buffer - ext_random_seed(ctx) => { - ctx.scratch_buf = ctx.ext.random_seed().encode(); + // Stores the random number for the current block for the given subject into the scratch + // buffer. + // + // The data is encoded as T::Hash. The current contents of the scratch buffer are + // overwritten. + ext_random(ctx, subject_ptr: u32, subject_len: u32) => { + // The length of a subject can't exceed `max_subject_len`. + if subject_len > ctx.schedule.max_subject_len { + return Err(sandbox::HostError); + } + + let subject_buf = read_sandbox_memory(ctx, subject_ptr, subject_len)?; + ctx.scratch_buf = ctx.ext.random(&subject_buf).encode(); Ok(()) }, // Load the latest block timestamp into the scratch buffer ext_now(ctx) => { - let now: u64 = As::as_(ctx.ext.now().clone()); - ctx.scratch_buf = now.encode(); + ctx.scratch_buf = ctx.ext.now().encode(); Ok(()) }, @@ -610,21 +637,72 @@ define_env!(Env, , Ok(()) }, - // Deposit a contract event with the data buffer. - ext_deposit_event(ctx, data_ptr: u32, data_len: u32) => { + // Deposit a contract event with the data buffer and optional list of topics. There is a limit + // on the maximum number of topics specified by `max_event_topics`. + // + // - topics_ptr - a pointer to the buffer of topics encoded as `Vec`. The value of this + // is ignored if `topics_len` is set to 0. The topics list can't contain duplicates. + // - topics_len - the length of the topics buffer. Pass 0 if you want to pass an empty vector. + // - data_ptr - a pointer to a raw data buffer which will saved along the event. + // - data_len - the length of the data buffer. + ext_deposit_event(ctx, topics_ptr: u32, topics_len: u32, data_ptr: u32, data_len: u32) => { + let mut topics = match topics_len { + 0 => Vec::new(), + _ => { + let topics_buf = read_sandbox_memory(ctx, topics_ptr, topics_len)?; + Vec::::T>>::decode(&mut &topics_buf[..]) + .ok_or_else(|| sandbox::HostError)? + } + }; + + // If there are more than `max_event_topics`, then trap. + if topics.len() > ctx.schedule.max_event_topics as usize { + return Err(sandbox::HostError); + } + + // Check for duplicate topics. If there are any, then trap. + if has_duplicates(&mut topics) { + return Err(sandbox::HostError); + } + + let event_data = read_sandbox_memory(ctx, data_ptr, data_len)?; + match ctx .gas_meter .charge( ctx.schedule, - RuntimeToken::DepositEvent(data_len) + RuntimeToken::DepositEvent(topics.len() as u32, data_len) ) { GasMeterResult::Proceed => (), GasMeterResult::OutOfGas => return Err(sandbox::HostError), } + ctx.ext.deposit_event(topics, event_data); - let event_data = read_sandbox_memory(ctx, data_ptr, data_len)?; - ctx.ext.deposit_event(event_data); + Ok(()) + }, + + // Set rent allowance of the contract + // + // - value_ptr: a pointer to the buffer with value, how much to allow for rent + // Should be decodable as a `T::Balance`. Traps otherwise. + // - value_len: length of the value buffer. + ext_set_rent_allowance(ctx, value_ptr: u32, value_len: u32) => { + let value = { + let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; + BalanceOf::<::T>::decode(&mut &value_buf[..]) + .ok_or_else(|| sandbox::HostError)? + }; + ctx.ext.set_rent_allowance(value); + + Ok(()) + }, + + // Stores the rent allowance into the scratch buffer. + // + // The data is encoded as T::Balance. The current contents of the scratch buffer are overwritten. + ext_rent_allowance(ctx) => { + ctx.scratch_buf = ctx.ext.rent_allowance().encode(); Ok(()) }, @@ -640,3 +718,21 @@ define_env!(Env, , Ok(()) }, ); + +/// Finds duplicates in a given vector. +/// +/// This function has complexity of O(n log n) and no additional memory is required, although +/// the order of items is not preserved. +fn has_duplicates>(items: &mut Vec) -> bool { + // Sort the vector + items.sort_unstable_by(|a, b| { + Ord::cmp(a.as_ref(), b.as_ref()) + }); + // And then find any two consecutive equal elements. + items.windows(2).any(|w| { + match w { + &[ref a, ref b] => a == b, + _ => false, + } + }) +} diff --git a/srml/council/Cargo.toml b/srml/council/Cargo.toml index 87de0ae0d1f1f29b67af98716ee3964d2a05f27b..c180846b8e969dfde3e126ae5840ef12b7c59db2 100644 --- a/srml/council/Cargo.toml +++ b/srml/council/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-council" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -17,7 +17,7 @@ democracy = { package = "srml-democracy", path = "../democracy", default-feature system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] -hex-literal = "0.1.0" +hex-literal = "0.2.0" balances = { package = "srml-balances", path = "../balances" } [features] diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index a13eb7e28067ac66a8ac95ee5c8d2a63f5d85ff1..fd6980573294a9a0372a22f57187ad1c355353b3 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -18,34 +18,42 @@ #![cfg_attr(not(feature = "std"), no_std)] -pub mod voting; pub mod motions; pub mod seats; pub use crate::seats::{Trait, Module, RawEvent, Event, VoteIndex}; +/// Trait for type that can handle incremental changes to a set of account IDs. +pub trait OnMembersChanged { + /// A number of members `new` just joined the set and replaced some `old` ones. + fn on_members_changed(new: &[AccountId], old: &[AccountId]); +} + +impl OnMembersChanged for () { + fn on_members_changed(_new: &[T], _old: &[T]) {} +} + #[cfg(test)] mod tests { // These re-exports are here for a reason, edit with care pub use super::*; pub use runtime_io::with_externalities; - use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch}; - pub use substrate_primitives::H256; - pub use primitives::BuildStorage; - pub use primitives::traits::{BlakeTwo256, IdentityLookup}; - pub use primitives::testing::{Digest, DigestItem, Header}; - pub use substrate_primitives::{Blake2Hasher}; - pub use {seats, motions, voting}; + use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch, parameter_types}; + pub use substrate_primitives::{H256, Blake2Hasher, u32_trait::{_1, _2, _3, _4}}; + pub use primitives::{ + BuildStorage, traits::{BlakeTwo256, IdentityLookup}, testing::{Digest, DigestItem, Header} + }; + pub use {seats, motions}; impl_outer_origin! { pub enum Origin for Test { - motions + motions } } impl_outer_event! { pub enum Event for Test { - balances, democracy, seats, voting, motions, + balances, democracy, seats, motions, } } @@ -81,71 +89,133 @@ mod tests { type TransferPayment = (); type DustRemoval = (); } + parameter_types! { + pub const LaunchPeriod: u64 = 1; + pub const VotingPeriod: u64 = 3; + pub const MinimumDeposit: u64 = 1; + pub const EnactmentPeriod: u64 = 0; + pub const CooloffPeriod: u64 = 2; + } impl democracy::Trait for Test { - type Currency = balances::Module; type Proposal = Call; type Event = Event; + type Currency = balances::Module; + type EnactmentPeriod = EnactmentPeriod; + type LaunchPeriod = LaunchPeriod; + type EmergencyVotingPeriod = VotingPeriod; + type VotingPeriod = VotingPeriod; + type MinimumDeposit = MinimumDeposit; + type ExternalOrigin = motions::EnsureProportionAtLeast<_1, _2, u64>; + type ExternalMajorityOrigin = motions::EnsureProportionAtLeast<_2, _3, u64>; + type EmergencyOrigin = motions::EnsureProportionAtLeast<_1, _1, u64>; + type CancellationOrigin = motions::EnsureProportionAtLeast<_2, _3, u64>; + type VetoOrigin = motions::EnsureMember; + type CooloffPeriod = CooloffPeriod; } impl seats::Trait for Test { type Event = Event; type BadPresentation = (); type BadReaper = (); + type BadVoterIndex = (); + type LoserCandidate = (); + type OnMembersChanged = CouncilMotions; } impl motions::Trait for Test { type Origin = Origin; type Proposal = Call; type Event = Event; } - impl voting::Trait for Test { - type Event = Event; + + pub struct ExtBuilder { + balance_factor: u64, + decay_ratio: u32, + voting_fee: u64, + voter_bond: u64, + bad_presentation_punishment: u64, + with_council: bool, } - pub fn new_test_ext(with_council: bool) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(balances::GenesisConfig::{ - transaction_base_fee: 0, - transaction_byte_fee: 0, - balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], - existential_deposit: 0, - transfer_fee: 0, - creation_fee: 0, - vesting: vec![], - }.build_storage().unwrap().0); - t.extend(democracy::GenesisConfig::{ - launch_period: 1, - voting_period: 3, - minimum_deposit: 1, - public_delay: 0, - max_lock_periods: 6, - }.build_storage().unwrap().0); - t.extend(seats::GenesisConfig:: { - candidacy_bond: 9, - voter_bond: 3, - present_slash_per_voter: 1, - carry_count: 2, - inactive_grace_period: 1, - active_council: if with_council { vec![ - (1, 10), - (2, 10), - (3, 10) - ] } else { vec![] }, - approval_voting_period: 4, - presentation_duration: 2, - desired_seats: 2, - term_duration: 5, - }.build_storage().unwrap().0); - t.extend(voting::GenesisConfig:: { - cooloff_period: 2, - voting_period: 1, - enact_delay_period: 0, - }.build_storage().unwrap().0); - runtime_io::TestExternalities::new(t) + impl Default for ExtBuilder { + fn default() -> Self { + Self { + balance_factor: 1, + decay_ratio: 24, + voting_fee: 0, + voter_bond: 0, + bad_presentation_punishment: 1, + with_council: false, + } + } + } + + impl ExtBuilder { + pub fn with_council(mut self, council: bool) -> Self { + self.with_council = council; + self + } + pub fn balance_factor(mut self, factor: u64) -> Self { + self.balance_factor = factor; + self + } + pub fn decay_ratio(mut self, ratio: u32) -> Self { + self.decay_ratio = ratio; + self + } + pub fn voting_fee(mut self, fee: u64) -> Self { + self.voting_fee = fee; + self + } + pub fn bad_presentation_punishment(mut self, fee: u64) -> Self { + self.bad_presentation_punishment = fee; + self + } + pub fn voter_bond(mut self, fee: u64) -> Self { + self.voter_bond = fee; + self + } + pub fn build(self) -> runtime_io::TestExternalities { + let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; + t.extend(balances::GenesisConfig::{ + transaction_base_fee: 0, + transaction_byte_fee: 0, + balances: vec![ + (1, 10 * self.balance_factor), + (2, 20 * self.balance_factor), + (3, 30 * self.balance_factor), + (4, 40 * self.balance_factor), + (5, 50 * self.balance_factor), + (6, 60 * self.balance_factor) + ], + existential_deposit: 0, + transfer_fee: 0, + creation_fee: 0, + vesting: vec![], + }.build_storage().unwrap().0); + t.extend(seats::GenesisConfig:: { + candidacy_bond: 3, + voter_bond: self.voter_bond, + present_slash_per_voter: self.bad_presentation_punishment, + carry_count: 2, + inactive_grace_period: 1, + active_council: if self.with_council { vec![ + (1, 10), + (2, 10), + (3, 10) + ] } else { vec![] }, + approval_voting_period: 4, + presentation_duration: 2, + desired_seats: 2, + decay_ratio: self.decay_ratio, + voting_fee: self.voting_fee, + term_duration: 5, + }.build_storage().unwrap().0); + runtime_io::TestExternalities::new(t) + } } pub type System = system::Module; pub type Balances = balances::Module; pub type Democracy = democracy::Module; pub type Council = seats::Module; - pub type CouncilVoting = voting::Module; pub type CouncilMotions = motions::Module; } diff --git a/srml/council/src/motions.rs b/srml/council/src/motions.rs index ac16a355a3f99424d25f16247afd13635f01a4a1..9fe30e3e785910f19b44450bb5ffe8c015e97d59 100644 --- a/srml/council/src/motions.rs +++ b/srml/council/src/motions.rs @@ -16,21 +16,27 @@ //! Council voting system. -use rstd::prelude::*; -use rstd::result; +use rstd::{prelude::*, result}; use substrate_primitives::u32_trait::Value as U32; use primitives::traits::{Hash, EnsureOrigin}; -use srml_support::dispatch::{Dispatchable, Parameter}; -use srml_support::{StorageValue, StorageMap, decl_module, decl_event, decl_storage, ensure}; -use super::{Trait as CouncilTrait, Module as Council}; +use srml_support::{ + dispatch::{Dispatchable, Parameter}, codec::{Encode, Decode}, + StorageValue, StorageMap, decl_module, decl_event, decl_storage, ensure +}; +use super::{Trait as CouncilTrait, Module as Council, OnMembersChanged}; use system::{self, ensure_signed}; /// Simple index type for proposal counting. pub type ProposalIndex = u32; +/// A number of council members. +/// +/// This also serves as a number of voting members, and since for motions, each council member may +/// vote exactly once, therefore also the number of votes for any given motion. +pub type MemberCount = u32; pub trait Trait: CouncilTrait { /// The outer origin type. - type Origin: From; + type Origin: From>; /// The outer call dispatch type. type Proposal: Parameter + Dispatchable::Origin>; @@ -42,31 +48,79 @@ pub trait Trait: CouncilTrait { /// Origin for the council module. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -pub enum Origin { - /// It has been condoned by a given number of council members. - Members(u32), +pub enum RawOrigin { + /// It has been condoned by a given number of council members from a given total. + Members(MemberCount, MemberCount), + /// It has been condoned by a single council member. + Member(AccountId), +} + +/// Origin for the council module. +pub type Origin = RawOrigin<::AccountId>; + +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +/// Info for keeping track of a motion being voted on. +pub struct Votes { + /// The proposal's unique index. + index: ProposalIndex, + /// The number of approval votes that are needed to pass the motion. + threshold: MemberCount, + /// The current set of voters that approved it. + ayes: Vec, + /// The current set of voters that rejected it. + nays: Vec, +} + +decl_storage! { + trait Store for Module as CouncilMotions { + /// The hashes of the active proposals. + pub Proposals get(proposals): Vec; + /// Actual proposal for a given hash, if it's current. + pub ProposalOf get(proposal_of): map T::Hash => Option<::Proposal>; + /// Votes on a given proposal, if it is ongoing. + pub Voting get(voting): map T::Hash => Option>; + /// Proposals so far. + pub ProposalCount get(proposal_count): u32; + } } decl_event!( pub enum Event where ::Hash, ::AccountId { - /// A motion (given hash) has been proposed (by given account) with a threshold (given u32). - Proposed(AccountId, ProposalIndex, Hash, u32), + /// A motion (given hash) has been proposed (by given account) with a threshold (given + /// `MemberCount`). + Proposed(AccountId, ProposalIndex, Hash, MemberCount), /// A motion (given hash) has been voted on by given account, leaving - /// a tally (yes votes and no votes given as u32s respectively). - Voted(AccountId, Hash, bool, u32, u32), + /// a tally (yes votes and no votes given respectively as `MemberCount`). + Voted(AccountId, Hash, bool, MemberCount, MemberCount), /// A motion was approved by the required threshold. Approved(Hash), /// A motion was not approved by the required threshold. Disapproved(Hash), /// A motion was executed; `bool` is true if returned without error. Executed(Hash, bool), + /// A single councillor did some action; `bool` is true if returned without error. + MemberExecuted(Hash, bool), } ); decl_module! { pub struct Module for enum Call where origin: ::Origin { fn deposit_event() = default; - fn propose(origin, #[compact] threshold: u32, proposal: Box<::Proposal>) { + + /// Dispatch a proposal from a councilor using the `Member` origin. + /// + /// Origin must be a council member. + fn execute(origin, proposal: Box<::Proposal>) { + let who = ensure_signed(origin)?; + ensure!(Self::is_councillor(&who), "proposer not on council"); + + let proposal_hash = T::Hashing::hash_of(&proposal); + let ok = proposal.dispatch(RawOrigin::Member(who).into()).is_ok(); + Self::deposit_event(RawEvent::MemberExecuted(proposal_hash, ok)); + } + + fn propose(origin, #[compact] threshold: MemberCount, proposal: Box<::Proposal>) { let who = ensure_signed(origin)?; ensure!(Self::is_councillor(&who), "proposer not on council"); @@ -76,14 +130,16 @@ decl_module! { ensure!(!>::exists(proposal_hash), "duplicate proposals not allowed"); if threshold < 2 { - let ok = proposal.dispatch(Origin::Members(1).into()).is_ok(); + let seats = >::active_council().len() as MemberCount; + let ok = proposal.dispatch(RawOrigin::Members(1, seats).into()).is_ok(); Self::deposit_event(RawEvent::Executed(proposal_hash, ok)); } else { let index = Self::proposal_count(); ProposalCount::mutate(|i| *i += 1); >::mutate(|proposals| proposals.push(proposal_hash)); >::insert(proposal_hash, *proposal); - >::insert(proposal_hash, (index, threshold, vec![who.clone()], vec![])); + let votes = Votes { index, threshold, ayes: vec![who.clone()], nays: vec![] }; + >::insert(proposal_hash, votes); Self::deposit_event(RawEvent::Proposed(who, index, proposal_hash, threshold)); } @@ -95,46 +151,46 @@ decl_module! { ensure!(Self::is_councillor(&who), "voter not on council"); let mut voting = Self::voting(&proposal).ok_or("proposal must exist")?; - ensure!(voting.0 == index, "mismatched index"); + ensure!(voting.index == index, "mismatched index"); - let position_yes = voting.2.iter().position(|a| a == &who); - let position_no = voting.3.iter().position(|a| a == &who); + let position_yes = voting.ayes.iter().position(|a| a == &who); + let position_no = voting.nays.iter().position(|a| a == &who); if approve { if position_yes.is_none() { - voting.2.push(who.clone()); + voting.ayes.push(who.clone()); } else { return Err("duplicate vote ignored") } if let Some(pos) = position_no { - voting.3.swap_remove(pos); + voting.nays.swap_remove(pos); } } else { if position_no.is_none() { - voting.3.push(who.clone()); + voting.nays.push(who.clone()); } else { return Err("duplicate vote ignored") } if let Some(pos) = position_yes { - voting.2.swap_remove(pos); + voting.ayes.swap_remove(pos); } } - let yes_votes = voting.2.len() as u32; - let no_votes = voting.3.len() as u32; + let yes_votes = voting.ayes.len() as MemberCount; + let no_votes = voting.nays.len() as MemberCount; Self::deposit_event(RawEvent::Voted(who, proposal, approve, yes_votes, no_votes)); - let threshold = voting.1; - let potential_votes = >::active_council().len() as u32; - let approved = yes_votes >= threshold; - let disapproved = potential_votes.saturating_sub(no_votes) < threshold; + let seats = >::active_council().len() as MemberCount; + let approved = yes_votes >= voting.threshold; + let disapproved = seats.saturating_sub(no_votes) < voting.threshold; if approved || disapproved { if approved { Self::deposit_event(RawEvent::Approved(proposal)); // execute motion, assuming it exists. if let Some(p) = >::take(&proposal) { - let ok = p.dispatch(Origin::Members(threshold).into()).is_ok(); + let origin = RawOrigin::Members(voting.threshold, seats).into(); + let ok = p.dispatch(origin).is_ok(); Self::deposit_event(RawEvent::Executed(proposal, ok)); } } else { @@ -153,22 +209,6 @@ decl_module! { } } -decl_storage! { - trait Store for Module as CouncilMotions { - /// The (hashes of) the active proposals. - pub Proposals get(proposals): Vec; - /// Actual proposal for a given hash, if it's current. - pub ProposalOf get(proposal_of): map T::Hash => Option< ::Proposal >; - /// Votes for a given proposal: (required_yes_votes, yes_voters, no_voters). - pub Voting get(voting): map T::Hash => Option<(ProposalIndex, u32, Vec, Vec)>; - /// Proposals so far. - pub ProposalCount get(proposal_count): u32; - } - add_extra_genesis { - build(|_, _, _| {}); - } -} - impl Module { pub fn is_councillor(who: &T::AccountId) -> bool { >::active_council().iter() @@ -176,24 +216,101 @@ impl Module { } } -/// Ensure that the origin `o` represents at least `n` council members. Returns -/// `Ok` or an `Err` otherwise. -pub fn ensure_council_members(o: OuterOrigin, n: u32) -> result::Result - where OuterOrigin: Into> +impl OnMembersChanged for Module { + fn on_members_changed(_new: &[T::AccountId], old: &[T::AccountId]) { + // remove accounts from all current voting in motions. + let mut old = old.to_vec(); + old.sort_unstable(); + for h in Self::proposals().into_iter() { + >::mutate(h, |v| + if let Some(mut votes) = v.take() { + votes.ayes = votes.ayes.into_iter() + .filter(|i| old.binary_search(i).is_err()) + .collect(); + votes.nays = votes.nays.into_iter() + .filter(|i| old.binary_search(i).is_err()) + .collect(); + *v = Some(votes); + } + ); + } + } +} + +/// Ensure that the origin `o` represents at least `n` council members. Returns `Ok` or an `Err` +/// otherwise. +pub fn ensure_council_members(o: OuterOrigin, n: MemberCount) + -> result::Result + where OuterOrigin: Into, OuterOrigin>> { match o.into() { - Some(Origin::Members(x)) if x >= n => Ok(n), + Ok(RawOrigin::Members(x, _)) if x >= n => Ok(n), _ => Err("bad origin: expected to be a threshold number of council members"), } } -pub struct EnsureMembers(::rstd::marker::PhantomData); -impl EnsureOrigin for EnsureMembers - where O: Into> -{ - type Success = u32; - fn ensure_origin(o: O) -> result::Result { - ensure_council_members(o, N::VALUE) +pub struct EnsureMember(::rstd::marker::PhantomData); +impl< + O: Into, O>> + From>, + AccountId +> EnsureOrigin for EnsureMember { + type Success = AccountId; + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Member(id) => Ok(id), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureMembers(::rstd::marker::PhantomData<(N, AccountId)>); +impl< + O: Into, O>> + From>, + N: U32, + AccountId, +> EnsureOrigin for EnsureMembers { + type Success = (MemberCount, MemberCount); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Members(n, m) if n >= N::VALUE => Ok((n, m)), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureProportionMoreThan( + ::rstd::marker::PhantomData<(N, D, AccountId)> +); +impl< + O: Into, O>> + From>, + N: U32, + D: U32, + AccountId, +> EnsureOrigin for EnsureProportionMoreThan { + type Success = (); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Members(n, m) if n * D::VALUE > N::VALUE * m => Ok(()), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureProportionAtLeast( + ::rstd::marker::PhantomData<(N, D, AccountId)> +); +impl< + O: Into, O>> + From>, + N: U32, + D: U32, + AccountId, +> EnsureOrigin for EnsureProportionAtLeast { + type Success = (); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Members(n, m) if n * D::VALUE >= N::VALUE * m => Ok(()), + r => Err(O::from(r)), + }) } } @@ -203,13 +320,14 @@ mod tests { use super::RawEvent; use crate::tests::*; use crate::tests::{Call, Origin, Event as OuterEvent}; + use primitives::traits::BlakeTwo256; use srml_support::{Hashable, assert_ok, assert_noop}; use system::{EventRecord, Phase}; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; #[test] fn motions_basic_environment_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); assert_eq!(Balances::free_balance(&42), 0); assert_eq!(CouncilMotions::proposals(), Vec::::new()); @@ -221,20 +339,58 @@ mod tests { } #[test] - fn motions_propose_works() { - with_externalities(&mut new_test_ext(true), || { + fn removal_of_old_voters_votes_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { + System::set_block_number(1); + let proposal = set_balance_proposal(42); + let hash = BlakeTwo256::hash_of(&proposal); + assert_ok!(CouncilMotions::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(CouncilMotions::vote(Origin::signed(2), hash.clone(), 0, true)); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 3, ayes: vec![1, 2], nays: vec![] }) + ); + CouncilMotions::on_members_changed(&[], &[1]); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 3, ayes: vec![2], nays: vec![] }) + ); + + let proposal = set_balance_proposal(69); + let hash = BlakeTwo256::hash_of(&proposal); + assert_ok!(CouncilMotions::propose(Origin::signed(2), 2, Box::new(proposal.clone()))); + assert_ok!(CouncilMotions::vote(Origin::signed(3), hash.clone(), 1, false)); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![3] }) + ); + CouncilMotions::on_members_changed(&[], &[3]); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![] }) + ); + }); + } + + #[test] + fn propose_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = proposal.blake2_256().into(); assert_ok!(CouncilMotions::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); assert_eq!(CouncilMotions::proposals(), vec![hash]); assert_eq!(CouncilMotions::proposal_of(&hash), Some(proposal)); - assert_eq!(CouncilMotions::voting(&hash), Some((0, 3, vec![1], Vec::::new()))); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 3, ayes: vec![1], nays: vec![] }) + ); assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 3)) + event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 3)), + topics: vec![], } ]); }); @@ -242,7 +398,7 @@ mod tests { #[test] fn motions_ignoring_non_council_proposals_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); assert_noop!(CouncilMotions::propose(Origin::signed(42), 3, Box::new(proposal.clone())), "proposer not on council"); @@ -251,7 +407,7 @@ mod tests { #[test] fn motions_ignoring_non_council_votes_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -262,7 +418,7 @@ mod tests { #[test] fn motions_ignoring_bad_index_council_vote_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(3); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -273,25 +429,33 @@ mod tests { #[test] fn motions_revoting_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); assert_ok!(CouncilMotions::propose(Origin::signed(1), 2, Box::new(proposal.clone()))); - assert_eq!(CouncilMotions::voting(&hash), Some((0, 2, vec![1], Vec::::new()))); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 2, ayes: vec![1], nays: vec![] }) + ); assert_noop!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, true), "duplicate vote ignored"); assert_ok!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, false)); - assert_eq!(CouncilMotions::voting(&hash), Some((0, 2, Vec::::new(), vec![1]))); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 2, ayes: vec![], nays: vec![1] }) + ); assert_noop!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, false), "duplicate vote ignored"); assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 2)) + event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 2)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Voted(1, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 0, 1)) + event: OuterEvent::motions(RawEvent::Voted(1, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 0, 1)), + topics: vec![], } ]); }); @@ -299,7 +463,7 @@ mod tests { #[test] fn motions_disapproval_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -309,15 +473,18 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 3)) + event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 3)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Voted(2, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 1, 1)) + event: OuterEvent::motions(RawEvent::Voted(2, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 1, 1)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Disapproved(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into())) + event: OuterEvent::motions(RawEvent::Disapproved(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into())), + topics: vec![], } ]); }); @@ -325,7 +492,7 @@ mod tests { #[test] fn motions_approval_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -335,19 +502,23 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 2)) + event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 2)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Voted(2, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), true, 2, 0)) + event: OuterEvent::motions(RawEvent::Voted(2, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), true, 2, 0)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Approved(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into())) + event: OuterEvent::motions(RawEvent::Approved(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into())), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Executed(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false)) + event: OuterEvent::motions(RawEvent::Executed(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false)), + topics: vec![], } ]); }); diff --git a/srml/council/src/seats.rs b/srml/council/src/seats.rs index 6bb0be5ec94407126269bd3e943947bda61f0548..8a1f4472b2a95a042cb25ef8df92237c5cbd2326 100644 --- a/srml/council/src/seats.rs +++ b/srml/council/src/seats.rs @@ -17,14 +17,20 @@ //! Council system: Handles the voting in and maintenance of council members. use rstd::prelude::*; -use primitives::traits::{Zero, One, As, StaticLookup}; +use primitives::traits::{Zero, One, StaticLookup, Bounded, Saturating}; use runtime_io::print; use srml_support::{ - StorageValue, StorageMap, dispatch::Result, decl_storage, decl_event, ensure, - traits::{Currency, ReservableCurrency, OnUnbalanced} + StorageValue, StorageMap, + dispatch::Result, decl_storage, decl_event, ensure, decl_module, + traits::{ + Currency, ReservableCurrency, OnUnbalanced, LockIdentifier, + LockableCurrency, WithdrawReasons, WithdrawReason, ExistenceRequirement + } }; use democracy; +use parity_codec::{Encode, Decode}; use system::{self, ensure_signed}; +use super::OnMembersChanged; // no polynomial attacks: // @@ -80,13 +86,51 @@ use system::{self, ensure_signed}; // after each vote as all but K entries are cleared. newly registering candidates must use cleared // entries before they increase the capacity. -use srml_support::decl_module; -pub type VoteIndex = u32; +/// The activity status of a voter. +#[derive(PartialEq, Eq, Copy, Clone, Encode, Decode, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct VoterInfo { + /// Last VoteIndex in which this voter assigned (or initialized) approvals. + last_active: VoteIndex, + /// Last VoteIndex in which one of this voter's approvals won. + /// Note that `last_win = N` indicates a last win at index `N-1`, hence `last_win = 0` means no win ever. + last_win: VoteIndex, + /// The amount of stored weight as a result of not winning but changing approvals. + pot: Balance, + /// Current staked amount. A lock equal to this value always exists. + stake: Balance, +} + +/// Used to demonstrate the status of a particular index in the global voter list. +#[derive(PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum CellStatus { + /// Any out of bound index. Means a push a must happen to the chunk pointed by `NextVoterSet`. + /// Voting fee is applied in case a new chunk is created. + Head, + /// Already occupied by another voter. Voting fee is applied. + Occupied, + /// Empty hole which should be filled. No fee will be applied. + Hole, +} + +const COUNCIL_SEATS_ID: LockIdentifier = *b"councils"; + +pub const VOTER_SET_SIZE: usize = 64; +pub const APPROVAL_SET_SIZE: usize = 8; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +type SetIndex = u32; +pub type VoteIndex = u32; + +// all three must be in sync. +type ApprovalFlag = u32; +pub const APPROVAL_FLAG_MASK: ApprovalFlag = 0x8000_0000; +pub const APPROVAL_FLAG_LEN: usize = 32; + pub trait Trait: democracy::Trait { type Event: From> + Into<::Event>; @@ -95,6 +139,14 @@ pub trait Trait: democracy::Trait { /// Handler for the unbalanced reduction when slashing an invalid reaping attempt. type BadReaper: OnUnbalanced>; + + /// Handler for the unbalanced reduction when submitting a bad `voter_index`. + type BadVoterIndex: OnUnbalanced>; + + /// Handler for the unbalanced reduction when a candidate has lost (and is not a runner up) + type LoserCandidate: OnUnbalanced>; + /// What to do when the members change. + type OnMembersChanged: OnMembersChanged; } decl_module! { @@ -103,22 +155,40 @@ decl_module! { /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots /// are registered. - fn set_approvals(origin, votes: Vec, #[compact] index: VoteIndex) -> Result { + /// + /// Locks the total balance of caller indefinitely. + /// Only [`retract_voter`] or [`reap_inactive_voter`] can unlock the balance. + /// + /// `hint` argument is interpreted differently based on: + /// - if `origin` is setting approvals for the first time: The index will be checked + /// for being a valid _hole_ in the voter list. + /// - if the hint is correctly pointing to a hole, no fee is deducted from `origin`. + /// - Otherwise, the call will succeed but the index is ignored and simply a push to the last chunk + /// with free space happens. If the new push causes a new chunk to be created, a fee indicated by + /// [`VotingFee`] is deducted. + /// - if `origin` is already a voter: the index __must__ be valid and point to the correct + /// position of the `origin` in the current voters list. + /// + /// Note that any trailing `false` votes in `votes` is ignored; In approval voting, not voting for a candidate + /// and voting false, are equal. + fn set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, hint: SetIndex) -> Result { let who = ensure_signed(origin)?; - Self::do_set_approvals(who, votes, index) + Self::do_set_approvals(who, votes, index, hint) } /// Set candidate approvals from a proxy. Approval slots stay valid as long as candidates in those slots /// are registered. - fn proxy_set_approvals(origin, votes: Vec, #[compact] index: VoteIndex) -> Result { + fn proxy_set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, hint: SetIndex) -> Result { let who = >::proxy(ensure_signed(origin)?).ok_or("not a proxy")?; - Self::do_set_approvals(who, votes, index) + Self::do_set_approvals(who, votes, index, hint) } /// Remove a voter. For it not to be a bond-consuming no-op, all approved candidate indices /// must now be either unregistered or registered to a candidate that registered the slot after /// the voter gave their last approval set. /// + /// Both indices must be provided as explained in [`voter_at`] function. + /// /// May be called by anyone. Returns the voter deposit to `signed`. fn reap_inactive_voter( origin, @@ -128,34 +198,49 @@ decl_module! { #[compact] assumed_vote_index: VoteIndex ) { let reporter = ensure_signed(origin)?; - let who = T::Lookup::lookup(who)?; + ensure!(!Self::presentation_active(), "cannot reap during presentation period"); - ensure!(Self::voter_last_active(&reporter).is_some(), "reporter must be a voter"); - let last_active = Self::voter_last_active(&who).ok_or("target for inactivity cleanup must be active")?; + ensure!(Self::voter_info(&reporter).is_some(), "reporter must be a voter"); + + let info = Self::voter_info(&who).ok_or("target for inactivity cleanup must be active")?; + let last_active = info.last_active; + ensure!(assumed_vote_index == Self::vote_index(), "vote index not current"); - ensure!(assumed_vote_index > last_active + Self::inactivity_grace_period(), "cannot reap during grace period"); - let voters = Self::voters(); + ensure!( + assumed_vote_index > last_active+ Self::inactivity_grace_period(), + "cannot reap during grace period" + ); + let reporter_index = reporter_index as usize; let who_index = who_index as usize; - ensure!(reporter_index < voters.len() && voters[reporter_index] == reporter, "bad reporter index"); - ensure!(who_index < voters.len() && voters[who_index] == who, "bad target index"); + let assumed_reporter = Self::voter_at(reporter_index).ok_or("invalid reporter index")?; + let assumed_who = Self::voter_at(who_index).ok_or("invalid target index")?; - // will definitely kill one of signed or who now. + ensure!(assumed_reporter == reporter, "bad reporter index"); + ensure!(assumed_who == who, "bad target index"); - let valid = !Self::approvals_of(&who).iter() + // will definitely kill one of reporter or who now. + + let valid = !Self::all_approvals_of(&who).iter() .zip(Self::candidates().iter()) .any(|(&appr, addr)| appr && *addr != T::AccountId::default() && - Self::candidate_reg_info(addr).map_or(false, |x| x.0 <= last_active)/*defensive only: all items in candidates list are registered*/ + // defensive only: all items in candidates list are registered + Self::candidate_reg_info(addr).map_or(false, |x| x.0 <= last_active) ); Self::remove_voter( if valid { &who } else { &reporter }, - if valid { who_index } else { reporter_index }, - voters + if valid { who_index } else { reporter_index } + ); + + T::Currency::remove_lock( + COUNCIL_SEATS_ID, + if valid { &who } else { &reporter } ); + if valid { // This only fails if `reporter` doesn't exist, which it clearly must do since its the origin. // Still, it's no more harmful to propagate any error at this point. @@ -169,23 +254,32 @@ decl_module! { } /// Remove a voter. All votes are cancelled and the voter deposit is returned. + /// + /// The index must be provided as explained in [`voter_at`] function. + /// + /// Also removes the lock on the balance of the voter. See [`do_set_approvals()`]. fn retract_voter(origin, #[compact] index: u32) { let who = ensure_signed(origin)?; ensure!(!Self::presentation_active(), "cannot retract when presenting"); - ensure!(>::exists(&who), "cannot retract non-voter"); - let voters = Self::voters(); + ensure!(>::exists(&who), "cannot retract non-voter"); let index = index as usize; - ensure!(index < voters.len(), "retraction index invalid"); - ensure!(voters[index] == who, "retraction index mismatch"); + let voter = Self::voter_at(index).ok_or("retraction index invalid")?; + ensure!(voter == who, "retraction index mismatch"); - Self::remove_voter(&who, index, voters); + Self::remove_voter(&who, index); T::Currency::unreserve(&who, Self::voting_bond()); + T::Currency::remove_lock(COUNCIL_SEATS_ID, &who); } /// Submit oneself for candidacy. /// /// Account must have enough transferrable funds in it to pay the bond. + /// + /// NOTE: if `origin` has already assigned approvals via [`set_approvals`], + /// it will NOT have any usable funds to pass candidacy bond and must first retract. + /// Note that setting approvals will lock the entire balance of the voter until + /// retraction or being reported. fn submit_candidacy(origin, #[compact] slot: u32) { let who = ensure_signed(origin)?; @@ -214,7 +308,7 @@ decl_module! { } /// Claim that `signed` is one of the top Self::carry_count() + current_vote().1 candidates. - /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()`` + /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()` /// `signed` should have at least fn present_winner( origin, @@ -223,15 +317,21 @@ decl_module! { #[compact] index: VoteIndex ) -> Result { let who = ensure_signed(origin)?; - ensure!(!total.is_zero(), "stake deposited to present winner and be added to leaderboard should be non-zero"); + ensure!( + !total.is_zero(), + "stake deposited to present winner and be added to leaderboard should be non-zero" + ); let candidate = T::Lookup::lookup(candidate)?; ensure!(index == Self::vote_index(), "index not current"); let (_, _, expiring) = Self::next_finalize().ok_or("cannot present outside of presentation period")?; - let stakes = Self::snapshoted_stakes(); - let voters = Self::voters(); - let bad_presentation_punishment = Self::present_slash_per_voter() * BalanceOf::::sa(voters.len() as u64); - ensure!(T::Currency::can_slash(&who, bad_presentation_punishment), "presenter must have sufficient slashable funds"); + let bad_presentation_punishment = + Self::present_slash_per_voter() + * BalanceOf::::from(Self::voter_count() as u32); + ensure!( + T::Currency::can_slash(&who, bad_presentation_punishment), + "presenter must have sufficient slashable funds" + ); let mut leaderboard = Self::leaderboard().ok_or("leaderboard must exist while present phase active")?; ensure!(total > leaderboard[0].0, "candidate not worthy of leaderboard"); @@ -240,17 +340,24 @@ decl_module! { ensure!(p < expiring.len(), "candidate must not form a duplicated member if elected"); } + let voters = Self::all_voters(); let (registered_since, candidate_index): (VoteIndex, u32) = Self::candidate_reg_info(&candidate).ok_or("presented candidate must be current")?; let actual_total = voters.iter() - .zip(stakes.iter()) - .filter_map(|(voter, stake)| - match Self::voter_last_active(voter) { - Some(b) if b >= registered_since => - Self::approvals_of(voter).get(candidate_index as usize) - .and_then(|approved| if *approved { Some(*stake) } else { None }), - _ => None, - }) + .filter_map(|maybe_voter| maybe_voter.as_ref()) + .filter_map(|voter| match Self::voter_info(voter) { + Some(b) if b.last_active >= registered_since => { + let last_win = b.last_win; + let now = Self::vote_index(); + let stake = b.stake; + let offset = Self::get_offset(stake, now - last_win); + let weight = stake + offset + b.pot; + if Self::approvals_of_at(voter, candidate_index as usize) { + Some(weight) + } else { None } + }, + _ => None, + }) .fold(Zero::zero(), |acc, n| acc + n); let dupe = leaderboard.iter().find(|&&(_, ref c)| c == &candidate).is_some(); if total == actual_total && !dupe { @@ -269,15 +376,16 @@ decl_module! { } /// Set the desired member count; if lower than the current count, then seats will not be up - /// election when they expire. If more, then a new vote will be started if one is not already - /// in progress. + /// election when they expire. If more, then a new vote will be started if one is not + /// already in progress. fn set_desired_seats(#[compact] count: u32) { DesiredSeats::put(count); } - /// Remove a particular member. A tally will happen instantly (if not already in a presentation + /// Remove a particular member from the council. This is effective immediately. + /// + /// Note: A tally should happen instantly (if not already in a presentation /// period) to fill the seat if removal means that the desired members are not met. - /// This is effective immediately. fn remove_member(who: ::Source) { let who = T::Lookup::lookup(who)?; let new_council: Vec<(T::AccountId, T::BlockNumber)> = Self::active_council() @@ -285,6 +393,7 @@ decl_module! { .filter(|i| i.0 != who) .collect(); >::put(new_council); + T::OnMembersChanged::on_members_changed(&[], &[who]); } /// Set the presentation duration. If there is currently a vote being presented for, will @@ -299,7 +408,7 @@ decl_module! { >::put(count); } - fn on_finalize(n: T::BlockNumber) { + fn on_initialize(n: T::BlockNumber) { if let Err(e) = Self::end_block(n) { print("Guru meditation"); print(e); @@ -311,57 +420,71 @@ decl_module! { decl_storage! { trait Store for Module as Council { - // parameters + // ---- parameters /// How much should be locked up in order to submit one's candidacy. - pub CandidacyBond get(candidacy_bond) config(): BalanceOf = BalanceOf::::sa(9); + pub CandidacyBond get(candidacy_bond) config(): BalanceOf = 9.into(); /// How much should be locked up in order to be able to submit votes. pub VotingBond get(voting_bond) config(voter_bond): BalanceOf; + /// The amount of fee paid upon each vote submission, unless if they submit a _hole_ index and replace it. + pub VotingFee get(voting_fee) config(voting_fee): BalanceOf; /// The punishment, per voter, if you provide an invalid presentation. - pub PresentSlashPerVoter get(present_slash_per_voter) config(): BalanceOf = BalanceOf::::sa(1); + pub PresentSlashPerVoter get(present_slash_per_voter) config(): BalanceOf = 1.into(); /// How many runners-up should have their approvals persist until the next vote. pub CarryCount get(carry_count) config(): u32 = 2; /// How long to give each top candidate to present themselves after the vote ends. - pub PresentationDuration get(presentation_duration) config(): T::BlockNumber = T::BlockNumber::sa(1000); - /// How many vote indexes need to go by after a target voter's last vote before they can be reaped if their + pub PresentationDuration get(presentation_duration) config(): T::BlockNumber = 1000.into(); + /// How many vote indices need to go by after a target voter's last vote before they can be reaped if their /// approvals are moot. pub InactiveGracePeriod get(inactivity_grace_period) config(inactive_grace_period): VoteIndex = 1; /// How often (in blocks) to check for new votes. - pub VotingPeriod get(voting_period) config(approval_voting_period): T::BlockNumber = T::BlockNumber::sa(1000); + pub VotingPeriod get(voting_period) config(approval_voting_period): T::BlockNumber = 1000.into(); /// How long each position is active for. - pub TermDuration get(term_duration) config(): T::BlockNumber = T::BlockNumber::sa(5); + pub TermDuration get(term_duration) config(): T::BlockNumber = 5.into(); /// Number of accounts that should be sitting on the council. pub DesiredSeats get(desired_seats) config(): u32; + /// Decay factor of weight when being accumulated. It should typically be set to + /// __at least__ `council_size -1` to keep the council secure. + /// When set to `N`, it indicates `(1/N)^t` of staked is decayed at weight increment step `t`. + /// 0 will result in no weight being added at all (normal approval voting). + pub DecayRatio get(decay_ratio) config(decay_ratio): u32 = 24; - // permanent state (always relevant, changes only at the finalization of voting) + // ---- permanent state (always relevant, changes only at the finalization of voting) /// The current council. When there's a vote going on, this should still be used for executive /// matters. The block number (second element in the tuple) is the block that their position is /// active until (calculated by the sum of the block number when the council member was elected /// and their term duration). pub ActiveCouncil get(active_council) config(): Vec<(T::AccountId, T::BlockNumber)>; - /// The total number of votes that have happened or are in progress. + /// The total number of vote rounds that have happened or are in progress. pub VoteCount get(vote_index): VoteIndex; - // persistent state (always relevant, changes constantly) - /// A list of votes for each voter, respecting the last cleared vote index that this voter was - /// last active at. - pub ApprovalsOf get(approvals_of): map T::AccountId => Vec; + // ---- persistent state (always relevant, changes constantly) + /// A list of votes for each voter. The votes are stored as numeric values and parsed in a bit-wise manner. + /// + /// In order to get a human-readable representation (`Vec`), use [`all_approvals_of`]. + /// + /// Furthermore, each vector of scalars is chunked with the cap of `APPROVAL_SET_SIZE`. + pub ApprovalsOf get(approvals_of): map (T::AccountId, SetIndex) => Vec; /// The vote index and list slot that the candidate `who` was registered or `None` if they are not /// currently registered. pub RegisterInfoOf get(candidate_reg_info): map T::AccountId => Option<(VoteIndex, u32)>; - /// The last cleared vote index that this voter was last active at. - pub LastActiveOf get(voter_last_active): map T::AccountId => Option; - /// The present voter list. - pub Voters get(voters): Vec; + /// Basic information about a voter. + pub VoterInfoOf get(voter_info): map T::AccountId => Option>>; + /// The present voter list (chunked and capped at [`VOTER_SET_SIZE`]). + pub Voters get(voters): map SetIndex => Vec>; + /// the next free set to store a voter in. This will keep growing. + pub NextVoterSet get(next_nonfull_voter_set): SetIndex = 0; + /// Current number of Voters. + pub VoterCount get(voter_count): SetIndex = 0; /// The present candidate list. pub Candidates get(candidates): Vec; // has holes + /// Current number of active candidates pub CandidateCount get(candidate_count): u32; - // temporary state (only relevant during finalization/presentation) + // ---- temporary state (only relevant during finalization/presentation) /// The accounts holding the seats that will become free on the next tally. pub NextFinalize get(next_finalize): Option<(T::BlockNumber, u32, Vec)>; - /// The stakes as they were at the point that the vote ended. - pub SnapshotedStakes get(snapshoted_stakes): Vec>; - /// Get the leaderboard if we;re in the presentation phase. + /// Get the leaderboard if we're in the presentation phase. The first element is the weight of each entry; + /// It may be the direct summed approval stakes, or a weighted version of it. pub Leaderboard get(leaderboard): Option, T::AccountId)> >; // ORDERED low -> high } } @@ -392,6 +515,14 @@ impl Module { >::exists(who) } + /// Iff the councillor `who` still has a seat at blocknumber `n` returns `true`. + pub fn will_still_be_councillor_at(who: &T::AccountId, n: T::BlockNumber) -> bool { + Self::active_council().iter() + .find(|&&(ref a, _)| a == who) + .map(|&(_, expires)| expires > n) + .unwrap_or(false) + } + /// Determine the block that a vote can happen on which is no less than `n`. pub fn next_vote_from(n: T::BlockNumber) -> T::BlockNumber { let voting_period = Self::voting_period(); @@ -446,15 +577,21 @@ impl Module { Ok(()) } - /// Remove a voter from the system. Trusts that Self::voters()[index] != voter. - fn remove_voter(voter: &T::AccountId, index: usize, mut voters: Vec) { - >::put({ voters.swap_remove(index); voters }); - >::remove(voter); - >::remove(voter); + /// Remove a voter at a specified index from the system. + fn remove_voter(voter: &T::AccountId, index: usize) { + let (set_index, vec_index) = Self::split_index(index, VOTER_SET_SIZE); + let mut set = Self::voters(set_index); + set[vec_index] = None; + >::insert(set_index, set); + >::mutate(|c| *c = *c - 1); + Self::remove_all_approvals_of(voter); + >::remove(voter); } - // Actually do the voting. - fn do_set_approvals(who: T::AccountId, votes: Vec, index: VoteIndex) -> Result { + /// Actually do the voting. + /// + /// The voter index must be provided as explained in [`voter_at`] function. + fn do_set_approvals(who: T::AccountId, votes: Vec, index: VoteIndex, hint: SetIndex) -> Result { let candidates = Self::candidates(); ensure!(!Self::presentation_active(), "no approval changes during presentation period"); @@ -463,39 +600,98 @@ impl Module { // Prevent a vote from voters that provide a list of votes that exceeds the candidates length // since otherwise an attacker may be able to submit a very long list of `votes` that far exceeds // the amount of candidates and waste more computation than a reasonable voting bond would cover. - ensure!(candidates.len() >= votes.len(), "amount of candidate approval votes cannot exceed amount of candidates"); + ensure!(candidates.len() >= votes.len(), "amount of candidate votes cannot exceed amount of candidates"); + + // Amount to be locked up. + let mut locked_balance = T::Currency::total_balance(&who); + let mut pot_to_set = Zero::zero(); + let hint = hint as usize; + + if let Some(info) = Self::voter_info(&who) { + // already a voter. Index must be valid. No fee. update pot. O(1) + let voter = Self::voter_at(hint).ok_or("invalid voter index")?; + ensure!(voter == who, "wrong voter index"); + + // write new accumulated offset. + let last_win = info.last_win; + let now = index; + let offset = Self::get_offset(info.stake, now - last_win); + pot_to_set = info.pot + offset; + } else { + // not yet a voter. Index _could be valid_. Fee might apply. Bond will be reserved O(1). + ensure!( + T::Currency::free_balance(&who) > Self::voting_bond(), + "new voter must have sufficient funds to pay the bond" + ); - if !>::exists(&who) { - // not yet a voter - deduct bond. - // NOTE: this must be the last potential bailer, since it changes state. - T::Currency::reserve(&who, Self::voting_bond())?; + let (set_index, vec_index) = Self::split_index(hint, VOTER_SET_SIZE); + match Self::cell_status(set_index, vec_index) { + CellStatus::Hole => { + // requested cell was a valid hole. + >::mutate(set_index, |set| set[vec_index] = Some(who.clone())); + }, + CellStatus::Head | CellStatus::Occupied => { + // Either occupied or out-of-range. + let next = Self::next_nonfull_voter_set(); + let mut set = Self::voters(next); + // Caused a new set to be created. Pay for it. + // This is the last potential error. Writes will begin afterwards. + if set.is_empty() { + let imbalance = T::Currency::withdraw( + &who, + Self::voting_fee(), + WithdrawReason::Fee, + ExistenceRequirement::KeepAlive, + )?; + T::BadVoterIndex::on_unbalanced(imbalance); + // NOTE: this is safe since the `withdraw()` will check this. + locked_balance -= Self::voting_fee(); + } + Self::checked_push_voter(&mut set, who.clone(), next); + >::insert(next, set); + } + } - >::mutate(|v| v.push(who.clone())); + T::Currency::reserve(&who, Self::voting_bond())?; + >::mutate(|c| *c = *c + 1); } - >::insert(&who, index); - >::insert(&who, votes); + + T::Currency::set_lock( + COUNCIL_SEATS_ID, + &who, + locked_balance, + T::BlockNumber::max_value(), + WithdrawReasons::all() + ); + + >::insert( + &who, + VoterInfo::> { + last_active: index, + last_win: index, + stake: locked_balance, + pot: pot_to_set, + } + ); + Self::set_approvals_chunked(&who, votes); Ok(()) } - /// Close the voting, snapshot the staking and the number of seats that are actually up for grabs. + /// Close the voting, record the number of seats that are actually up for grabs. fn start_tally() { let active_council = Self::active_council(); let desired_seats = Self::desired_seats() as usize; let number = >::block_number(); - let expiring = active_council.iter().take_while(|i| i.1 == number).map(|i| i.0.clone()).collect::>(); + let expiring = active_council.iter().take_while(|i| i.1 <= number).map(|i| i.0.clone()).collect::>(); let retaining_seats = active_council.len() - expiring.len(); if retaining_seats < desired_seats { let empty_seats = desired_seats - retaining_seats; >::put((number + Self::presentation_duration(), empty_seats as u32, expiring)); - let voters = Self::voters(); - let votes = voters.iter().map(T::Currency::total_balance).collect::>(); - >::put(votes); - // initialize leaderboard. let leaderboard_size = empty_seats + Self::carry_count() as usize; - >::put(vec![(BalanceOf::::zero(), T::AccountId::default()); leaderboard_size]); + >::put(vec![(Zero::zero(), T::AccountId::default()); leaderboard_size]); Self::deposit_event(RawEvent::TallyStarted(empty_seats as u32)); } @@ -506,7 +702,6 @@ impl Module { /// a new vote is started. /// Clears all presented candidates, returning the bond of the elected ones. fn finalize_tally() -> Result { - >::kill(); let (_, coming, expiring): (T::BlockNumber, u32, Vec) = >::take().ok_or("finalize can only be called after a tally is started.")?; let leaderboard: Vec<(BalanceOf, T::AccountId)> = >::take().unwrap_or_default(); @@ -514,16 +709,30 @@ impl Module { // return bond to winners. let candidacy_bond = Self::candidacy_bond(); - let incoming: Vec = leaderboard.iter() + let incoming: Vec<_> = leaderboard.iter() .rev() .take_while(|&&(b, _)| !b.is_zero()) .take(coming as usize) .map(|(_, a)| a) .cloned() - .inspect(|a| {T::Currency::unreserve(a, candidacy_bond);}) + .inspect(|a| { T::Currency::unreserve(a, candidacy_bond); }) .collect(); + + // Update last win index for anyone voted for any of the incomings. + incoming.iter().filter_map(|i| Self::candidate_reg_info(i)).for_each(|r| { + let index = r.1 as usize; + Self::all_voters() + .iter() + .filter_map(|mv| mv.as_ref()) + .filter(|v| Self::approvals_of_at(*v, index)) + .for_each(|v| >::mutate(v, |a| { + if let Some(activity) = a { activity.last_win = Self::vote_index() + 1; } + })); + }); let active_council = Self::active_council(); - let outgoing = active_council.iter().take(expiring.len()).map(|a| a.0.clone()).collect(); + let outgoing: Vec<_> = active_council.iter() + .take(expiring.len()) + .map(|a| a.0.clone()).collect(); // set the new council. let mut new_council: Vec<_> = active_council @@ -534,6 +743,8 @@ impl Module { new_council.sort_by_key(|&(_, expiry)| expiry); >::put(new_council); + T::OnMembersChanged::on_members_changed(&incoming, &outgoing); + // clear all except runners-up from candidate list. let candidates = Self::candidates(); let mut new_candidates = vec![T::AccountId::default(); candidates.len()]; // shrink later. @@ -565,6 +776,205 @@ impl Module { VoteCount::put(Self::vote_index() + 1); Ok(()) } + + fn checked_push_voter(set: &mut Vec>, who: T::AccountId, index: u32) { + let len = set.len(); + + // Defensive only: this should never happen. Don't push since it will break more things. + if len == VOTER_SET_SIZE { return; } + + set.push(Some(who)); + if len + 1 == VOTER_SET_SIZE { + >::put(index + 1); + } + } + + /// Get the set and vector index of a global voter index. + /// + /// Note that this function does not take holes into account. + /// See [`voter_at`]. + fn split_index(index: usize, scale: usize) -> (SetIndex, usize) { + let set_index = (index / scale) as u32; + let vec_index = index % scale; + (set_index, vec_index) + } + + /// Return a concatenated vector over all voter sets. + fn all_voters() -> Vec> { + let mut all = >::get(0); + let mut index = 1; + // NOTE: we could also use `Self::next_nonfull_voter_set()` here but that might change based + // on how we do chunking. This is more generic. + loop { + let next_set = >::get(index); + if next_set.is_empty() { + break; + } else { + index += 1; + all.extend(next_set); + } + } + all + } + + /// Shorthand for fetching a voter at a specific (global) index. + /// + /// NOTE: this function is used for checking indices. Yet, it does not take holes into account. + /// This means that any account submitting an index at any point in time should submit: + /// `VOTER_SET_SIZE * set_index + local_index`, meaning that you are ignoring all holes in the + /// first `set_index` sets. + fn voter_at(index: usize) -> Option { + let (set_index, vec_index) = Self::split_index(index, VOTER_SET_SIZE); + let set = Self::voters(set_index); + if vec_index < set.len() { + set[vec_index].clone() + } else { + None + } + } + + /// A more sophisticated version of `voter_at`. Will be kept separate as most often it is an overdue + /// compared to `voter_at`. Only used when setting approvals. + fn cell_status(set_index: SetIndex, vec_index: usize) -> CellStatus { + let set = Self::voters(set_index); + if vec_index < set.len() { + if let Some(_) = set[vec_index] { + CellStatus::Occupied + } else { + CellStatus::Hole + } + } else { + CellStatus::Head + } + } + + /// Sets the approval of a voter in a chunked manner. + fn set_approvals_chunked(who: &T::AccountId, approvals: Vec) { + let approvals_flag_vec = Self::bool_to_flag(approvals); + approvals_flag_vec + .chunks(APPROVAL_SET_SIZE) + .enumerate() + .for_each(|(index, slice)| >::insert((who.clone(), index as SetIndex), slice.to_vec())); + } + + /// shorthand for fetching a specific approval of a voter at a specific (global) index. + /// + /// Using this function to read a vote is preferred as it reads `APPROVAL_SET_SIZE` items of type + /// `ApprovalFlag` from storage at most; not all of them. + /// + /// Note that false is returned in case of no-vote or an explicit `false`. + fn approvals_of_at(who: &T::AccountId, index: usize) -> bool { + let (flag_index, bit) = Self::split_index(index, APPROVAL_FLAG_LEN); + let (set_index, vec_index) = Self::split_index(flag_index as usize, APPROVAL_SET_SIZE); + let set = Self::approvals_of((who.clone(), set_index)); + if vec_index < set.len() { + // This is because bit_at treats numbers in lsb -> msb order. + let reversed_index = set.len() - 1 - vec_index; + Self::bit_at(set[reversed_index], bit) + } else { + false + } + } + + /// Return true of the bit `n` of scalar `x` is set to `1` and false otherwise. + fn bit_at(x: ApprovalFlag, n: usize) -> bool { + if n < APPROVAL_FLAG_LEN { + // x & ( APPROVAL_FLAG_MASK >> n ) != 0 + x & ( 1 << n ) != 0 + } else { + false + } + } + + /// Convert a vec of boolean approval flags to a vec of integers, as denoted by + /// the type `ApprovalFlag`. see `bool_to_flag_should_work` test for examples. + pub fn bool_to_flag(x: Vec) -> Vec { + let mut result: Vec = Vec::with_capacity(x.len() / APPROVAL_FLAG_LEN); + if x.is_empty() { + return result; + } + result.push(0); + let mut index = 0; + let mut counter = 0; + loop { + let shl_index = counter % APPROVAL_FLAG_LEN; + result[index] += (if x[counter] { 1 } else { 0 }) << shl_index; + counter += 1; + if counter > x.len() - 1 { break; } + if counter % APPROVAL_FLAG_LEN == 0 { + result.push(0); + index += 1; + } + } + result + } + + /// Convert a vec of flags (u32) to boolean. + pub fn flag_to_bool(chunk: Vec) -> Vec { + let mut result = Vec::with_capacity(chunk.len()); + if chunk.is_empty() { return vec![] } + chunk.into_iter() + .map(|num| (0..APPROVAL_FLAG_LEN).map(|bit| Self::bit_at(num, bit)).collect::>()) + .for_each(|c| { + let last_approve = match c.iter().rposition(|n| *n) { + Some(index) => index + 1, + None => 0 + }; + result.extend(c.into_iter().take(last_approve)); + }); + result + } + + /// Return a concatenated vector over all approvals of a voter as boolean. + /// The trailing zeros are removed. + fn all_approvals_of(who: &T::AccountId) -> Vec { + let mut all: Vec = vec![]; + let mut index = 0_u32; + loop { + let chunk = Self::approvals_of((who.clone(), index)); + if chunk.is_empty() { break; } + all.extend(Self::flag_to_bool(chunk)); + index += 1; + } + all + } + + /// Remove all approvals associated with one account. + fn remove_all_approvals_of(who: &T::AccountId) { + let mut index = 0; + loop { + let set = Self::approvals_of((who.clone(), index)); + if set.len() > 0 { + >::remove((who.clone(), index)); + index += 1; + } else { + break + } + } + } + + /// Calculates the offset value (stored pot) of a stake, based on the distance + /// to the last win_index, `t`. Regardless of the internal implementation, + /// it should always be used with the following structure: + /// + /// Given Stake of voter `V` being `x` and distance to last_win index `t`, the new weight + /// of `V` is `x + get_offset(x, t)`. + /// + /// In other words, this function returns everything extra that should be added + /// to a voter's stake value to get the correct weight. Indeed, zero is + /// returned if `t` is zero. + fn get_offset(stake: BalanceOf, t: VoteIndex) -> BalanceOf { + let decay_ratio: BalanceOf = Self::decay_ratio().into(); + if t > 150 { return stake * decay_ratio } + let mut offset = stake; + let mut r = Zero::zero(); + let decay = decay_ratio + One::one(); + for _ in 0..t { + offset = offset.saturating_sub(offset / decay); + r += offset + } + r + } } #[cfg(test)] @@ -573,16 +983,86 @@ mod tests { use crate::tests::*; use srml_support::{assert_ok, assert_noop, assert_err}; + fn voter_ids() -> Vec { + Council::all_voters().iter().map(|v| v.unwrap_or(0) ).collect::>() + } + + fn vote(i: u64, l: usize) { + let _ = Balances::make_free_balance_be(&i, 20); + assert_ok!(Council::set_approvals(Origin::signed(i), (0..l).map(|_| true).collect::>(), 0, 0)); + } + + fn vote_at(i: u64, l: usize, index: VoteIndex) { + let _ = Balances::make_free_balance_be(&i, 20); + assert_ok!(Council::set_approvals(Origin::signed(i), (0..l).map(|_| true).collect::>(), 0, index)); + } + + fn create_candidate(i: u64, index: u32) { + let _ = Balances::make_free_balance_be(&i, 20); + assert_ok!(Council::submit_candidacy(Origin::signed(i), index)); + } + + fn bond() -> u64 { + Council::voting_bond() + } + + + #[test] + fn bool_to_flag_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_eq!(Council::bool_to_flag(vec![]), vec![]); + assert_eq!(Council::bool_to_flag(vec![false]), vec![0]); + assert_eq!(Council::bool_to_flag(vec![true]), vec![1]); + assert_eq!(Council::bool_to_flag(vec![true, true, true, true]), vec![15]); + assert_eq!(Council::bool_to_flag(vec![true, true, true, true, true]), vec![15 + 16]); + + let set_1 = vec![ + true, false, false, false, // 0x1 + false, true, true, true, // 0xE + ]; + assert_eq!( + Council::bool_to_flag(set_1.clone()), + vec![0x00_00_00_E1_u32] + ); + assert_eq!( + Council::flag_to_bool(vec![0x00_00_00_E1_u32]), + set_1 + ); + + let set_2 = vec![ + false, false, false, true, // 0x8 + false, true, false, true, // 0xA + ]; + assert_eq!( + Council::bool_to_flag(set_2.clone()), + vec![0x00_00_00_A8_u32] + ); + assert_eq!( + Council::flag_to_bool(vec![0x00_00_00_A8_u32]), + set_2 + ); + + let mut rhs = (0..100/APPROVAL_FLAG_LEN).map(|_| 0xFFFFFFFF_u32).collect::>(); + // NOTE: this might be need change based on `APPROVAL_FLAG_LEN`. + rhs.extend(vec![0x00_00_00_0F]); + assert_eq!( + Council::bool_to_flag((0..100).map(|_| true).collect()), + rhs + ) + }) + } + #[test] fn params_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::next_vote_from(1), 4); assert_eq!(Council::next_vote_from(4), 4); assert_eq!(Council::next_vote_from(5), 8); assert_eq!(Council::vote_index(), 0); - assert_eq!(Council::candidacy_bond(), 9); - assert_eq!(Council::voting_bond(), 3); + assert_eq!(Council::candidacy_bond(), 3); + assert_eq!(Council::voting_bond(), 0); + assert_eq!(Council::voting_fee(), 0); assert_eq!(Council::present_slash_per_voter(), 1); assert_eq!(Council::presentation_duration(), 2); assert_eq!(Council::inactivity_grace_period(), 1); @@ -600,15 +1080,225 @@ mod tests { assert_eq!(Council::is_a_candidate(&1), false); assert_eq!(Council::candidate_reg_info(1), None); - assert_eq!(Council::voters(), Vec::::new()); - assert_eq!(Council::voter_last_active(1), None); - assert_eq!(Council::approvals_of(1), vec![]); + assert_eq!(Council::voters(0), Vec::>::new()); + assert_eq!(Council::voter_info(1), None); + assert_eq!(Council::all_approvals_of(&1), vec![]); + }); + } + + #[test] + fn voter_set_growth_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + // create 65. 64 (set0) + 1 (set1) + (1..=63).for_each(|i| vote(i, 2)); + assert_eq!(Council::next_nonfull_voter_set(), 0); + vote(64, 2); + assert_eq!(Council::next_nonfull_voter_set(), 1); + vote(65, 2); + + let set1 = Council::voters(0); + let set2 = Council::voters(1); + + assert_eq!(set1.len(), 64); + assert_eq!(set2.len(), 1); + + assert_eq!(set1[0], Some(1)); + assert_eq!(set1[10], Some(11)); + assert_eq!(set2[0], Some(65)); + }) + } + + #[test] + fn voter_set_reclaim_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + (1..=129).for_each(|i| vote(i, 2)); + assert_eq!(Council::next_nonfull_voter_set(), 2); + + assert_ok!(Council::retract_voter(Origin::signed(11), 10)); + + assert_ok!(Council::retract_voter(Origin::signed(66), 65)); + assert_ok!(Council::retract_voter(Origin::signed(67), 66)); + + // length does not show it but holes do exist. + assert_eq!(Council::voters(0).len(), 64); + assert_eq!(Council::voters(1).len(), 64); + assert_eq!(Council::voters(2).len(), 1); + + assert_eq!(Council::voters(0)[10], None); + assert_eq!(Council::voters(1)[1], None); + assert_eq!(Council::voters(1)[2], None); + // Next set with capacity is 2. + assert_eq!(Council::next_nonfull_voter_set(), 2); + + // But we can fill a hole. + vote_at(130, 2, 10); + + // Nothing added to set 2. A hole was filled. + assert_eq!(Council::voters(0).len(), 64); + assert_eq!(Council::voters(1).len(), 64); + assert_eq!(Council::voters(2).len(), 1); + + // and the next two (scheduled) to the second set. + assert_eq!(Council::next_nonfull_voter_set(), 2); + }) + } + + #[test] + fn approvals_set_growth_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + // create candidates and voters. + (1..=250).for_each(|i| create_candidate(i, (i-1) as u32)); + (1..=250).for_each(|i| vote(i, i as usize)); + + // all approvals of should return the exact expected vector. + assert_eq!(Council::all_approvals_of(&180), (0..180).map(|_| true).collect::>()); + + assert_eq!(Council::all_approvals_of(&32), (0..32).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&8), (0..8).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&64), (0..64).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&65), (0..65).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&63), (0..63).map(|_| true).collect::>()); + + // NOTE: assuming that APPROVAL_SET_SIZE is more or less small-ish. Might fail otherwise. + let full_sets = (180 / APPROVAL_FLAG_LEN) / APPROVAL_SET_SIZE; + let left_over = (180 / APPROVAL_FLAG_LEN) / APPROVAL_SET_SIZE; + let rem = 180 % APPROVAL_FLAG_LEN; + + // grab and check the last full set, if it exists. + if full_sets > 0 { + assert_eq!( + Council::approvals_of((180, (full_sets-1) as SetIndex )), + Council::bool_to_flag((0..APPROVAL_SET_SIZE * APPROVAL_FLAG_LEN).map(|_| true).collect::>()) + ); + } + + // grab and check the last, half-empty, set. + if left_over > 0 { + assert_eq!( + Council::approvals_of((180, full_sets as SetIndex)), + Council::bool_to_flag((0..left_over * APPROVAL_FLAG_LEN + rem).map(|_| true).collect::>()) + ); + } + }) + } + + + #[test] + fn cell_status_works() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + (1..=63).for_each(|i| vote(i, 2)); + + assert_ok!(Council::retract_voter(Origin::signed(11), 10)); + assert_ok!(Council::retract_voter(Origin::signed(21), 20)); + + assert_eq!(Council::cell_status(0, 10), CellStatus::Hole); + assert_eq!(Council::cell_status(0, 0), CellStatus::Occupied); + assert_eq!(Council::cell_status(0, 20), CellStatus::Hole); + assert_eq!(Council::cell_status(0, 63), CellStatus::Head); + assert_eq!(Council::cell_status(1, 0), CellStatus::Head); + assert_eq!(Council::cell_status(1, 10), CellStatus::Head); + }) + } + + #[test] + fn initial_set_approvals_ignores_voter_index() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + + // Last argument is essentially irrelevant. You might get or miss a tip. + assert_ok!(Council::set_approvals(Origin::signed(3), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 5)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 0, 100)); + + // indices are more or less ignored. all is pushed. + assert_eq!(voter_ids(), vec![3, 4, 5]); + }) + } + + #[test] + fn bad_approval_index_slashes_voters_and_bond_reduces_stake() { + with_externalities(&mut ExtBuilder::default().voting_fee(5).voter_bond(2).build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + (1..=63).for_each(|i| vote(i, 2)); + assert_eq!(Balances::free_balance(&1), 20 - 5 - 2); // -5 fee -2 bond + assert_eq!(Balances::free_balance(&10), 20 - 2); + assert_eq!(Balances::free_balance(&60), 20 - 2); + + // still no fee + vote(64, 2); + assert_eq!(Balances::free_balance(&64), 20 - 2); // -2 bond + assert_eq!( + Council::voter_info(&64).unwrap(), + VoterInfo { last_win: 0, last_active: 0, stake: 20, pot:0 } + ); + + assert_eq!(Council::next_nonfull_voter_set(), 1); + + // now we charge the next voter. + vote(65, 2); + assert_eq!(Balances::free_balance(&65), 20 - 5 - 2); + assert_eq!( + Council::voter_info(&65).unwrap(), + VoterInfo { last_win: 0, last_active: 0, stake: 15, pot:0 } + ); }); } + #[test] + fn subsequent_set_approvals_checks_voter_index() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + + assert_ok!(Council::set_approvals(Origin::signed(3), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 5)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 0, 100)); + + // invalid index + assert_noop!(Council::set_approvals(Origin::signed(4), vec![true], 0, 5), "invalid voter index"); + // wrong index + assert_noop!(Council::set_approvals(Origin::signed(4), vec![true], 0, 0), "wrong voter index"); + // correct + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 1)); + }) + } + + #[test] + fn voter_index_does_not_take_holes_into_account() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + // create 65. 64 (set0) + 1 (set1) + (1..=65).for_each(|i| vote(i, 2)); + + // account 65 has global index 65. + assert_eq!(Council::voter_at(64).unwrap(), 65); + + assert_ok!(Council::retract_voter(Origin::signed(1), 0)); + assert_ok!(Council::retract_voter(Origin::signed(2), 1)); + + // still the same. These holes are in some other set. + assert_eq!(Council::voter_at(64).unwrap(), 65); + // proof: can submit a new approval with the old index. + assert_noop!(Council::set_approvals(Origin::signed(65), vec![false, true], 0, 64 - 2), "wrong voter index"); + assert_ok!(Council::set_approvals(Origin::signed(65), vec![false, true], 0, 64)); + }) + } + #[test] fn simple_candidate_submission_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_eq!(Council::candidate_reg_info(1), None); @@ -633,7 +1323,7 @@ mod tests { } fn new_test_ext_with_candidate_holes() -> runtime_io::TestExternalities { - let mut t = new_test_ext(false); + let mut t = ExtBuilder::default().build(); with_externalities(&mut t, || { >::put(vec![0, 0, 1]); >::put(1); @@ -676,7 +1366,9 @@ mod tests { #[test] fn candidate_submission_not_using_free_slot_should_not_work() { - with_externalities(&mut new_test_ext_with_candidate_holes(), || { + let mut t = new_test_ext_with_candidate_holes(); + + with_externalities(&mut t, || { System::set_block_number(1); assert_noop!(Council::submit_candidacy(Origin::signed(4), 3), "invalid candidate slot"); }); @@ -684,7 +1376,7 @@ mod tests { #[test] fn bad_candidate_slot_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_noop!(Council::submit_candidacy(Origin::signed(1), 1), "invalid candidate slot"); @@ -693,7 +1385,7 @@ mod tests { #[test] fn non_free_candidate_slot_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); @@ -704,7 +1396,7 @@ mod tests { #[test] fn dupe_candidate_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); @@ -715,45 +1407,367 @@ mod tests { #[test] fn poor_candidate_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_noop!(Council::submit_candidacy(Origin::signed(7), 0), "candidate has not enough funds"); }); } + #[test] + fn balance_should_lock_to_the_maximum() { + with_externalities(&mut ExtBuilder::default().build(), || { + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Balances::free_balance(&2), 20); + + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + + assert_eq!(Balances::free_balance(&2), 20 - bond() ); + assert_noop!(Balances::reserve(&2, 1), "account liquidity restrictions prevent withdrawal"); // locked. + + // deposit a bit more. + let _ = Balances::deposit_creating(&2, 100); + assert_ok!(Balances::reserve(&2, 1)); // locked but now has enough. + + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + assert_noop!(Balances::reserve(&2, 1), "account liquidity restrictions prevent withdrawal"); // locked. + assert_eq!(Balances::locks(&2).len(), 1); + assert_eq!(Balances::locks(&2)[0].amount, 100 + 20); + + assert_ok!(Council::retract_voter(Origin::signed(2), 0)); + + assert_eq!(Balances::locks(&2).len(), 0); + assert_eq!(Balances::free_balance(&2), 120 - 1); // 1 ok call to .reserve() happened. + assert_ok!(Balances::reserve(&2, 1)); // unlocked. + }); + } + + #[test] + fn balance_should_lock_on_submit_approvals_unlock_on_retract() { + with_externalities(&mut ExtBuilder::default().voter_bond(8).voting_fee(0).build(), || { + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Balances::free_balance(&2), 20); + + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + + assert_eq!(Balances::free_balance(&2), 12); // 20 - 8 (bond) + assert_noop!(Balances::reserve(&2, 10), "account liquidity restrictions prevent withdrawal"); // locked. + + assert_ok!(Council::retract_voter(Origin::signed(2), 0)); + + assert_eq!(Balances::free_balance(&2), 20); + assert_ok!(Balances::reserve(&2, 10)); // unlocked. + }); + } + + #[test] + fn accumulating_weight_and_decaying_should_work() { + with_externalities(&mut ExtBuilder::default().balance_factor(10).build(), || { + System::set_block_number(4); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 2)); + + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![false, false, true], 0, 0)); + + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (5, 11)]); + assert_eq!(Council::voter_info(6).unwrap(), VoterInfo { last_win: 1, last_active: 0, stake: 600, pot: 0}); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 1, last_active: 0, stake: 500, pot: 0}); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot: 0}); + + System::set_block_number(12); + // retract needed to unlock approval funds => submit candidacy again. + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 1, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 1, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(14); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100 + Council::get_offset(100, 1), 1), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100 + 96, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 19), (5, 19)]); + assert_eq!( + Council::voter_info(6).unwrap(), + VoterInfo { last_win: 2, last_active: 1, stake: 600, pot:0 } + ); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 2, last_active: 1, stake: 500, pot:0 }); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot:0 }); + + System::set_block_number(20); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 2, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 2, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(22); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 2), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 2), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100 + Council::get_offset(100, 2), 2), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100 + 96 + 93, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 27), (5, 27)]); + assert_eq!( + Council::voter_info(6).unwrap(), + VoterInfo { last_win: 3, last_active: 2, stake: 600, pot: 0} + ); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 3, last_active: 2, stake: 500, pot: 0}); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot: 0}); + + + System::set_block_number(28); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 3, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 3, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(30); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 3), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 3), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100 + Council::get_offset(100, 3), 3), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100 + 96 + 93 + 90, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 35), (5, 35)]); + assert_eq!( + Council::voter_info(6).unwrap(), + VoterInfo { last_win: 4, last_active: 3, stake: 600, pot: 0} + ); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 4, last_active: 3, stake: 500, pot: 0}); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot: 0}); + }) + } + + #[test] + fn winning_resets_accumulated_pot() { + with_externalities(&mut ExtBuilder::default().balance_factor(10).build(), || { + System::set_block_number(4); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 3)); + + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, true, false, false], 0, 1)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true, true], 0, 2)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 4, 400, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(3), 3, 300, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(2), 2, 300, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(300, 2), (300, 3), (400, 4), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (4, 11)]); + + System::set_block_number(12); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(4), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false, false], 1, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, true, false, false], 1, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(14); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 4, 400, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(3), 3, 300 + Council::get_offset(300, 1), 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(2), 2, 300 + Council::get_offset(300, 1), 1), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(400, 4), (588, 2), (588, 3), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 19), (3, 19)]); + + System::set_block_number(20); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(22); + // 2 will not get re-elected with 300 + 288, instead just 300. + // because one of 3's candidates (3) won in previous round + // 4 on the other hand will get extra weight since it was unlucky. + assert_eq!(Council::present_winner(Origin::signed(3), 2, 300, 2), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 4, 400 + Council::get_offset(400, 1), 2), Ok(())); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(4, 27), (2, 27)]); + }) + } + + #[test] + fn resubmitting_approvals_stores_pot() { + with_externalities(&mut ExtBuilder::default() + .voter_bond(0) + .voting_fee(0) + .balance_factor(10) + .build(), + || { System::set_block_number(4); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 2)); + + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 0, 1)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![false, false, true], 0, 2)); + + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (5, 11)]); + + System::set_block_number(12); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 1, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 1, 1)); + // give 1 some new high balance + let _ = Balances::make_free_balance_be(&1, 997); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![false, false, true], 1, 2)); + assert_eq!(Council::voter_info(1).unwrap(), + VoterInfo { + stake: 1000, // 997 + 3 which is candidacy bond. + pot: Council::get_offset(100, 1), + last_active: 1, + last_win: 1, + } + ); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (5, 11)]); + + System::set_block_number(14); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 1000 + 96 /* pot */, 1), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (500, 5), (600, 6), (1096, 1)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(1, 19), (6, 19)]); + }) + } + + #[test] + fn get_offset_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_eq!(Council::get_offset(100, 0), 0); + assert_eq!(Council::get_offset(100, 1), 96); + assert_eq!(Council::get_offset(100, 2), 96 + 93); + assert_eq!(Council::get_offset(100, 3), 96 + 93 + 90); + assert_eq!(Council::get_offset(100, 4), 96 + 93 + 90 + 87); + // limit + assert_eq!(Council::get_offset(100, 1000), 100 * 24); + + assert_eq!(Council::get_offset(50_000_000_000, 0), 0); + assert_eq!(Council::get_offset(50_000_000_000, 1), 48_000_000_000); + assert_eq!(Council::get_offset(50_000_000_000, 2), 48_000_000_000 + 46_080_000_000); + assert_eq!(Council::get_offset(50_000_000_000, 3), 48_000_000_000 + 46_080_000_000 + 44_236_800_000); + assert_eq!( + Council::get_offset(50_000_000_000, 4), + 48_000_000_000 + 46_080_000_000 + 44_236_800_000 + 42_467_328_000 + ); + // limit + assert_eq!(Council::get_offset(50_000_000_000, 1000), 50_000_000_000 * 24); + }) + } + + #[test] + fn get_offset_with_zero_decay() { + with_externalities(&mut ExtBuilder::default().decay_ratio(0).build(), || { + assert_eq!(Council::get_offset(100, 0), 0); + assert_eq!(Council::get_offset(100, 1), 0); + assert_eq!(Council::get_offset(100, 2), 0); + assert_eq!(Council::get_offset(100, 3), 0); + // limit + assert_eq!(Council::get_offset(100, 1000), 0); + }) + } + #[test] fn voting_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 1)); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::voters(), vec![1, 4]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(voter_ids(), vec![1, 4]); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0, 2)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0, 3)); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); - assert_eq!(Council::voters(), vec![1, 4, 2, 3]); + assert_eq!(voter_ids(), vec![1, 4, 2, 3]); }); } #[test] fn proxy_voting_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); @@ -762,74 +1776,79 @@ mod tests { Democracy::force_proxy(2, 12); Democracy::force_proxy(3, 13); Democracy::force_proxy(4, 14); + assert_ok!(Council::proxy_set_approvals(Origin::signed(11), vec![true], 0, 0)); + assert_ok!(Council::proxy_set_approvals(Origin::signed(14), vec![true], 0, 1)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(11), vec![true], 0)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(14), vec![true], 0)); - - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::voters(), vec![1, 4]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(voter_ids(), vec![1, 4]); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(12), vec![false, true, true], 0)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(13), vec![false, true, true], 0)); + assert_ok!(Council::proxy_set_approvals(Origin::signed(12), vec![false, true, true], 0, 2)); + assert_ok!(Council::proxy_set_approvals(Origin::signed(13), vec![false, true, true], 0, 3)); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); - assert_eq!(Council::voters(), vec![1, 4, 2, 3]); + assert_eq!(voter_ids(), vec![1, 4, 2, 3]); }); } #[test] fn setting_any_approval_vote_count_without_any_candidate_count_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates().len(), 0); - assert_noop!(Council::set_approvals(Origin::signed(4), vec![], 0), "amount of candidates to receive approval votes should be non-zero"); + assert_noop!( + Council::set_approvals(Origin::signed(4), vec![], 0, 0), + "amount of candidates to receive approval votes should be non-zero" + ); }); } #[test] fn setting_an_approval_vote_count_more_than_candidate_count_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); assert_eq!(Council::candidates().len(), 1); - assert_noop!(Council::set_approvals(Origin::signed(4), vec![true, true], 0), "amount of candidate approval votes cannot exceed amount of candidates"); + assert_noop!( + Council::set_approvals(Origin::signed(4),vec![true, true], 0, 0), + "amount of candidate votes cannot exceed amount of candidates" + ); }); } #[test] fn resubmitting_voting_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 0)); - assert_eq!(Council::approvals_of(4), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); assert_eq!(Council::candidates().len(), 3); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0, 0)); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); }); } #[test] fn retracting_voter_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); @@ -837,88 +1856,108 @@ mod tests { assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); assert_eq!(Council::candidates().len(), 3); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0, 1)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0, 2)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0, 3)); - assert_eq!(Council::voters(), vec![1, 2, 3, 4]); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![1, 2, 3, 4]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); assert_ok!(Council::retract_voter(Origin::signed(1), 0)); - assert_eq!(Council::voters(), vec![4, 2, 3]); - assert_eq!(Council::approvals_of(1), Vec::::new()); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![0, 2, 3, 4]); + assert_eq!(Council::all_approvals_of(&1), Vec::::new()); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); assert_ok!(Council::retract_voter(Origin::signed(2), 1)); - assert_eq!(Council::voters(), vec![4, 3]); - assert_eq!(Council::approvals_of(1), Vec::::new()); - assert_eq!(Council::approvals_of(2), Vec::::new()); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![0, 0, 3, 4]); + assert_eq!(Council::all_approvals_of(&1), Vec::::new()); + assert_eq!(Council::all_approvals_of(&2), Vec::::new()); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); - assert_ok!(Council::retract_voter(Origin::signed(3), 1)); + assert_ok!(Council::retract_voter(Origin::signed(3), 2)); - assert_eq!(Council::voters(), vec![4]); - assert_eq!(Council::approvals_of(1), Vec::::new()); - assert_eq!(Council::approvals_of(2), Vec::::new()); - assert_eq!(Council::approvals_of(3), Vec::::new()); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![0, 0, 0, 4]); + assert_eq!(Council::all_approvals_of(&1), Vec::::new()); + assert_eq!(Council::all_approvals_of(&2), Vec::::new()); + assert_eq!(Council::all_approvals_of(&3), Vec::::new()); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); }); } #[test] fn invalid_retraction_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); - assert_eq!(Council::voters(), vec![1, 2]); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + assert_eq!(voter_ids(), vec![1, 2]); assert_noop!(Council::retract_voter(Origin::signed(1), 1), "retraction index mismatch"); }); } #[test] fn overflow_retraction_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); assert_noop!(Council::retract_voter(Origin::signed(1), 1), "retraction index invalid"); }); } #[test] fn non_voter_retraction_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); assert_noop!(Council::retract_voter(Origin::signed(2), 0), "cannot retract non-voter"); }); } + #[test] + fn approval_storage_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![], 0, 0)); + + assert_eq!(Council::all_approvals_of(&2), vec![true]); + // NOTE: these two are stored in mem differently though. + assert_eq!(Council::all_approvals_of(&3), vec![]); + assert_eq!(Council::all_approvals_of(&4), vec![]); + + assert_eq!(Council::approvals_of((3, 0)), vec![0]); + assert_eq!(Council::approvals_of((4, 0)), vec![]); + }); + } + #[test] fn simple_tally_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); - assert_eq!(Council::voters(), vec![2, 5]); - assert_eq!(Council::approvals_of(2), vec![true, false]); - assert_eq!(Council::approvals_of(5), vec![false, true]); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); + assert_eq!(voter_ids(), vec![2, 5]); + assert_eq!(Council::all_approvals_of(&2), vec![true]); + assert_eq!(Council::all_approvals_of(&5), vec![false, true]); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -935,34 +1974,71 @@ mod tests { assert!(!Council::is_a_candidate(&2)); assert!(!Council::is_a_candidate(&5)); assert_eq!(Council::vote_index(), 1); - assert_eq!(Council::voter_last_active(2), Some(0)); - assert_eq!(Council::voter_last_active(5), Some(0)); + assert_eq!(Council::voter_info(2), Some(VoterInfo { last_win: 1, last_active: 0, stake: 20, pot: 0 })); + assert_eq!(Council::voter_info(5), Some(VoterInfo { last_win: 1, last_active: 0, stake: 50, pot: 0 })); + }); + } + + #[test] + fn seats_should_be_released() { + with_externalities(&mut ExtBuilder::default().build(), || { + System::set_block_number(4); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(4), 2, 20, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 5, 50, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (0, 0), (20, 2), (50, 5)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(5, 11), (2, 11)]); + let mut current = System::block_number(); + let free_block; + loop { + current += 1; + System::set_block_number(current); + assert_ok!(Council::end_block(System::block_number())); + if Council::active_council().len() == 0 { + free_block = current; + break; + } + } + // 11 + 2 which is the next voting period. + assert_eq!(free_block, 14); }); } #[test] fn presentations_with_zero_staked_deposit_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_noop!(Council::present_winner(Origin::signed(4), 2, 0, 0), "stake deposited to present winner and be added to leaderboard should be non-zero"); + assert_noop!( + Council::present_winner(Origin::signed(4), 2, 0, 0), + "stake deposited to present winner and be added to leaderboard should be non-zero" + ); }); } #[test] fn double_presentations_should_be_punished() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { assert!(Balances::can_slash(&4, 10)); System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -978,10 +2054,10 @@ mod tests { #[test] fn retracting_inactive_voter_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -990,7 +2066,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -998,24 +2074,24 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); assert_ok!(Council::reap_inactive_voter(Origin::signed(5), - (Council::voters().iter().position(|&i| i == 5).unwrap() as u32).into(), - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 5).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 )); - assert_eq!(Council::voters(), vec![5]); - assert_eq!(Council::approvals_of(2).len(), 0); - assert_eq!(Balances::total_balance(&2), 17); - assert_eq!(Balances::total_balance(&5), 53); + assert_eq!(voter_ids(), vec![0, 5]); + assert_eq!(Council::all_approvals_of(&2).len(), 0); + assert_eq!(Balances::total_balance(&2), 20); + assert_eq!(Balances::total_balance(&5), 50); }); } #[test] fn presenting_for_double_election_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_eq!(Council::submit_candidacy(Origin::signed(2), 0), Ok(())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1023,21 +2099,26 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); + // NOTE: This is now mandatory to disable the lock + assert_ok!(Council::retract_voter(Origin::signed(2), 0)); assert_eq!(Council::submit_candidacy(Origin::signed(2), 0), Ok(())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_noop!(Council::present_winner(Origin::signed(4), 2, 20, 1), "candidate must not form a duplicated member if elected"); + assert_noop!( + Council::present_winner(Origin::signed(4), 2, 20, 1), + "candidate must not form a duplicated member if elected" + ); }); } #[test] fn retracting_inactive_voter_with_other_candidates_in_slots_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().voter_bond(2).build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1046,7 +2127,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1057,24 +2138,24 @@ mod tests { assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); assert_ok!(Council::reap_inactive_voter(Origin::signed(5), - (Council::voters().iter().position(|&i| i == 5).unwrap() as u32).into(), - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 5).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 )); - assert_eq!(Council::voters(), vec![5]); - assert_eq!(Council::approvals_of(2).len(), 0); - assert_eq!(Balances::total_balance(&2), 17); - assert_eq!(Balances::total_balance(&5), 53); + assert_eq!(voter_ids(), vec![0, 5]); + assert_eq!(Council::all_approvals_of(&2).len(), 0); + assert_eq!(Balances::total_balance(&2), 18); + assert_eq!(Balances::total_balance(&5), 52); }); } #[test] fn retracting_inactive_voter_with_bad_reporter_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1083,7 +2164,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1092,18 +2173,18 @@ mod tests { assert_noop!(Council::reap_inactive_voter(Origin::signed(2), 42, - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 - ), "bad reporter index"); + ), "invalid reporter index"); }); } #[test] fn retracting_inactive_voter_with_bad_target_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1112,7 +2193,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1120,25 +2201,25 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); assert_noop!(Council::reap_inactive_voter(Origin::signed(2), - (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2, 42, 2 - ), "bad target index"); + ), "invalid target index"); }); } #[test] fn attempting_to_retract_active_voter_should_slash_reporter() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 2)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 3)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false, false, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, false, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1153,34 +2234,34 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 1)); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 30, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20 + Council::get_offset(20, 1), 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30 + Council::get_offset(30, 1), 1)); assert_ok!(Council::end_block(System::block_number())); assert_eq!(Council::vote_index(), 2); assert_eq!(Council::inactivity_grace_period(), 1); assert_eq!(Council::voting_period(), 4); - assert_eq!(Council::voter_last_active(4), Some(0)); + assert_eq!(Council::voter_info(4), Some(VoterInfo { last_win: 1, last_active: 0, stake: 40, pot: 0 })); assert_ok!(Council::reap_inactive_voter(Origin::signed(4), - (Council::voters().iter().position(|&i| i == 4).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 4).unwrap() as u32).into(), 2, - (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 )); - assert_eq!(Council::voters(), vec![2, 3, 5]); - assert_eq!(Council::approvals_of(4).len(), 0); - assert_eq!(Balances::total_balance(&4), 37); + assert_eq!(voter_ids(), vec![2, 3, 0, 5]); + assert_eq!(Council::all_approvals_of(&4).len(), 0); + assert_eq!(Balances::total_balance(&4), 40); }); } #[test] fn attempting_to_retract_inactive_voter_by_nonvoter_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1189,7 +2270,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1198,7 +2279,7 @@ mod tests { assert_noop!(Council::reap_inactive_voter(Origin::signed(4), 0, - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 ), "reporter must be a voter"); }); @@ -1206,18 +2287,18 @@ mod tests { #[test] fn presenting_loser_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1239,18 +2320,18 @@ mod tests { #[test] fn presenting_loser_first_should_not_matter() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1271,21 +2352,24 @@ mod tests { #[test] fn present_outside_of_presentation_period_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_noop!(Council::present_winner(Origin::signed(5), 5, 1, 0), "cannot present outside of presentation period"); + assert_noop!( + Council::present_winner(Origin::signed(5), 5, 1, 0), + "cannot present outside of presentation period" + ); }); } #[test] fn present_with_invalid_vote_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1295,34 +2379,50 @@ mod tests { #[test] fn present_when_presenter_is_poor_should_not_work() { - with_externalities(&mut new_test_ext(false), || { - System::set_block_number(4); - assert!(!Council::presentation_active()); - - assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); - assert_ok!(Council::end_block(System::block_number())); - - System::set_block_number(6); - assert_eq!(Balances::free_balance(&1), 1); - assert_eq!(Balances::reserved_balance(&1), 9); - assert_noop!(Council::present_winner(Origin::signed(1), 1, 20, 0), "presenter must have sufficient slashable funds"); - }); + let test_present = |p| { + with_externalities(&mut ExtBuilder::default() + .voting_fee(5) + .voter_bond(2) + .bad_presentation_punishment(p) + .build(), + || { + System::set_block_number(4); + let _ = Balances::make_free_balance_be(&1, 15); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); // -3 + assert_eq!(Balances::free_balance(&1), 12); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); // -2 -5 + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert_eq!(Balances::free_balance(&1), 5); + assert_eq!(Balances::reserved_balance(&1), 5); + if p > 5 { + assert_noop!(Council::present_winner( + Origin::signed(1), 1, 10, 0), + "presenter must have sufficient slashable funds" + ); + } else { + assert_ok!(Council::present_winner(Origin::signed(1), 1, 10, 0)); + } + }); + }; + test_present(4); + test_present(6); } #[test] fn invalid_present_tally_should_slash() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); assert_eq!(Balances::total_balance(&4), 40); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1334,20 +2434,20 @@ mod tests { #[test] fn runners_up_should_be_kept() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); @@ -1355,7 +2455,7 @@ mod tests { assert!(Council::presentation_active()); assert_ok!(Council::present_winner(Origin::signed(4), 1, 60, 0)); // leaderboard length is the empty seats plus the carry count (i.e. 5 + 2), where those - // to be carried are the lowest and stored in lowest indexes + // to be carried are the lowest and stored in lowest indices assert_eq!(Council::leaderboard(), Some(vec![ (0, 0), (0, 0), @@ -1383,11 +2483,11 @@ mod tests { assert!(Council::is_a_candidate(&3)); assert!(Council::is_a_candidate(&4)); assert_eq!(Council::vote_index(), 1); - assert_eq!(Council::voter_last_active(2), Some(0)); - assert_eq!(Council::voter_last_active(3), Some(0)); - assert_eq!(Council::voter_last_active(4), Some(0)); - assert_eq!(Council::voter_last_active(5), Some(0)); - assert_eq!(Council::voter_last_active(6), Some(0)); + assert_eq!(Council::voter_info(2), Some(VoterInfo { last_win: 0, last_active: 0, stake: 20, pot: 0 })); + assert_eq!(Council::voter_info(3), Some(VoterInfo { last_win: 0, last_active: 0, stake: 30, pot: 0 })); + assert_eq!(Council::voter_info(4), Some(VoterInfo { last_win: 0, last_active: 0, stake: 40, pot: 0 })); + assert_eq!(Council::voter_info(5), Some(VoterInfo { last_win: 1, last_active: 0, stake: 50, pot: 0 })); + assert_eq!(Council::voter_info(6), Some(VoterInfo { last_win: 1, last_active: 0, stake: 60, pot: 0 })); assert_eq!(Council::candidate_reg_info(3), Some((0, 2))); assert_eq!(Council::candidate_reg_info(4), Some((0, 3))); }); @@ -1395,18 +2495,18 @@ mod tests { #[test] fn second_tally_should_use_runners_up() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1417,13 +2517,13 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![false, false, true, false], 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![false, false, true, false], 1, 0)); assert_ok!(Council::set_desired_seats(3)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 90, 1)); - assert_ok!(Council::present_winner(Origin::signed(4), 4, 40, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30 + Council::get_offset(30, 1) + 60, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 4, 40 + Council::get_offset(40, 1), 1)); assert_ok!(Council::end_block(System::block_number())); assert!(!Council::presentation_active()); @@ -1435,11 +2535,14 @@ mod tests { assert!(!Council::is_a_candidate(&5)); assert!(Council::is_a_candidate(&4)); assert_eq!(Council::vote_index(), 2); - assert_eq!(Council::voter_last_active(2), Some(0)); - assert_eq!(Council::voter_last_active(3), Some(0)); - assert_eq!(Council::voter_last_active(4), Some(0)); - assert_eq!(Council::voter_last_active(5), Some(0)); - assert_eq!(Council::voter_last_active(6), Some(1)); + assert_eq!(Council::voter_info(2), Some( VoterInfo { last_win: 0, last_active: 0, stake: 20, pot: 0})); + assert_eq!(Council::voter_info(3), Some( VoterInfo { last_win: 2, last_active: 0, stake: 30, pot: 0})); + assert_eq!(Council::voter_info(4), Some( VoterInfo { last_win: 0, last_active: 0, stake: 40, pot: 0})); + assert_eq!(Council::voter_info(5), Some( VoterInfo { last_win: 1, last_active: 0, stake: 50, pot: 0})); + assert_eq!( + Council::voter_info(6), + Some(VoterInfo { last_win: 2, last_active: 1, stake: 60, pot: 0}) + ); assert_eq!(Council::candidate_reg_info(4), Some((0, 3))); }); diff --git a/srml/council/src/voting.rs b/srml/council/src/voting.rs deleted file mode 100644 index 37c1444a74ee8c2f48e94fee5f94dfc20d7f6a4e..0000000000000000000000000000000000000000 --- a/srml/council/src/voting.rs +++ /dev/null @@ -1,494 +0,0 @@ -// Copyright 2017-2019 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 . - -//! Council voting system. - -use rstd::prelude::*; -use rstd::borrow::Borrow; -use primitives::traits::{Hash, As, Zero}; -use runtime_io::print; -use srml_support::dispatch::Result; -use srml_support::{StorageValue, StorageMap, IsSubType, decl_module, decl_storage, decl_event, ensure}; -use {system, democracy}; -use super::{Trait as CouncilTrait, Module as Council}; -use system::ensure_signed; - -pub trait Trait: CouncilTrait { - type Event: From> + Into<::Event>; -} - -decl_module! { - pub struct Module for enum Call where origin: T::Origin { - fn deposit_event() = default; - - fn propose(origin, proposal: Box) { - let who = ensure_signed(origin)?; - - let expiry = >::block_number() + Self::voting_period(); - ensure!(Self::will_still_be_councillor_at(&who, expiry), "proposer would not be on council"); - - let proposal_hash = T::Hashing::hash_of(&proposal); - - ensure!(!>::exists(proposal_hash), "duplicate proposals not allowed"); - ensure!(!Self::is_vetoed(&proposal_hash), "proposal is vetoed"); - - let mut proposals = Self::proposals(); - proposals.push((expiry, proposal_hash)); - proposals.sort_by_key(|&(expiry, _)| expiry); - Self::set_proposals(&proposals); - - >::insert(proposal_hash, *proposal); - >::insert(proposal_hash, vec![who.clone()]); - >::insert((proposal_hash, who.clone()), true); - } - - fn vote(origin, proposal: T::Hash, approve: bool) { - let who = ensure_signed(origin)?; - - ensure!(Self::is_councillor(&who), "only councillors may vote on council proposals"); - - if Self::vote_of((proposal, who.clone())).is_none() { - >::mutate(proposal, |voters| voters.push(who.clone())); - } - >::insert((proposal, who), approve); - } - - fn veto(origin, proposal_hash: T::Hash) { - let who = ensure_signed(origin)?; - - ensure!(Self::is_councillor(&who), "only councillors may veto council proposals"); - ensure!(>::exists(&proposal_hash), "proposal must exist to be vetoed"); - - let mut existing_vetoers = Self::veto_of(&proposal_hash) - .map(|pair| pair.1) - .unwrap_or_else(Vec::new); - let insert_position = existing_vetoers.binary_search(&who) - .err().ok_or("a councillor may not veto a proposal twice")?; - existing_vetoers.insert(insert_position, who); - Self::set_veto_of( - &proposal_hash, - >::block_number() + Self::cooloff_period(), - existing_vetoers - ); - - Self::set_proposals( - &Self::proposals().into_iter().filter(|&(_, h)| h != proposal_hash - ).collect::>()); - >::remove(proposal_hash); - >::remove(proposal_hash); - for (c, _) in >::active_council() { - >::remove((proposal_hash, c)); - } - } - - fn set_cooloff_period(#[compact] blocks: T::BlockNumber) { - >::put(blocks); - } - - fn set_voting_period(#[compact] blocks: T::BlockNumber) { - >::put(blocks); - } - - fn on_finalize(n: T::BlockNumber) { - if let Err(e) = Self::end_block(n) { - print("Guru meditation"); - print(e); - } - } - } -} - -decl_storage! { - trait Store for Module as CouncilVoting { - pub CooloffPeriod get(cooloff_period) config(): T::BlockNumber = T::BlockNumber::sa(1000); - pub VotingPeriod get(voting_period) config(): T::BlockNumber = T::BlockNumber::sa(3); - /// Number of blocks by which to delay enactment of successful, non-unanimous-council-instigated referendum proposals. - pub EnactDelayPeriod get(enact_delay_period) config(): T::BlockNumber = T::BlockNumber::sa(0); - pub Proposals get(proposals) build(|_| vec![]): Vec<(T::BlockNumber, T::Hash)>; // ordered by expiry. - pub ProposalOf get(proposal_of): map T::Hash => Option; - pub ProposalVoters get(proposal_voters): map T::Hash => Vec; - pub CouncilVoteOf get(vote_of): map (T::Hash, T::AccountId) => Option; - pub VetoedProposal get(veto_of): map T::Hash => Option<(T::BlockNumber, Vec)>; - } -} - -decl_event!( - pub enum Event where ::Hash { - /// A voting tally has happened for a referendum cancellation vote. - /// Last three are yes, no, abstain counts. - TallyCancelation(Hash, u32, u32, u32), - /// A voting tally has happened for a referendum vote. - /// Last three are yes, no, abstain counts. - TallyReferendum(Hash, u32, u32, u32), - } -); - -impl Module { - pub fn is_vetoed>(proposal: B) -> bool { - Self::veto_of(proposal.borrow()) - .map(|(expiry, _): (T::BlockNumber, Vec)| >::block_number() < expiry) - .unwrap_or(false) - } - - pub fn will_still_be_councillor_at(who: &T::AccountId, n: T::BlockNumber) -> bool { - >::active_council().iter() - .find(|&&(ref a, _)| a == who) - .map(|&(_, expires)| expires > n) - .unwrap_or(false) - } - - pub fn is_councillor(who: &T::AccountId) -> bool { - >::active_council().iter() - .any(|&(ref a, _)| a == who) - } - - pub fn tally(proposal_hash: &T::Hash) -> (u32, u32, u32) { - Self::generic_tally(proposal_hash, |w: &T::AccountId, p: &T::Hash| Self::vote_of((*p, w.clone()))) - } - - // Private - fn set_veto_of(proposal: &T::Hash, expiry: T::BlockNumber, vetoers: Vec) { - >::insert(proposal, (expiry, vetoers)); - } - - fn kill_veto_of(proposal: &T::Hash) { - >::remove(proposal); - } - - fn take_tally(proposal_hash: &T::Hash) -> (u32, u32, u32) { - Self::generic_tally(proposal_hash, |w: &T::AccountId, p: &T::Hash| >::take((*p, w.clone()))) - } - - fn generic_tally Option>(proposal_hash: &T::Hash, vote_of: F) -> (u32, u32, u32) { - let c = >::active_council(); - let (approve, reject) = c.iter() - .filter_map(|&(ref a, _)| vote_of(a, proposal_hash)) - .map(|approve| if approve { (1, 0) } else { (0, 1) }) - .fold((0, 0), |(a, b), (c, d)| (a + c, b + d)); - (approve, reject, c.len() as u32 - approve - reject) - } - - fn set_proposals(p: &Vec<(T::BlockNumber, T::Hash)>) { - >::put(p); - } - - fn take_proposal_if_expiring_at(n: T::BlockNumber) -> Option<(T::Proposal, T::Hash)> { - let proposals = Self::proposals(); - match proposals.first() { - Some(&(expiry, hash)) if expiry == n => { - // yes this is horrible, but fixing it will need substantial work in storage. - Self::set_proposals(&proposals[1..].to_vec()); - >::take(hash).map(|p| (p, hash)) /* defensive only: all queued proposal hashes must have associated proposals*/ - } - _ => None, - } - } - - fn end_block(now: T::BlockNumber) -> Result { - while let Some((proposal, proposal_hash)) = Self::take_proposal_if_expiring_at(now) { - let tally = Self::take_tally(&proposal_hash); - if let Some(&democracy::Call::cancel_referendum(ref_index)) = IsSubType::>::is_aux_sub_type(&proposal) { - Self::deposit_event(RawEvent::TallyCancelation(proposal_hash, tally.0, tally.1, tally.2)); - if let (_, 0, 0) = tally { - >::internal_cancel_referendum(ref_index.into()); - } - } else { - Self::deposit_event(RawEvent::TallyReferendum(proposal_hash.clone(), tally.0, tally.1, tally.2)); - if tally.0 > tally.1 + tally.2 { - Self::kill_veto_of(&proposal_hash); - // If there were no nay-votes from the council, then it's weakly uncontroversial; we enact immediately. - let period = match tally.1 { - 0 => Zero::zero(), - _ => Self::enact_delay_period(), - }; - // If all council members voted yes, then it's strongly uncontroversial; we require a negative - // super-majority at referendum in order to defeat it. - let threshold = match tally { - (_, 0, 0) => democracy::VoteThreshold::SuperMajorityAgainst, - _ => democracy::VoteThreshold::SimpleMajority, - }; - >::internal_start_referendum(proposal, threshold, period).map(|_| ())?; - } - } - } - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::tests::*; - use crate::tests::{Call, Origin}; - use srml_support::{Hashable, assert_ok, assert_noop}; - use democracy::{ReferendumInfo, VoteThreshold}; - - #[test] - fn basic_environment_works() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - assert_eq!(Balances::free_balance(&42), 0); - assert_eq!(CouncilVoting::cooloff_period(), 2); - assert_eq!(CouncilVoting::voting_period(), 1); - assert_eq!(CouncilVoting::will_still_be_councillor_at(&1, 1), true); - assert_eq!(CouncilVoting::will_still_be_councillor_at(&1, 10), false); - assert_eq!(CouncilVoting::will_still_be_councillor_at(&4, 10), false); - assert_eq!(CouncilVoting::is_councillor(&1), true); - assert_eq!(CouncilVoting::is_councillor(&4), false); - assert_eq!(CouncilVoting::proposals(), Vec::<(u64, H256)>::new()); - assert_eq!(CouncilVoting::proposal_voters(H256::default()), Vec::::new()); - assert_eq!(CouncilVoting::is_vetoed(&H256::default()), false); - assert_eq!(CouncilVoting::vote_of((H256::default(), 1)), None); - assert_eq!(CouncilVoting::tally(&H256::default()), (0, 0, 3)); - }); - } - - fn set_balance_proposal(value: u64) -> Call { - Call::Balances(balances::Call::set_balance(42, value.into(), 0)) - } - - fn cancel_referendum_proposal(id: u32) -> Call { - Call::Democracy(democracy::Call::cancel_referendum(id.into())) - } - - #[test] - fn referendum_cancellation_should_work_when_unanimous() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove, 0), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, true)); - assert_eq!(CouncilVoting::proposals(), vec![(2, hash)]); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referendums(), vec![]); - assert_eq!(Balances::free_balance(&42), 0); - }); - } - - #[test] - fn referendum_cancellation_should_fail_when_not_unanimous() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove, 0), 0); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, false)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); - }); - } - - #[test] - fn referendum_cancellation_should_fail_when_abstentions() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove, 0), 0); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); - }); - } - - #[test] - fn veto_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums().len(), 0); - }); - } - - #[test] - fn double_veto_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(3); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_noop!(CouncilVoting::veto(Origin::signed(2), hash), "a councillor may not veto a proposal twice"); - }); - } - - #[test] - fn retry_in_cooloff_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(2); - assert_noop!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone())), "proposal is vetoed"); - }); - } - - #[test] - fn retry_after_cooloff_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(3); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, false)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, true)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(4); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(7, set_balance_proposal(42), VoteThreshold::SimpleMajority, 0))]); - }); - } - - #[test] - fn alternative_double_veto_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(3); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(3), hash)); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums().len(), 0); - }); - } - - #[test] - fn simple_propose_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_eq!(CouncilVoting::proposals().len(), 1); - assert_eq!(CouncilVoting::proposal_voters(&hash), vec![1]); - assert_eq!(CouncilVoting::vote_of((hash, 1)), Some(true)); - assert_eq!(CouncilVoting::tally(&hash), (1, 0, 2)); - }); - } - - #[test] - fn unvoted_proposal_should_expire_without_action() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (1, 0, 2)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums().len(), 0); - }); - } - - #[test] - fn unanimous_proposal_should_expire_with_biased_referendum() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), proposal.blake2_256().into(), true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), proposal.blake2_256().into(), true)); - assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (3, 0, 0)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(5, proposal, VoteThreshold::SuperMajorityAgainst, 0))]); - }); - } - - #[test] - fn majority_proposal_should_expire_with_unbiased_referendum() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), proposal.blake2_256().into(), true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), proposal.blake2_256().into(), false)); - assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (2, 1, 0)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(5, proposal, VoteThreshold::SimpleMajority, 0))]); - }); - } - - #[test] - fn propose_by_public_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_noop!(CouncilVoting::propose(Origin::signed(4), Box::new(proposal)), "proposer would not be on council"); - }); - } - - #[test] - fn vote_by_public_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_noop!(CouncilVoting::vote(Origin::signed(4), proposal.blake2_256().into(), true), "only councillors may vote on council proposals"); - }); - } -} diff --git a/srml/democracy/Cargo.toml b/srml/democracy/Cargo.toml index e789c733d69148dad6247aa490b2cac54cdcf216..88d1da1a8cb24008e61a87d3b39323b0f1bd4460 100644 --- a/srml/democracy/Cargo.toml +++ b/srml/democracy/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-democracy" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.3", default-features = false, features = ["derive"] } diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 43b143ddaf53b7a81cbd04f41888fda7dbdb891a..28c42fb5a29ed2a99ea051d96e49f11223b5ed41 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -19,15 +19,19 @@ #![cfg_attr(not(feature = "std"), no_std)] use rstd::prelude::*; -use rstd::result; -use primitives::traits::{Zero, As, Bounded}; -use parity_codec::{Encode, Decode}; -use srml_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType, EnumerableStorageMap}; -use srml_support::{decl_module, decl_storage, decl_event, ensure}; -use srml_support::traits::{Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, - OnFreeBalanceZero}; +use rstd::{result, convert::TryFrom}; +use primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv, EnsureOrigin, Hash}; +use parity_codec::{Encode, Decode, Input, Output}; +use srml_support::{ + decl_module, decl_storage, decl_event, ensure, + StorageValue, StorageMap, Parameter, Dispatchable, IsSubType, EnumerableStorageMap, + traits::{ + Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, + OnFreeBalanceZero, Get + } +}; use srml_support::dispatch::Result; -use system::ensure_signed; +use system::{ensure_signed, ensure_root}; mod vote_threshold; pub use vote_threshold::{Approved, VoteThreshold}; @@ -36,63 +40,294 @@ const DEMOCRACY_ID: LockIdentifier = *b"democrac"; /// A proposal index. pub type PropIndex = u32; + /// A referendum index. pub type ReferendumIndex = u32; -/// A number of lock periods. -pub type LockPeriods = i8; - -const MAX_RECURSION_LIMIT: u32 = 16; -/// A number of lock periods, plus a vote, one way or the other. -#[derive(Encode, Decode, Copy, Clone, Eq, PartialEq, Default)] +/// A value denoting the strength of conviction of a vote. +#[derive(Encode, Decode, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct Vote(i8); +pub enum Conviction { + /// 0.1x votes, unlocked. + None, + /// 1x votes, locked for an enactment period following a successful vote. + Locked1x, + /// 2x votes, locked for 2x enactment periods following a successful vote. + Locked2x, + /// 3x votes, locked for 4x... + Locked3x, + /// 4x votes, locked for 8x... + Locked4x, + /// 5x votes, locked for 16x... + Locked5x, +} -impl Vote { - /// Create a new instance. - pub fn new(aye: bool, multiplier: LockPeriods) -> Self { - let m = multiplier.max(1) - 1; - Vote(if aye { - -1 - m - } else { - m +impl Default for Conviction { + fn default() -> Self { + Conviction::None + } +} + +impl From for u8 { + fn from(c: Conviction) -> u8 { + match c { + Conviction::None => 0, + Conviction::Locked1x => 1, + Conviction::Locked2x => 2, + Conviction::Locked3x => 3, + Conviction::Locked4x => 4, + Conviction::Locked5x => 5, + } + } +} + +impl TryFrom for Conviction { + type Error = (); + fn try_from(i: u8) -> result::Result { + Ok(match i { + 0 => Conviction::None, + 1 => Conviction::Locked1x, + 2 => Conviction::Locked2x, + 3 => Conviction::Locked3x, + 4 => Conviction::Locked4x, + 5 => Conviction::Locked5x, + _ => return Err(()), }) } +} + +impl Conviction { + /// The amount of time (in number of periods) that our conviction implies a successful voter's + /// balance should be locked for. + fn lock_periods(self) -> u32 { + match self { + Conviction::None => 0, + Conviction::Locked1x => 1, + Conviction::Locked2x => 2, + Conviction::Locked3x => 4, + Conviction::Locked4x => 8, + Conviction::Locked5x => 16, + } + } + + /// The votes of a voter of the given `balance` with our conviction. + fn votes< + B: From + Zero + Copy + CheckedMul + CheckedDiv + Bounded + >(self, balance: B) -> (B, B) { + match self { + Conviction::None => { + let r = balance.checked_div(&10u8.into()).unwrap_or_else(Zero::zero); + (r, r) + } + x => ( + balance.checked_mul(&u8::from(x).into()).unwrap_or_else(B::max_value), + balance, + ) + } + } +} - /// Is this an aye vote? - pub fn is_aye(self) -> bool { - self.0 < 0 +impl Bounded for Conviction { + fn min_value() -> Self { + Conviction::None } - /// The strength (measured in lock periods). - pub fn multiplier(self) -> LockPeriods { - 1 + if self.0 < 0 { -(self.0 + 1) } else { self.0 } + fn max_value() -> Self { + Conviction::Locked5x + } +} + +const MAX_RECURSION_LIMIT: u32 = 16; + +/// A number of lock periods, plus a vote, one way or the other. +#[derive(Copy, Clone, Eq, PartialEq, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Vote { + pub aye: bool, + pub conviction: Conviction, +} + +impl Encode for Vote { + fn encode_to(&self, output: &mut T) { + output.push_byte(u8::from(self.conviction) | if self.aye { 0b1000_0000 } else { 0 }); + } +} + +impl Decode for Vote { + fn decode(input: &mut I) -> Option { + let b = input.read_byte()?; + Some(Vote { + aye: (b & 0b1000_0000) == 0b1000_0000, + conviction: Conviction::try_from(b & 0b0111_1111).ok()?, + }) } } type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; pub trait Trait: system::Trait + Sized { - type Currency: ReservableCurrency + LockableCurrency; - type Proposal: Parameter + Dispatchable + IsSubType>; - type Event: From> + Into<::Event>; + + /// Currency type for this module. + type Currency: ReservableCurrency + + LockableCurrency; + + /// The minimum period of locking and the period between a proposal being approved and enacted. + /// + /// It should generally be a little more than the unstake period to ensure that + /// voting stakers have an opportunity to remove themselves from the system in the case where + /// they are on the losing side of a vote. + type EnactmentPeriod: Get; + + /// How often (in blocks) new public referenda are launched. + type LaunchPeriod: Get; + + /// How often (in blocks) to check for new votes. + type VotingPeriod: Get; + + /// The minimum amount to be used as a deposit for a public referendum proposal. + type MinimumDeposit: Get>; + + /// Origin from which the next tabled referendum may be forced. This is a normal + /// "super-majority-required" referendum. + type ExternalOrigin: EnsureOrigin; + + /// Origin from which the next tabled referendum may be forced; this allows for the tabling of + /// a majority-carries referendum. + type ExternalMajorityOrigin: EnsureOrigin; + + /// Origin from which emergency referenda may be scheduled. + type EmergencyOrigin: EnsureOrigin; + + /// Minimum voting period allowed for an emergency referendum. + type EmergencyVotingPeriod: Get; + + /// Origin from which any referenda may be cancelled in an emergency. + type CancellationOrigin: EnsureOrigin; + + /// Origin for anyone able to veto proposals. + type VetoOrigin: EnsureOrigin; + + /// Period in blocks where an external proposal may not be re-submitted after being vetoed. + type CooloffPeriod: Get; +} + +/// Info regarding an ongoing referendum. +#[derive(Encode, Decode, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct ReferendumInfo { + /// When voting on this referendum will end. + end: BlockNumber, + /// The proposal being voted on. + proposal: Proposal, + /// The thresholding mechanism to determine whether it passed. + threshold: VoteThreshold, + /// The delay (in blocks) to wait after a successful referendum before deploying. + delay: BlockNumber, +} + +impl ReferendumInfo { + /// Create a new instance. + pub fn new( + end: BlockNumber, + proposal: Proposal, + threshold: VoteThreshold, + delay: BlockNumber + ) -> Self { + ReferendumInfo { end, proposal, threshold, delay } + } } +decl_storage! { + trait Store for Module as Democracy { + + /// The number of (public) proposals that have been made so far. + pub PublicPropCount get(public_prop_count) build(|_| 0 as PropIndex) : PropIndex; + /// The public proposals. Unsorted. + pub PublicProps get(public_props): Vec<(PropIndex, T::Proposal, T::AccountId)>; + /// Those who have locked a deposit. + pub DepositOf get(deposit_of): map PropIndex => Option<(BalanceOf, Vec)>; + + /// The next free referendum index, aka the number of referenda started so far. + pub ReferendumCount get(referendum_count) build(|_| 0 as ReferendumIndex): ReferendumIndex; + /// The next referendum index that should be tallied. + pub NextTally get(next_tally) build(|_| 0 as ReferendumIndex): ReferendumIndex; + /// Information concerning any given referendum. + pub ReferendumInfoOf get(referendum_info): + map ReferendumIndex => Option<(ReferendumInfo)>; + /// Queue of successful referenda to be dispatched. + pub DispatchQueue get(dispatch_queue): + map T::BlockNumber => Vec>; + + /// Get the voters for the current proposal. + pub VotersFor get(voters_for): map ReferendumIndex => Vec; + + /// Get the vote in a given referendum of a particular voter. The result is meaningful only + /// if `voters_for` includes the voter when called with the referendum (you'll get the + /// default `Vote` value otherwise). If you don't want to check `voters_for`, then you can + /// also check for simple existence with `VoteOf::exists` first. + pub VoteOf get(vote_of): map (ReferendumIndex, T::AccountId) => Vote; + + /// Who is able to vote for whom. Value is the fund-holding account, key is the + /// vote-transaction-sending account. + pub Proxy get(proxy): map T::AccountId => Option; + + /// Get the account (and lock periods) to which another account is delegating vote. + pub Delegations get(delegations): linked_map T::AccountId => (T::AccountId, Conviction); + + /// True if the last referendum tabled was submitted externally. False if it was a public + /// proposal. + pub LastTabledWasExternal: bool; + + /// The referendum to be tabled whenever it would be valid to table an external proposal. + /// This happens when a referendum needs to be tabled and one of two conditions are met: + /// - `LastTabledWasExternal` is `false`; or + /// - `PublicProps` is empty. + pub NextExternal: Option<(T::Proposal, VoteThreshold)>; + + /// A record of who vetoed what. Maps proposal hash to a possible existent block number + /// (until when it may not be resubmitted) and who vetoed it. + pub Blacklist get(blacklist): map T::Hash => Option<(T::BlockNumber, Vec)>; + + /// Record of all proposals that have been subject to emergency cancellation. + pub Cancellations: map T::Hash => bool; + } +} + +decl_event!( + pub enum Event where + Balance = BalanceOf, + ::AccountId, + ::Hash, + ::BlockNumber, + { + Proposed(PropIndex, Balance), + Tabled(PropIndex, Balance, Vec), + ExternalTabled, + Started(ReferendumIndex, VoteThreshold), + Passed(ReferendumIndex), + NotPassed(ReferendumIndex), + Cancelled(ReferendumIndex), + Executed(ReferendumIndex, bool), + Delegated(AccountId, AccountId), + Undelegated(AccountId), + Vetoed(AccountId, Hash, BlockNumber), + } +); + decl_module! { pub struct Module for enum Call where origin: T::Origin { fn deposit_event() = default; /// Propose a sensitive action to be taken. - fn propose( - origin, + fn propose(origin, proposal: Box, #[compact] value: BalanceOf ) { let who = ensure_signed(origin)?; - ensure!(value >= Self::minimum_deposit(), "value too low"); + ensure!(value >= T::MinimumDeposit::get(), "value too low"); T::Currency::reserve(&who, value) .map_err(|_| "proposer's balance too low")?; @@ -120,26 +355,113 @@ decl_module! { /// Vote in a referendum. If `vote.is_aye()`, the vote is to enact the proposal; /// otherwise it is a vote to keep the status quo. - fn vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote) -> Result { + fn vote(origin, + #[compact] ref_index: ReferendumIndex, + vote: Vote + ) -> Result { let who = ensure_signed(origin)?; Self::do_vote(who, ref_index, vote) } - /// Vote in a referendum on behalf of a stash. If `vote.is_aye()`, the vote is to enact the proposal; - /// otherwise it is a vote to keep the status quo. - fn proxy_vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote) -> Result { + /// Vote in a referendum on behalf of a stash. If `vote.is_aye()`, the vote is to enact + /// the proposal; otherwise it is a vote to keep the status quo. + fn proxy_vote(origin, + #[compact] ref_index: ReferendumIndex, + vote: Vote + ) -> Result { let who = Self::proxy(ensure_signed(origin)?).ok_or("not a proxy")?; Self::do_vote(who, ref_index, vote) } - /// Start a referendum. - fn start_referendum(proposal: Box, threshold: VoteThreshold, delay: T::BlockNumber) -> Result { + /// Schedule an emergency referendum. + /// + /// This will create a new referendum for the `proposal`, approved as long as counted votes + /// exceed `threshold` and, if approved, enacted after the given `delay`. + /// + /// It may be called from either the Root or the Emergency origin. + fn emergency_propose(origin, + proposal: Box, + threshold: VoteThreshold, + voting_period: T::BlockNumber, + delay: T::BlockNumber + ) { + T::EmergencyOrigin::try_origin(origin) + .map(|_| ()) + .or_else(|origin| ensure_root(origin))?; + let now = >::block_number(); + // We don't consider it an error if `vote_period` is too low, but we do enforce the + // minimum. This is primarily due to practicality. If it's an emergency, we don't want + // to introduce more delays than is strictly needed by requiring a potentially costly + // resubmission in the case of a mistakenly low `vote_period`; better to just let the + // referendum take place with the lowest valid value. + let period = voting_period.max(T::EmergencyVotingPeriod::get()); Self::inject_referendum( - >::block_number() + Self::voting_period(), + now + period, *proposal, threshold, delay, - ).map(|_| ()) + ).map(|_| ())?; + } + + /// Schedule an emergency cancellation of a referendum. Cannot happen twice to the same + /// referendum. + fn emergency_cancel(origin, ref_index: ReferendumIndex) { + T::CancellationOrigin::ensure_origin(origin)?; + + let info = Self::referendum_info(ref_index).ok_or("unknown index")?; + let h = T::Hashing::hash_of(&info.proposal); + ensure!(!>::exists(h), "cannot cancel the same proposal twice"); + + >::insert(h, true); + Self::clear_referendum(ref_index); + } + + /// Schedule a referendum to be tabled once it is legal to schedule an external + /// referendum. + fn external_propose(origin, proposal: Box) { + T::ExternalOrigin::ensure_origin(origin)?; + ensure!(!>::exists(), "proposal already made"); + let proposal_hash = T::Hashing::hash_of(&proposal); + if let Some((until, _)) = >::get(proposal_hash) { + ensure!(>::block_number() >= until, "proposal still blacklisted"); + } + >::put((*proposal, VoteThreshold::SuperMajorityApprove)); + } + + /// Schedule a majority-carries referendum to be tabled next once it is legal to schedule + /// an external referendum. + fn external_propose_majority(origin, proposal: Box) { + T::ExternalMajorityOrigin::ensure_origin(origin)?; + ensure!(!>::exists(), "proposal already made"); + let proposal_hash = T::Hashing::hash_of(&proposal); + if let Some((until, _)) = >::get(proposal_hash) { + ensure!(>::block_number() >= until, "proposal still blacklisted"); + } + >::put((*proposal, VoteThreshold::SimpleMajority)); + } + + /// Veto and blacklist the external proposal hash. + fn veto_external(origin, proposal_hash: T::Hash) { + let who = T::VetoOrigin::ensure_origin(origin)?; + + if let Some((proposal, _)) = >::get() { + ensure!(proposal_hash == T::Hashing::hash_of(&proposal), "unknown proposal"); + } else { + Err("no external proposal")?; + } + + let mut existing_vetoers = >::get(&proposal_hash) + .map(|pair| pair.1) + .unwrap_or_else(Vec::new); + let insert_position = existing_vetoers.binary_search(&who) + .err().ok_or("identity may not veto a proposal twice")?; + + existing_vetoers.insert(insert_position, who.clone()); + let until = >::block_number() + T::CooloffPeriod::get(); + >::insert(&proposal_hash, (until, existing_vetoers)); + + Self::deposit_event(RawEvent::Vetoed(who, proposal_hash, until)); + >::kill(); } /// Remove a referendum. @@ -148,12 +470,22 @@ decl_module! { } /// Cancel a proposal queued for enactment. - pub fn cancel_queued(#[compact] when: T::BlockNumber, #[compact] which: u32) { + fn cancel_queued( + #[compact] when: T::BlockNumber, + #[compact] which: u32, + #[compact] what: ReferendumIndex + ) { let which = which as usize; - >::mutate(when, |items| if items.len() > which { items[which] = None }); + let mut items = >::get(when); + if items.get(which).and_then(Option::as_ref).map_or(false, |x| x.1 == what) { + items[which] = None; + >::insert(when, items); + } else { + Err("proposal not found")? + } } - fn on_finalize(n: T::BlockNumber) { + fn on_initialize(n: T::BlockNumber) { if let Err(e) = Self::end_block(n) { runtime_io::print(e); } @@ -180,11 +512,17 @@ decl_module! { } /// Delegate vote. - pub fn delegate(origin, to: T::AccountId, lock_periods: LockPeriods) { + pub fn delegate(origin, to: T::AccountId, conviction: Conviction) { let who = ensure_signed(origin)?; - >::insert(who.clone(), (to.clone(), lock_periods.clone())); + >::insert(who.clone(), (to.clone(), conviction)); // Currency is locked indefinitely as long as it's delegated. - T::Currency::extend_lock(DEMOCRACY_ID, &who, Bounded::max_value(), T::BlockNumber::max_value(), WithdrawReason::Transfer.into()); + T::Currency::extend_lock( + DEMOCRACY_ID, + &who, + Bounded::max_value(), + T::BlockNumber::max_value(), + WithdrawReason::Transfer.into() + ); Self::deposit_event(RawEvent::Delegated(who, to)); } @@ -192,105 +530,29 @@ decl_module! { fn undelegate(origin) { let who = ensure_signed(origin)?; ensure!(>::exists(&who), "not delegated"); - let d = >::take(&who); + let (_, conviction) = >::take(&who); // Indefinite lock is reduced to the maximum voting lock that could be possible. - let lock_period = Self::public_delay(); let now = >::block_number(); - let locked_until = now + lock_period * T::BlockNumber::sa(d.1 as u64); - T::Currency::set_lock(DEMOCRACY_ID, &who, Bounded::max_value(), locked_until, WithdrawReason::Transfer.into()); + let locked_until = now + T::EnactmentPeriod::get() * conviction.lock_periods().into(); + T::Currency::set_lock( + DEMOCRACY_ID, + &who, + Bounded::max_value(), + locked_until, + WithdrawReason::Transfer.into() + ); Self::deposit_event(RawEvent::Undelegated(who)); } } } -/// Info regarding an ongoing referendum. -#[derive(Encode, Decode, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct ReferendumInfo { - /// When voting on this referendum will end. - end: BlockNumber, - /// The proposal being voted on. - proposal: Proposal, - /// The thresholding mechanism to determine whether it passed. - threshold: VoteThreshold, - /// The delay (in blocks) to wait after a successful referendum before deploying. - delay: BlockNumber, -} - -impl ReferendumInfo { - /// Create a new instance. - pub fn new(end: BlockNumber, proposal: Proposal, threshold: VoteThreshold, delay: BlockNumber) -> Self { - ReferendumInfo { end, proposal, threshold, delay } - } -} - -decl_storage! { - trait Store for Module as Democracy { - - /// The number of (public) proposals that have been made so far. - pub PublicPropCount get(public_prop_count) build(|_| 0 as PropIndex) : PropIndex; - /// The public proposals. Unsorted. - pub PublicProps get(public_props): Vec<(PropIndex, T::Proposal, T::AccountId)>; - /// Those who have locked a deposit. - pub DepositOf get(deposit_of): map PropIndex => Option<(BalanceOf, Vec)>; - /// How often (in blocks) new public referenda are launched. - pub LaunchPeriod get(launch_period) config(): T::BlockNumber = T::BlockNumber::sa(1000); - /// The minimum amount to be used as a deposit for a public referendum proposal. - pub MinimumDeposit get(minimum_deposit) config(): BalanceOf; - /// The delay before enactment for all public referenda. - pub PublicDelay get(public_delay) config(): T::BlockNumber; - /// The maximum number of additional lock periods a voter may offer to strengthen their vote. Multiples of `PublicDelay`. - pub MaxLockPeriods get(max_lock_periods) config(): LockPeriods; - - /// How often (in blocks) to check for new votes. - pub VotingPeriod get(voting_period) config(): T::BlockNumber = T::BlockNumber::sa(1000); - - /// The next free referendum index, aka the number of referendums started so far. - pub ReferendumCount get(referendum_count) build(|_| 0 as ReferendumIndex): ReferendumIndex; - /// The next referendum index that should be tallied. - pub NextTally get(next_tally) build(|_| 0 as ReferendumIndex): ReferendumIndex; - /// Information concerning any given referendum. - pub ReferendumInfoOf get(referendum_info): map ReferendumIndex => Option<(ReferendumInfo)>; - /// Queue of successful referenda to be dispatched. - pub DispatchQueue get(dispatch_queue): map T::BlockNumber => Vec>; - - /// Get the voters for the current proposal. - pub VotersFor get(voters_for): map ReferendumIndex => Vec; - - /// Get the vote in a given referendum of a particular voter. The result is meaningful only if `voters_for` includes the - /// voter when called with the referendum (you'll get the default `Vote` value otherwise). If you don't want to check - /// `voters_for`, then you can also check for simple existence with `VoteOf::exists` first. - pub VoteOf get(vote_of): map (ReferendumIndex, T::AccountId) => Vote; - - /// Who is able to vote for whom. Value is the fund-holding account, key is the vote-transaction-sending account. - pub Proxy get(proxy): map T::AccountId => Option; - - /// Get the account (and lock periods) to which another account is delegating vote. - pub Delegations get(delegations): linked_map T::AccountId => (T::AccountId, LockPeriods); - } -} - -decl_event!( - pub enum Event where Balance = BalanceOf, ::AccountId { - Proposed(PropIndex, Balance), - Tabled(PropIndex, Balance, Vec), - Started(ReferendumIndex, VoteThreshold), - Passed(ReferendumIndex), - NotPassed(ReferendumIndex), - Cancelled(ReferendumIndex), - Executed(ReferendumIndex, bool), - Delegated(AccountId, AccountId), - Undelegated(AccountId), - } -); - impl Module { // exposed immutables. /// Get the amount locked in support of `proposal`; `None` if proposal isn't a valid proposal /// index. pub fn locked_for(proposal: PropIndex) -> Option> { - Self::deposit_of(proposal).map(|(d, l)| d * BalanceOf::::sa(l.len() as u64)) + Self::deposit_of(proposal).map(|(d, l)| d * (l.len() as u32).into()) } /// Return true if `ref_index` is an on-going referendum. @@ -298,8 +560,10 @@ impl Module { >::exists(ref_index) } - /// Get all referendums currently active. - pub fn active_referendums() -> Vec<(ReferendumIndex, ReferendumInfo)> { + /// Get all referenda currently active. + pub fn active_referenda() + -> Vec<(ReferendumIndex, ReferendumInfo)> + { let next = Self::next_tally(); let last = Self::referendum_count(); (next..last).into_iter() @@ -307,8 +571,10 @@ impl Module { .collect() } - /// Get all referendums ready for tally at block `n`. - pub fn maturing_referendums_at(n: T::BlockNumber) -> Vec<(ReferendumIndex, ReferendumInfo)> { + /// Get all referenda ready for tally at block `n`. + pub fn maturing_referenda_at( + n: T::BlockNumber + ) -> Vec<(ReferendumIndex, ReferendumInfo)> { let next = Self::next_tally(); let last = Self::referendum_count(); (next..last).into_iter() @@ -319,52 +585,75 @@ impl Module { /// Get the voters for the current proposal. pub fn tally(ref_index: ReferendumIndex) -> (BalanceOf, BalanceOf, BalanceOf) { - let (approve, against, capital): (BalanceOf, BalanceOf, BalanceOf) = Self::voters_for(ref_index).iter() - .map(|voter| ( - T::Currency::total_balance(voter), Self::vote_of((ref_index, voter.clone())) - )) - .map(|(bal, vote)| - if vote.is_aye() { - (bal * BalanceOf::::sa(vote.multiplier() as u64), Zero::zero(), bal) - } else { - (Zero::zero(), bal * BalanceOf::::sa(vote.multiplier() as u64), bal) - } - ).fold((Zero::zero(), Zero::zero(), Zero::zero()), |(a, b, c), (d, e, f)| (a + d, b + e, c + f)); + let (approve, against, capital): + (BalanceOf, BalanceOf, BalanceOf) = Self::voters_for(ref_index) + .iter() + .map(|voter| ( + T::Currency::total_balance(voter), Self::vote_of((ref_index, voter.clone())) + )) + .map(|(balance, Vote { aye, conviction })| { + let (votes, turnout) = conviction.votes(balance); + if aye { + (votes, Zero::zero(), turnout) + } else { + (Zero::zero(), votes, turnout) + } + }).fold( + (Zero::zero(), Zero::zero(), Zero::zero()), + |(a, b, c), (d, e, f)| (a + d, b + e, c + f) + ); let (del_approve, del_against, del_capital) = Self::tally_delegation(ref_index); (approve + del_approve, against + del_against, capital + del_capital) } /// Get the delegated voters for the current proposal. - /// I think this goes into a worker once https://github.com/paritytech/substrate/issues/1458 is done. + /// I think this goes into a worker once https://github.com/paritytech/substrate/issues/1458 is + /// done. fn tally_delegation(ref_index: ReferendumIndex) -> (BalanceOf, BalanceOf, BalanceOf) { - Self::voters_for(ref_index).iter() - .fold((Zero::zero(), Zero::zero(), Zero::zero()), |(approve_acc, against_acc, capital_acc), voter| { - let vote = Self::vote_of((ref_index, voter.clone())); - let (votes, balance) = Self::delegated_votes(ref_index, voter.clone(), vote.multiplier(), MAX_RECURSION_LIMIT); - if vote.is_aye() { - (approve_acc + votes, against_acc, capital_acc + balance) + Self::voters_for(ref_index).iter().fold( + (Zero::zero(), Zero::zero(), Zero::zero()), + |(approve_acc, against_acc, turnout_acc), voter| { + let Vote { aye, conviction } = Self::vote_of((ref_index, voter.clone())); + let (votes, turnout) = Self::delegated_votes( + ref_index, + voter.clone(), + conviction, + MAX_RECURSION_LIMIT + ); + if aye { + (approve_acc + votes, against_acc, turnout_acc + turnout) } else { - (approve_acc, against_acc + votes, capital_acc + balance) + (approve_acc, against_acc + votes, turnout_acc + turnout) } - }) + } + ) } fn delegated_votes( ref_index: ReferendumIndex, to: T::AccountId, - min_lock_periods: LockPeriods, + parent_conviction: Conviction, recursion_limit: u32, ) -> (BalanceOf, BalanceOf) { if recursion_limit == 0 { return (Zero::zero(), Zero::zero()); } >::enumerate() - .filter(|(delegator, (delegate, _))| *delegate == to && !>::exists(&(ref_index, delegator.clone()))) - .fold((Zero::zero(), Zero::zero()), |(votes_acc, balance_acc), (delegator, (_delegate, periods))| { - let lock_periods = if min_lock_periods <= periods { min_lock_periods } else { periods }; - let balance = T::Currency::total_balance(&delegator); - let votes = T::Currency::total_balance(&delegator) * BalanceOf::::sa(lock_periods as u64); - let (del_votes, del_balance) = Self::delegated_votes(ref_index, delegator, lock_periods, recursion_limit - 1); - (votes_acc + votes + del_votes, balance_acc + balance + del_balance) - }) + .filter(|(delegator, (delegate, _))| + *delegate == to && !>::exists(&(ref_index, delegator.clone())) + ).fold( + (Zero::zero(), Zero::zero()), + |(votes_acc, turnout_acc), (delegator, (_delegate, max_conviction))| { + let conviction = Conviction::min(parent_conviction, max_conviction); + let balance = T::Currency::total_balance(&delegator); + let (votes, turnout) = conviction.votes(balance); + let (del_votes, del_turnout) = Self::delegated_votes( + ref_index, + delegator, + conviction, + recursion_limit - 1 + ); + (votes_acc + votes + del_votes, turnout_acc + turnout + del_turnout) + } + ) } // Exposed mutables. @@ -375,8 +664,17 @@ impl Module { } /// Start a referendum. Can be called directly by the council. - pub fn internal_start_referendum(proposal: T::Proposal, threshold: VoteThreshold, delay: T::BlockNumber) -> result::Result { - >::inject_referendum(>::block_number() + >::voting_period(), proposal, threshold, delay) + pub fn internal_start_referendum( + proposal: T::Proposal, + threshold: VoteThreshold, + delay: T::BlockNumber + ) -> result::Result { + >::inject_referendum( + >::block_number() + T::VotingPeriod::get(), + proposal, + threshold, + delay + ) } /// Remove a referendum. Can be called directly by the council. @@ -389,7 +687,6 @@ impl Module { /// Actually enact a vote, if legit. fn do_vote(who: T::AccountId, ref_index: ReferendumIndex, vote: Vote) -> Result { - ensure!(vote.multiplier() <= Self::max_lock_periods(), "vote has too great a strength"); ensure!(Self::is_active_referendum(ref_index), "vote given for invalid referendum."); if !>::exists(&(ref_index, who.clone())) { >::mutate(ref_index, |voters| voters.push(who.clone())); @@ -406,12 +703,17 @@ impl Module { delay: T::BlockNumber, ) -> result::Result { let ref_index = Self::referendum_count(); - if ref_index > 0 && Self::referendum_info(ref_index - 1).map(|i| i.end > end).unwrap_or(false) { + if ref_index.checked_sub(1) + .and_then(Self::referendum_info) + .map(|i| i.end > end) + .unwrap_or(false) + { Err("Cannot inject a referendum that ends earlier than preceeding referendum")? } - ReferendumCount::put(ref_index + 1); - >::insert(ref_index, ReferendumInfo { end, proposal, threshold, delay }); + >::put(ref_index + 1); + let item = ReferendumInfo { end, proposal, threshold, delay }; + >::insert(ref_index, item); Self::deposit_event(RawEvent::Started(ref_index, threshold)); Ok(ref_index) } @@ -431,47 +733,92 @@ impl Module { Self::deposit_event(RawEvent::Executed(index, ok)); } + /// Table the next waiting proposal for a vote. fn launch_next(now: T::BlockNumber) -> Result { + if >::take() { + Self::launch_public(now).or_else(|_| Self::launch_external(now)) + } else { + Self::launch_external(now).or_else(|_| Self::launch_public(now)) + }.map_err(|_| "No proposals waiting") + } + + /// Table the waiting external proposal for a vote, if there is one. + fn launch_external(now: T::BlockNumber) -> Result { + if let Some((proposal, threshold)) = >::take() { + >::put(true); + Self::deposit_event(RawEvent::ExternalTabled); + Self::inject_referendum( + now + T::VotingPeriod::get(), + proposal, + threshold, + T::EnactmentPeriod::get(), + )?; + Ok(()) + } else { + Err("No external proposal waiting") + } + } + + /// Table the waiting public proposal with the highest backing for a vote. + fn launch_public(now: T::BlockNumber) -> Result { let mut public_props = Self::public_props(); if let Some((winner_index, _)) = public_props.iter() .enumerate() - .max_by_key(|x| Self::locked_for((x.1).0).unwrap_or_else(Zero::zero)/*defensive only: All current public proposals have an amount locked*/) + .max_by_key(|x| Self::locked_for((x.1).0).unwrap_or_else(Zero::zero) + /* ^^ defensive only: All current public proposals have an amount locked*/) { let (prop_index, proposal, _) = public_props.swap_remove(winner_index); >::put(public_props); - if let Some((deposit, depositors)) = >::take(prop_index) {//: (BalanceOf, Vec) = + if let Some((deposit, depositors)) = >::take(prop_index) { // refund depositors for d in &depositors { T::Currency::unreserve(d, deposit); } Self::deposit_event(RawEvent::Tabled(prop_index, deposit, depositors)); - Self::inject_referendum(now + Self::voting_period(), proposal, VoteThreshold::SuperMajorityApprove, Self::public_delay())?; + Self::inject_referendum( + now + T::VotingPeriod::get(), + proposal, + VoteThreshold::SuperMajorityApprove, + T::EnactmentPeriod::get(), + )?; } + Ok(()) + } else { + Err("No public proposals waiting") } - Ok(()) } - fn bake_referendum(now: T::BlockNumber, index: ReferendumIndex, info: ReferendumInfo) -> Result { + fn bake_referendum( + now: T::BlockNumber, + index: ReferendumIndex, + info: ReferendumInfo + ) -> Result { let (approve, against, capital) = Self::tally(index); let total_issuance = T::Currency::total_issuance(); let approved = info.threshold.approved(approve, against, capital, total_issuance); - let lock_period = Self::public_delay(); // Logic defined in https://www.slideshare.net/gavofyork/governance-in-polkadot-poc3 // Essentially, we extend the lock-period of the coins behind the winning votes to be the // vote strength times the public delay period from now. - for (a, vote) in Self::voters_for(index).into_iter() + for (a, Vote { conviction, .. }) in Self::voters_for(index).into_iter() .map(|a| (a.clone(), Self::vote_of((index, a)))) - // ^^^ defensive only: all items come from `voters`; for an item to be in `voters` there must be a vote registered; qed - .filter(|&(_, vote)| vote.is_aye() == approved) // Just the winning coins + // ^^^ defensive only: all items come from `voters`; for an item to be in `voters` + // there must be a vote registered; qed + .filter(|&(_, vote)| vote.aye == approved) // Just the winning coins { - // now plus: the base lock period multiplied by the number of periods this voter offered to - // lock should they win... - let locked_until = now + lock_period * T::BlockNumber::sa((vote.multiplier()) as u64); + // now plus: the base lock period multiplied by the number of periods this voter + // offered to lock should they win... + let locked_until = now + T::EnactmentPeriod::get() * conviction.lock_periods().into(); // ...extend their bondage until at least then. - T::Currency::extend_lock(DEMOCRACY_ID, &a, Bounded::max_value(), locked_until, WithdrawReason::Transfer.into()); + T::Currency::extend_lock( + DEMOCRACY_ID, + &a, + Bounded::max_value(), + locked_until, + WithdrawReason::Transfer.into() + ); } Self::clear_referendum(index); @@ -480,7 +827,10 @@ impl Module { if info.delay.is_zero() { Self::enact_proposal(info.proposal, index); } else { - >::mutate(now + info.delay, |q| q.push(Some((info.proposal, index)))); + >::mutate( + now + info.delay, + |q| q.push(Some((info.proposal, index))) + ); } } else { Self::deposit_event(RawEvent::NotPassed(index)); @@ -491,14 +841,17 @@ impl Module { } /// Current era is ending; we should finish up any proposals. + // TODO: move to initialize_block #2779 fn end_block(now: T::BlockNumber) -> Result { // pick out another public referendum if it's time. - if (now % Self::launch_period()).is_zero() { - Self::launch_next(now.clone())?; + if (now % T::LaunchPeriod::get()).is_zero() { + // Errors come from the queue being empty. we don't really care about that, and even if + // we did, there is nothing we can do here. + let _ = Self::launch_next(now.clone()); } // tally up votes for any expiring referenda. - for (index, info) in Self::maturing_referendums_at(now).into_iter() { + for (index, info) in Self::maturing_referenda_at(now).into_iter() { Self::bake_referendum(now.clone(), index, info)?; } @@ -519,15 +872,21 @@ impl OnFreeBalanceZero for Module { mod tests { use super::*; use runtime_io::with_externalities; - use srml_support::{impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok}; + use srml_support::{ + impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok, parameter_types, + traits::Contains + }; use substrate_primitives::{H256, Blake2Hasher}; use primitives::BuildStorage; - use primitives::traits::{BlakeTwo256, IdentityLookup}; + use primitives::traits::{BlakeTwo256, IdentityLookup, Bounded}; use primitives::testing::{Digest, DigestItem, Header}; use balances::BalanceLock; + use system::EnsureSignedBy; - const AYE: Vote = Vote(-1); - const NAY: Vote = Vote(0); + const AYE: Vote = Vote{ aye: true, conviction: Conviction::None }; + const NAY: Vote = Vote{ aye: false, conviction: Conviction::None }; + const BIG_AYE: Vote = Vote{ aye: true, conviction: Conviction::Locked1x }; + const BIG_NAY: Vote = Vote{ aye: false, conviction: Conviction::Locked1x }; impl_outer_origin! { pub enum Origin for Test {} @@ -565,17 +924,43 @@ mod tests { type TransferPayment = (); type DustRemoval = (); } - impl Trait for Test { - type Currency = balances::Module; + parameter_types! { + pub const LaunchPeriod: u64 = 2; + pub const VotingPeriod: u64 = 2; + pub const EmergencyVotingPeriod: u64 = 1; + pub const MinimumDeposit: u64 = 1; + pub const EnactmentPeriod: u64 = 2; + pub const CooloffPeriod: u64 = 2; + pub const One: u64 = 1; + pub const Two: u64 = 2; + pub const Three: u64 = 3; + pub const Four: u64 = 4; + pub const Five: u64 = 5; + } + pub struct OneToFive; + impl Contains for OneToFive { + fn contains(n: &u64) -> bool { + *n >= 1 && *n <= 5 + } + } + impl super::Trait for Test { type Proposal = Call; type Event = (); + type Currency = balances::Module; + type EnactmentPeriod = EnactmentPeriod; + type LaunchPeriod = LaunchPeriod; + type VotingPeriod = VotingPeriod; + type EmergencyVotingPeriod = EmergencyVotingPeriod; + type MinimumDeposit = MinimumDeposit; + type EmergencyOrigin = EnsureSignedBy; + type ExternalOrigin = EnsureSignedBy; + type ExternalMajorityOrigin = EnsureSignedBy; + type CancellationOrigin = EnsureSignedBy; + type VetoOrigin = EnsureSignedBy; + type CooloffPeriod = CooloffPeriod; } fn new_test_ext() -> runtime_io::TestExternalities { - new_test_ext_with_public_delay(0) - } - - fn new_test_ext_with_public_delay(public_delay: u64) -> runtime_io::TestExternalities { let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; t.extend(balances::GenesisConfig::{ transaction_base_fee: 0, @@ -586,13 +971,7 @@ mod tests { creation_fee: 0, vesting: vec![], }.build_storage().unwrap().0); - t.extend(GenesisConfig::{ - launch_period: 1, - voting_period: 1, - minimum_deposit: 1, - public_delay, - max_lock_periods: 6, - }.build_storage().unwrap().0); + t.extend(GenesisConfig::::default().build_storage().unwrap().0); runtime_io::TestExternalities::new(t) } @@ -603,49 +982,347 @@ mod tests { #[test] fn params_should_work() { with_externalities(&mut new_test_ext(), || { - assert_eq!(Democracy::launch_period(), 1); - assert_eq!(Democracy::voting_period(), 1); - assert_eq!(Democracy::minimum_deposit(), 1); assert_eq!(Democracy::referendum_count(), 0); assert_eq!(Balances::free_balance(&42), 0); assert_eq!(Balances::total_issuance(), 210); - assert_eq!(Democracy::public_delay(), 0); - assert_eq!(Democracy::max_lock_periods(), 6); }); } + fn set_balance_proposal(value: u64) -> Call { + Call::Balances(balances::Call::set_balance(42, value, 0)) + } + + fn propose_set_balance(who: u64, value: u64, delay: u64) -> super::Result { + Democracy::propose( + Origin::signed(who), + Box::new(set_balance_proposal(value)), + delay + ) + } + + fn next_block() { + assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + System::set_block_number(System::block_number() + 1); + } + + fn fast_forward_to(n: u64) { + while System::block_number() < n { + next_block(); + } + } + #[test] - fn vote_should_work() { - assert_eq!(Vote::new(true, 0).multiplier(), 1); - assert_eq!(Vote::new(true, 1).multiplier(), 1); - assert_eq!(Vote::new(true, 2).multiplier(), 2); - assert_eq!(Vote::new(true, 0).is_aye(), true); - assert_eq!(Vote::new(true, 1).is_aye(), true); - assert_eq!(Vote::new(true, 2).is_aye(), true); - assert_eq!(Vote::new(false, 0).multiplier(), 1); - assert_eq!(Vote::new(false, 1).multiplier(), 1); - assert_eq!(Vote::new(false, 2).multiplier(), 2); - assert_eq!(Vote::new(false, 0).is_aye(), false); - assert_eq!(Vote::new(false, 1).is_aye(), false); - assert_eq!(Vote::new(false, 2).is_aye(), false); + fn external_and_public_interleaving_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(1)), + )); + assert_ok!(propose_set_balance(6, 2, 2)); + + fast_forward_to(1); + + // both waiting: external goes first. + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(1), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish external + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(3)), + )); + + fast_forward_to(3); + + // both waiting: public goes next. + assert_eq!( + Democracy::referendum_info(1), + Some(ReferendumInfo { + end: 4, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // don't replenish public + + fast_forward_to(5); + + // it's external "turn" again, though since public is empty that doesn't really matter + assert_eq!( + Democracy::referendum_info(2), + Some(ReferendumInfo { + end: 6, + proposal: set_balance_proposal(3), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish external + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(5)), + )); + + fast_forward_to(7); + + // external goes again because there's no public waiting. + assert_eq!( + Democracy::referendum_info(3), + Some(ReferendumInfo { + end: 8, + proposal: set_balance_proposal(5), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish both + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(7)), + )); + assert_ok!(propose_set_balance(6, 4, 2)); + + fast_forward_to(9); + + // public goes now since external went last time. + assert_eq!( + Democracy::referendum_info(4), + Some(ReferendumInfo { + end: 10, + proposal: set_balance_proposal(4), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish public again + assert_ok!(propose_set_balance(6, 6, 2)); + // cancel external + let h = BlakeTwo256::hash_of(&set_balance_proposal(7)); + assert_ok!(Democracy::veto_external(Origin::signed(3), h)); + + fast_forward_to(11); + + // public goes again now since there's no external waiting. + assert_eq!( + Democracy::referendum_info(5), + Some(ReferendumInfo { + end: 12, + proposal: set_balance_proposal(6), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + }); } + #[test] - fn invalid_vote_strength_should_not_work() { + fn emergency_cancel_should_work() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_noop!(Democracy::vote(Origin::signed(1), r, Vote::new(true, 7)), "vote has too great a strength"); - assert_noop!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 7)), "vote has too great a strength"); + System::set_block_number(0); + let r = Democracy::inject_referendum( + 2, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 2 + ).unwrap(); + assert!(Democracy::referendum_info(r).is_some()); + + assert_noop!(Democracy::emergency_cancel(Origin::signed(3), r), "Invalid origin"); + assert_ok!(Democracy::emergency_cancel(Origin::signed(4), r)); + assert!(Democracy::referendum_info(r).is_none()); + + // some time later... + + let r = Democracy::inject_referendum( + 2, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 2 + ).unwrap(); + assert!(Democracy::referendum_info(r).is_some()); + assert_noop!(Democracy::emergency_cancel(Origin::signed(4), r), "cannot cancel the same proposal twice"); }); } - fn set_balance_proposal(value: u64) -> Call { - Call::Balances(balances::Call::set_balance(42, value.into(), 0)) + #[test] + fn veto_external_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + )); + assert!(>::exists()); + + let h = BlakeTwo256::hash_of(&set_balance_proposal(2)); + assert_ok!(Democracy::veto_external(Origin::signed(3), h.clone())); + // cancelled. + assert!(!>::exists()); + // fails - same proposal can't be resubmitted. + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + ), "proposal still blacklisted"); + + fast_forward_to(1); + // fails as we're still in cooloff period. + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + ), "proposal still blacklisted"); + + fast_forward_to(2); + // works; as we're out of the cooloff period. + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + )); + assert!(>::exists()); + + // 3 can't veto the same thing twice. + assert_noop!( + Democracy::veto_external(Origin::signed(3), h.clone()), + "identity may not veto a proposal twice" + ); + + // 4 vetoes. + assert_ok!(Democracy::veto_external(Origin::signed(4), h.clone())); + // cancelled again. + assert!(!>::exists()); + + fast_forward_to(3); + // same proposal fails as we're still in cooloff + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + ), "proposal still blacklisted"); + // different proposal works fine. + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(3)), + )); + }); + } + + #[test] + fn emergency_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::emergency_propose( + Origin::signed(6), // invalid + Box::new(set_balance_proposal(2)), + VoteThreshold::SuperMajorityAgainst, + 0, + 0, + ), "bad origin: expected to be a root origin"); + assert_ok!(Democracy::emergency_propose( + Origin::signed(1), + Box::new(set_balance_proposal(2)), + VoteThreshold::SuperMajorityAgainst, + 0, + 0, + )); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 1, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityAgainst, + delay: 0 + }) + ); + + assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); + fast_forward_to(1); + assert_eq!(Balances::free_balance(&42), 0); + fast_forward_to(2); + assert_eq!(Balances::free_balance(&42), 2); + + assert_ok!(Democracy::emergency_propose( + Origin::signed(1), + Box::new(set_balance_proposal(4)), + VoteThreshold::SuperMajorityAgainst, + 3, + 3 + )); + assert_eq!( + Democracy::referendum_info(1), + Some(ReferendumInfo { + end: 5, + proposal: set_balance_proposal(4), + threshold: VoteThreshold::SuperMajorityAgainst, + delay: 3 + }) + ); + assert_ok!(Democracy::vote(Origin::signed(1), 1, AYE)); + fast_forward_to(8); + assert_eq!(Balances::free_balance(&42), 2); + fast_forward_to(9); + assert_eq!(Balances::free_balance(&42), 4); + }); } - fn propose_set_balance(who: u64, value: u64, locked: u64) -> super::Result { - Democracy::propose(Origin::signed(who), Box::new(set_balance_proposal(value)), locked.into()) + #[test] + fn external_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::external_propose( + Origin::signed(1), + Box::new(set_balance_proposal(2)), + ), "Invalid origin"); + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + )); + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(1)), + ), "proposal already made"); + fast_forward_to(1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + }); + } + + #[test] + fn external_majority_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::external_propose_majority( + Origin::signed(1), + Box::new(set_balance_proposal(2)) + ), "Invalid origin"); + assert_ok!(Democracy::external_propose_majority( + Origin::signed(3), + Box::new(set_balance_proposal(2)) + )); + fast_forward_to(1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SimpleMajority, + delay: 2, + }) + ); + }); } #[test] @@ -664,24 +1341,74 @@ mod tests { #[test] fn single_proposal_should_work() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert!(Democracy::referendum_info(0).is_none()); + + // end of 0 => next referendum scheduled. + fast_forward_to(1); - System::set_block_number(2); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_eq!(Democracy::referendum_count(), 1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); + + fast_forward_to(2); + + // referendum still running + assert!(Democracy::referendum_info(0).is_some()); + + // referendum runs during 1 and 2, ends @ end of 2. + fast_forward_to(3); + + assert!(Democracy::referendum_info(0).is_none()); + assert_eq!(Democracy::dispatch_queue(4), vec![ + Some((set_balance_proposal(2), 0)) + ]); + + // referendum passes and wait another two blocks for enactment. + fast_forward_to(5); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); assert_eq!(Balances::free_balance(&42), 2); }); } + #[test] + fn cancel_queued_should_work() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_ok!(propose_set_balance(1, 2, 1)); + + // end of 0 => next referendum scheduled. + fast_forward_to(1); + + assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); + + fast_forward_to(3); + + assert_eq!(Democracy::dispatch_queue(4), vec![ + Some((set_balance_proposal(2), 0)) + ]); + + assert_noop!(Democracy::cancel_queued(3, 0, 0), "proposal not found"); + assert_noop!(Democracy::cancel_queued(4, 1, 0), "proposal not found"); + assert_ok!(Democracy::cancel_queued(4, 0, 0)); + assert_eq!(Democracy::dispatch_queue(4), vec![None]); + }); + } + #[test] fn proxy_should_work() { with_externalities(&mut new_test_ext(), || { @@ -715,21 +1442,19 @@ mod tests { #[test] fn single_proposal_should_work_with_proxy() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + fast_forward_to(1); let r = 0; assert_ok!(Democracy::set_proxy(Origin::signed(1), 10)); assert_ok!(Democracy::proxy_vote(Origin::signed(10), r, AYE)); - assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); } @@ -737,27 +1462,23 @@ mod tests { #[test] fn single_proposal_should_work_with_delegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); - let r = 0; + fast_forward_to(1); // Delegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); + let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - - assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - // Delegated vote is counted. - assert_eq!(Democracy::tally(r), (30, 0, 30)); + assert_eq!(Democracy::tally(r), (3, 0, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -766,27 +1487,24 @@ mod tests { #[test] fn single_proposal_should_work_with_cyclic_delegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); - let r = 0; + fast_forward_to(1); // Check behavior with cycle. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); - assert_ok!(Democracy::delegate(Origin::signed(3), 2, 100)); - assert_ok!(Democracy::delegate(Origin::signed(1), 3, 100)); - + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); + assert_ok!(Democracy::delegate(Origin::signed(3), 2, Conviction::max_value())); + assert_ok!(Democracy::delegate(Origin::signed(1), 3, Conviction::max_value())); + let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - - assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); // Delegated vote is counted. - assert_eq!(Democracy::tally(r), (60, 0, 60)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert_eq!(Democracy::tally(r), (6, 0, 6)); + + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -796,30 +1514,24 @@ mod tests { /// If transactor already voted, delegated vote is overwriten. fn single_proposal_should_work_with_vote_and_delegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); - let r = 0; + fast_forward_to(1); + let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - // Vote. assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); - // Delegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); - - assert_eq!(Democracy::referendum_count(), 1); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); assert_eq!(Democracy::voters_for(r), vec![1, 2]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - // Delegated vote is not counted. - assert_eq!(Democracy::tally(r), (30, 0, 30)); + assert_eq!(Democracy::tally(r), (3, 0, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -828,16 +1540,15 @@ mod tests { #[test] fn single_proposal_should_work_with_undelegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); // Delegate and undelegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); assert_ok!(Democracy::undelegate(Origin::signed(2))); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + fast_forward_to(1); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); @@ -846,9 +1557,9 @@ mod tests { assert_eq!(Democracy::vote_of((r, 1)), AYE); // Delegated vote is not counted. - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -858,18 +1569,17 @@ mod tests { /// If transactor voted, delegated vote is overwriten. fn single_proposal_should_work_with_delegation_and_vote() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + fast_forward_to(1); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); // Delegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); // Vote. assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); @@ -879,9 +1589,9 @@ mod tests { assert_eq!(Democracy::vote_of((r, 1)), AYE); // Delegated vote is not counted. - assert_eq!(Democracy::tally(r), (30, 0, 30)); + assert_eq!(Democracy::tally(r), (3, 0, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -911,7 +1621,7 @@ mod tests { assert_ok!(Democracy::second(Origin::signed(5), 0)); assert_ok!(Democracy::second(Origin::signed(5), 0)); assert_ok!(Democracy::second(Origin::signed(5), 0)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(3); assert_eq!(Balances::free_balance(&1), 10); assert_eq!(Balances::free_balance(&2), 20); assert_eq!(Balances::free_balance(&5), 50); @@ -950,21 +1660,12 @@ mod tests { assert_ok!(propose_set_balance(1, 2, 2)); assert_ok!(propose_set_balance(1, 4, 4)); assert_ok!(propose_set_balance(1, 3, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - - System::set_block_number(1); + fast_forward_to(1); assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - assert_eq!(Balances::free_balance(&42), 4); - - System::set_block_number(2); + fast_forward_to(3); assert_ok!(Democracy::vote(Origin::signed(1), 1, AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - assert_eq!(Balances::free_balance(&42), 3); - - System::set_block_number(3); + fast_forward_to(5); assert_ok!(Democracy::vote(Origin::signed(1), 2, AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); }); } @@ -972,14 +1673,20 @@ mod tests { fn simple_passing_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -989,11 +1696,17 @@ mod tests { fn cancel_referendum_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_ok!(Democracy::cancel_referendum(r.into())); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 0); }); @@ -1003,14 +1716,20 @@ mod tests { fn simple_failing_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, NAY)); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), NAY); - assert_eq!(Democracy::tally(r), (0, 10, 10)); + assert_eq!(Democracy::tally(r), (0, 1, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 0); }); @@ -1020,17 +1739,23 @@ mod tests { fn controversial_voting_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - assert_ok!(Democracy::vote(Origin::signed(2), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(3), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(4), r, AYE)); - assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(1), r, BIG_AYE)); + assert_ok!(Democracy::vote(Origin::signed(2), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(3), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(4), r, BIG_AYE)); + assert_ok!(Democracy::vote(Origin::signed(5), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, BIG_AYE)); assert_eq!(Democracy::tally(r), (110, 100, 210)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -1040,7 +1765,12 @@ mod tests { fn delayed_enactment_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 1).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 1 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); assert_ok!(Democracy::vote(Origin::signed(3), r, AYE)); @@ -1048,102 +1778,157 @@ mod tests { assert_ok!(Democracy::vote(Origin::signed(5), r, AYE)); assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); - assert_eq!(Democracy::tally(r), (210, 0, 210)); + assert_eq!(Democracy::tally(r), (21, 0, 21)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); assert_eq!(Balances::free_balance(&42), 0); - System::set_block_number(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); } #[test] - fn lock_voting_should_work() { - with_externalities(&mut new_test_ext_with_public_delay(1), || { + fn controversial_low_turnout_voting_should_work() { + with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 6))); - assert_ok!(Democracy::vote(Origin::signed(2), r, Vote::new(true, 5))); - assert_ok!(Democracy::vote(Origin::signed(3), r, Vote::new(true, 4))); - assert_ok!(Democracy::vote(Origin::signed(4), r, Vote::new(true, 3))); - assert_ok!(Democracy::vote(Origin::signed(5), r, Vote::new(true, 2))); - assert_ok!(Democracy::vote(Origin::signed(6), r, Vote::new(false, 1))); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(5), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, BIG_AYE)); - assert_eq!(Democracy::tally(r), (440, 120, 210)); - - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - - assert_eq!(Balances::locks(1), vec![]); - assert_eq!(Balances::locks(2), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 6, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(3), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 5, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(4), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 4, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(5), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 3, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(6), vec![]); + assert_eq!(Democracy::tally(r), (60, 50, 110)); - System::set_block_number(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(&42), 0); }); } #[test] - fn lock_voting_should_work_with_delegation() { - with_externalities(&mut new_test_ext_with_public_delay(1), || { - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 6))); - assert_ok!(Democracy::vote(Origin::signed(2), r, Vote::new(true, 5))); - assert_ok!(Democracy::vote(Origin::signed(3), r, Vote::new(true, 4))); - assert_ok!(Democracy::vote(Origin::signed(4), r, Vote::new(true, 3))); - assert_ok!(Democracy::delegate(Origin::signed(5), 2, 2)); - assert_ok!(Democracy::vote(Origin::signed(6), r, Vote::new(false, 1))); + fn passing_low_turnout_voting_should_work() { + with_externalities(&mut new_test_ext(), || { + assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::total_issuance(), 210); - assert_eq!(Democracy::tally(r), (440, 120, 210)); + System::set_block_number(1); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(4), r, BIG_AYE)); + assert_ok!(Democracy::vote(Origin::signed(5), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, BIG_AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert_eq!(Democracy::tally(r), (100, 50, 150)); - System::set_block_number(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); } #[test] - fn controversial_low_turnout_voting_should_work() { + fn lock_voting_should_work() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); - - assert_eq!(Democracy::tally(r), (60, 50, 110)); + System::set_block_number(0); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(1), r, Vote { + aye: false, + conviction: Conviction::Locked5x + })); + assert_ok!(Democracy::vote(Origin::signed(2), r, Vote { + aye: true, + conviction: Conviction::Locked4x + })); + assert_ok!(Democracy::vote(Origin::signed(3), r, Vote { + aye: true, + conviction: Conviction::Locked3x + })); + assert_ok!(Democracy::vote(Origin::signed(4), r, Vote { + aye: true, + conviction: Conviction::Locked2x + })); + assert_ok!(Democracy::vote(Origin::signed(5), r, Vote { + aye: false, + conviction: Conviction::Locked1x + })); + + assert_eq!(Democracy::tally(r), (250, 100, 150)); + + fast_forward_to(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert_eq!(Balances::locks(1), vec![]); + assert_eq!(Balances::locks(2), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 17, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(3), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 9, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(4), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 5, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(5), vec![]); - assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::free_balance(&42), 2); }); } #[test] - fn passing_low_turnout_voting_should_work() { + fn lock_voting_should_work_with_delegation() { with_externalities(&mut new_test_ext(), || { - assert_eq!(Balances::free_balance(&42), 0); - assert_eq!(Balances::total_issuance(), 210); - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(4), r, AYE)); - assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); - - assert_eq!(Democracy::tally(r), (100, 50, 150)); - - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(1), r, Vote { + aye: false, + conviction: Conviction::Locked5x + })); + assert_ok!(Democracy::vote(Origin::signed(2), r, Vote { + aye: true, + conviction: Conviction::Locked4x + })); + assert_ok!(Democracy::vote(Origin::signed(3), r, Vote { + aye: true, + conviction: Conviction::Locked3x + })); + assert_ok!(Democracy::delegate(Origin::signed(4), 2, Conviction::Locked2x)); + assert_ok!(Democracy::vote(Origin::signed(5), r, Vote { + aye: false, + conviction: Conviction::Locked1x + })); + + assert_eq!(Democracy::tally(r), (250, 100, 150)); + + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); diff --git a/srml/example/Cargo.toml b/srml/example/Cargo.toml index c62b61f7b33a571faace253e8eabbd186aa103b1..7601a799f81c72564de689121f2b649b3083b734 100644 --- a/srml/example/Cargo.toml +++ b/srml/example/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-example" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } parity-codec = { version = "3.3", default-features = false } srml-support = { path = "../support", default-features = false } diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index d1ff7cc634c284053ca968e7cfa12df6fb3d671f..33c023ee8a669e3eed5a7d3798179c48895c0935 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -24,12 +24,19 @@ //! //! ### Documentation Guidelines: //! -//! +//! +//! //!
    -//!
  • Documentation comments (i.e. /// comment) - should accompany module functions and be restricted to the module interface, not the internals of the module implementation. Only state inputs, outputs, and a brief description that mentions whether calling it requires root, but without repeating the source code details. Capitalise the first word of each documentation comment and end it with a full stop. See Generic example of annotating source code with documentation comments
  • +//!
  • Documentation comments (i.e. /// comment) - should accompany module functions and be +//! restricted to the module interface, not the internals of the module implementation. Only state inputs, +//! outputs, and a brief description that mentions whether calling it requires root, but without repeating +//! the source code details. Capitalise the first word of each documentation comment and end it with a full +//! stop. See Generic example of annotating source code with documentation comments
  • //!
  • Self-documenting code - Try to refactor code to be self-documenting.
  • //!
  • Code comments - Supplement complex code with a brief explanation, not every line of code.
  • -//!
  • Identifiers - surround by backticks (i.e. INHERENT_IDENTIFIER, InherentType, u64)
  • +//!
  • Identifiers - surround by backticks (i.e. INHERENT_IDENTIFIER, InherentType, +//! u64)
  • //!
  • Usage scenarios - should be simple doctests. The compiler should ensure they stay valid.
  • //!
  • Extended tutorials - should be moved to external files and refer to.
  • //! @@ -39,7 +46,8 @@ //! //! ### Documentation Template:
    //! -//! Copy and paste this template from srml/example/src/lib.rs into file srml//src/lib.rs of your own custom module and complete it. +//! Copy and paste this template from srml/example/src/lib.rs into file srml//src/lib.rs of +//! your own custom module and complete it. //!

     //! // Add heading with custom module name
     //!
    @@ -47,6 +55,13 @@
     //!
     //! // Add simple description
     //!
    +//! // Include the following links that shows what trait needs to be implemented to use the module
    +//! // and the supported dispatchables that are documented in the Call enum.
    +//!
    +//! - \[`::Trait`](./trait.Trait.html)
    +//! - \[`Call`](./enum.Call.html)
    +//! - \[`Module`](./struct.Module.html)
    +//!
     //! \## Overview
     //!
     //!  
    @@ -59,12 +74,6 @@
     //! // Inputs it uses and the source of each input.
     //! // Outputs it produces.
     //!
    -//! 
    -//! -//! Standard format (example): "The timestamp module provides functionality to get and set the on-chain time. -//! To use the timestamp module you need to implement the following [Trait] (). -//! Supported dispatchables are documented in the [Call] enum." -//! //! //! //! @@ -75,8 +84,7 @@ //! // use some judgment about what is included. We don't want a list of every storage item nor types - the user //! // can go to the code for that. For example, "transfer fee" is obvious and should not be included, but //! // "free balance" and "reserved balance" should be noted to give context to the module. -//! -//!
    +//! // Please do not link to outside resources. The reference docs should be the ultimate source of truth. //! //! //! @@ -99,14 +107,15 @@ //! //! \### Supported Origins //! -//! // What origins are used and supported in this module (root, signed, inherent) +//! // What origins are used and supported in this module (root, signed, none) //! // i.e. root when \`ensure_root\` used -//! // i.e. inherent when \`ensure_inherent\` used +//! // i.e. none when \`ensure_none\` used //! // i.e. signed when \`ensure_signed\` used //! //! \`inherent\` //! -//! +//! +//! //! //! \### Types //! @@ -212,8 +221,6 @@ //! // - Substrate TCR https://github.com/parity-samples/substrate-tcr //! // - Substrate Kitties https://shawntabrizi.github.io/substrate-collectables-workshop/#/ //! -//! // Show a usage example in an actual runtime -//! //! \## Genesis Config //! //! @@ -315,7 +322,9 @@ decl_event!( // Generally you'll want to split these into three groups: // - Public calls that are signed by an external account. // - Root calls that are allowed to be made only by the governance system. -// - Inherent calls that are allowed to be made only by the block authors and validators. +// - Unsigned calls that can be of two kinds: +// * "Inherent extrinsics" that are opinions generally held by the block authors that build child blocks. +// * Unsigned Transactions that are of intrinsic recognisable utility to the network, and are validated by the runtime. // // Information about where this dispatch initiated from is provided as the first argument // "origin". As such functions must always look like: @@ -330,10 +339,10 @@ decl_event!( // `fn foo(origin: T::Origin, bar: Bar, baz: Baz) { ... }` // // There are three entries in the `system::Origin` enum that correspond -// to the above bullets: `::Signed(AccountId)`, `::Root` and `::Inherent`. You should always match +// to the above bullets: `::Signed(AccountId)`, `::Root` and `::None`. You should always match // against them as the first thing you do in your function. There are three convenience calls // in system that do the matching for you and return a convenient result: `ensure_signed`, -// `ensure_root` and `ensure_inherent`. +// `ensure_root` and `ensure_none`. decl_module! { // Simple declaration of the `Module` type. Lets the macro know what its working on. pub struct Module for enum Call where origin: T::Origin { @@ -441,7 +450,7 @@ decl_module! { // For instance you can generate extrinsics for the upcoming produced block. fn offchain_worker(_n: T::BlockNumber) { // We don't do anything here. - // but we could dispatch extrinsic (transaction/inherent) using + // but we could dispatch extrinsic (transaction/unsigned/inherent) using // runtime_io::submit_extrinsic } } diff --git a/srml/executive/Cargo.toml b/srml/executive/Cargo.toml index 0526e86ca951c05cdc896886e9f463d860143e2d..7089a2aa9b973b363705041792c54d1bf985206d 100644 --- a/srml/executive/Cargo.toml +++ b/srml/executive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-executive" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -14,7 +14,7 @@ srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] -hex-literal = "0.1.0" +hex-literal = "0.2.0" substrate-primitives = { path = "../../core/primitives" } srml-indices = { path = "../indices" } balances = { package = "srml-balances", path = "../balances" } diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 271d7156acc6a26fe494deb67b61db4e418d4d69..d1c22fcb6a5d3333a7388cdb09b9043b0d6ca870 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -59,8 +59,17 @@ //! # pub type Balances = u64; //! # pub type AllModules = u64; //! # pub enum Runtime {}; +//! # use primitives::transaction_validity::TransactionValidity; +//! # use primitives::traits::ValidateUnsigned; +//! # impl ValidateUnsigned for Runtime { +//! # type Call = (); +//! # +//! # fn validate_unsigned(_call: &Self::Call) -> TransactionValidity { +//! # TransactionValidity::Invalid(0) +//! # } +//! # } //! /// Executive: handles dispatch to the various modules. -//! pub type Executive = executive::Executive; +//! pub type Executive = executive::Executive; //! ``` #![cfg_attr(not(feature = "std"), no_std)] @@ -70,7 +79,8 @@ use rstd::marker::PhantomData; use rstd::result; use primitives::traits::{ self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalize, - OnInitialize, Digest, NumberFor, Block as BlockT, OffchainWorker + OnInitialize, Digest, NumberFor, Block as BlockT, OffchainWorker, + ValidateUnsigned, DigestItem, }; use srml_support::{Dispatchable, traits::MakePayment}; use parity_codec::{Codec, Encode}; @@ -101,8 +111,8 @@ pub trait ExecuteBlock { fn execute_block(block: Block); } -pub struct Executive( - PhantomData<(System, Block, Context, Payment, AllModules)> +pub struct Executive( + PhantomData<(System, Block, Context, Payment, UnsignedValidator, AllModules)> ); impl< @@ -110,15 +120,18 @@ impl< Block: traits::Block, Context: Default, Payment: MakePayment, + UnsignedValidator, AllModules: OnInitialize + OnFinalize + OffchainWorker, -> ExecuteBlock for Executive where +> ExecuteBlock for Executive +where Block::Extrinsic: Checkable + Codec, >::Checked: Applyable, <>::Checked as Applyable>::Call: Dispatchable, - <<>::Checked as Applyable>::Call as Dispatchable>::Origin: From> + <<>::Checked as Applyable>::Call as Dispatchable>::Origin: From>, + UnsignedValidator: ValidateUnsigned>::Checked as Applyable>::Call> { fn execute_block(block: Block) { - Executive::::execute_block(block); + Executive::::execute_block(block); } } @@ -127,20 +140,25 @@ impl< Block: traits::Block, Context: Default, Payment: MakePayment, + UnsignedValidator, AllModules: OnInitialize + OnFinalize + OffchainWorker, -> Executive where +> Executive +where Block::Extrinsic: Checkable + Codec, >::Checked: Applyable, <>::Checked as Applyable>::Call: Dispatchable, - <<>::Checked as Applyable>::Call as Dispatchable>::Origin: From> + <<>::Checked as Applyable>::Call as Dispatchable>::Origin: From>, + UnsignedValidator: ValidateUnsigned>::Checked as Applyable>::Call> { /// Start the execution of a particular block. pub fn initialize_block(header: &System::Header) { - Self::initialize_block_impl(header.number(), header.parent_hash(), header.extrinsics_root()); + let mut digests = System::Digest::default(); + header.digest().logs().iter().for_each(|d| if d.as_pre_runtime().is_some() { digests.push(d.clone()) }); + Self::initialize_block_impl(header.number(), header.parent_hash(), header.extrinsics_root(), &digests); } - fn initialize_block_impl(block_number: &System::BlockNumber, parent_hash: &System::Hash, extrinsics_root: &System::Hash) { - >::initialize(block_number, parent_hash, extrinsics_root); + fn initialize_block_impl(block_number: &System::BlockNumber, parent_hash: &System::Hash, extrinsics_root: &System::Hash, digest: &System::Digest) { + >::initialize(block_number, parent_hash, extrinsics_root, digest); >::on_initialize(*block_number); } @@ -246,7 +264,8 @@ impl< Payment::make_payment(sender, encoded_len).map_err(|_| internal::ApplyError::CantPay)?; // AUDIT: Under no circumstances may this function panic from here onwards. - + // FIXME: ensure this at compile-time (such as by not defining a panic function, forcing + // a linker error unless the compiler can prove it cannot be called). // increment nonce in storage >::inc_account_nonce(sender); } @@ -290,7 +309,7 @@ impl< assert!(header.state_root() == storage_root, "Storage root must match that calculated."); } - /// Check a given transaction for validity. This doesn't execute any + /// Check a given signed transaction for validity. This doesn't execute any /// side-effects; it merely checks whether the transaction would panic if it were included or not. /// /// Changes made to storage should be discarded. @@ -313,38 +332,38 @@ impl< Err(_) => return TransactionValidity::Invalid(UNKNOWN_ERROR), }; - if let (Some(sender), Some(index)) = (xt.sender(), xt.index()) { - // pay any fees - if Payment::make_payment(sender, encoded_len).is_err() { - return TransactionValidity::Invalid(ApplyError::CantPay as i8) - } + match (xt.sender(), xt.index()) { + (Some(sender), Some(index)) => { + // pay any fees + if Payment::make_payment(sender, encoded_len).is_err() { + return TransactionValidity::Invalid(ApplyError::CantPay as i8) + } - // check index - let expected_index = >::account_nonce(sender); - if index < &expected_index { - return TransactionValidity::Invalid(ApplyError::Stale as i8) - } + // check index + let expected_index = >::account_nonce(sender); + if index < &expected_index { + return TransactionValidity::Invalid(ApplyError::Stale as i8) + } - let index = *index; - let provides = vec![(sender, index).encode()]; - let requires = if expected_index < index { - vec![(sender, index - One::one()).encode()] - } else { - vec![] - }; - - TransactionValidity::Valid { - priority: encoded_len as TransactionPriority, - requires, - provides, - longevity: TransactionLongevity::max_value(), - } - } else { - return TransactionValidity::Invalid(if xt.sender().is_none() { - MISSING_SENDER - } else { - INVALID_INDEX - }) + let index = *index; + let provides = vec![(sender, index).encode()]; + let requires = if expected_index < index { + vec![(sender, index - One::one()).encode()] + } else { + vec![] + }; + + TransactionValidity::Valid { + priority: encoded_len as TransactionPriority, + requires, + provides, + longevity: TransactionLongevity::max_value(), + propagate: true, + } + }, + (None, None) => UnsignedValidator::validate_unsigned(&xt.deconstruct().0), + (Some(_), None) => TransactionValidity::Invalid(INVALID_INDEX), + (None, Some(_)) => TransactionValidity::Invalid(MISSING_SENDER), } } @@ -365,7 +384,7 @@ mod tests { use primitives::testing::{Digest, DigestItem, Header, Block}; use srml_support::{traits::Currency, impl_outer_origin, impl_outer_event}; use system; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; impl_outer_origin! { pub enum Origin for Runtime { @@ -404,8 +423,25 @@ mod tests { type TransferPayment = (); } + impl ValidateUnsigned for Runtime { + type Call = Call; + + fn validate_unsigned(call: &Self::Call) -> TransactionValidity { + match call { + Call::set_balance(_, _, _) => TransactionValidity::Valid { + priority: 0, + requires: vec![], + provides: vec![], + longevity: std::u64::MAX, + propagate: false, + }, + _ => TransactionValidity::Invalid(0), + } + } + } + type TestXt = primitives::testing::TestXt>; - type Executive = super::Executive, system::ChainContext, balances::Module, ()>; + type Executive = super::Executive, system::ChainContext, balances::Module, Runtime, ()>; #[test] fn balance_transfer_dispatch_works() { @@ -443,7 +479,7 @@ mod tests { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("4c10fddf15e63c91ff2aa13ab3a9b7f6b19938d533829489e72ba40278a08fac").into(), + state_root: hex!("5ba497e45e379d80a4524f9509d224e9c175d0fa30f3491481e7e44a6a758adf").into(), extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), digest: Digest { logs: vec![], }, }, @@ -527,4 +563,22 @@ mod tests { run_test(false); run_test(true); } + + #[test] + fn validate_unsigned() { + let xt = primitives::testing::TestXt(None, 0, Call::set_balance(33, 69, 69)); + let valid = TransactionValidity::Valid { + priority: 0, + requires: vec![], + provides: vec![], + longevity: 18446744073709551615, + propagate: false, + }; + let mut t = new_test_ext(); + + with_externalities(&mut t, || { + assert_eq!(Executive::validate_transaction(xt.clone()), valid); + assert_eq!(Executive::apply_extrinsic(xt), Ok(ApplyOutcome::Fail)); + }); + } } diff --git a/srml/finality-tracker/Cargo.toml b/srml/finality-tracker/Cargo.toml index c85534f1ebffea5a789a9e463ae089f3d059601a..e6cf47ab25a26db462e35d96a8a3e344e9446cd8 100644 --- a/srml/finality-tracker/Cargo.toml +++ b/srml/finality-tracker/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-finality-tracker" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", default-features = false, features = ["derive"] } parity-codec = { version = "3.3", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } @@ -18,7 +17,7 @@ srml-system = { path = "../system", default-features = false } substrate-primitives = { path = "../../core/primitives", default-features = false } sr-io = { path = "../../core/sr-io", default-features = false } lazy_static = "1.0" -parking_lot = "0.7" +parking_lot = "0.8.0" [features] default = ["std"] diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index 34be4ea66a590f216ee350550fc43ae8670a3038..9e8319850212cabf0d225f195d537033fd6f4ef6 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -26,16 +26,16 @@ use inherents::{ InherentData, MakeFatalError, }; use srml_support::StorageValue; -use primitives::traits::{As, One, Zero}; +use primitives::traits::{One, Zero, SaturatedConversion}; use rstd::{prelude::*, result, cmp, vec}; use parity_codec::Decode; -use srml_system::{ensure_inherent, Trait as SystemTrait}; +use srml_system::{ensure_none, Trait as SystemTrait}; #[cfg(feature = "std")] use parity_codec::Encode; -const DEFAULT_WINDOW_SIZE: u64 = 101; -const DEFAULT_DELAY: u64 = 1000; +const DEFAULT_WINDOW_SIZE: u32 = 101; +const DEFAULT_DELAY: u32 = 1000; /// The identifier for the `finalnum` inherent. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"finalnum"; @@ -100,9 +100,9 @@ decl_storage! { /// The median. Median get(median) build(|_| T::BlockNumber::zero()): T::BlockNumber; /// The number of recent samples to keep from this chain. Default is n-100 - pub WindowSize get(window_size) config(window_size): T::BlockNumber = T::BlockNumber::sa(DEFAULT_WINDOW_SIZE); + pub WindowSize get(window_size) config(window_size): T::BlockNumber = DEFAULT_WINDOW_SIZE.into(); /// The delay after which point things become suspicious. - pub ReportLatency get(report_latency) config(report_latency): T::BlockNumber = T::BlockNumber::sa(DEFAULT_DELAY); + pub ReportLatency get(report_latency) config(report_latency): T::BlockNumber = DEFAULT_DELAY.into(); /// Final hint to apply in the block. `None` means "same as parent". Update: Option; @@ -117,7 +117,7 @@ decl_module! { /// Hint that the author of this block thinks the best finalized /// block is the given number. fn final_hint(origin, #[compact] hint: T::BlockNumber) { - ensure_inherent(origin)?; + ensure_none(origin)?; assert!(!::Update::exists(), "Final hint must be updated only once in the block"); assert!( srml_system::Module::::block_number() >= hint, @@ -154,7 +154,7 @@ impl Module { // the sample size has just been shrunk. { // take into account the item we haven't pushed yet. - let to_prune = (recent.len() + 1).saturating_sub(window_size.as_() as usize); + let to_prune = (recent.len() + 1).saturating_sub(window_size.saturated_into::()); for drained in recent.drain(..to_prune) { let idx = ordered.binary_search(&drained) @@ -188,13 +188,13 @@ impl Module { } }; - let our_window_size = recent.len(); + let our_window_size = recent.len() as u32; ::RecentHints::put(recent); ::OrderedHints::put(ordered); ::Median::put(median); - if T::BlockNumber::sa(our_window_size as u64) == window_size { + if T::BlockNumber::from(our_window_size) == window_size { let now = srml_system::Module::::block_number(); let latency = Self::report_latency(); @@ -344,7 +344,7 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { let mut parent_hash = System::parent_hash(); for i in 2..106 { - System::initialize(&i, &parent_hash, &Default::default()); + System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); FinalityTracker::on_finalize(i); let hdr = System::finalize(); parent_hash = hdr.hash(); @@ -369,10 +369,10 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { let mut parent_hash = System::parent_hash(); for i in 2..106 { - System::initialize(&i, &parent_hash, &Default::default()); + System::initialize(&i, &parent_hash, &Default::default(), &Default::default()); assert_ok!(FinalityTracker::dispatch( Call::final_hint(i-1), - Origin::INHERENT, + Origin::NONE, )); FinalityTracker::on_finalize(i); let hdr = System::finalize(); diff --git a/srml/grandpa/Cargo.toml b/srml/grandpa/Cargo.toml index 49906e699a08a20f658564430aceec49e37df2b0..7855019af8a4d3af942d4ec895c173a0f3ef39ab 100644 --- a/srml/grandpa/Cargo.toml +++ b/srml/grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-grandpa" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs index e9886eddb13c75e31744c32b991a63d3272a036f..5425ace8bb89e18b5cd398c374d9f61f3ab54f00 100644 --- a/srml/grandpa/src/lib.rs +++ b/srml/grandpa/src/lib.rs @@ -275,8 +275,6 @@ impl Module { in_blocks: T::BlockNumber, forced: Option, ) -> Result { - use primitives::traits::As; - if Self::pending_change().is_none() { let scheduled_at = system::ChainContext::::default().current_height(); @@ -287,7 +285,7 @@ impl Module { // only allow the next forced change when twice the window has passed since // this one. - >::put(scheduled_at + in_blocks * T::BlockNumber::sa(2)); + >::put(scheduled_at + in_blocks * 2.into()); } >::put(StoredPendingChange { diff --git a/srml/grandpa/src/tests.rs b/srml/grandpa/src/tests.rs index 3050b6a572e0d2d8269cf0a6ba8beb5862248da8..d19c5c25b639ef553ea112ceaad429783c321c3e 100644 --- a/srml/grandpa/src/tests.rs +++ b/srml/grandpa/src/tests.rs @@ -30,7 +30,7 @@ use super::*; #[test] fn authorities_change_logged() { with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 0, None).unwrap(); System::note_finished_extrinsics(); @@ -47,6 +47,7 @@ fn authorities_change_logged() { EventRecord { phase: Phase::Finalization, event: RawEvent::NewAuthorities(vec![(4, 1), (5, 1), (6, 1)]).into(), + topics: vec![], }, ]); }); @@ -55,7 +56,7 @@ fn authorities_change_logged() { #[test] fn authorities_change_logged_after_delay() { with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 1, None).unwrap(); Grandpa::on_finalize(1); let header = System::finalize(); @@ -68,7 +69,7 @@ fn authorities_change_logged_after_delay() { // no change at this height. assert_eq!(System::events(), vec![]); - System::initialize(&2, &header.hash(), &Default::default()); + System::initialize(&2, &header.hash(), &Default::default(), &Default::default()); System::note_finished_extrinsics(); Grandpa::on_finalize(2); @@ -77,6 +78,7 @@ fn authorities_change_logged_after_delay() { EventRecord { phase: Phase::Finalization, event: RawEvent::NewAuthorities(vec![(4, 1), (5, 1), (6, 1)]).into(), + topics: vec![], }, ]); }); @@ -85,7 +87,7 @@ fn authorities_change_logged_after_delay() { #[test] fn cannot_schedule_change_when_one_pending() { with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 1, None).unwrap(); assert!(Grandpa::pending_change().is_some()); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err()); @@ -93,14 +95,14 @@ fn cannot_schedule_change_when_one_pending() { Grandpa::on_finalize(1); let header = System::finalize(); - System::initialize(&2, &header.hash(), &Default::default()); + System::initialize(&2, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_some()); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err()); Grandpa::on_finalize(2); let header = System::finalize(); - System::initialize(&3, &header.hash(), &Default::default()); + System::initialize(&3, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_none()); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_ok()); @@ -128,7 +130,7 @@ fn new_decodes_from_old() { #[test] fn dispatch_forced_change() { with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); Grandpa::schedule_change( vec![(4, 1), (5, 1), (6, 1)], 5, @@ -142,7 +144,7 @@ fn dispatch_forced_change() { let mut header = System::finalize(); for i in 2..7 { - System::initialize(&i, &header.hash(), &Default::default()); + System::initialize(&i, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().unwrap().forced.is_some()); assert_eq!(Grandpa::next_forced(), Some(11)); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err()); @@ -155,7 +157,7 @@ fn dispatch_forced_change() { // change has been applied at the end of block 6. // add a normal change. { - System::initialize(&7, &header.hash(), &Default::default()); + System::initialize(&7, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_none()); assert_eq!(Grandpa::grandpa_authorities(), vec![(4, 1), (5, 1), (6, 1)]); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_ok()); @@ -165,7 +167,7 @@ fn dispatch_forced_change() { // run the normal change. { - System::initialize(&8, &header.hash(), &Default::default()); + System::initialize(&8, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_some()); assert_eq!(Grandpa::grandpa_authorities(), vec![(4, 1), (5, 1), (6, 1)]); assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err()); @@ -176,7 +178,7 @@ fn dispatch_forced_change() { // normal change applied. but we can't apply a new forced change for some // time. for i in 9..11 { - System::initialize(&i, &header.hash(), &Default::default()); + System::initialize(&i, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_none()); assert_eq!(Grandpa::grandpa_authorities(), vec![(5, 1)]); assert_eq!(Grandpa::next_forced(), Some(11)); @@ -186,7 +188,7 @@ fn dispatch_forced_change() { } { - System::initialize(&11, &header.hash(), &Default::default()); + System::initialize(&11, &header.hash(), &Default::default(), &Default::default()); assert!(Grandpa::pending_change().is_none()); assert!(Grandpa::schedule_change(vec![(5, 1), (6, 1), (7, 1)], 5, Some(0)).is_ok()); assert_eq!(Grandpa::next_forced(), Some(21)); diff --git a/srml/indices/Cargo.toml b/srml/indices/Cargo.toml index 8c62cf13b56ba1fcffda4ea8a8b19f0226491885..de496f20c6bbaab9a637275b123abe6f0ace3954 100644 --- a/srml/indices/Cargo.toml +++ b/srml/indices/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-indices" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.3", default-features = false, features = ["derive"] } diff --git a/srml/indices/src/address.rs b/srml/indices/src/address.rs index c7709e3bec3a5722b0662d141a65c9b494474d6c..c76585d2169670f3e1e253f5f29d736458f4e0ea 100644 --- a/srml/indices/src/address.rs +++ b/srml/indices/src/address.rs @@ -18,7 +18,8 @@ #[cfg(feature = "std")] use std::fmt; -use crate::{Member, Decode, Encode, As, Input, Output}; +use rstd::convert::TryInto; +use crate::{Member, Decode, Encode, Input, Output}; /// An indices-aware address, which can be either a direct `AccountId` or /// an index. @@ -59,14 +60,20 @@ fn need_more_than(a: T, b: T) -> Option { impl Decode for Address where AccountId: Member + Decode, - AccountIndex: Member + Decode + PartialOrd + Ord + As + As + As + Copy, + AccountIndex: Member + Decode + PartialOrd + Ord + From + Copy, { fn decode(input: &mut I) -> Option { Some(match input.read_byte()? { - x @ 0x00...0xef => Address::Index(As::sa(x)), - 0xfc => Address::Index(As::sa(need_more_than(0xef, u16::decode(input)?)?)), - 0xfd => Address::Index(As::sa(need_more_than(0xffff, u32::decode(input)?)?)), - 0xfe => Address::Index(need_more_than(As::sa(0xffffffffu32), Decode::decode(input)?)?), + x @ 0x00..=0xef => Address::Index(AccountIndex::from(x as u32)), + 0xfc => Address::Index(AccountIndex::from( + need_more_than(0xef, u16::decode(input)?)? as u32 + )), + 0xfd => Address::Index(AccountIndex::from( + need_more_than(0xffff, u32::decode(input)?)? + )), + 0xfe => Address::Index( + need_more_than(0xffffffffu32.into(), Decode::decode(input)?)? + ), 0xff => Address::Id(Decode::decode(input)?), _ => return None, }) @@ -75,7 +82,7 @@ impl Decode for Address where impl Encode for Address where AccountId: Member + Encode, - AccountIndex: Member + Encode + PartialOrd + Ord + As + As + As + Copy, + AccountIndex: Member + Encode + PartialOrd + Ord + Copy + From + TryInto, { fn encode_to(&self, dest: &mut T) { match *self { @@ -83,19 +90,26 @@ impl Encode for Address where dest.push_byte(255); dest.push(i); } - Address::Index(i) if i > As::sa(0xffffffffu32) => { - dest.push_byte(254); - dest.push(&i); - } - Address::Index(i) if i > As::sa(0xffffu32) => { - dest.push_byte(253); - dest.push(&As::::as_(i)); - } - Address::Index(i) if i >= As::sa(0xf0u32) => { - dest.push_byte(252); - dest.push(&As::::as_(i)); - } - Address::Index(i) => dest.push_byte(As::::as_(i)), + Address::Index(i) => { + let maybe_u32: Result = i.try_into(); + if let Ok(x) = maybe_u32 { + if x > 0xffff { + dest.push_byte(253); + dest.push(&x); + } + else if x >= 0xf0 { + dest.push_byte(252); + dest.push(&(x as u16)); + } + else { + dest.push_byte(x as u8); + } + + } else { + dest.push_byte(254); + dest.push(&i); + } + }, } } } diff --git a/srml/indices/src/lib.rs b/srml/indices/src/lib.rs index 4a6010f800dec7b60a465b5816e2221a8a4eee0f..38f7ee668dd84d169daacb92496b5eba64ca6468 100644 --- a/srml/indices/src/lib.rs +++ b/srml/indices/src/lib.rs @@ -19,10 +19,10 @@ #![cfg_attr(not(feature = "std"), no_std)] -use rstd::{prelude::*, result, marker::PhantomData}; +use rstd::{prelude::*, result, marker::PhantomData, convert::TryInto}; use parity_codec::{Encode, Decode, Codec, Input, Output}; use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage}; -use primitives::traits::{One, SimpleArithmetic, As, StaticLookup, Member}; +use primitives::traits::{One, SimpleArithmetic, StaticLookup, Member}; use system::{IsDeadAccount, OnNewAccount}; use self::address::Address as RawAddress; @@ -33,23 +33,25 @@ pub mod address; mod tests; /// Number of account IDs stored per enum set. -const ENUM_SET_SIZE: usize = 64; +const ENUM_SET_SIZE: u32 = 64; pub type Address = RawAddress<::AccountId, ::AccountIndex>; /// Turn an Id into an Index, or None for the purpose of getting /// a hint at a possibly desired index. -pub trait ResolveHint> { +pub trait ResolveHint { /// Turn an Id into an Index, or None for the purpose of getting /// a hint at a possibly desired index. fn resolve_hint(who: &AccountId) -> Option; } -/// Simple encode-based resolve hint implemenntation. +/// Simple encode-based resolve hint implementation. pub struct SimpleResolveHint(PhantomData<(AccountId, AccountIndex)>); -impl> ResolveHint for SimpleResolveHint { +impl> + ResolveHint for SimpleResolveHint +{ fn resolve_hint(who: &AccountId) -> Option { - Some(AccountIndex::sa(who.using_encoded(|e| e[0] as usize + e[1] as usize * 256))) + Some(AccountIndex::from(who.using_encoded(|e| e[0] as u32 + e[1] as u32 * 256))) } } @@ -57,7 +59,7 @@ impl> ResolveHint + As + As + As + As + Copy; + type AccountIndex: Parameter + Member + Codec + Default + SimpleArithmetic + Copy; /// Whether an account is dead or not. type IsDeadAccount: IsDeadAccount; @@ -92,15 +94,18 @@ decl_storage! { trait Store for Module as Indices { /// The next free enumeration set. pub NextEnumSet get(next_enum_set) build(|config: &GenesisConfig| { - T::AccountIndex::sa(config.ids.len() / ENUM_SET_SIZE) + (config.ids.len() as u32 / ENUM_SET_SIZE).into() }): T::AccountIndex; /// The enumeration sets. pub EnumSet get(enum_set) build(|config: &GenesisConfig| { - (0..(config.ids.len() + ENUM_SET_SIZE - 1) / ENUM_SET_SIZE) + (0..((config.ids.len() as u32) + ENUM_SET_SIZE - 1) / ENUM_SET_SIZE) .map(|i| ( - T::AccountIndex::sa(i), - config.ids[i * ENUM_SET_SIZE..config.ids.len().min((i + 1) * ENUM_SET_SIZE)].to_owned(), + i.into(), + config.ids[ + (i * ENUM_SET_SIZE) as usize.. + config.ids.len().min(((i + 1) * ENUM_SET_SIZE) as usize) + ].to_owned(), )) .collect::>() }): map T::AccountIndex => Vec; @@ -117,7 +122,7 @@ impl Module { pub fn lookup_index(index: T::AccountIndex) -> Option { let enum_set_size = Self::enum_set_size(); let set = Self::enum_set(index / enum_set_size); - let i: usize = (index % enum_set_size).as_(); + let i: usize = (index % enum_set_size).try_into().ok()?; set.get(i).cloned() } @@ -125,12 +130,18 @@ impl Module { pub fn can_reclaim(try_index: T::AccountIndex) -> bool { let enum_set_size = Self::enum_set_size(); let try_set = Self::enum_set(try_index / enum_set_size); - let i = (try_index % enum_set_size).as_(); - i < try_set.len() && T::IsDeadAccount::is_dead_account(&try_set[i]) + let maybe_usize: Result = (try_index % enum_set_size).try_into(); + if let Ok(i) = maybe_usize { + i < try_set.len() && T::IsDeadAccount::is_dead_account(&try_set[i]) + } else { + false + } } /// Lookup an address to get an Id, if there's one there. - pub fn lookup_address(a: address::Address) -> Option { + pub fn lookup_address( + a: address::Address + ) -> Option { match a { address::Address::Id(i) => Some(i), address::Address::Index(i) => Self::lookup_index(i), @@ -140,7 +151,7 @@ impl Module { // PUBLIC MUTABLES (DANGEROUS) fn enum_set_size() -> T::AccountIndex { - T::AccountIndex::sa(ENUM_SET_SIZE) + ENUM_SET_SIZE.into() } } @@ -153,36 +164,38 @@ impl OnNewAccount for Module { // then check to see if this account id identifies a dead account index. let set_index = try_index / enum_set_size; let mut try_set = Self::enum_set(set_index); - let item_index = (try_index % enum_set_size).as_(); - if item_index < try_set.len() { - if T::IsDeadAccount::is_dead_account(&try_set[item_index]) { - // yup - this index refers to a dead account. can be reused. - try_set[item_index] = who.clone(); - >::insert(set_index, try_set); - - return + if let Ok(item_index) = (try_index % enum_set_size).try_into() { + if item_index < try_set.len() { + if T::IsDeadAccount::is_dead_account(&try_set[item_index]) { + // yup - this index refers to a dead account. can be reused. + try_set[item_index] = who.clone(); + >::insert(set_index, try_set); + + return + } } } } // insert normally as a back up let mut set_index = next_set_index; - // defensive only: this loop should never iterate since we keep NextEnumSet up to date later. + // defensive only: this loop should never iterate since we keep NextEnumSet up to date + // later. let mut set = loop { let set = Self::enum_set(set_index); - if set.len() < ENUM_SET_SIZE { + if set.len() < ENUM_SET_SIZE as usize { break set; } set_index += One::one(); }; - let index = T::AccountIndex::sa(set_index.as_() * ENUM_SET_SIZE + set.len()); + let index = set_index * enum_set_size + T::AccountIndex::from(set.len() as u32); // update set. set.push(who.clone()); // keep NextEnumSet up to date - if set.len() == ENUM_SET_SIZE { + if set.len() == ENUM_SET_SIZE as usize { >::put(set_index + One::one()); } diff --git a/srml/metadata/Cargo.toml b/srml/metadata/Cargo.toml index aeac0148b433ece0395bc9fd49a850985bb1b163..0e9ae66540bfa46ab8e11ca03a1ac9b2ead08b25 100644 --- a/srml/metadata/Cargo.toml +++ b/srml/metadata/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-metadata" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/srml/metadata/src/lib.rs b/srml/metadata/src/lib.rs index 5f8b57206b7c9bd400cbb3340d44d3ebfe0c408e..28a513cc07b54d5e32d1b6981096e1bb1a21bec2 100644 --- a/srml/metadata/src/lib.rs +++ b/srml/metadata/src/lib.rs @@ -292,22 +292,6 @@ pub enum StorageFunctionModifier { Default, } -/// All metadata about the outer dispatch. -#[derive(Clone, PartialEq, Eq, Encode)] -#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] -pub struct OuterDispatchMetadata { - pub name: DecodeDifferentStr, - pub calls: DecodeDifferentArray, -} - -/// A Call from the outer dispatch. -#[derive(Clone, PartialEq, Eq, Encode)] -#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] -pub struct OuterDispatchCall { - pub name: DecodeDifferentStr, - pub index: u16, -} - #[derive(Eq, Encode, PartialEq)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] /// Metadata prefixed by a u32 for reserved usage diff --git a/srml/session/Cargo.toml b/srml/session/Cargo.toml index 036f5a55ec7ee19ce90b11219fd0ad64af2bfa3f..318c6d9f2266b721a24012c60f59cdd526f5f161 100644 --- a/srml/session/Cargo.toml +++ b/srml/session/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-session" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.3", default-features = false, features = ["derive"] } diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index b8476f6412c08c6276fecd67e7904186b6901f3f..45c2bc46cbdb6c181c50e68aa3b46cd04cd89a28 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -116,7 +116,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use rstd::prelude::*; -use primitives::traits::{As, Zero, One, Convert}; +use primitives::traits::{Zero, One, Convert}; use srml_support::{StorageValue, StorageMap, for_each_tuple, decl_module, decl_event, decl_storage}; use srml_support::{dispatch::Result, traits::OnFreeBalanceZero}; use system::ensure_signed; @@ -200,9 +200,9 @@ decl_storage! { /// The current set of validators. pub Validators get(validators) config(): Vec; /// Current length of the session. - pub SessionLength get(length) config(session_length): T::BlockNumber = T::BlockNumber::sa(1000); + pub SessionLength get(length) config(session_length): T::BlockNumber = 1000.into(); /// Current index of the session. - pub CurrentIndex get(current_index) build(|_| T::BlockNumber::sa(0)): T::BlockNumber; + pub CurrentIndex get(current_index) build(|_| 0.into()): T::BlockNumber; /// Timestamp when current session started. pub CurrentStart get(current_start) build(|_| T::Moment::zero()): T::Moment; diff --git a/srml/staking/Cargo.toml b/srml/staking/Cargo.toml index cd10f783b1a203eb0f1f93f3be1065179b4984ce..62fc187176ed4a4e1e77b22a3b1bfb27df6d3fd4 100644 --- a/srml/staking/Cargo.toml +++ b/srml/staking/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-staking" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.3", default-features = false, features = ["derive"] } @@ -22,8 +21,10 @@ session = { package = "srml-session", path = "../session", default-features = fa substrate-primitives = { path = "../../core/primitives" } timestamp = { package = "srml-timestamp", path = "../timestamp" } balances = { package = "srml-balances", path = "../balances" } +rand = "0.6.5" [features] +bench = [] default = ["std"] std = [ "serde", diff --git a/srml/staking/src/benches.rs b/srml/staking/src/benches.rs new file mode 100644 index 0000000000000000000000000000000000000000..e3ee00b9e94802658a05364b1b0b34a1ceee79ff --- /dev/null +++ b/srml/staking/src/benches.rs @@ -0,0 +1,114 @@ +// Copyright 2019 Parity Technologies +// +// 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. + +//! Benchmarks of the phragmen election algorithm. +//! Note that execution times will not be accurate in an absolute scale, since +//! - Everything is executed in the context of `TestExternalities` +//! - Everything is executed in native environment. +//! +//! Run using: +//! +//! ```zsh +//! cargo bench --features bench --color always +//! ``` + +use test::Bencher; +use runtime_io::with_externalities; +use mock::*; +use super::*; +use rand::{self, Rng}; + +const VALIDATORS: u64 = 1000; +const NOMINATORS: u64 = 10_000; +const EDGES: u64 = 2; +const TO_ELECT: usize = 100; +const STAKE: u64 = 1000; + +fn do_phragmen(b: &mut Bencher, num_vals: u64, num_noms: u64, count: usize, votes_per: u64) { + with_externalities(&mut ExtBuilder::default().nominate(false).build(), || { + assert!(num_vals > votes_per); + let rr = |a, b| rand::thread_rng().gen_range(a as usize, b as usize) as u64; + + // prefix to distinguish the validator and nominator account ranges. + let np = 10_000; + + (1 ..= 2*num_vals) + .step_by(2) + .for_each(|acc| bond_validator(acc, STAKE + rr(10, 50))); + + (np ..= (np + 2*num_noms)) + .step_by(2) + .for_each(|acc| { + let mut stashes_to_vote = (1 ..= 2*num_vals) + .step_by(2) + .map(|ctrl| ctrl + 1) + .collect::>(); + let votes = (0 .. votes_per) + .map(|_| { + stashes_to_vote.remove(rr(0, stashes_to_vote.len()) as usize) + }) + .collect::>(); + bond_nominator(acc, STAKE + rr(10, 50), votes); + }); + + b.iter(|| { + let _ = phragmen::elect::( + count, + 1_usize, + >::enumerate(), + >::enumerate(), + Staking::slashable_balance_of + ); + }) + }) +} + +macro_rules! phragmen_benches { + ($($name:ident: $tup:expr,)*) => { + $( + #[bench] + fn $name(b: &mut Bencher) { + let (v, n, t, e) = $tup; + println!(""); + println!( + "++ Benchmark: {} Validators // {} Nominators // {} Edges-per-nominator // {} total edges // electing {}", + v, n, e, e * n, t + ); + do_phragmen(b, v, n, t, e); + } + )* + } +} + +phragmen_benches! { + bench_1_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES), + bench_1_2: (VALIDATORS*2, NOMINATORS, TO_ELECT, EDGES), + bench_1_3: (VALIDATORS*4, NOMINATORS, TO_ELECT, EDGES), + bench_1_4: (VALIDATORS*8, NOMINATORS, TO_ELECT, EDGES), + + bench_0_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES), + bench_0_2: (VALIDATORS, NOMINATORS, TO_ELECT * 4, EDGES), + bench_0_3: (VALIDATORS, NOMINATORS, TO_ELECT * 8, EDGES), + bench_0_4: (VALIDATORS, NOMINATORS, TO_ELECT * 16, EDGES), + + bench_2_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES), + bench_2_2: (VALIDATORS, NOMINATORS*2, TO_ELECT, EDGES), + bench_2_3: (VALIDATORS, NOMINATORS*4, TO_ELECT, EDGES), + bench_2_4: (VALIDATORS, NOMINATORS*8, TO_ELECT, EDGES), + + bench_3_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES), + bench_3_2: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES*2), + bench_3_3: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES*4), + bench_3_4: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES*8), +} diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 6093a73228ab40490bf2def6a2b888dcd29e4325..d34fb6ef87b74955a4f4beab0d6aa7755490c2e8 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -187,15 +187,16 @@ //! A validator can be _reported_ to be offline at any point via the public function //! [`on_offline_validator`](enum.Call.html#variant.on_offline_validator). Each validator declares how many times it //! can be _reported_ before it actually gets slashed via its -//! [`unstake_threshold`](./struct.ValidatorPrefs.html#structfield.unstake_threshold). +//! [`ValidatorPrefs::unstake_threshold`](./struct.ValidatorPrefs.html#structfield.unstake_threshold). //! //! On top of this, the Staking module also introduces an //! [`OfflineSlashGrace`](./struct.Module.html#method.offline_slash_grace), which applies //! to all validators and prevents them from getting immediately slashed. //! //! Essentially, a validator gets slashed once they have been reported more than -//! [`OfflineSlashGrace`] + [`unstake_threshold`] times. Getting slashed due to offline report always leads -//! to being _unstaked_ (_i.e._ removed as a validator candidate) as the consequence. +//! [`OfflineSlashGrace`] + [`ValidatorPrefs::unstake_threshold`] times. Getting slashed due to +//! offline report always leads to being _unstaked_ (_i.e._ removed as a validator candidate) as +//! the consequence. //! //! The base slash value is computed _per slash-event_ by multiplying //! [`OfflineSlash`](./struct.Module.html#method.offline_slash) and the `total` `Exposure`. This value is then @@ -213,6 +214,11 @@ //! removed. Once the `BondingDuration` is over, the [`withdraw_unbonded`](./enum.Call.html#variant.withdraw_unbonded) call can be used //! to actually withdraw the funds. //! +//! Note that there is a limitation to the number of fund-chunks that can be scheduled to be unlocked in the future +//! via [`unbond`](enum.Call.html#variant.unbond). +//! In case this maximum (`MAX_UNLOCKING_CHUNKS`) is reached, the bonded account _must_ first wait until a successful +//! call to `withdraw_unbonded` to remove some of the chunks. +//! //! ### Election Algorithm //! //! The current election algorithm is implemented based on Phragmén. @@ -234,34 +240,50 @@ //! stored in the Session module's `Validators` at the end of each era. #![cfg_attr(not(feature = "std"), no_std)] +#![cfg_attr(all(feature = "bench", test), feature(test))] + +#[cfg(all(feature = "bench", test))] +extern crate test; + +#[cfg(any(feature = "bench", test))] +mod mock; + +#[cfg(test)] +mod tests; + +mod phragmen; + +#[cfg(all(feature = "bench", test))] +mod benches; #[cfg(feature = "std")] use runtime_io::with_storage; -use rstd::{prelude::*, result}; +use rstd::{prelude::*, result, collections::btree_map::BTreeMap}; use parity_codec::{HasCompact, Encode, Decode}; -use srml_support::{StorageValue, StorageMap, EnumerableStorageMap, dispatch::Result}; -use srml_support::{decl_module, decl_event, decl_storage, ensure}; -use srml_support::traits::{ - Currency, OnFreeBalanceZero, OnDilution, LockIdentifier, LockableCurrency, WithdrawReasons, - OnUnbalanced, Imbalance, +use srml_support::{ StorageValue, StorageMap, EnumerableStorageMap, dispatch::Result, + decl_module, decl_event, decl_storage, ensure, + traits::{Currency, OnFreeBalanceZero, OnDilution, LockIdentifier, LockableCurrency, + WithdrawReasons, OnUnbalanced, Imbalance + } }; use session::OnSessionChange; use primitives::Perbill; -use primitives::traits::{Convert, Zero, One, As, StaticLookup, CheckedSub, Saturating, Bounded}; +use primitives::traits::{ + Convert, Zero, One, StaticLookup, CheckedSub, CheckedShl, Saturating, + Bounded, SaturatedConversion +}; #[cfg(feature = "std")] use primitives::{Serialize, Deserialize}; use system::ensure_signed; -mod mock; -mod tests; -mod phragmen; - -use phragmen::{elect, ElectionConfig}; +use phragmen::{elect, ACCURACY, ExtendedBalance}; const RECENT_OFFLINE_COUNT: usize = 32; const DEFAULT_MINIMUM_VALIDATOR_COUNT: u32 = 4; const MAX_NOMINATIONS: usize = 16; const MAX_UNSTAKE_THRESHOLD: u32 = 10; +const MAX_UNLOCKING_CHUNKS: usize = 32; +const STAKING_ID: LockIdentifier = *b"staking "; /// Indicates the initial status of the staker. #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] @@ -394,12 +416,19 @@ type BalanceOf = <::Currency as Currency<::Ac type PositiveImbalanceOf = <::Currency as Currency<::AccountId>>::PositiveImbalance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +type RawAssignment = (::AccountId, ExtendedBalance); +type Assignment = (::AccountId, ExtendedBalance, BalanceOf); +type ExpoMap = BTreeMap<::AccountId, Exposure<::AccountId, BalanceOf>>; + pub trait Trait: system::Trait + session::Trait { /// The staking balance. type Currency: LockableCurrency; /// Convert a balance into a number used for election calculation. /// This must fit into a `u64` but is allowed to be sensibly lossy. + /// TODO: #1377 + /// The backward convert should be removed as the new Phragmen API returns ratio. + /// The post-processing needs it but will be moved to off-chain. type CurrencyToVote: Convert, u64> + Convert>; /// Some tokens minted. @@ -415,8 +444,6 @@ pub trait Trait: system::Trait + session::Trait { type Reward: OnUnbalanced>; } -const STAKING_ID: LockIdentifier = *b"staking "; - decl_storage! { trait Store for Module as Staking { @@ -425,15 +452,15 @@ decl_storage! { /// Minimum number of staking participants before emergency conditions are imposed. pub MinimumValidatorCount get(minimum_validator_count) config(): u32 = DEFAULT_MINIMUM_VALIDATOR_COUNT; /// The length of a staking era in sessions. - pub SessionsPerEra get(sessions_per_era) config(): T::BlockNumber = T::BlockNumber::sa(1000); + pub SessionsPerEra get(sessions_per_era) config(): T::BlockNumber = 1000.into(); /// Maximum reward, per validator, that is provided per acceptable session. - pub SessionReward get(session_reward) config(): Perbill = Perbill::from_billionths(60); + pub SessionReward get(session_reward) config(): Perbill = Perbill::from_parts(60); /// Slash, per validator that is taken for the first time they are found to be offline. - pub OfflineSlash get(offline_slash) config(): Perbill = Perbill::from_millionths(1000); // Perbill::from_fraction() is only for std, so use from_millionths(). + pub OfflineSlash get(offline_slash) config(): Perbill = Perbill::from_millionths(1000); /// Number of instances of offline reports before slashing begins for validators. pub OfflineSlashGrace get(offline_slash_grace) config(): u32; /// The length of the bonding duration in eras. - pub BondingDuration get(bonding_duration) config(): T::BlockNumber = T::BlockNumber::sa(12); + pub BondingDuration get(bonding_duration) config(): T::BlockNumber = 12.into(); /// Any validators that may never be slashed or forcibly kicked. It's a Vec since they're easy to initialize /// and the performance hit is minimal (we expect no more than four invulnerables) and restricted to testnets. @@ -594,12 +621,20 @@ decl_module! { /// Once the unlock period is done, you can call `withdraw_unbonded` to actually move /// the funds out of management ready for transfer. /// + /// No more than a limited number of unlocking chunks (see `MAX_UNLOCKING_CHUNKS`) + /// can co-exists at the same time. In that case, [`Call::withdraw_unbonded`] need + /// to be called first to remove some of the chunks (if possible). + /// /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. /// /// See also [`Call::withdraw_unbonded`]. fn unbond(origin, #[compact] value: BalanceOf) { let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or("not a controller")?; + ensure!( + ledger.unlocking.len() < MAX_UNLOCKING_CHUNKS, + "can not schedule more unlock chunks" + ); let mut value = value.min(ledger.active); @@ -860,8 +895,12 @@ impl Module { if ideal_elapsed.is_zero() { return Self::current_session_reward(); } - let per65536: u64 = (T::Moment::sa(65536u64) * ideal_elapsed.clone() / actual_elapsed.max(ideal_elapsed)).as_(); - Self::current_session_reward() * >::sa(per65536) / >::sa(65536u64) + // Assumes we have 16-bits free at the top of T::Moment. Holds true for moment as seconds + // in a u64 for the forseeable future, but more correct would be to handle overflows + // explicitly. + let per65536 = T::Moment::from(65536) * ideal_elapsed.clone() / actual_elapsed.max(ideal_elapsed); + let per65536: BalanceOf = per65536.saturated_into::().into(); + Self::current_session_reward() * per65536 / 65536.into() } /// Session has just changed. We need to determine whether we pay a reward, slash and/or @@ -894,8 +933,10 @@ impl Module { Self::reward_validator(v, reward); } Self::deposit_event(RawEvent::Reward(reward)); - let total_minted = reward * as As>::sa(validators.len()); - let total_rewarded_stake = Self::slot_stake() * as As>::sa(validators.len()); + let len = validators.len() as u32; // validators length can never overflow u64 + let len: BalanceOf = len.into(); + let total_minted = reward * len; + let total_rewarded_stake = Self::slot_stake() * len; T::OnRewardMinted::on_dilution(total_minted, total_rewarded_stake); } @@ -925,20 +966,71 @@ impl Module { /// /// Returns the new `SlotStake` value. fn select_validators() -> BalanceOf { - let maybe_elected_candidates = elect::( + let maybe_elected_set = elect::( Self::validator_count() as usize, Self::minimum_validator_count().max(1) as usize, >::enumerate(), >::enumerate(), Self::slashable_balance_of, - ElectionConfig::> { - equalize: false, - tolerance: >::sa(10 as u64), - iterations: 10, - } ); - if let Some(elected_candidates) = maybe_elected_candidates { + if let Some(elected_set) = maybe_elected_set { + let elected_stashes = elected_set.0; + let assignments = elected_set.1; + + // helper closure. + let to_balance = |b: ExtendedBalance| >>::convert(b); + let to_votes = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance; + + // The return value of this is safe to be converted to u64. + // The original balance, `b` is within the scope of u64. It is just extended to u128 + // to be properly multiplied by a ratio, which will lead to another value + // less than u64 for sure. The result can then be safely passed to `to_balance`. + // For now the backward convert is used. A simple `TryFrom` is also safe. + let ratio_of = |b, p| (p as ExtendedBalance).saturating_mul(to_votes(b)) / ACCURACY; + + // Compute the actual stake from nominator's ratio. + let mut assignments_with_stakes = assignments.iter().map(|(n, a)|( + n.clone(), + Self::slashable_balance_of(n), + a.iter().map(|(acc, r)| ( + acc.clone(), + *r, + to_balance(ratio_of(Self::slashable_balance_of(n), *r)), + )) + .collect::>>() + )).collect::, Vec>)>>(); + + // update elected candidate exposures. + let mut exposures = >::new(); + elected_stashes + .iter() + .map(|e| (e, Self::slashable_balance_of(e))) + .for_each(|(e, s)| { + exposures.insert(e.clone(), Exposure { own: s, total: s, ..Default::default() }); + }); + + for (n, _, assignment) in &assignments_with_stakes { + for (c, _, s) in assignment { + if let Some(expo) = exposures.get_mut(c) { + // NOTE: simple example where this saturates: + // candidate with max_value stake. 1 nominator with max_value stake. + // Nuked. Sadly there is not much that we can do about this. + // See this test: phragmen_should_not_overflow_xxx() + expo.total = expo.total.saturating_add(*s); + expo.others.push( IndividualExposure { who: n.clone(), value: *s } ); + } + } + } + + // This optimization will most likely be only applied off-chain. + let do_equalise = false; + if do_equalise { + let tolerance = 10 as u128; + let iterations = 10 as usize; + phragmen::equalize::(&mut assignments_with_stakes, &mut exposures, tolerance, iterations); + } + // Clear Stakers and reduce their slash_count. for v in Self::current_elected().iter() { >::remove(v); @@ -949,17 +1041,16 @@ impl Module { } // Populate Stakers and figure out the minimum stake behind a slot. - let mut slot_stake = elected_candidates[0].exposure.total; - for c in &elected_candidates { - if c.exposure.total < slot_stake { - slot_stake = c.exposure.total; + let mut slot_stake = BalanceOf::::max_value(); + for (c, e) in exposures.iter() { + if e.total < slot_stake { + slot_stake = e.total; } - >::insert(c.who.clone(), c.exposure.clone()); + >::insert(c.clone(), e.clone()); } >::put(&slot_stake); // Set the new validator set. - let elected_stashes = elected_candidates.into_iter().map(|i| i.who).collect::>(); >::put(&elected_stashes); >::set_validators( &elected_stashes.into_iter().map(|s| Self::bonded(s).unwrap_or_default()).collect::>() @@ -972,6 +1063,7 @@ impl Module { // We should probably disable all functionality except for block production // and let the chain keep producing blocks until we can decide on a sufficiently // substantial set. + // TODO: #2494 Self::slot_stake() } } @@ -981,8 +1073,6 @@ impl Module { /// /// NOTE: This is called with the controller (not the stash) account id. pub fn on_offline_validator(controller: T::AccountId, count: usize) { - use primitives::traits::CheckedShl; - if let Some(l) = Self::ledger(&controller) { let stash = l.stash; diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index 88b401b19eb51a81b38dc3a1818e3efbc0c16ac5..5b3b22dda5f9a8c70a3ba7ea413e36ce3bd422d8 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -16,14 +16,12 @@ //! Test utilities -#![cfg(test)] - use primitives::{traits::{IdentityLookup, Convert}, BuildStorage, Perbill}; use primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, ConvertUintAuthorityId}; use substrate_primitives::{H256, Blake2Hasher}; use runtime_io; -use srml_support::impl_outer_origin; -use crate::{GenesisConfig, Module, Trait, StakerStatus}; +use srml_support::{impl_outer_origin, assert_ok, traits::Currency}; +use crate::{GenesisConfig, Module, Trait, StakerStatus, ValidatorPrefs, RewardDestination}; /// The AccountId alias in this test module. pub type AccountIdType = u64; @@ -241,3 +239,33 @@ pub type Balances = balances::Module; pub type Session = session::Module; pub type Timestamp = timestamp::Module; pub type Staking = Module; + +pub fn check_exposure(acc: u64) { + let expo = Staking::stakers(&acc); + assert_eq!(expo.total as u128, expo.own as u128 + expo.others.iter().map(|e| e.value as u128).sum::()); +} + +pub fn check_exposure_all() { + Staking::current_elected().into_iter().for_each(|acc| check_exposure(acc)); +} + +pub fn assert_total_expo(acc: u64, val: u64) { + let expo = Staking::stakers(&acc); + assert_eq!(expo.total, val); +} + +pub fn bond_validator(acc: u64, val: u64) { + // a = controller + // a + 1 = stash + let _ = Balances::make_free_balance_be(&(acc+1), val); + assert_ok!(Staking::bond(Origin::signed(acc+1), acc, val, RewardDestination::Controller)); + assert_ok!(Staking::validate(Origin::signed(acc), ValidatorPrefs::default())); +} + +pub fn bond_nominator(acc: u64, val: u64, target: Vec) { + // a = controller + // a + 1 = stash + let _ = Balances::make_free_balance_be(&(acc+1), val); + assert_ok!(Staking::bond(Origin::signed(acc+1), acc, val, RewardDestination::Controller)); + assert_ok!(Staking::nominate(Origin::signed(acc), target)); +} \ No newline at end of file diff --git a/srml/staking/src/phragmen.rs b/srml/staking/src/phragmen.rs index 9f6732033aa4b8a4cf05a127b627b8173c4fb2ad..ba79de48698838f289f0d4cdeaf2a1ee34ebb7ec 100644 --- a/srml/staking/src/phragmen.rs +++ b/srml/staking/src/phragmen.rs @@ -16,47 +16,39 @@ //! Rust implementation of the Phragmén election algorithm. -use rstd::prelude::*; -use primitives::PerU128; -use primitives::traits::{Zero, Saturating, Convert}; -use parity_codec::{HasCompact, Encode, Decode}; -use crate::{Exposure, BalanceOf, Trait, ValidatorPrefs, IndividualExposure}; +use rstd::{prelude::*, collections::btree_map::BTreeMap}; +use primitives::{PerU128}; +use primitives::traits::{Zero, Convert, Saturating}; +use crate::{BalanceOf, Assignment, RawAssignment, ExpoMap, Trait, ValidatorPrefs}; type Fraction = PerU128; -type ExtendedBalance = u128; -const SCALE_FACTOR_64: u128 = u64::max_value() as u128 + 1; - -/// Configure the behavior of the Phragmen election. -/// Might be deprecated. -pub struct ElectionConfig { - /// Perform equalize?. - pub equalize: bool, - /// Number of equalize iterations. - pub iterations: usize, - /// Tolerance of max change per equalize iteration. - pub tolerance: Balance, -} +/// Wrapper around the type used as the _safe_ wrapper around a `balance`. +pub type ExtendedBalance = u128; + +// this is only used while creating the candidate score. Due to reasons explained below +// The more accurate this is, the less likely we choose a wrong candidate. +const SCALE_FACTOR: ExtendedBalance = u32::max_value() as ExtendedBalance + 1; +/// These are used to expose a fixed accuracy to the caller function. The bigger they are, +/// the more accurate we get, but the more likely it is for us to overflow. The case of overflow +/// is handled but accuracy will be lost. 32 or 16 are reasonable values. +pub const ACCURACY: ExtendedBalance = u32::max_value() as ExtendedBalance + 1; /// Wrapper around validation candidates some metadata. -#[derive(Clone, Encode, Decode, Default)] +#[derive(Clone, Default)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct Candidate { +pub struct Candidate { /// The validator's account pub who: AccountId, - /// Exposure struct, holding info about the value that the validator has in stake. - pub exposure: Exposure, /// Intermediary value used to sort candidates. pub score: Fraction, /// Accumulator of the stake of this candidate based on received votes. approval_stake: ExtendedBalance, /// Flag for being elected. elected: bool, - /// This is most often equal to `Exposure.total` but not always. Needed for [`equalize`] - backing_stake: ExtendedBalance } /// Wrapper around the nomination info of a single nominator for a group of validators. -#[derive(Clone, Encode, Decode, Default)] +#[derive(Clone, Default)] #[cfg_attr(feature = "std", derive(Debug))] pub struct Nominator { /// The nominator's account. @@ -70,21 +62,17 @@ pub struct Nominator { } /// Wrapper around a nominator vote and the load of that vote. -#[derive(Clone, Encode, Decode, Default)] +#[derive(Clone, Default)] #[cfg_attr(feature = "std", derive(Debug))] pub struct Edge { /// Account being voted for who: AccountId, /// Load of this vote. load: Fraction, - /// Final backing stake of this vote. - backing_stake: ExtendedBalance, - /// Index of the candidate stored in the 'candidates' vector + /// Equal to `edge.load / nom.load`. Stored only to be used with post-processing. + ratio: ExtendedBalance, + /// Index of the candidate stored in the 'candidates' vector. candidate_index: usize, - /// Index of the candidate stored in the 'elected_candidates' vector. Used only with equalize. - elected_idx: usize, - /// Indicates if this edge is a vote for an elected candidate. Used only with equalize. - elected: bool, } /// Perform election based on Phragmén algorithm. @@ -93,52 +81,55 @@ pub struct Edge { /// /// Returns an Option of elected candidates, if election is performed. /// Returns None if not enough candidates exist. +/// +/// The returned Option is a tuple consisting of: +/// - The list of elected candidates. +/// - The list of nominators and their associated vote weights. pub fn elect( validator_count: usize, minimum_validator_count: usize, validator_iter: FV, nominator_iter: FN, stash_of: FS, - config: ElectionConfig>, -) -> Option>>> where +) -> Option<(Vec, Vec<(T::AccountId, Vec>)>)> where FV: Iterator>)>, FN: Iterator)>, for <'r> FS: Fn(&'r T::AccountId) -> BalanceOf, { - let into_currency = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance; - let into_votes = |b: ExtendedBalance| >>::convert(b); - let mut elected_candidates; + let to_votes = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance; + + // return structures + let mut elected_candidates: Vec; + let mut assigned: Vec<(T::AccountId, Vec>)>; + let mut c_idx_cache = BTreeMap::::new(); // 1- Pre-process candidates and place them in a container, optimisation and add phantom votes. // Candidates who have 0 stake => have no votes or all null-votes. Kick them out not. let mut nominators: Vec> = Vec::with_capacity(validator_iter.size_hint().0 + nominator_iter.size_hint().0); let mut candidates = validator_iter.map(|(who, _)| { - let stash_balance = stash_of(&who); - Candidate { - who, - exposure: Exposure { total: stash_balance, own: stash_balance, others: vec![] }, - ..Default::default() - } - }) - .filter_map(|mut c| { - c.approval_stake += into_currency(c.exposure.total); - if c.approval_stake.is_zero() { - None - } else { - Some(c) - } - }) - .enumerate() - .map(|(idx, c)| { - nominators.push(Nominator { - who: c.who.clone(), - edges: vec![ Edge { who: c.who.clone(), candidate_index: idx, ..Default::default() }], - budget: into_currency(c.exposure.total), - load: Fraction::zero(), - }); - c - }) - .collect::>>>(); + let stash_balance = stash_of(&who); + (Candidate { who, ..Default::default() }, stash_balance) + }) + .filter_map(|(mut c, s)| { + c.approval_stake += to_votes(s); + if c.approval_stake.is_zero() { + None + } else { + Some((c, s)) + } + }) + .enumerate() + .map(|(idx, (c, s))| { + nominators.push(Nominator { + who: c.who.clone(), + edges: vec![ Edge { who: c.who.clone(), candidate_index: idx, ..Default::default() }], + budget: to_votes(s), + load: Fraction::zero(), + }); + c_idx_cache.insert(c.who.clone(), idx); + c + }) + .collect::>>(); // 2- Collect the nominators with the associated votes. // Also collect approval stake along the way. @@ -146,17 +137,17 @@ pub fn elect( let nominator_stake = stash_of(&who); let mut edges: Vec> = Vec::with_capacity(nominees.len()); for n in &nominees { - if let Some(idx) = candidates.iter_mut().position(|i| i.who == *n) { - candidates[idx].approval_stake = candidates[idx].approval_stake - .saturating_add(into_currency(nominator_stake)); - edges.push(Edge { who: n.clone(), candidate_index: idx, ..Default::default() }); - } + if let Some(idx) = c_idx_cache.get(n) { + // This candidate is valid + already cached. + candidates[*idx].approval_stake = candidates[*idx].approval_stake + .saturating_add(to_votes(nominator_stake)); + edges.push(Edge { who: n.clone(), candidate_index: *idx, ..Default::default() }); + } // else {} would be wrong votes. We don't really care about it. } - Nominator { who, edges: edges, - budget: into_currency(nominator_stake), + budget: to_votes(nominator_stake), load: Fraction::zero(), } })); @@ -166,6 +157,7 @@ pub fn elect( let validator_count = validator_count.min(candidates.len()); elected_candidates = Vec::with_capacity(validator_count); + assigned = Vec::with_capacity(validator_count); // Main election loop for _round in 0..validator_count { // Loop 1: initialize score @@ -179,13 +171,15 @@ pub fn elect( for e in &n.edges { let c = &mut candidates[e.candidate_index]; if !c.elected && !c.approval_stake.is_zero() { + // Basic fixed-point shifting by 32. + // `n.budget.saturating_mul(SCALE_FACTOR)` will never saturate + // since n.budget cannot exceed u64,despite being stored in u128. yet, + // `*n.load / SCALE_FACTOR` might collapse to zero. Hence, 32 or 16 bits are better scale factors. + // Note that left-associativity in operators precedence is crucially important here. let temp = - // Basic fixed-point shifting by 64. - // This will never saturate since n.budget cannot exceed u64,despite being stored in u128. - // Note that left-associativity in operators precedence is crucially important here. - n.budget.saturating_mul(SCALE_FACTOR_64) / c.approval_stake - * (*n.load / SCALE_FACTOR_64); - c.score = Fraction::from_max_value((*c.score).saturating_add(temp)); + n.budget.saturating_mul(SCALE_FACTOR) / c.approval_stake + * (*n.load / SCALE_FACTOR); + c.score = Fraction::from_parts((*c.score).saturating_add(temp)); } } } @@ -201,168 +195,201 @@ pub fn elect( for n in &mut nominators { for e in &mut n.edges { if e.who == winner.who { - e.load = Fraction::from_max_value(*winner.score - *n.load); + e.load = Fraction::from_parts(*winner.score - *n.load); n.load = winner.score; } } } - elected_candidates.push(winner.clone()); + elected_candidates.push(winner.who.clone()); } else { break } - } - // end of all rounds + } // end of all rounds // 4.1- Update backing stake of candidates and nominators for n in &mut nominators { + let mut assignment = (n.who.clone(), vec![]); for e in &mut n.edges { - // if the target of this vote is among the winners, otherwise let go. - if let Some(c) = elected_candidates.iter_mut().find(|c| c.who == e.who) { - e.elected = true; - e.backing_stake = n.budget.saturating_mul(*e.load) / n.load.max(1); - c.backing_stake = c.backing_stake.saturating_add(e.backing_stake); - if c.who != n.who { - // Only update the exposure if this vote is from some other account. - c.exposure.total = c.exposure.total.saturating_add(into_votes(e.backing_stake)); - c.exposure.others.push( - IndividualExposure { who: n.who.clone(), value: into_votes(e.backing_stake) } - ); + if let Some(c) = elected_candidates.iter().find(|c| **c == e.who) { + if *c != n.who { + let ratio = { + // Full support. No need to calculate. + if *n.load == *e.load { ACCURACY } + else { + // This should not saturate. Safest is to just check + if let Some(r) = ACCURACY.checked_mul(*e.load) { + r / n.load.max(1) + } else { + // Just a simple trick. + *e.load / (n.load.max(1) / ACCURACY) + } + } + }; + e.ratio = ratio; + assignment.1.push((e.who.clone(), ratio)); } } } - } - // Optionally perform equalize post-processing. - if config.equalize { - let tolerance = config.tolerance; - let equalize_iterations = config.iterations; - - // Fix indexes - nominators.iter_mut().for_each(|n| { - n.edges.iter_mut().for_each(|e| { - if let Some(idx) = elected_candidates.iter().position(|c| c.who == e.who) { - e.elected_idx = idx; - } - }); - }); - - for _i in 0..equalize_iterations { - let mut max_diff = >::zero(); - nominators.iter_mut().for_each(|mut n| { - let diff = equalize::(&mut n, &mut elected_candidates, tolerance); - if diff > max_diff { - max_diff = diff; + if assignment.1.len() > 0 { + // To ensure an assertion indicating: no stake from the nominator going to waste, + // we add a minimal post-processing to equally assign all of the leftover stake ratios. + let vote_count = assignment.1.len() as ExtendedBalance; + let l = assignment.1.len(); + let sum = assignment.1.iter().map(|a| a.1).sum::(); + let diff = ACCURACY.checked_sub(sum).unwrap_or(0); + let diff_per_vote= diff / vote_count; + + if diff_per_vote > 0 { + for i in 0..l { + assignment.1[i%l].1 = + assignment.1[i%l].1 + .saturating_add(diff_per_vote); } - }); - if max_diff < tolerance { - break; } + + // `remainder` is set to be less than maximum votes of a nominator (currently 16). + // safe to cast it to usize. + let remainder = diff - diff_per_vote * vote_count; + for i in 0..remainder as usize { + assignment.1[i%l].1 = + assignment.1[i%l].1 + .saturating_add(1); + } + assigned.push(assignment); } } + } else { // if we have less than minimum, use the previous validator set. return None } - Some(elected_candidates) + Some((elected_candidates, assigned)) } /// Performs equalize post-processing to the output of the election algorithm /// This function mutates the input parameters, most noticeably it updates the exposure of /// the elected candidates. -/// The return value is to tolerance at which the function has stopped. +/// +/// No value is returned from the function and the `expo_map` parameter is updated. pub fn equalize( - nominator: &mut Nominator, - elected_candidates: &mut Vec>>, - _tolerance: BalanceOf -) -> BalanceOf { - let into_currency = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance; - let into_votes = |b: ExtendedBalance| >>::convert(b); - let tolerance = into_currency(_tolerance); - - let mut elected_edges = nominator.edges - .iter_mut() - .filter(|e| e.elected) - .collect::>>(); - - if elected_edges.len() == 0 { - return >::zero(); + assignments: &mut Vec<(T::AccountId, BalanceOf, Vec>)>, + expo_map: &mut ExpoMap, + tolerance: ExtendedBalance, + iterations: usize, +) { + for _i in 0..iterations { + let mut max_diff = 0; + assignments.iter_mut().for_each(|(n, budget, assignment)| { + let diff = do_equalize::(&n, *budget, assignment, expo_map, tolerance); + if diff > max_diff { + max_diff = diff; + } + }); + if max_diff < tolerance { + break; + } } +} + +fn do_equalize( + nominator: &T::AccountId, + budget_balance: BalanceOf, + elected_edges_balance: &mut Vec>, + expo_map: &mut ExpoMap, + tolerance: ExtendedBalance +) -> ExtendedBalance { + let to_votes = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance; + let to_balance = |v: ExtendedBalance| >>::convert(v); + let budget = to_votes(budget_balance); + + // Convert all stakes to extended. Result is Vec<(Acc, Ratio, Balance)> + let mut elected_edges = elected_edges_balance + .into_iter() + .map(|e| (e.0.clone(), e.1, to_votes(e.2))) + .collect::>(); let stake_used = elected_edges .iter() - .fold(0, |s, e| s.saturating_add(e.backing_stake)); - let backed_stakes = elected_edges + .fold(0 as ExtendedBalance, |s, e| s.saturating_add(e.2)); + + let backed_stakes_iter = elected_edges .iter() - .map(|e| elected_candidates[e.elected_idx].backing_stake) - .collect::>(); + .filter_map(|e| expo_map.get(&e.0)) + .map(|e| to_votes(e.total)); + let backing_backed_stake = elected_edges .iter() - .filter(|e| e.backing_stake > 0) - .map(|e| elected_candidates[e.elected_idx].backing_stake) + .filter(|e| e.2 > 0) + .filter_map(|e| expo_map.get(&e.0)) + .map(|e| to_votes(e.total)) .collect::>(); let mut difference; if backing_backed_stake.len() > 0 { - let max_stake = *backing_backed_stake + let max_stake = backing_backed_stake .iter() .max() .expect("vector with positive length will have a max; qed"); - let min_stake = *backed_stakes - .iter() + let min_stake = backed_stakes_iter .min() - .expect("vector with positive length will have a min; qed"); + .expect("iterator with positive length will have a min; qed"); + difference = max_stake.saturating_sub(min_stake); - difference = difference.saturating_add(nominator.budget.saturating_sub(stake_used)); + difference = difference.saturating_add(budget.saturating_sub(stake_used)); if difference < tolerance { - return into_votes(difference); + return difference; } } else { - difference = nominator.budget; + difference = budget; } // Undo updates to exposure elected_edges.iter_mut().for_each(|e| { - // NOTE: no assertions in the runtime, but this should nonetheless be indicative. - //assert_eq!(elected_candidates[e.elected_idx].who, e.who); - elected_candidates[e.elected_idx].backing_stake -= e.backing_stake; - elected_candidates[e.elected_idx].exposure.total -= into_votes(e.backing_stake); - e.backing_stake = 0; + if let Some(expo) = expo_map.get_mut(&e.0) { + expo.total = expo.total.saturating_sub(to_balance(e.2)); + } + e.2 = 0; }); - elected_edges.sort_unstable_by_key(|e| elected_candidates[e.elected_idx].backing_stake); + elected_edges.sort_unstable_by_key(|e| e.2); let mut cumulative_stake: ExtendedBalance = 0; let mut last_index = elected_edges.len() - 1; - let budget = nominator.budget; elected_edges.iter_mut().enumerate().for_each(|(idx, e)| { - let stake = elected_candidates[e.elected_idx].backing_stake; - - let stake_mul = stake.saturating_mul(idx as ExtendedBalance); - let stake_sub = stake_mul.saturating_sub(cumulative_stake); - if stake_sub > budget { - last_index = idx.checked_sub(1).unwrap_or(0); - return + if let Some(expo) = expo_map.get_mut(&e.0) { + let stake: ExtendedBalance = to_votes(expo.total); + + let stake_mul = stake.saturating_mul(idx as ExtendedBalance); + let stake_sub = stake_mul.saturating_sub(cumulative_stake); + if stake_sub > budget { + last_index = idx.checked_sub(1).unwrap_or(0); + return + } + cumulative_stake = cumulative_stake.saturating_add(stake); } - cumulative_stake = cumulative_stake.saturating_add(stake); }); - let last_stake = elected_candidates[elected_edges[last_index].elected_idx].backing_stake; + let last_stake = elected_edges[last_index].2; let split_ways = last_index + 1; - let excess = nominator.budget + let excess = budget .saturating_add(cumulative_stake) .saturating_sub(last_stake.saturating_mul(split_ways as ExtendedBalance)); - let nominator_address = nominator.who.clone(); elected_edges.iter_mut().take(split_ways).for_each(|e| { - let c = &mut elected_candidates[e.elected_idx]; - e.backing_stake = (excess / split_ways as ExtendedBalance) - .saturating_add(last_stake) - .saturating_sub(c.backing_stake); - c.exposure.total = c.exposure.total.saturating_add(into_votes(e.backing_stake)); - c.backing_stake = c.backing_stake.saturating_add(e.backing_stake); - if let Some(i_expo) = c.exposure.others.iter_mut().find(|i| i.who == nominator_address) { - i_expo.value = into_votes(e.backing_stake); + if let Some(expo) = expo_map.get_mut(&e.0) { + e.2 = (excess / split_ways as ExtendedBalance) + .saturating_add(last_stake) + .saturating_sub(to_votes(expo.total)); + expo.total = expo.total.saturating_add(to_balance(e.2)); + if let Some(i_expo) = expo.others.iter_mut().find(|i| i.who == nominator.clone()) { + i_expo.value = to_balance(e.2); + } } }); - into_votes(difference) + + // Store back the individual edge weights. + elected_edges.iter().enumerate().for_each(|(idx, e)| elected_edges_balance[idx].2 = to_balance(e.2)); + + difference } diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index e62b59d4892d7057de8f3e0e441aa7764e45eb59..eba6ce77a560cef415e456ecc8f90a18e5ee841e 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -16,14 +16,11 @@ //! Tests for the module. -#![cfg(test)] - use super::*; use runtime_io::with_externalities; use phragmen; -use primitives::PerU128; use srml_support::{assert_ok, assert_noop, assert_eq_uvec, EnumerableStorageMap}; -use mock::{Balances, Session, Staking, System, Timestamp, Test, ExtBuilder, Origin}; +use mock::*; use srml_support::traits::{Currency, ReservableCurrency}; #[test] @@ -55,7 +52,7 @@ fn basic_setup_works() { assert_eq!(Staking::nominators(101), vec![11, 21]); // Account 10 is exposed by 1000 * balance_factor from their own stash in account 11 + the default nominator vote - assert_eq!(Staking::stakers(11), Exposure { total: 1124, own: 1000, others: vec![ IndividualExposure { who: 101, value: 124 }] }); + assert_eq!(Staking::stakers(11), Exposure { total: 1125, own: 1000, others: vec![ IndividualExposure { who: 101, value: 125 }] }); // Account 20 is exposed by 1000 * balance_factor from their own stash in account 21 + the default nominator vote assert_eq!(Staking::stakers(21), Exposure { total: 1375, own: 1000, others: vec![ IndividualExposure { who: 101, value: 375 }] }); @@ -70,11 +67,14 @@ fn basic_setup_works() { assert_eq!(Staking::current_session_reward(), 10); // initial slot_stake - assert_eq!(Staking::slot_stake(), 1124); // Naive + assert_eq!(Staking::slot_stake(), 1125); // Naive // initial slash_count of validators assert_eq!(Staking::slash_count(&11), 0); assert_eq!(Staking::slash_count(&21), 0); + + // All exposures must be correct. + check_exposure_all(); }); } @@ -97,6 +97,31 @@ fn no_offline_should_work() { }); } +#[test] +fn change_controller_works() { + with_externalities(&mut ExtBuilder::default().build(), + || { + assert_eq!(Staking::bonded(&11), Some(10)); + + assert!(>::enumerate().map(|(c, _)| c).collect::>().contains(&11)); + // 10 can control 11 who is initially a validator. + assert_ok!(Staking::chill(Origin::signed(10))); + assert!(!>::enumerate().map(|(c, _)| c).collect::>().contains(&11)); + + assert_ok!(Staking::set_controller(Origin::signed(11), 5)); + + System::set_block_number(1); + Session::check_rotate_session(System::block_number()); + assert_eq!(Staking::current_era(), 1); + + assert_noop!( + Staking::validate(Origin::signed(10), ValidatorPrefs::default()), + "not a controller" + ); + assert_ok!(Staking::validate(Origin::signed(5), ValidatorPrefs::default())); + }) +} + #[test] fn invulnerability_should_work() { // Test that users can be invulnerable from slashing and being kicked @@ -282,7 +307,7 @@ fn rewards_should_work() { .sessions_per_era(3) .build(), || { - let delay = 0; + let delay = 1; // this test is only in the scope of one era. Since this variable changes // at the last block/new era, we'll save it. let session_reward = 10; @@ -305,7 +330,6 @@ fn rewards_should_work() { assert_eq!(Balances::total_balance(&2), 500); // add a dummy nominator. - // NOTE: this nominator is being added 'manually'. a Further test (nomination_and_reward..) will add it via '.nominate()' >::insert(&11, Exposure { own: 500, // equal division indicates that the reward will be equally divided among validator and nominator. total: 1000, @@ -316,8 +340,7 @@ fn rewards_should_work() { assert_eq!(Staking::payee(2), RewardDestination::Stash); assert_eq!(Staking::payee(11), RewardDestination::Controller); - let mut block = 3; - // Block 3 => Session 1 => Era 0 + let mut block = 3; // Block 3 => Session 1 => Era 0 System::set_block_number(block); Timestamp::set_timestamp(block*5); // on time. Session::check_rotate_session(System::block_number()); @@ -354,16 +377,16 @@ fn rewards_should_work() { #[test] fn multi_era_reward_should_work() { - // should check that: + // Should check that: // The value of current_session_reward is set at the end of each era, based on - // slot_stake and session_reward. Check and verify this. + // slot_stake and session_reward. with_externalities(&mut ExtBuilder::default() .session_length(3) .sessions_per_era(3) .nominate(false) .build(), || { - let delay = 0; + let delay = 1; let session_reward = 10; // This is set by the test config builder. @@ -378,12 +401,12 @@ fn multi_era_reward_should_work() { let mut block = 3; // Block 3 => Session 1 => Era 0 System::set_block_number(block); - Timestamp::set_timestamp(block*5); // on time. + Timestamp::set_timestamp(block*5); Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 1); - // session triggered: the reward value stashed should be 10 -- defined in ExtBuilder genesis. + // session triggered: the reward value stashed should be 10 assert_eq!(Staking::current_session_reward(), session_reward); assert_eq!(Staking::current_era_reward(), session_reward); @@ -413,14 +436,14 @@ fn multi_era_reward_should_work() { assert_eq!(Staking::current_session_reward(), new_session_reward); // fast forward to next era: - block=12;System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); - block=15;System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); + block=12; System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); + block=15; System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); // intermediate test. assert_eq!(Staking::current_era_reward(), 2*new_session_reward); // new era is triggered here. - block=18;System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); + block=18; System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); // pay time assert_eq!(Balances::total_balance(&10), 3*new_session_reward + recorded_balance); @@ -515,31 +538,28 @@ fn staking_should_work() { #[test] fn less_than_needed_candidates_works() { - // Test the situation where the number of validators are less than `ValidatorCount` but more than - // The expected behavior is to choose all the candidates that have some vote. with_externalities(&mut ExtBuilder::default() .minimum_validator_count(1) .validator_count(4) .nominate(false) .build(), || { - assert_eq!(Staking::era_length(), 1); assert_eq!(Staking::validator_count(), 4); assert_eq!(Staking::minimum_validator_count(), 1); + assert_eq_uvec!(Session::validators(), vec![30, 20, 10]); - // 10 and 20 are now valid candidates. - // trigger era System::set_block_number(1); Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 1); - // both validators will be chosen again. NO election algorithm is even executed. + // Previous set is selected. NO election algorithm is even executed. assert_eq_uvec!(Session::validators(), vec![30, 20, 10]); // But the exposure is updated in a simple way. No external votes exists. This is purely self-vote. - assert_eq!(Staking::stakers(10).others.iter().map(|e| e.who).collect::>>(), vec![]); - assert_eq!(Staking::stakers(20).others.iter().map(|e| e.who).collect::>>(), vec![]); - assert_eq!(Staking::stakers(30).others.iter().map(|e| e.who).collect::>>(), vec![]); + assert_eq!(Staking::stakers(10).others.len(), 0); + assert_eq!(Staking::stakers(20).others.len(), 0); + assert_eq!(Staking::stakers(30).others.len(), 0); + check_exposure_all(); }); } @@ -560,13 +580,15 @@ fn no_candidate_emergency_condition() { // initial validators assert_eq_uvec!(Session::validators(), vec![10, 20, 30, 40]); + let _ = Staking::chill(Origin::signed(10)); + // trigger era System::set_block_number(1); Session::check_rotate_session(System::block_number()); - assert_eq!(Staking::current_era(), 1); - // No one nominates => no one has a proper vote => no change + // Previous ones are elected. chill is invalidates. TODO: #2494 assert_eq_uvec!(Session::validators(), vec![10, 20, 30, 40]); + assert_eq!(Staking::current_elected().len(), 0); }); } @@ -656,15 +678,15 @@ fn nominating_and_rewards_should_work() { // total expo of 10, with 1200 coming from nominators (externals), according to phragmen. assert_eq!(Staking::stakers(11).own, 1000); - assert_eq!(Staking::stakers(11).total, 1000 + 798); + assert_eq!(Staking::stakers(11).total, 1000 + 800); // 2 and 4 supported 10, each with stake 600, according to phragmen. - assert_eq!(Staking::stakers(11).others.iter().map(|e| e.value).collect::>>(), vec![399, 399]); + assert_eq!(Staking::stakers(11).others.iter().map(|e| e.value).collect::>>(), vec![400, 400]); assert_eq!(Staking::stakers(11).others.iter().map(|e| e.who).collect::>>(), vec![3, 1]); // total expo of 20, with 500 coming from nominators (externals), according to phragmen. assert_eq!(Staking::stakers(21).own, 1000); - assert_eq!(Staking::stakers(21).total, 1000 + 1200); + assert_eq!(Staking::stakers(21).total, 1000 + 1198); // 2 and 4 supported 20, each with stake 250, according to phragmen. - assert_eq!(Staking::stakers(21).others.iter().map(|e| e.value).collect::>>(), vec![600, 600]); + assert_eq!(Staking::stakers(21).others.iter().map(|e| e.value).collect::>>(), vec![599, 599]); assert_eq!(Staking::stakers(21).others.iter().map(|e| e.who).collect::>>(), vec![3, 1]); // They are not chosen anymore @@ -685,9 +707,11 @@ fn nominating_and_rewards_should_work() { assert_eq!(Balances::total_balance(&4), initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11)); // 10 got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9 - assert_eq!(Balances::total_balance(&10), initial_balance + 5*new_session_reward/9 + 2) ; + assert_eq!(Balances::total_balance(&10), initial_balance + 5*new_session_reward/9); // 10 got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = 5/11 assert_eq!(Balances::total_balance(&20), initial_balance + 5*new_session_reward/11); + + check_exposure_all(); }); } @@ -701,7 +725,7 @@ fn nominators_also_get_slashed() { assert_eq!(Staking::offline_slash_grace(), 0); // Account 10 has not been reported offline assert_eq!(Staking::slash_count(&10), 0); - >::put(Perbill::from_percent(12)); + >::put(Perbill::from_percent(12)); // Set payee to controller assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); @@ -735,6 +759,7 @@ fn nominators_also_get_slashed() { // initial + first era reward + slash assert_eq!(Balances::total_balance(&10), initial_balance + 10 - validator_slash); assert_eq!(Balances::total_balance(&2), initial_balance - nominator_slash); + check_exposure_all(); // Because slashing happened. assert!(Staking::forcing_new_era().is_some()); }); @@ -1050,6 +1075,8 @@ fn validator_payment_prefs_work() { assert_eq!(Balances::total_balance(&10), 1); // Rest of the reward will be shared and paid to the nominator in stake. assert_eq!(Balances::total_balance(&2), 500 + shared_cut/2); + + check_exposure_all(); }); } @@ -1173,6 +1200,38 @@ fn bond_extra_and_withdraw_unbonded_works() { }) } +#[test] +fn too_many_unbond_calls_should_not_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + // locked at era 0 until 3 + for _ in 0..MAX_UNLOCKING_CHUNKS-1 { + assert_ok!(Staking::unbond(Origin::signed(10), 1)); + } + + System::set_block_number(1); + Session::check_rotate_session(System::block_number()); + + // locked ar era 1 until 4 + assert_ok!(Staking::unbond(Origin::signed(10), 1)); + // can't do more. + assert_noop!(Staking::unbond(Origin::signed(10), 1), "can not schedule more unlock chunks"); + + System::set_block_number(2); + Session::check_rotate_session(System::block_number()); + + System::set_block_number(3); + Session::check_rotate_session(System::block_number()); + + assert_noop!(Staking::unbond(Origin::signed(10), 1), "can not schedule more unlock chunks"); + // free up. + assert_ok!(Staking::withdraw_unbonded(Origin::signed(10))); + + // Can add again. + assert_ok!(Staking::unbond(Origin::signed(10), 1)); + assert_eq!(Staking::ledger(&10).unwrap().unlocking.len(), 2); + }) +} + #[test] fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment() { // Test that slot_stake is determined by the least staked validator @@ -1220,6 +1279,8 @@ fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment( assert_eq!(Staking::slash_count(&11), 4); // check the balance of 10 (slash will be deducted from free balance.) assert_eq!(Balances::free_balance(&11), 1000 + 10 - 50 /*5% of 1000*/ * 8 /*2**3*/); + + check_exposure_all(); }); } @@ -1432,11 +1493,12 @@ fn phragmen_poc_works() { assert_eq!(Staking::stakers(21).others.iter().map(|e| e.value).collect::>>(), vec![333, 333]); assert_eq!(Staking::stakers(21).others.iter().map(|e| e.value).sum::>(), 666); assert_eq!(Staking::stakers(21).others.iter().map(|e| e.who).collect::>>(), vec![3, 1]); + check_exposure_all(); }); } #[test] -fn phragmen_election_works_with_post_processing() { +fn phragmen_poc_2_works() { // tests the encapsulated phragmen::elect function. // Votes [ // ('10', 1000, ['10']), @@ -1448,32 +1510,6 @@ fn phragmen_election_works_with_post_processing() { // Sequential Phragmén gives // 10 is elected with stake 1705.7377049180327 and score 0.0004878048780487805 // 30 is elected with stake 1344.2622950819673 and score 0.0007439024390243903 - - // 10 has load 0.0004878048780487805 and supported - // 10 with stake 1000.0 - // 20 has load 0 and supported - // 20 with stake 0 - // 30 has load 0.0007439024390243903 and supported - // 30 with stake 1000.0 - // 2 has load 0.0004878048780487805 and supported - // 10 with stake 50.0 20 with stake 0.0 - // 4 has load 0.0007439024390243903 and supported - // 10 with stake 655.7377049180328 30 with stake 344.26229508196724 - - // Sequential Phragmén with post processing gives - // 10 is elected with stake 1525.0 and score 0.0004878048780487805 - // 30 is elected with stake 1525.0 and score 0.0007439024390243903 - - // 10 has load 0.0004878048780487805 and supported - // 10 with stake 1000.0 - // 20 has load 0 and supported - // 20 with stake 0 - // 30 has load 0.0007439024390243903 and supported - // 30 with stake 1000.0 - // 2 has load 0.0004878048780487805 and supported - // 10 with stake 50.0 20 with stake 0.0 - // 4 has load 0.0007439024390243903 and supported - // 10 with stake 475.0 30 with stake 525.0 with_externalities(&mut ExtBuilder::default().nominate(false).build(), || { // initial setup of 10 and 20, both validators assert_eq_uvec!(Session::validators(), vec![20, 10]); @@ -1497,30 +1533,17 @@ fn phragmen_election_works_with_post_processing() { >::enumerate(), >::enumerate(), Staking::slashable_balance_of, - ElectionConfig::> { - equalize: true, - tolerance: >::sa(10 as u64), - iterations: 10, - } ); - let winners = winners.unwrap(); + let (winners, assignment) = winners.unwrap(); // 10 and 30 must be the winners - assert_eq!(winners.iter().map(|w| w.who).collect::>>(), vec![11, 31]); - - let winner_10 = winners.iter().filter(|w| w.who == 11).nth(0).unwrap(); - let winner_30 = winners.iter().filter(|w| w.who == 31).nth(0).unwrap(); - - // Check exposures - assert_eq!(winner_10.exposure.total, 1000 + 525); - assert_eq!(winner_10.score, PerU128::from_max_value(165991398498018762665060784113057664)); - assert_eq!(winner_10.exposure.others[0].value, 475); - assert_eq!(winner_10.exposure.others[1].value, 50); - - assert_eq!(winner_30.exposure.total, 1000 + 525); - assert_eq!(winner_30.score, PerU128::from_max_value(253136882709478612992230401826229321)); - assert_eq!(winner_30.exposure.others[0].value, 525); + assert_eq!(winners, vec![11, 31]); + assert_eq!(assignment, vec![ + (3, vec![(11, 2816371998), (31, 1478595298)]), + (1, vec![(11, 4294967296)]), + ]); + check_exposure_all(); }) } @@ -1593,6 +1616,7 @@ fn switching_roles() { System::set_block_number(6); Session::check_rotate_session(System::block_number()); assert_eq_uvec!(Session::validators(), vec![2, 20]); + check_exposure_all(); }); } @@ -1728,6 +1752,7 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() { assert_eq!(Balances::free_balance(&2), initial_balance_2 + reward.max(1)); // same for 10 assert_eq!(Balances::free_balance(&10), initial_balance_10 + 10 + reward.max(1)); + check_exposure_all(); }); } @@ -1741,17 +1766,6 @@ fn phragmen_linear_worse_case_equalize() { .fair(true) .build(), || { - let bond_validator = |a, b| { - let _ = Balances::deposit_creating(&(a-1), b); - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - let bond_nominator = |a, b, v| { - let _ = Balances::deposit_creating(&(a-1), b); - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::nominate(Origin::signed(a), v)); - }; - for i in &[10, 20, 30, 40] { assert_ok!(Staking::set_payee(Origin::signed(*i), RewardDestination::Controller)); } bond_validator(50, 1000); @@ -1763,8 +1777,8 @@ fn phragmen_linear_worse_case_equalize() { bond_nominator(6, 1000, vec![21, 31]); bond_nominator(8, 1000, vec![31, 41]); bond_nominator(110, 1000, vec![41, 51]); - bond_nominator(112, 1000, vec![51, 61]); - bond_nominator(114, 1000, vec![61, 71]); + bond_nominator(120, 1000, vec![51, 61]); + bond_nominator(130, 1000, vec![61, 71]); assert_eq_uvec!(Session::validators(), vec![40, 30]); assert_ok!(Staking::set_validator_count(7)); @@ -1776,20 +1790,22 @@ fn phragmen_linear_worse_case_equalize() { // Sequential Phragmén with post processing gives // 10 is elected with stake 3000.0 and score 0.00025 + // 20 is elected with stake 2017.7421569824219 and score 0.0005277777777777777 // 30 is elected with stake 2008.8712884829595 and score 0.0003333333333333333 + // 40 is elected with stake 2000.0001049958742 and score 0.0005555555555555556 // 50 is elected with stake 2000.0001049958742 and score 0.0003333333333333333 // 60 is elected with stake 1991.128921508789 and score 0.0004444444444444444 - // 20 is elected with stake 2017.7421569824219 and score 0.0005277777777777777 - // 40 is elected with stake 2000.0001049958742 and score 0.0005555555555555556 // 70 is elected with stake 1982.2574230340813 and score 0.0007222222222222222 + check_exposure_all(); + assert_eq!(Staking::stakers(11).total, 3000); - assert_eq!(Staking::stakers(31).total, 2035); - assert_eq!(Staking::stakers(51).total, 2000); - assert_eq!(Staking::stakers(61).total, 1968); - assert_eq!(Staking::stakers(21).total, 2035); - assert_eq!(Staking::stakers(41).total, 2024); - assert_eq!(Staking::stakers(71).total, 1936); + assert_eq!(Staking::stakers(21).total, 2209); + assert_eq!(Staking::stakers(31).total, 2027); + assert_eq!(Staking::stakers(41).total, 2010); + assert_eq!(Staking::stakers(51).total, 2010); + assert_eq!(Staking::stakers(61).total, 1998); + assert_eq!(Staking::stakers(71).total, 1983); }) } @@ -1809,6 +1825,7 @@ fn phragmen_chooses_correct_number_of_validators() { Session::check_rotate_session(System::block_number()); assert_eq!(Session::validators().len(), 1); + check_exposure_all(); }) } @@ -1816,18 +1833,9 @@ fn phragmen_chooses_correct_number_of_validators() { #[test] fn phragmen_score_should_be_accurate_on_large_stakes() { with_externalities(&mut ExtBuilder::default() - .nominate(false) - .build() - , || { - let bond_validator = |a, b| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - - for i in 1..=8 { - let _ = Balances::make_free_balance_be(&i, u64::max_value()); - } - + .nominate(false) + .build(), + || { bond_validator(2, u64::max_value()); bond_validator(4, u64::max_value()); bond_validator(6, u64::max_value()-1); @@ -1837,184 +1845,114 @@ fn phragmen_score_should_be_accurate_on_large_stakes() { Session::check_rotate_session(System::block_number()); assert_eq!(Session::validators(), vec![4, 2]); + check_exposure_all(); }) } #[test] fn phragmen_should_not_overflow_validators() { with_externalities(&mut ExtBuilder::default() - .nominate(false) - .build() - , || { - let bond_validator = |a, b| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - let bond_nominator = |a, b, v| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::nominate(Origin::signed(a), v)); - }; - let check_exposure = |a| { - let expo = Staking::stakers(&a); - assert_eq!(expo.total, expo.own + expo.others.iter().map(|e| e.value).sum::()); - }; - - for i in 1..=8 { - let _ = Balances::make_free_balance_be(&i, u64::max_value()); - } - + .nominate(false) + .build(), + || { let _ = Staking::chill(Origin::signed(10)); let _ = Staking::chill(Origin::signed(20)); bond_validator(2, u64::max_value()); bond_validator(4, u64::max_value()); - bond_nominator(6, u64::max_value()/2, vec![1, 3]); - bond_nominator(8, u64::max_value()/2, vec![1, 3]); + bond_nominator(6, u64::max_value()/2, vec![3, 5]); + bond_nominator(8, u64::max_value()/2, vec![3, 5]); System::set_block_number(2); Session::check_rotate_session(System::block_number()); assert_eq_uvec!(Session::validators(), vec![4, 2]); - check_exposure(4); - check_exposure(2); + + // This test will fail this. Will saturate. + // check_exposure_all(); + assert_eq!(Staking::stakers(3).total, u64::max_value()); + assert_eq!(Staking::stakers(5).total, u64::max_value()); }) } #[test] fn phragmen_should_not_overflow_nominators() { with_externalities(&mut ExtBuilder::default() - .nominate(false) - .build() - , || { - let bond_validator = |a, b| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - let bond_nominator = |a, b, v| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::nominate(Origin::signed(a), v)); - }; - let check_exposure = |a| { - let expo = Staking::stakers(&a); - assert_eq!(expo.total, expo.own + expo.others.iter().map(|e| e.value).sum::()); - }; - + .nominate(false) + .build(), + || { let _ = Staking::chill(Origin::signed(10)); let _ = Staking::chill(Origin::signed(20)); - for i in 1..=8 { - let _ = Balances::make_free_balance_be(&i, u64::max_value()); - } - bond_validator(2, u64::max_value()/2); bond_validator(4, u64::max_value()/2); - bond_nominator(6, u64::max_value(), vec![1, 3]); - bond_nominator(8, u64::max_value(), vec![1, 3]); + bond_nominator(6, u64::max_value(), vec![3, 5]); + bond_nominator(8, u64::max_value(), vec![3, 5]); System::set_block_number(2); Session::check_rotate_session(System::block_number()); assert_eq_uvec!(Session::validators(), vec![4, 2]); - check_exposure(4); - check_exposure(2); + + // Saturate. + assert_eq!(Staking::stakers(3).total, u64::max_value()); + assert_eq!(Staking::stakers(5).total, u64::max_value()); }) } #[test] fn phragmen_should_not_overflow_ultimate() { with_externalities(&mut ExtBuilder::default() - .nominate(false) - .build() - , || { - let bond_validator = |a, b| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - let bond_nominator = |a, b, v| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::nominate(Origin::signed(a), v)); - }; - let check_exposure = |a| { - let expo = Staking::stakers(&a); - assert_eq!(expo.total, expo.own + expo.others.iter().map(|e| e.value).sum::()); - }; - - for i in 1..=8 { - let _ = Balances::make_free_balance_be(&i, u64::max_value()); - } - + .nominate(false) + .build(), + || { bond_validator(2, u64::max_value()); bond_validator(4, u64::max_value()); - bond_nominator(6, u64::max_value(), vec![1, 3]); - bond_nominator(8, u64::max_value(), vec![1, 3]); + bond_nominator(6, u64::max_value(), vec![3, 5]); + bond_nominator(8, u64::max_value(), vec![3, 5]); System::set_block_number(2); Session::check_rotate_session(System::block_number()); assert_eq_uvec!(Session::validators(), vec![4, 2]); - check_exposure(4); - check_exposure(2); + + // Saturate. + assert_eq!(Staking::stakers(3).total, u64::max_value()); + assert_eq!(Staking::stakers(5).total, u64::max_value()); }) } #[test] -fn large_scale_test() { +fn phragmen_large_scale_test() { with_externalities(&mut ExtBuilder::default() - .nominate(false) - .minimum_validator_count(1) - .validator_count(20) - .build() - , || { + .nominate(false) + .minimum_validator_count(1) + .validator_count(20) + .build(), + || { let _ = Staking::chill(Origin::signed(10)); let _ = Staking::chill(Origin::signed(20)); - - let bond_validator = |a, b| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - let bond_nominator = |a, b, v| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::nominate(Origin::signed(a), v)); - }; - let check_expo = |e: Exposure| { - assert_eq!(e.total, e.own + e.others.iter().fold(0, |s, v| s + v.value)); - }; - + let _ = Staking::chill(Origin::signed(30)); let prefix = 200; - for i in prefix..=(prefix+50) { - let _ = Balances::make_free_balance_be(&i, u64::max_value()); - } bond_validator(prefix + 2, 1); - bond_validator(prefix + 4, 105); - bond_validator(prefix + 6, 3879248198); + bond_validator(prefix + 4, 100); + bond_validator(prefix + 6, 1000000); bond_validator(prefix + 8, 100000000001000); bond_validator(prefix + 10, 100000000002000); - bond_validator(prefix + 12, 150000000000000); + bond_validator(prefix + 12, 100000000003000); bond_validator(prefix + 14, 400000000000000); - bond_validator(prefix + 16, 524611669156413); - bond_validator(prefix + 18, 700000000000000); - bond_validator(prefix + 20, 797663650978304); - bond_validator(prefix + 22, 900003879248198); - bond_validator(prefix + 24, 997530000000000); - bond_validator(prefix + 26, 1000000000010000); - bond_validator(prefix + 28, 1000000000020000); - bond_validator(prefix + 30, 1000003879248198); - bond_validator(prefix + 32, 1200000000000000); - bond_validator(prefix + 34, 7997659802817256); - bond_validator(prefix + 36, 18000000000000000); - bond_validator(prefix + 38, 20000033025753738); - bond_validator(prefix + 40, 500000000000100000); - bond_validator(prefix + 42, 500000000000200000); - - Balances::make_free_balance_be(&50, u64::max_value()); - Balances::make_free_balance_be(&49, u64::max_value()); - bond_nominator(50, 990000068998617227, vec![ - prefix + 1, + bond_validator(prefix + 16, 400000000001000); + bond_validator(prefix + 18, 18000000000000000); + bond_validator(prefix + 20, 20000000000000000); + bond_validator(prefix + 22, 500000000000100000); + bond_validator(prefix + 24, 500000000000200000); + + bond_nominator(50, 990000000000000000, vec![ prefix + 3, prefix + 5, prefix + 7, @@ -2026,38 +1964,66 @@ fn large_scale_test() { prefix + 19, prefix + 21, prefix + 23, - prefix + 25, - prefix + 27, - prefix + 29, - prefix + 31, - prefix + 33, - prefix + 35, - prefix + 37, - prefix + 39, - prefix + 41, - prefix + 43, - prefix + 45] + prefix + 25] ); System::set_block_number(1); Session::check_rotate_session(System::block_number()); + // For manual inspection + println!("Validators are {:?}", Session::validators()); + println!("Validators are {:#?}", + Session::validators() + .iter() + .map(|v| (v.clone(), Staking::stakers(v+1))) + .collect::)>>() + ); + // Each exposure => total == own + sum(others) - Session::validators().iter().for_each(|acc| check_expo(Staking::stakers(acc-1))); + check_exposure_all(); // aside from some error, stake must be divided correctly + let individual_expo_sum: u128 = Session::validators() + .iter() + .map(|v| Staking::stakers(v+1)) + .fold(0u128, |s, v| if v.others.len() > 0 { s + v.others[0].value as u128 } else { s }); assert!( - 990000068998617227 - - Session::validators() - .iter() - .map(|v| Staking::stakers(v-1)) - .fold(0, |s, v| if v.others.len() > 0 { s + v.others[0].value } else { s }) - < 100 + 990000000000000000 - individual_expo_sum < 100, + format!( + "Nominator stake = {} / SUM(individual expo) = {} / diff = {}", + 990000000000000000u64, + individual_expo_sum, + 990000000000000000 - individual_expo_sum + ) ); + }) +} - // For manual inspection - println!("Validators are {:?}", Session::validators()); - println!("Validators are {:#?}", - Session::validators().iter().map(|v| (v.clone(), Staking::stakers(v-1)) ).collect::)>>()); +#[test] +fn phragmen_large_scale_test_2() { + with_externalities(&mut ExtBuilder::default() + .nominate(false) + .minimum_validator_count(1) + .validator_count(2) + .build(), + || { + let _ = Staking::chill(Origin::signed(10)); + let _ = Staking::chill(Origin::signed(20)); + let nom_budget: u64 = 1_000_000_000_000_000_000; + let c_budget: u64 = 4_000_000; + + bond_validator(2, c_budget as u64); + bond_validator(4, c_budget as u64); + + bond_nominator(50, nom_budget, vec![3, 5]); + + System::set_block_number(1); + Session::check_rotate_session(System::block_number()); + + // Each exposure => total == own + sum(others) + check_exposure_all(); + + assert_total_expo(3, nom_budget / 2 + c_budget); + assert_total_expo(5, nom_budget / 2 + c_budget); }) -} \ No newline at end of file +} diff --git a/srml/sudo/Cargo.toml b/srml/sudo/Cargo.toml index 220127ba3b67cdbe1096bd04925cb7f8ebe8b3a8..29ef579516fd58d7fe52f7611a3a678753b539ed 100644 --- a/srml/sudo/Cargo.toml +++ b/srml/sudo/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "srml-sudo" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } sr-std = { path = "../../core/sr-std", default-features = false } +sr-io = { path = "../../core/sr-io", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } srml-support-procedural = { path = "../support/procedural" } @@ -24,6 +24,7 @@ std = [ "serde", "parity-codec/std", "sr-std/std", + "sr-io/std", "sr-primitives/std", "srml-support/std", "system/std", diff --git a/srml/sudo/src/lib.rs b/srml/sudo/src/lib.rs index 8c5953646956cc00293033e0cb9215fafb193b02..1caeac73b8b98ff6477cb6d8d00562baad6b2d6c 100644 --- a/srml/sudo/src/lib.rs +++ b/srml/sudo/src/lib.rs @@ -88,7 +88,10 @@ use sr_std::prelude::*; use sr_primitives::traits::StaticLookup; -use srml_support::{StorageValue, Parameter, Dispatchable, decl_module, decl_event, decl_storage, ensure}; +use srml_support::{ + StorageValue, Parameter, Dispatchable, decl_module, decl_event, + decl_storage, ensure +}; use system::ensure_signed; pub trait Trait: system::Trait { @@ -112,8 +115,15 @@ decl_module! { let sender = ensure_signed(origin)?; ensure!(sender == Self::key(), "only the current sudo key can sudo"); - let ok = proposal.dispatch(system::RawOrigin::Root.into()).is_ok(); - Self::deposit_event(RawEvent::Sudid(ok)); + let res = match proposal.dispatch(system::RawOrigin::Root.into()) { + Ok(_) => true, + Err(e) => { + sr_io::print(e); + false + } + }; + + Self::deposit_event(RawEvent::Sudid(res)); } /// Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo key. diff --git a/srml/support/Cargo.toml b/srml/support/Cargo.toml index ab16e98ee90ed6704dad3c410d0aeed3e0f309eb..22635106dfa4e6204329f5066d850b7fef328e57 100644 --- a/srml/support/Cargo.toml +++ b/srml/support/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-support" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = { version = "0.1.0", optional = true } serde = { version = "1.0", optional = true, features = ["derive"] } codec = { package = "parity-codec", version = "3.5.1", default-features = false, features = ["derive"] } srml-metadata = { path = "../metadata", default-features = false } @@ -25,7 +24,6 @@ srml-system = { path = "../system", default-features = false } [features] default = ["std"] std = [ - "hex-literal", "once_cell", "bitmask/std", "serde", diff --git a/srml/support/procedural/Cargo.toml b/srml/support/procedural/Cargo.toml index 26b648da0cbe0dc4f95ce843e774179cca3bb4c0..fba706c17e890bccf203cc8171b0e904cd529cfe 100644 --- a/srml/support/procedural/Cargo.toml +++ b/srml/support/procedural/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-support-procedural" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,6 +13,4 @@ sr-api-macros = { path = "../../../core/sr-api-macros" } proc-macro2 = "0.4.27" quote = { version = "0.6.12" } -# FIXME: https://github.com/paritytech/substrate/issues/2326 -# Remove this restriction once the dependency on erstwhile CustomKeyword trait is removed -syn = { version = ">= 0.15.30, < 0.15.32", features = ["full"] } +syn = { version = "0.15.32", features = ["full"] } diff --git a/srml/support/procedural/src/lib.rs b/srml/support/procedural/src/lib.rs index 5db5c0bf6080f03219a0d1aba8d8617854f548f3..abd7e90951b58d23588c312add27f56d1f428a21 100644 --- a/srml/support/procedural/src/lib.rs +++ b/srml/support/procedural/src/lib.rs @@ -40,23 +40,49 @@ use proc_macro::TokenStream; /// } /// ``` /// -/// Declaration is set with this header `(pub) trait Store for Module as Example` -/// with `Store` a (pub) trait generated associating each storage to the `Module` and -/// `as Example` setting the prefix used for storages of this module. `Example` must be unique: -/// another module with same name and same inner storage item name will conflict. +/// Declaration is set with the header `(pub) trait Store for Module as Example`, +/// with `Store` a (pub) trait generated associating each storage item to the `Module` and +/// `as Example` setting the prefix used for storage items of this module. `Example` must be unique: +/// another module with the same name and the same inner storage item name will conflict. /// /// Basic storage consists of a name and a type; supported types are: /// -/// * Value: `Foo: type`: Implements [StorageValue](../srml_support/storage/trait.StorageValue.html). -/// * Map: `Foo: map type => type`: implements [StorageMap](../srml_support/storage/trait.StorageMap.html) -/// * Linked map: `Foo: linked_map type => type`: Implements [StorageMap](../srml_support/storage/trait.StorageMap.html) -/// and [EnumarableStorageMap](../srml_support/storage/trait.EnumerableStorageMap.html). -/// * Double map: `Foo: double_map u32, $hash(u32) => u32;`: Implements `StorageDoubleMap` with `$hash` representing a -/// choice of hashing algorithms available in [`Hashable` trait](../srml_support/trait.Hashable.html). +/// * Value: `Foo: type`: Implements the [`StorageValue`](../srml_support/storage/trait.StorageValue.html) trait. +/// * Map: `Foo: map hasher($hash) type => type`: Implements the +/// [`StorageMap`](../srml_support/storage/trait.StorageMap.html) trait +/// with `$hash` representing a choice of hashing algorithms available in the +/// [`Hashable`](../srml_support/trait.Hashable.html) trait. /// -/// /!\ Be careful when choosing the hash function, malicious actors could craft second keys to lower the trie. +/// `hasher($hash)` is optional and its default is `blake2_256`. /// -/// And it can be extended as such: +/// /!\ Be careful with each key in the map that is inserted in the trie `$hash(module_name ++ " " ++ storage_name ++ encoding(key))`. +/// If the keys are not trusted (e.g. can be set by a user), a cryptographic `hasher` such as +/// `blake2_256` must be used. Otherwise, other values in storage can be compromised. +/// +/// * Linked map: `Foo: linked_map hasher($hash) type => type`: Same as `Map` but also implements +/// the [`EnumerableStorageMap`](../srml_support/storage/trait.EnumerableStorageMap.html) trait. +/// +/// * Double map: `Foo: double_map hasher($hash) u32, $hash2(u32) => u32`: Implements the +/// [`StorageDoubleMap`](../srml_support/storage/trait.StorageDoubleMap.html) trait with +/// `$hash` and `$hash2` representing choices of hashing algorithms available in the +/// [`Hashable`](../srml_support/trait.Hashable.html) trait. +/// +/// `hasher($hash)` is optional and its default is `blake2_256`. +/// +/// /!\ Be careful with each key pair in the double map that is inserted in the trie. +/// The final key is calculated as follows: +/// +/// ```nocompile +/// $hash(module_name ++ " " ++ storage_name ++ encoding(first_key)) ++ $hash2(encoding(second_key)) +/// ``` +/// +/// If the first key is untrusted, a cryptographic `hasher` such as `blake2_256` must be used. +/// Otherwise, other values of all storage items can be compromised. +/// +/// If the second key is untrusted, a cryptographic `hasher` such as `blake2_256` must be used. +/// Otherwise, other items in storage with the same first key can be compromised. +/// +/// Basic storage can be extended as such: /// /// `#vis #name get(#getter) config(#field_name) build(#closure): #type = #default;` /// @@ -100,18 +126,18 @@ use proc_macro::TokenStream; /// /// This struct can be exposed as `Config` by the `decl_runtime!` macro. /// -/// ### Module with instances +/// ### Module with Instances /// -/// The `decl_storage!` macro supports building modules with instances with the following syntax: -/// (`DefaultInstance` type is optional) +/// The `decl_storage!` macro supports building modules with instances with the following syntax +/// (`DefaultInstance` type is optional): /// /// ```nocompile /// trait Store for Module, I: Instance=DefaultInstance> as Example {} /// ``` /// -/// Then the genesis config is generated with two generic parameter `GenesisConfig` -/// and storage items are now accessible using two generic parameters, e.g.: -/// `>::get()` or `Dummy::::get()` +/// Then the genesis config is generated with two generic parameters (i.e. `GenesisConfig`) +/// and storage items are accessible using two generic parameters, e.g.: +/// `>::get()` or `Dummy::::get()`. #[proc_macro] pub fn decl_storage(input: TokenStream) -> TokenStream { storage::transformation::decl_storage_impl(input) diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs index 13fdc1a462dfb75578cb935a21e6859f6552207a..2b441274c00976c6d85690c2a84c0ec428ff88c3 100644 --- a/srml/support/procedural/src/storage/impls.rs +++ b/srml/support/procedural/src/storage/impls.rs @@ -134,13 +134,13 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Take a value from storage, removing it afterwards. - fn take>(storage: &S) -> Self::Query { + fn take>(storage: &mut S) -> Self::Query { storage.take(>::key()) .#option_simple_1(|| #fielddefault) } /// Mutate the value under a key. - fn mutate R, S: #scrate::HashedStorage<#scrate::Twox128>>(f: F, storage: &S) -> R { + fn mutate R, S: #scrate::HashedStorage<#scrate::Twox128>>(f: F, storage: &mut S) -> R { let mut val = >::get(storage); let ret = f(&mut val); @@ -242,21 +242,24 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Take the value, reading and removing it. - fn take>(key: &#kty, storage: &S) -> Self::Query { + fn take>(key: &#kty, storage: &mut S) -> Self::Query { let key = #as_map::key_for(key); storage.take(&key[..]).#option_simple_1(|| #fielddefault) } /// Mutate the value under a key - fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &S) -> R { + fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &mut S) -> R { let mut val = #as_map::get(key, storage); let ret = f(&mut val); #mutate_impl ; ret } - } + + impl<#traitinstance: 'static + #traittype, #instance #bound_instantiable> + #scrate::storage::hashed::generator::AppendableStorageMap<#kty, #typ> for #name<#traitinstance, #instance> + {} } } @@ -395,7 +398,7 @@ impl<'a, I: Iterator> Impls<'a, I> { /// /// Takes care of updating previous and next elements points /// as well as updates head if the element is first or last. - fn remove_linkage>(linkage: Linkage<#kty>, storage: &S); + fn remove_linkage>(linkage: Linkage<#kty>, storage: &mut S); /// Read the contained data and it's linkage. fn read_with_linkage>(storage: &S, key: &[u8]) -> Option<(#value_type, Linkage<#kty>)>; @@ -404,7 +407,7 @@ impl<'a, I: Iterator> Impls<'a, I> { /// /// Takes care of updating head and previous head's pointer. fn new_head_linkage>( - storage: &S, + storage: &mut S, key: &#kty, ) -> Linkage<#kty>; @@ -414,7 +417,7 @@ impl<'a, I: Iterator> Impls<'a, I> { /// Overwrite current head pointer. /// /// If `None` is given head is removed from storage. - fn write_head>(storage: &S, head: Option<&#kty>); + fn write_head>(storage: &mut S, head: Option<&#kty>); } } }; @@ -426,7 +429,7 @@ impl<'a, I: Iterator> Impls<'a, I> { impl<#impl_trait> self::#inner_module::Utils<#trait_and_instance> for #name<#trait_and_instance> { fn remove_linkage>( linkage: self::#inner_module::Linkage<#kty>, - storage: &S, + storage: &mut S, ) { use self::#inner_module::Utils; @@ -461,7 +464,7 @@ impl<'a, I: Iterator> Impls<'a, I> { } fn new_head_linkage>( - storage: &S, + storage: &mut S, key: &#kty, ) -> self::#inner_module::Linkage<#kty> { use self::#inner_module::Utils; @@ -496,7 +499,7 @@ impl<'a, I: Iterator> Impls<'a, I> { storage.get(#final_head_key) } - fn write_head>(storage: &S, head: Option<&#kty>) { + fn write_head>(storage: &mut S, head: Option<&#kty>) { match head { Some(head) => storage.put(#final_head_key, head), None => storage.kill(#final_head_key), @@ -535,7 +538,7 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Take the value, reading and removing it. - fn take>(key: &#kty, storage: &S) -> Self::Query { + fn take>(key: &#kty, storage: &mut S) -> Self::Query { use self::#inner_module::Utils; let res: Option<(#value_type, self::#inner_module::Linkage<#kty>)> = storage.take(&*#as_map::key_for(key)); @@ -549,12 +552,12 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Remove the value under a key. - fn remove>(key: &#kty, storage: &S) { + fn remove>(key: &#kty, storage: &mut S) { #as_map::take(key, storage); } /// Store a value to be associated with the given key from the map. - fn insert>(key: &#kty, val: &#typ, storage: &S) { + fn insert>(key: &#kty, val: &#typ, storage: &mut S) { use self::#inner_module::Utils; let key_for = &*#as_map::key_for(key); @@ -568,7 +571,7 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Mutate the value under a key - fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &S) -> R { + fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &mut S) -> R { use self::#inner_module::Utils; let key_for = &*#as_map::key_for(key); @@ -684,9 +687,11 @@ impl<'a, I: Iterator> Impls<'a, I> { type Query = #value_type; fn prefix_for(k1: &#k1ty) -> Vec { + use #scrate::storage::hashed::generator::StorageHasher; + let mut key = #as_double_map::prefix().to_vec(); #scrate::codec::Encode::encode_to(k1, &mut key); - #scrate::Hashable::#hasher(&key).to_vec() + #scrate::#hasher::hash(&key[..]).to_vec() } fn prefix() -> &'static [u8] { @@ -704,12 +709,12 @@ impl<'a, I: Iterator> Impls<'a, I> { storage.get(&key).#option_simple_1(|| #fielddefault) } - fn take(key1: &#k1ty, key2: &#k2ty, storage: &S) -> Self::Query { + fn take(key1: &#k1ty, key2: &#k2ty, storage: &mut S) -> Self::Query { let key = #as_double_map::key_for(key1, key2); storage.take(&key).#option_simple_1(|| #fielddefault) } - fn mutate R, S: #scrate::UnhashedStorage>(key1: &#k1ty, key2: &#k2ty, f: F, storage: &S) -> R { + fn mutate R, S: #scrate::UnhashedStorage>(key1: &#k1ty, key2: &#k2ty, f: F, storage: &mut S) -> R { let mut val = #as_double_map::get(key1, key2, storage); let ret = f(&mut val); diff --git a/srml/support/procedural/src/storage/mod.rs b/srml/support/procedural/src/storage/mod.rs index d89189a58f611d553864c8184426f42e8512ea48..5081fca4e215299958312476988985167e9bbf3d 100644 --- a/srml/support/procedural/src/storage/mod.rs +++ b/srml/support/procedural/src/storage/mod.rs @@ -18,11 +18,8 @@ //! `decl_storage` macro // end::description[] -use srml_support_procedural_tools::syn_ext as ext; -use srml_support_procedural_tools::{ToTokens, Parse, custom_keyword, custom_keyword_impl}; - +use srml_support_procedural_tools::{ToTokens, Parse, syn_ext as ext}; use syn::{Ident, Token}; -use syn::token::CustomKeyword; use proc_macro2::TokenStream as TokenStream2; use quote::quote; @@ -30,10 +27,28 @@ mod impls; pub mod transformation; +mod keyword { + syn::custom_keyword!(hiddencrate); + syn::custom_keyword!(add_extra_genesis); + syn::custom_keyword!(extra_genesis_skip_phantom_data_field); + syn::custom_keyword!(config); + syn::custom_keyword!(build); + syn::custom_keyword!(get); + syn::custom_keyword!(map); + syn::custom_keyword!(linked_map); + syn::custom_keyword!(double_map); + syn::custom_keyword!(blake2_256); + syn::custom_keyword!(blake2_128); + syn::custom_keyword!(twox_256); + syn::custom_keyword!(twox_128); + syn::custom_keyword!(twox_64_concat); + syn::custom_keyword!(hasher); +} + /// Parsing usage only #[derive(Parse, ToTokens, Debug)] struct StorageDefinition { - pub hidden_crate: Option, + pub hidden_crate: ext::Opt, pub visibility: syn::Visibility, pub trait_token: Token![trait], pub ident: Ident, @@ -51,18 +66,18 @@ struct StorageDefinition { pub as_token: Token![as], pub crate_ident: Ident, pub content: ext::Braces>, - pub extra_genesis: Option, + pub extra_genesis: ext::Opt, } #[derive(Parse, ToTokens, Debug)] struct SpecificHiddenCrate { - pub keyword: ext::CustomToken, + pub keyword: keyword::hiddencrate, pub ident: ext::Parens, } #[derive(Parse, ToTokens, Debug)] struct AddExtraGenesis { - pub extragenesis_keyword: ext::CustomToken, + pub extragenesis_keyword: keyword::add_extra_genesis, pub content: ext::Braces, } @@ -80,7 +95,7 @@ enum AddExtraGenesisLineEnum { #[derive(Parse, ToTokens, Debug)] struct AddExtraGenesisLine { pub attrs: ext::OuterAttributes, - pub config_keyword: ext::CustomToken, + pub config_keyword: keyword::config, pub extra_field: ext::Parens, pub coldot_token: Token![:], pub extra_type: syn::Type, @@ -95,9 +110,9 @@ struct DeclStorageLine { pub visibility: syn::Visibility, // name pub name: Ident, - pub getter: Option, - pub config: Option, - pub build: Option, + pub getter: ext::Opt, + pub config: ext::Opt, + pub build: ext::Opt, pub coldot_token: Token![:], pub storage_type: DeclStorageType, pub default_value: ext::Opt, @@ -106,19 +121,19 @@ struct DeclStorageLine { #[derive(Parse, ToTokens, Debug)] struct DeclStorageGetter { - pub getter_keyword: ext::CustomToken, + pub getter_keyword: keyword::get, pub getfn: ext::Parens, } #[derive(Parse, ToTokens, Debug)] struct DeclStorageConfig { - pub config_keyword: ext::CustomToken, + pub config_keyword: keyword::config, pub expr: ext::Parens>, } #[derive(Parse, ToTokens, Debug)] struct DeclStorageBuild { - pub build_keyword: ext::CustomToken, + pub build_keyword: keyword::build, pub expr: ext::Parens, } @@ -132,8 +147,8 @@ enum DeclStorageType { #[derive(Parse, ToTokens, Debug)] struct DeclStorageMap { - pub map_keyword: ext::CustomToken, - pub hasher: Option, + pub map_keyword: keyword::map, + pub hasher: ext::Opt, pub key: syn::Type, pub ass_keyword: Token![=>], pub value: syn::Type, @@ -141,8 +156,8 @@ struct DeclStorageMap { #[derive(Parse, ToTokens, Debug)] struct DeclStorageLinkedMap { - pub map_keyword: ext::CustomToken, - pub hasher: Option, + pub map_keyword: keyword::linked_map, + pub hasher: ext::Opt, pub key: syn::Type, pub ass_keyword: Token![=>], pub value: syn::Type, @@ -150,8 +165,8 @@ struct DeclStorageLinkedMap { #[derive(Parse, ToTokens, Debug)] struct DeclStorageDoubleMap { - pub map_keyword: ext::CustomToken, - pub hasher: Option, + pub map_keyword: keyword::double_map, + pub hasher: ext::Opt, pub key1: syn::Type, pub comma_keyword: Token![,], pub key2_hasher: Hasher, @@ -162,11 +177,11 @@ struct DeclStorageDoubleMap { #[derive(Parse, ToTokens, Debug)] enum Hasher { - Blake2_256(ext::CustomToken), - Blake2_128(ext::CustomToken), - Twox256(ext::CustomToken), - Twox128(ext::CustomToken), - Twox64Concat(ext::CustomToken), + Blake2_256(keyword::blake2_256), + Blake2_128(keyword::blake2_128), + Twox256(keyword::twox_256), + Twox128(keyword::twox_128), + Twox64Concat(keyword::twox_64_concat), } #[derive(Parse, ToTokens, Debug)] @@ -177,7 +192,7 @@ struct DeclStorageDefault { #[derive(Parse, ToTokens, Debug)] struct SetHasher { - pub hasher_keyword: ext::CustomToken, + pub hasher_keyword: keyword::hasher, pub inner: ext::Parens, } @@ -212,16 +227,6 @@ impl HasherKind { } } - fn into_hashable_fn(&self) -> TokenStream2 { - match self { - HasherKind::Blake2_256 => quote!( blake2_256 ), - HasherKind::Blake2_128 => quote!( blake2_128 ), - HasherKind::Twox256 => quote!( twox_256 ), - HasherKind::Twox128 => quote!( twox_128 ), - HasherKind::Twox64Concat => quote!( twox_64_concat), - } - } - fn into_metadata(&self) -> TokenStream2 { match self { HasherKind::Blake2_256 => quote!( StorageHasher::Blake2_256 ), @@ -232,20 +237,3 @@ impl HasherKind { } } } - -custom_keyword_impl!(SpecificHiddenCrate, "hiddencrate", "hiddencrate as keyword"); -custom_keyword_impl!(DeclStorageConfig, "config", "build as keyword"); -custom_keyword!(ConfigKeyword, "config", "config as keyword"); -custom_keyword!(BuildKeyword, "build", "build as keyword"); -custom_keyword_impl!(DeclStorageBuild, "build", "storage build config"); -custom_keyword_impl!(AddExtraGenesis, "add_extra_genesis", "storage extra genesis"); -custom_keyword_impl!(DeclStorageGetter, "get", "storage getter"); -custom_keyword!(MapKeyword, "map", "map as keyword"); -custom_keyword!(LinkedMapKeyword, "linked_map", "linked_map as keyword"); -custom_keyword!(DoubleMapKeyword, "double_map", "double_map as keyword"); -custom_keyword!(Blake2_256Keyword, "blake2_256", "Blake2_256 as keyword"); -custom_keyword!(Blake2_128Keyword, "blake2_128", "Blake2_128 as keyword"); -custom_keyword!(Twox256Keyword, "twox_256", "Twox256 as keyword"); -custom_keyword!(Twox128Keyword, "twox_128", "Twox128 as keyword"); -custom_keyword!(Twox64ConcatKeyword, "twox_64_concat", "Twox64Concat as keyword"); -custom_keyword_impl!(SetHasher, "hasher", "storage hasher"); diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index 3591ab88310f730dd3378992eebdefed011f660e..dc9adb8d8d5c25ce6b43a8858dcbab40c96b87a4 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -80,7 +80,7 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { Err(err) => return err.to_compile_error().into(), }; - let hidden_crate_name = hidden_crate.map(|rc| rc.ident.content).map(|i| i.to_string()) + let hidden_crate_name = hidden_crate.inner.map(|rc| rc.ident.content).map(|i| i.to_string()) .unwrap_or_else(|| "decl_storage".to_string()); let scrate = generate_crate_access(&hidden_crate_name, "srml-support"); let scrate_decl = generate_hidden_includes( @@ -109,7 +109,7 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { &traittype, &instance_opts, &storage_lines, - &extra_genesis, + &extra_genesis.inner, )); let decl_storage_items = decl_storage_items( &scrate, @@ -200,7 +200,7 @@ fn decl_store_extra_genesis( } = instance_opts; let mut is_trait_needed = false; - let mut serde_complete_bound = std::collections::HashSet::new(); + let mut serde_complete_bound = Vec::new(); let mut config_field = TokenStream2::new(); let mut config_field_default = TokenStream2::new(); let mut builders = TokenStream2::new(); @@ -232,7 +232,7 @@ fn decl_store_extra_genesis( let builder = if let Some(ref config) = config { let ident = if let Some(ident) = config.expr.content.as_ref() { quote!( #ident ) - } else if let Some(ref getter) = getter { + } else if let Some(ref getter) = getter.inner { let ident = &getter.getfn.content; quote!( #ident ) } else { @@ -250,9 +250,20 @@ fn decl_store_extra_genesis( is_trait_needed = true; } - serde_complete_bound.insert(type_infos.value_type); - if let DeclStorageTypeInfosKind::Map { key_type, .. } = type_infos.kind { - serde_complete_bound.insert(key_type); + let value_type = &type_infos.value_type; + serde_complete_bound.push(quote!( #value_type )); + match type_infos.kind { + DeclStorageTypeInfosKind::Map { key_type, .. } => + serde_complete_bound.push(quote!( #key_type )), + DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, .. } => { + serde_complete_bound.push(quote!( #key1_type )); + serde_complete_bound.push(quote!( #key2_type )); + }, + _ => {}, + } + + if type_infos.is_option { + serde_complete_bound.push(type_infos.typ.clone()); } // Propagate doc attributes. @@ -374,7 +385,7 @@ fn decl_store_extra_genesis( is_trait_needed = true; } - serde_complete_bound.insert(extra_type); + serde_complete_bound.push(quote!( #extra_type )); let extrafield = &extra_field.content; genesis_extrafields.extend(quote!{ @@ -722,7 +733,7 @@ fn decl_storage_items( i.linked_map(hasher.into_storage_hasher_struct(), key_type) }, DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, key2_hasher, hasher } => { - i.double_map(hasher.into_hashable_fn(), key1_type, key2_type, key2_hasher) + i.double_map(hasher.into_storage_hasher_struct(), key1_type, key2_type, key2_hasher) }, }; impls.extend(implementation) @@ -797,7 +808,7 @@ fn impl_store_fns( .. } = sline; - if let Some(getter) = getter { + if let Some(getter) = getter.inner.as_ref() { let get_fn = &getter.getfn.content; let type_infos = get_type_infos(storage_type); @@ -818,7 +829,10 @@ fn impl_store_fns( quote!{ #( #[ #attrs ] )* pub fn #get_fn() -> #value_type { - <#name<#struct_trait #instance> as #scrate::storage::hashed::generator::StorageValue<#typ>> :: get(&#scrate::storage::RuntimeStorage) + <#name<#struct_trait #instance> as + #scrate::storage::hashed::generator::StorageValue<#typ>> :: get( + &#scrate::storage::RuntimeStorage + ) } } }, @@ -1053,17 +1067,17 @@ fn get_type_infos(storage_type: &DeclStorageType) -> DeclStorageTypeInfos { let (value_type, kind) = match storage_type { DeclStorageType::Simple(ref st) => (st, DeclStorageTypeInfosKind::Simple), DeclStorageType::Map(ref map) => (&map.value, DeclStorageTypeInfosKind::Map { - hasher: map.hasher.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256), + hasher: map.hasher.inner.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256), key_type: &map.key, is_linked: false, }), DeclStorageType::LinkedMap(ref map) => (&map.value, DeclStorageTypeInfosKind::Map { - hasher: map.hasher.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256), + hasher: map.hasher.inner.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256), key_type: &map.key, is_linked: true, }), DeclStorageType::DoubleMap(ref map) => (&map.value, DeclStorageTypeInfosKind::DoubleMap { - hasher: map.hasher.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256), + hasher: map.hasher.inner.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256), key1_type: &map.key1, key2_type: &map.key2.content, key2_hasher: { let h = &map.key2_hasher; quote! { #h } }, diff --git a/srml/support/procedural/tools/Cargo.toml b/srml/support/procedural/tools/Cargo.toml index ef55ad1b2ee3347130bb35ab569fba42fbcba997..bb6d24def2da8c933fc1881e3bf4c53f39063dd0 100644 --- a/srml/support/procedural/tools/Cargo.toml +++ b/srml/support/procedural/tools/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-support-procedural-tools" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/srml/support/procedural/tools/derive/Cargo.toml b/srml/support/procedural/tools/derive/Cargo.toml index 5922911c671a269d95c9d309979c5fa9176b09c1..2f7f35ff4a70228423ec451aaf9c641c30e38699 100644 --- a/srml/support/procedural/tools/derive/Cargo.toml +++ b/srml/support/procedural/tools/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-support-procedural-tools-derive" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/srml/support/procedural/tools/derive/src/lib.rs b/srml/support/procedural/tools/derive/src/lib.rs index 0e3fcb22475fc2e9babeeb3a3c7268c4a16ab018..4bf1a5f44c252cfe97c8ea85318e9aa93f030f8e 100644 --- a/srml/support/procedural/tools/derive/src/lib.rs +++ b/srml/support/procedural/tools/derive/src/lib.rs @@ -58,7 +58,7 @@ pub(crate) fn fields_access( /// For enums: /// variant are tested in order of definition. /// Empty variant is always true. -/// Please use carefully, this will fully parse successfull variant twice. +/// Please use carefully, this will fully parse successful variant twice. #[proc_macro_derive(Parse)] pub fn derive_parse(input: TokenStream) -> TokenStream { let item = parse_macro_input!(input as syn::Item); diff --git a/srml/support/procedural/tools/src/lib.rs b/srml/support/procedural/tools/src/lib.rs index 34b96df8104b50e33656a3636cb55530d9f84963..1b8a580773d0b6eee6a0f2e16a2d04cc9fb96490 100644 --- a/srml/support/procedural/tools/src/lib.rs +++ b/srml/support/procedural/tools/src/lib.rs @@ -27,30 +27,6 @@ use quote::quote; pub mod syn_ext; -#[macro_export] -macro_rules! custom_keyword_impl { - ($name:ident, $keyident:expr, $keydisp:expr) => { - - impl CustomKeyword for $name { - fn ident() -> &'static str { $keyident } - fn display() -> &'static str { $keydisp } - } - - } -} - -#[macro_export] -macro_rules! custom_keyword { - ($name:ident, $keyident:expr, $keydisp:expr) => { - - #[derive(Debug)] - struct $name; - - custom_keyword_impl!($name, $keyident, $keydisp); - - } -} - // FIXME #1569, remove the following functions, which are copied from sr-api-macros use proc_macro2::{TokenStream, Span}; use syn::Ident; @@ -95,8 +71,8 @@ pub fn generate_hidden_includes(unique_id: &str, def_crate: &str) -> TokenStream } } -// fn to remove white spaces arount string types -// (basically whitespaces arount tokens) +// fn to remove white spaces around string types +// (basically whitespaces around tokens) pub fn clean_type_string(input: &str) -> String { input .replace(" ::", "::") diff --git a/srml/support/procedural/tools/src/syn_ext.rs b/srml/support/procedural/tools/src/syn_ext.rs index 365c0c8c64af088daae8c6568ef386ecbb0e95ba..506828cdc8f8a6afa1a74ff4021f51fd0cda86d8 100644 --- a/srml/support/procedural/tools/src/syn_ext.rs +++ b/srml/support/procedural/tools/src/syn_ext.rs @@ -22,7 +22,7 @@ use syn::{ visit::{Visit, self}, parse::{Parse, ParseStream, Result}, token::CustomKeyword, Ident, }; -use proc_macro2::{ TokenStream, TokenTree }; +use proc_macro2::{TokenStream, TokenTree}; use quote::{ToTokens, quote}; use std::iter::once; use srml_support_procedural_tools_derive::{ToTokens, Parse}; @@ -69,32 +69,6 @@ groups_impl!(Braces, Brace, Brace, parse_braces); groups_impl!(Brackets, Bracket, Bracket, parse_brackets); groups_impl!(Parens, Paren, Parenthesis, parse_parens); -#[derive(Debug, Clone)] -pub struct CustomToken(std::marker::PhantomData); - -impl Parse for CustomToken { - fn parse(input: ParseStream) -> Result { - let ident: syn::Ident = input.parse()?; - - if ident.to_string().as_str() != T::ident() { - return Err(syn::parse::Error::new_spanned(ident, "expected another custom token")) - } - Ok(CustomToken(std::marker::PhantomData)) - } -} - -impl ToTokens for CustomToken { - fn to_tokens(&self, tokens: &mut TokenStream) { - use std::str::FromStr; - tokens.extend(TokenStream::from_str(T::ident()).expect("custom keyword should parse to ident")); - } -} - -impl CustomKeyword for CustomToken { - fn ident() -> &'static str { ::ident() } - fn display() -> &'static str { ::display() } -} - #[derive(Debug)] pub struct PunctuatedInner { pub inner: syn::punctuated::Punctuated, diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index 48db2e748eabd44011ef3d4c92aae7ab4249dcdc..f2db609dc38b68df74e303fd1b7c6b1adb05fc5a 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -22,10 +22,7 @@ pub use crate::rstd::prelude::{Vec, Clone, Eq, PartialEq}; pub use std::fmt; pub use crate::rstd::result; pub use crate::codec::{Codec, Decode, Encode, Input, Output, HasCompact, EncodeAsRef}; -pub use srml_metadata::{ - FunctionMetadata, DecodeDifferent, DecodeDifferentArray, - FunctionArgumentMetadata, OuterDispatchMetadata, OuterDispatchCall -}; +pub use srml_metadata::{FunctionMetadata, DecodeDifferent, DecodeDifferentArray, FunctionArgumentMetadata}; /// A type that cannot be instantiated. pub enum Never {} @@ -776,6 +773,7 @@ macro_rules! decl_module { $type, } variant $fn_name; + $( #[doc = $doc_attr] )* $( $rest )* } }; @@ -803,6 +801,7 @@ macro_rules! decl_module { $type, } variant $fn_name; + $( #[doc = $doc_attr] )* $( $rest )* } }; @@ -862,7 +861,10 @@ macro_rules! decl_module { (@imp $(#[$attr:meta])* - pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?> + pub struct $mod_type:ident< + $trait_instance:ident: $trait_name:ident + $(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)? + > for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident { $( $(#[doc = $doc_attr:tt])* @@ -877,10 +879,17 @@ macro_rules! decl_module { { $( $on_finalize:tt )* } { $( $offchain:tt )* } ) => { + $crate::__check_reserved_fn_name! { + $($fn_name)* + } + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] - pub struct $mod_type<$trait_instance: $trait_name $(, $instance: $instantiable $( = $module_default_instance)?)?>($crate::rstd::marker::PhantomData<($trait_instance $(, $instance)?)>); + pub struct $mod_type< + $trait_instance: $trait_name + $(, $instance: $instantiable $( = $module_default_instance)?)? + >($crate::rstd::marker::PhantomData<($trait_instance $(, $instance)?)>); $crate::decl_module! { @impl_on_initialize @@ -1204,6 +1213,38 @@ macro_rules! __function_to_metadata { } } +#[macro_export] +#[doc(hidden)] +macro_rules! __check_reserved_fn_name { + (deposit_event $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error deposit_event); + }; + (on_initialize $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error on_initialize); + }; + (on_initialise $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error on_initialise); + }; + (on_finalize $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error on_finalize); + }; + (on_finalise $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error on_finalise); + }; + (offchain_worker $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error offchain_worker); + }; + ($t:ident $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!($( $rest )*); + }; + () => {}; + (@compile_error $ident:ident) => { + compile_error!(concat!("Invalid call fn name: `", stringify!($ident), + "`, name is reserved and doesn't match expected signature, please refer to `decl_module!`", + " documentation to see the appropriate usage, or rename it to an unreserved keyword.")); + }; +} + #[cfg(test)] // Do not complain about unused `dispatch` and `dispatch_aux`. #[allow(dead_code)] diff --git a/srml/support/src/event.rs b/srml/support/src/event.rs index b64927b40d9635d327ba6ab9fd592aab5de99c50..03811f4c1cd33da815baf0bf26fa93836aa61fda 100644 --- a/srml/support/src/event.rs +++ b/srml/support/src/event.rs @@ -87,7 +87,7 @@ pub use srml_metadata::{EventMetadata, DecodeDifferent, OuterEventMetadata, FnEn /// type Token; /// } /// -/// // For module with instances, DefaultInstance is optionnal +/// // For module with instances, DefaultInstance is optional /// srml_support::decl_event!( /// pub enum Event where /// ::Balance, @@ -665,7 +665,7 @@ mod tests { } decl_event!( - /// Event finish formatting on an named one with trailling comma + /// Event finish formatting on an named one with trailing comma pub enum Event where BalanceRenamed = ::Balance, OriginRenamed = ::Origin, diff --git a/srml/support/src/inherent.rs b/srml/support/src/inherent.rs index 8a4fb669d15daafacb4cfaf6643374c70d2206cb..d886abbca7e373ece226eed2fdd0a4c7c011f51c 100644 --- a/srml/support/src/inherent.rs +++ b/srml/support/src/inherent.rs @@ -29,7 +29,7 @@ pub use inherents::{InherentData, ProvideInherent, CheckInherentsResult, IsFatal /// /// ```nocompile /// impl_outer_inherent! { -/// pub struct InherentData where Block = Block, UncheckedExtrinsic = UncheckedExtrinsic { +/// impl Inherents where Block = Block, UncheckedExtrinsic = UncheckedExtrinsic { /// timestamp: Timestamp, /// consensus: Consensus, /// /// Aura module using the `Timestamp` call. diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index 4a61451f84f3dd11c06c7b74e496a2a35776a730..2dc364f3f584856dd5f1630f941104903f67d501 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -17,7 +17,6 @@ //! Support code for the runtime. #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] #[macro_use] extern crate bitmask; @@ -53,18 +52,58 @@ pub mod metadata; mod runtime; #[macro_use] pub mod inherent; +#[macro_use] +pub mod unsigned; mod double_map; pub mod traits; -pub use self::storage::{StorageList, StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap}; +pub use self::storage::{ + StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap, AppendableStorageMap +}; pub use self::hashable::Hashable; pub use self::dispatch::{Parameter, Dispatchable, Callable, IsSubType}; pub use self::double_map::StorageDoubleMapWithHasher; -pub use runtime_io::print; +pub use runtime_io::{print, storage_root}; + +/// Macro for easily creating a new implementation of the `Get` trait. Use similarly to +/// how you would declare a `const`: +/// +/// ```no_compile +/// parameter_types! { +/// pub const Argument: u64 = 42; +/// } +/// trait Config { +/// type Parameter: Get; +/// } +/// struct Runtime; +/// impl Config for Runtime { +/// type Parameter = Argument; +/// } +/// ``` +#[macro_export] +macro_rules! parameter_types { + (pub const $name:ident: $type:ty = $value:expr; $( $rest:tt )*) => ( + pub struct $name; + $crate::parameter_types!{IMPL $name , $type , $value} + $crate::parameter_types!{ $( $rest )* } + ); + (const $name:ident: $type:ty = $value:expr; $( $rest:tt )*) => ( + struct $name; + $crate::parameter_types!{IMPL $name , $type , $value} + $crate::parameter_types!{ $( $rest )* } + ); + () => (); + (IMPL $name:ident , $type:ty , $value:expr) => { + impl $crate::traits::Get<$type> for $name { fn get() -> $type { $value } } + } +} #[doc(inline)] pub use srml_support_procedural::decl_storage; +/// Return Err of the expression: `return Err($expression);`. +/// +/// Used as `fail!(expression)`. #[macro_export] macro_rules! fail { ( $y:expr ) => {{ @@ -72,6 +111,9 @@ macro_rules! fail { }} } +/// Evaluate `$x:expr` and if not true return `Err($y:expr)`. +/// +/// Used as `ensure!(expression_to_ensure, expression_to_return_on_false)`. #[macro_export] macro_rules! ensure { ( $x:expr, $y:expr ) => {{ @@ -81,16 +123,27 @@ macro_rules! ensure { }} } +/// Evaluate an expression, assert it returns an expected `Err` value and that +/// runtime storage has not been mutated (i.e. expression is a no-operation). +/// +/// Used as `assert_noop(expression_to_assert, expected_error_expression)`. #[macro_export] #[cfg(feature = "std")] macro_rules! assert_noop { ( $x:expr , $y:expr ) => { - let h = runtime_io::storage_root(); + let h = $crate::storage_root(); $crate::assert_err!($x, $y); - assert_eq!(h, runtime_io::storage_root()); + assert_eq!(h, $crate::storage_root()); } } +/// Panic if an expression doesn't evaluate to an `Err`. +/// +/// Used as `assert_err!(expression_to_assert, expected_err_expression)`. + +/// Assert an expression returns an error specified. +/// +/// Used as `assert_err!(expression_to_assert, expected_error_expression)` #[macro_export] #[cfg(feature = "std")] macro_rules! assert_err { @@ -99,6 +152,10 @@ macro_rules! assert_err { } } +/// Panic if an expression doesn't evaluate to `Ok`. +/// +/// Used as `assert_ok!(expression_to_assert, expected_ok_expression)`, +/// or `assert_ok!(expression_to_assert)` which would assert against `Ok(())`. #[macro_export] #[cfg(feature = "std")] macro_rules! assert_ok { @@ -213,6 +270,7 @@ mod tests { pub DataDM config(test_config) build(|_| vec![(15u32, 16u32, 42u64)]): double_map hasher(twox_64_concat) u32, blake2_256(u32) => u64; pub GenericDataDM: double_map T::BlockNumber, twox_128(T::BlockNumber) => T::BlockNumber; pub GenericData2DM: double_map T::BlockNumber, twox_256(T::BlockNumber) => Option; + pub AppendableDM: double_map u32, blake2_256(T::BlockNumber) => Vec; } } @@ -342,6 +400,21 @@ mod tests { assert_eq!(DoubleMap::get(key1, key2+1), 0u64); assert_eq!(DoubleMap::get(key1+1, key2), 4u64); assert_eq!(DoubleMap::get(key1+1, key2+1), 4u64); + + }); + } + + #[test] + fn double_map_append_should_work() { + with_externalities(&mut new_test_ext(), || { + type DoubleMap = AppendableDM; + + let key1 = 17u32; + let key2 = 18u32; + + DoubleMap::insert(key1, key2, vec![1]); + DoubleMap::append(key1, key2, &[2, 3]).unwrap(); + assert_eq!(DoubleMap::get(key1, key2), vec![1, 2, 3]); }); } @@ -428,6 +501,21 @@ mod tests { ), documentation: DecodeDifferent::Encode(&[]), }, + StorageFunctionMetadata { + name: DecodeDifferent::Encode("AppendableDM"), + modifier: StorageFunctionModifier::Default, + ty: StorageFunctionType::DoubleMap{ + hasher: StorageHasher::Blake2_256, + key1: DecodeDifferent::Encode("u32"), + key2: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("Vec"), + key2_hasher: DecodeDifferent::Encode("blake2_256"), + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, ]) }; diff --git a/srml/support/src/metadata.rs b/srml/support/src/metadata.rs index 407408b52c84768474c42b80f56360aa89ad3374..ed3e443afdcf414cfb718b1b0aafabd9a4e2b535 100644 --- a/srml/support/src/metadata.rs +++ b/srml/support/src/metadata.rs @@ -246,7 +246,8 @@ mod tests { mod system { pub trait Trait { - type Origin: Into>> + From>; + type Origin: Into, Self::Origin>> + + From>; type AccountId; type BlockNumber; } @@ -265,14 +266,14 @@ mod tests { pub enum RawOrigin { Root, Signed(AccountId), - Inherent, + None, } impl From> for RawOrigin { fn from(s: Option) -> RawOrigin { match s { Some(who) => RawOrigin::Signed(who), - None => RawOrigin::Inherent, + None => RawOrigin::None, } } } diff --git a/srml/support/src/origin.rs b/srml/support/src/origin.rs index 1ef922ce16a12532b156a654c8913e4b3ab17916..6a237b4b5e1c8b5fc83c30cceb6c2c2062bd512d 100644 --- a/srml/support/src/origin.rs +++ b/srml/support/src/origin.rs @@ -169,7 +169,7 @@ macro_rules! impl_outer_origin { #[allow(dead_code)] impl $name { - pub const INHERENT: Self = $name::system($system::RawOrigin::Inherent); + pub const NONE: Self = $name::system($system::RawOrigin::None); pub const ROOT: Self = $name::system($system::RawOrigin::Root); pub fn signed(by: <$runtime as $system::Trait>::AccountId) -> Self { $name::system($system::RawOrigin::Signed(by)) @@ -180,12 +180,12 @@ macro_rules! impl_outer_origin { $name::system(x) } } - impl Into>> for $name { - fn into(self) -> Option<$system::Origin<$runtime>> { + impl Into<$crate::rstd::result::Result<$system::Origin<$runtime>, $name>> for $name { + fn into(self) -> $crate::rstd::result::Result<$system::Origin<$runtime>, Self> { if let $name::system(l) = self { - Some(l) + Ok(l) } else { - None + Err(self) } } } @@ -201,12 +201,20 @@ macro_rules! impl_outer_origin { $name::[< $module $( _ $generic_instance )? >](x) } } - impl Into>> for $name { - fn into(self) -> Option<$module::Origin < $( $generic )? $(, $module::$generic_instance )? > > { + impl Into< + $crate::rstd::result::Result< + $module::Origin < $( $generic )? $(, $module::$generic_instance )? >>, + $name, + > + for $name { + fn into(self) -> $crate::rstd::result::Result< + $module::Origin < $( $generic )? $(, $module::$generic_instance )? >, + Self, + > { if let $name::[< $module $( _ $generic_instance )? >](l) = self { - Some(l) + Ok(l) } else { - None + Err(self) } } } @@ -226,14 +234,14 @@ mod tests { pub enum RawOrigin { Root, Signed(AccountId), - Inherent, + None, } impl From> for RawOrigin { fn from(s: Option) -> RawOrigin { match s { Some(who) => RawOrigin::Signed(who), - None => RawOrigin::Inherent, + None => RawOrigin::None, } } } diff --git a/srml/support/src/runtime.rs b/srml/support/src/runtime.rs index adb01cad180a547868c4e66c9971339bd71bbdc1..930c3865ca6a774bdadb42edf7c99e7ac64caa81 100644 --- a/srml/support/src/runtime.rs +++ b/srml/support/src/runtime.rs @@ -17,13 +17,14 @@ //! Macros to define a runtime. A runtime is basically all your logic running in Substrate, //! consisting of selected SRML modules and maybe some of your own modules. //! A lot of supporting logic is automatically generated for a runtime, -//! mostly for to combine data types and metadata of the included modules. +//! mostly to combine data types and metadata of the included modules. /// Construct a runtime, with the given name and the given modules. /// -/// The parameters here are specific types for Block, NodeBlock and InherentData -/// (TODO: describe the difference between Block and NodeBlock) -/// and the modules that are used by the runtime. +/// The parameters here are specific types for `Block`, `NodeBlock`, and `InherentData` +/// and the modules that are used by the runtime. +/// `Block` is the block type that is used in the runtime and `NodeBlock` is the block type +/// that is used in the node. For instance they can differ in the extrinsics type. /// /// # Example: /// @@ -56,6 +57,7 @@ /// `Test2: test_with_long_module::{Module}`. /// /// We provide support for the following types in a module: +/// /// - `Module` /// - `Call` /// - `Storage` @@ -66,11 +68,13 @@ /// - `Inherent $( (CALL) )*` - If the module provides/can check inherents. The optional parameter /// is for modules that use a `Call` from a different module as /// inherent. +/// - `ValidateUnsigned` - If the module validates unsigned extrinsics. /// /// # Note /// /// The population of the genesis storage depends on the order of modules. So, if one of your -/// modules depends on another module. The dependent module need to come before the module depending on it. +/// modules depends on another module, the module that is depended upon needs to come before +/// the module depending on it. #[macro_export] macro_rules! construct_runtime { @@ -262,9 +266,16 @@ macro_rules! construct_runtime { $uncheckedextrinsic; ; $( - $name: $module::{ $( $modules $( ( $( $modules_args ),* ) )* ),* } + $name: $module::{ $( $modules $( ( $( $modules_args )* ) )* ),* } ),*; ); + $crate::__impl_outer_validate_unsigned!( + $runtime; + {}; + $( + $name: $module::{ $( $modules $( ( $( $modules_args )* ) )* )* } + )* + ); } } @@ -336,12 +347,28 @@ macro_rules! __create_decl_macro { $d( $rest )* ); }; + (@inner + $runtime:ident; + $d( $system:ident )?; + { $d( $parsed:tt )* }; + $name:ident : $module:ident:: < $module_instance:ident >:: { + $macro_enum_name $d( <$event_generic:ident> )* $d(, $ignore:ident $d( <$ignor:ident> )* )* + }, + $d( $rest:tt )* + ) => { + compile_error!{concat!{ + "Module `", stringify!{$name}, "` must have `", stringify!{$macro_enum_name}, "`", + " but has `", stringify!{$macro_enum_name} $d(, "<", stringify!{$event_generic}, ">")*, "`", + ": Instantiated modules must have ", stringify!{$macro_enum_name}, + " generic over instance to be able to convert to outer ", stringify!{$macro_enum_name} + }} + }; (@inner $runtime:ident; $d( $system:ident )?; { $d( $parsed:tt )* }; $name:ident : $module:ident:: { - $macro_enum_name $d( <$event_generic:ident> )* $d(, $ingore:ident $d( <$ignor:ident> )* )* + $macro_enum_name $d( <$event_generic:ident> )* $d(, $ignore:ident $d( <$ignor:ident> )* )* }, $d( $rest:tt )* ) => { @@ -445,7 +472,7 @@ macro_rules! __decl_all_modules { $runtime:ident; $( $system:ident )?; { $( $parsed:tt )* }; - $name:ident: $module:ident:: $( < $module_instance:ident >:: )? { $ingore:ident $(, $modules:ident )* }, + $name:ident: $module:ident:: $( < $module_instance:ident >:: )? { $ignore:ident $(, $modules:ident )* }, $( $rest:tt )* ) => { $crate::__decl_all_modules!( @@ -492,7 +519,7 @@ macro_rules! __decl_outer_dispatch { $runtime:ident; $( $parsed_modules:ident :: $parsed_name:ident ),*; System: $module:ident::{ - $ingore:ident $( <$ignor:ident> )* $(, $modules:ident $( <$modules_generic:ident> )* )* + $ignore:ident $( <$ignor:ident> )* $(, $modules:ident $( <$modules_generic:ident> )* )* } $(, $rest_name:ident : $rest_module:ident::{ $( $rest_modules:ident $( <$rest_modules_generic:ident> )* ),* @@ -532,7 +559,7 @@ macro_rules! __decl_outer_dispatch { $runtime:ident; $( $parsed_modules:ident :: $parsed_name:ident ),*; $name:ident: $module:ident::{ - $ingore:ident $( <$ignor:ident> )* $(, $modules:ident $( <$modules_generic:ident> )* )* + $ignore:ident $( <$ignor:ident> )* $(, $modules:ident $( <$modules_generic:ident> )* )* } $(, $rest_name:ident : $rest_module:ident::{ $( $rest_modules:ident $( <$rest_modules_generic:ident> )* ),* @@ -848,7 +875,7 @@ macro_rules! __decl_outer_inherent { $uncheckedextrinsic:ident; $( $parsed_name:ident :: $parsed_call:ident ),*; $name:ident: $module:ident::{ - $ingore:ident $( ( $( $ignor:ident )* ) )* + $ignore:ident $( ( $( $ignor:ident )* ) )* $(, $modules:ident $( ( $( $modules_call:ident )* ) )* )* } $(, $rest_name:ident : $rest_module:ident::{ @@ -915,3 +942,65 @@ macro_rules! __decl_instance_import { } }; } + +/// A private macro that calls impl_outer_validate_unsigned for Call. +#[macro_export] +#[doc(hidden)] +macro_rules! __impl_outer_validate_unsigned { + ( + $runtime:ident; + { $( $parsed:tt )* }; + $name:ident: $module:ident:: $(<$module_instance:ident>::)? { + ValidateUnsigned $( $modules:ident $( ( $( $modules_args:ident )* ) )* )* + } + $( $rest:tt )* + ) => { + $crate::__impl_outer_validate_unsigned!( + $runtime; + { $( $parsed )* $name }; + $( $rest )* + ); + }; + ( + $runtime:ident; + { $( $parsed:tt )* }; + $name:ident: $module:ident:: $(<$module_instance:ident>::)? { + $ignore:ident $( ( $( $args_ignore:ident )* ) )* + $( $modules:ident $( ( $( $modules_args:ident )* ) )* )* + } + $( $rest:tt )* + ) => { + $crate::__impl_outer_validate_unsigned!( + $runtime; + { $( $parsed )* }; + $name: $module:: $(<$module_instance>::)? { + $( $modules $( ( $( $modules_args )* ) )* )* + } + $( $rest )* + ); + }; + ( + $runtime:ident; + { $( $parsed:tt )* }; + $name:ident: $module:ident:: $(<$module_instance:ident>::)? {} + $( $rest:tt )* + ) => { + $crate::__impl_outer_validate_unsigned!( + $runtime; + { $( $parsed )* }; + $( $rest )* + ); + }; + ( + $runtime:ident; + { $( + $parsed_modules:ident + )* }; + ) => { + $crate::impl_outer_validate_unsigned!( + impl ValidateUnsigned for $runtime { + $( $parsed_modules )* + } + ); + }; +} diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs index 12600a9eafa6a9239f9aeb8d2d508c1dbadc7998..5a8b2f9d8f54b0fe4f51edb715aafa8614bf589a 100644 --- a/srml/support/src/storage/hashed/generator.rs +++ b/srml/support/src/storage/hashed/generator.rs @@ -103,25 +103,25 @@ pub trait HashedStorage { } /// Put a value in under a key. - fn put(&self, key: &[u8], val: &T); + fn put(&mut self, key: &[u8], val: &T); /// Remove the bytes of a key from storage. - fn kill(&self, key: &[u8]); + fn kill(&mut self, key: &[u8]); /// Take a value from storage, deleting it after reading. - fn take(&self, key: &[u8]) -> Option { + fn take(&mut self, key: &[u8]) -> Option { let value = self.get(key); self.kill(key); value } /// Take a value from storage, deleting it after reading. - fn take_or_panic(&self, key: &[u8]) -> T { + fn take_or_panic(&mut self, key: &[u8]) -> T { self.take(key).expect("Required values must be in storage") } /// Take a value from storage, deleting it after reading. - fn take_or_default(&self, key: &[u8]) -> T { + fn take_or_default(&mut self, key: &[u8]) -> T { self.take(key).unwrap_or_default() } @@ -129,12 +129,12 @@ pub trait HashedStorage { fn get_raw(&self, key: &[u8]) -> Option>; /// Put a raw byte slice into storage. - fn put_raw(&self, key: &[u8], value: &[u8]); + fn put_raw(&mut self, key: &[u8], value: &[u8]); } // We use a construct like this during when genesis storage is being built. #[cfg(feature = "std")] -impl HashedStorage for std::cell::RefCell<&mut sr_primitives::StorageOverlay> { +impl HashedStorage for sr_primitives::StorageOverlay { fn exists(&self, key: &[u8]) -> bool { UnhashedStorage::exists(self, &H::hash(key).as_ref()) } @@ -143,11 +143,11 @@ impl HashedStorage for std::cell::RefCell<&mut sr_primitive UnhashedStorage::get(self, &H::hash(key).as_ref()) } - fn put(&self, key: &[u8], val: &T) { + fn put(&mut self, key: &[u8], val: &T) { UnhashedStorage::put(self, &H::hash(key).as_ref(), val) } - fn kill(&self, key: &[u8]) { + fn kill(&mut self, key: &[u8]) { UnhashedStorage::kill(self, &H::hash(key).as_ref()) } @@ -155,7 +155,7 @@ impl HashedStorage for std::cell::RefCell<&mut sr_primitive UnhashedStorage::get_raw(self, &H::hash(key).as_ref()) } - fn put_raw(&self, key: &[u8], value: &[u8]) { + fn put_raw(&mut self, key: &[u8], value: &[u8]) { UnhashedStorage::put_raw(self, &H::hash(key).as_ref(), value) } } @@ -177,18 +177,18 @@ pub trait StorageValue { fn get>(storage: &S) -> Self::Query; /// Take a value from storage, removing it afterwards. - fn take>(storage: &S) -> Self::Query; + fn take>(storage: &mut S) -> Self::Query; /// Store a value under this key into the provided storage instance. - fn put>(val: &T, storage: &S) { + fn put>(val: &T, storage: &mut S) { storage.put(Self::key(), val) } /// Mutate this value - fn mutate R, S: HashedStorage>(f: F, storage: &S) -> R; + fn mutate R, S: HashedStorage>(f: F, storage: &mut S) -> R; /// Clear the storage value. - fn kill>(storage: &S) { + fn kill>(storage: &mut S) { storage.kill(Self::key()) } @@ -196,7 +196,7 @@ pub trait StorageValue { /// /// `T` is required to implement `codec::EncodeAppend`. fn append, I: codec::Encode>( - items: &[I], storage: &S + items: &[I], storage: &mut S ) -> Result<(), &'static str> where T: codec::EncodeAppend { let new_val = ::append( storage.get_raw(Self::key()).unwrap_or_default(), @@ -207,36 +207,6 @@ pub trait StorageValue { } } -/// A strongly-typed list in storage. -pub trait StorageList { - /// Get the prefix key in storage. - fn prefix() -> &'static [u8]; - - /// Get the key used to put the length field. - fn len_key() -> Vec; - - /// Get the storage key used to fetch a value at a given index. - fn key_for(index: u32) -> Vec; - - /// Read out all the items. - fn items>(storage: &S) -> Vec; - - /// Set the current set of items. - fn set_items>(items: &[T], storage: &S); - - /// Set the item at the given index. - fn set_item>(index: u32, item: &T, storage: &S); - - /// Load the value at given index. Returns `None` if the index is out-of-bounds. - fn get>(index: u32, storage: &S) -> Option; - - /// Load the length of the list - fn len>(storage: &S) -> u32; - - /// Clear the list. - fn clear>(storage: &S); -} - /// A strongly-typed map in storage. pub trait StorageMap { /// The type that get/take returns. @@ -259,20 +229,20 @@ pub trait StorageMap { fn get>(key: &K, storage: &S) -> Self::Query; /// Take the value under a key. - fn take>(key: &K, storage: &S) -> Self::Query; + fn take>(key: &K, storage: &mut S) -> Self::Query; /// Store a value to be associated with the given key from the map. - fn insert>(key: &K, val: &V, storage: &S) { + fn insert>(key: &K, val: &V, storage: &mut S) { storage.put(&Self::key_for(key)[..], val); } /// Remove the value under a key. - fn remove>(key: &K, storage: &S) { + fn remove>(key: &K, storage: &mut S) { storage.kill(&Self::key_for(key)[..]); } /// Mutate the value under a key. - fn mutate R, S: HashedStorage>(key: &K, f: F, storage: &S) -> R; + fn mutate R, S: HashedStorage>(key: &K, f: F, storage: &mut S) -> R; } /// A `StorageMap` with enumerable entries. @@ -281,5 +251,25 @@ pub trait EnumerableStorageMap: StorageMap>(storage: &S) -> Option; /// Enumerate all elements in the map. - fn enumerate<'a, S: HashedStorage>(storage: &'a S) -> Box + 'a> where K: 'a, V: 'a; + fn enumerate<'a, S: HashedStorage>( + storage: &'a S + ) -> Box + 'a> where K: 'a, V: 'a; +} + +/// A `StorageMap` with appendable entries. +pub trait AppendableStorageMap: StorageMap { + /// Append the given items to the value in the storage. + /// + /// `T` is required to implement `codec::EncodeAppend`. + fn append, I: codec::Encode>( + key : &K, items: &[I], storage: &mut S + ) -> Result<(), &'static str> where V: codec::EncodeAppend { + let k = Self::key_for(key); + let new_val = ::append( + storage.get_raw(&k[..]).unwrap_or_default(), + items, + ).ok_or_else(|| "Could not append given item")?; + storage.put_raw(&k[..], &new_val); + Ok(()) + } } diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs index fb23383c9d11301075544454404edbaea747bf2b..a1891dade3b0c5b4010824c0bff8e641e18f9194 100644 --- a/srml/support/src/storage/mod.rs +++ b/srml/support/src/storage/mod.rs @@ -70,17 +70,17 @@ impl HashedStorage for RuntimeStorage { } /// Put a value in under a key. - fn put(&self, key: &[u8], val: &T) { + fn put(&mut self, key: &[u8], val: &T) { hashed::put(&H::hash, key, val) } /// Remove the bytes of a key from storage. - fn kill(&self, key: &[u8]) { + fn kill(&mut self, key: &[u8]) { hashed::kill(&H::hash, key) } /// Take a value from storage, deleting it after reading. - fn take(&self, key: &[u8]) -> Option { + fn take(&mut self, key: &[u8]) -> Option { hashed::take(&H::hash, key) } @@ -88,7 +88,7 @@ impl HashedStorage for RuntimeStorage { hashed::get_raw(&H::hash, key) } - fn put_raw(&self, key: &[u8], value: &[u8]) { + fn put_raw(&mut self, key: &[u8], value: &[u8]) { hashed::put_raw(&H::hash, key, value) } } @@ -104,22 +104,22 @@ impl UnhashedStorage for RuntimeStorage { } /// Put a value in under a key. - fn put(&self, key: &[u8], val: &T) { + fn put(&mut self, key: &[u8], val: &T) { unhashed::put(key, val) } /// Remove the bytes of a key from storage. - fn kill(&self, key: &[u8]) { + fn kill(&mut self, key: &[u8]) { unhashed::kill(key) } /// Remove the bytes of a key from storage. - fn kill_prefix(&self, prefix: &[u8]) { + fn kill_prefix(&mut self, prefix: &[u8]) { unhashed::kill_prefix(prefix) } /// Take a value from storage, deleting it after reading. - fn take(&self, key: &[u8]) -> Option { + fn take(&mut self, key: &[u8]) -> Option { unhashed::take(key) } @@ -127,7 +127,7 @@ impl UnhashedStorage for RuntimeStorage { unhashed::get_raw(key) } - fn put_raw(&self, key: &[u8], value: &[u8]) { + fn put_raw(&mut self, key: &[u8], value: &[u8]) { unhashed::put_raw(key, value) } } @@ -178,89 +178,21 @@ impl StorageValue for U where U: hashed::generator::StorageValue U::get(&RuntimeStorage) } fn put>(val: Arg) { - U::put(val.borrow(), &RuntimeStorage) + U::put(val.borrow(), &mut RuntimeStorage) } fn mutate R>(f: F) -> R { - U::mutate(f, &RuntimeStorage) + U::mutate(f, &mut RuntimeStorage) } fn kill() { - U::kill(&RuntimeStorage) + U::kill(&mut RuntimeStorage) } fn take() -> Self::Query { - U::take(&RuntimeStorage) + U::take(&mut RuntimeStorage) } fn append(items: &[I]) -> Result<(), &'static str> where T: EncodeAppend { - U::append(items, &RuntimeStorage) - } -} - -/// A strongly-typed list in storage. -pub trait StorageList { - /// Get the prefix key in storage. - fn prefix() -> &'static [u8]; - - /// Get the key used to store the length field. - fn len_key() -> Vec; - - /// Get the storage key used to fetch a value at a given index. - fn key_for(index: u32) -> Vec; - - /// Read out all the items. - fn items() -> Vec; - - /// Set the current set of items. - fn set_items(items: &[T]); - - /// Set the item at the given index. - fn set_item>(index: u32, val: Arg); - - /// Load the value at given index. Returns `None` if the index is out-of-bounds. - fn get(index: u32) -> Option; - - /// Load the length of the list - fn len() -> u32; - - /// Clear the list. - fn clear(); -} - -impl StorageList for U where U: hashed::generator::StorageList { - fn prefix() -> &'static [u8] { - >::prefix() - } - - fn len_key() -> Vec { - >::len_key() - } - - fn key_for(index: u32) -> Vec { - >::key_for(index) - } - - fn items() -> Vec { - U::items(&RuntimeStorage) - } - - fn set_items(items: &[T]) { - U::set_items(items, &RuntimeStorage) - } - - fn set_item>(index: u32, val: Arg) { - U::set_item(index, val.borrow(), &RuntimeStorage) - } - - fn get(index: u32) -> Option { - U::get(index, &RuntimeStorage) - } - - fn len() -> u32 { - U::len(&RuntimeStorage) - } - - fn clear() { - U::clear(&RuntimeStorage) + U::append(items, &mut RuntimeStorage) } } @@ -314,26 +246,45 @@ impl StorageMap for U where U: hashed::generator::S } fn insert, ValArg: Borrow>(key: KeyArg, val: ValArg) { - U::insert(key.borrow(), val.borrow(), &RuntimeStorage) + U::insert(key.borrow(), val.borrow(), &mut RuntimeStorage) } fn remove>(key: KeyArg) { - U::remove(key.borrow(), &RuntimeStorage) + U::remove(key.borrow(), &mut RuntimeStorage) } fn mutate, R, F: FnOnce(&mut Self::Query) -> R>(key: KeyArg, f: F) -> R { - U::mutate(key.borrow(), f, &RuntimeStorage) + U::mutate(key.borrow(), f, &mut RuntimeStorage) } fn take>(key: KeyArg) -> Self::Query { - U::take(key.borrow(), &RuntimeStorage) + U::take(key.borrow(), &mut RuntimeStorage) + } +} + +/// A storage map with values that can be appended to. +pub trait AppendableStorageMap: StorageMap { + /// Append the given item to the value in the storage. + /// + /// `T` is required to implement `codec::EncodeAppend`. + fn append, I: Encode>(key: KeyArg, items: &[I]) -> Result<(), &'static str> + where V: EncodeAppend; +} + +impl AppendableStorageMap for U + where U: hashed::generator::AppendableStorageMap +{ + fn append, I: Encode>(key: KeyArg, items: &[I]) -> Result<(), &'static str> + where V: EncodeAppend + { + U::append(key.borrow(), items, &mut RuntimeStorage) } } /// A storage map that can be enumerated. /// -/// Note that type is primarily useful for off-chain computations. -/// Runtime implementors should avoid enumerating storage entries. +/// Primarily useful for off-chain computations. +/// Runtime implementors should avoid enumerating storage entries on-chain. pub trait EnumerableStorageMap: StorageMap { /// Return current head element. fn head() -> Option; @@ -342,7 +293,9 @@ pub trait EnumerableStorageMap: StorageMap { fn enumerate() -> Box> where K: 'static, V: 'static; } -impl EnumerableStorageMap for U where U: hashed::generator::EnumerableStorageMap { +impl EnumerableStorageMap for U + where U: hashed::generator::EnumerableStorageMap +{ fn head() -> Option { >::head(&RuntimeStorage) } @@ -401,6 +354,20 @@ pub trait StorageDoubleMap { KArg1: Borrow, KArg2: Borrow, F: FnOnce(&mut Self::Query) -> R; + + /// Append the given items to the value under the key specified. + /// + /// `V` is required to implement `codec::EncodeAppend`. + fn append( + k1: KArg1, + k2: KArg2, + items: &[I], + ) -> Result<(), &'static str> + where + KArg1: Borrow, + KArg2: Borrow, + I: codec::Encode, + V: EncodeAppend; } impl StorageDoubleMap for U @@ -430,19 +397,19 @@ where } fn take, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query { - U::take(k1.borrow(), k2.borrow(), &RuntimeStorage) + U::take(k1.borrow(), k2.borrow(), &mut RuntimeStorage) } fn insert, KArg2: Borrow, VArg: Borrow>(k1: KArg1, k2: KArg2, val: VArg) { - U::insert(k1.borrow(), k2.borrow(), val.borrow(), &RuntimeStorage) + U::insert(k1.borrow(), k2.borrow(), val.borrow(), &mut RuntimeStorage) } fn remove, KArg2: Borrow>(k1: KArg1, k2: KArg2) { - U::remove(k1.borrow(), k2.borrow(), &RuntimeStorage) + U::remove(k1.borrow(), k2.borrow(), &mut RuntimeStorage) } fn remove_prefix>(k1: KArg1) { - U::remove_prefix(k1.borrow(), &RuntimeStorage) + U::remove_prefix(k1.borrow(), &mut RuntimeStorage) } fn mutate(k1: KArg1, k2: KArg2, f: F) -> R @@ -451,7 +418,21 @@ where KArg2: Borrow, F: FnOnce(&mut Self::Query) -> R { - U::mutate(k1.borrow(), k2.borrow(), f, &RuntimeStorage) + U::mutate(k1.borrow(), k2.borrow(), f, &mut RuntimeStorage) + } + + fn append( + k1: KArg1, + k2: KArg2, + items: &[I], + ) -> Result<(), &'static str> + where + KArg1: Borrow, + KArg2: Borrow, + I: codec::Encode, + V: EncodeAppend, + { + U::append(k1.borrow(), k2.borrow(), items, &mut RuntimeStorage) } } diff --git a/srml/support/src/storage/storage_items.rs b/srml/support/src/storage/storage_items.rs index 989b37a173ab10be9ba134206e886b473d34308c..38f996a6853c1a9eb696e15e6b21032b3a67f418 100644 --- a/srml/support/src/storage/storage_items.rs +++ b/srml/support/src/storage/storage_items.rs @@ -22,7 +22,6 @@ //! Three kinds of data types are currently supported: //! - values //! - maps -//! - lists //! //! # Examples: //! @@ -39,8 +38,6 @@ //! pub Value: b"putd_key" => SessionKey; //! // private map. //! Balances: b"private_map:" => map [AuthorityId => Balance]; -//! // private list. -//! Authorities: b"auth:" => list [AuthorityId]; //! } //! //!# fn main() { } @@ -159,16 +156,6 @@ macro_rules! storage_items { storage_items!($($t)*); }; - - // lists - ($name:ident : $prefix:expr => list [$ty:ty]; $($t:tt)*) => { - $crate::__storage_items_internal!(() $name: $prefix => list [$ty]); - storage_items!($($t)*); - }; - (pub $name:ident : $prefix:expr => list [$ty:ty]; $($t:tt)*) => { - $crate::__storage_items_internal!((pub) $name: $prefix => list [$ty]); - storage_items!($($t)*); - }; () => () } @@ -197,12 +184,12 @@ macro_rules! __storage_items_internal { } /// Take a value from storage, removing it afterwards. - fn take>(storage: &S) -> Self::Query { + fn take>(storage: &mut S) -> Self::Query { storage.$taker($key) } /// Mutate this value. - fn mutate R, S: $crate::HashedStorage<$crate::Twox128>>(f: F, storage: &S) -> R { + fn mutate R, S: $crate::HashedStorage<$crate::Twox128>>(f: F, storage: &mut S) -> R { let mut val = >::get(storage); let ret = f(&mut val); @@ -256,13 +243,13 @@ macro_rules! __storage_items_internal { } /// Take the value, reading and removing it. - fn take>(key: &$kty, storage: &S) -> Self::Query { + fn take>(key: &$kty, storage: &mut S) -> Self::Query { let key = <$name as $crate::storage::hashed::generator::StorageMap<$kty, $ty>>::key_for(key); storage.$taker(&key[..]) } /// Mutate the value under a key. - fn mutate R, S: $crate::HashedStorage>(key: &$kty, f: F, storage: &S) -> R { + fn mutate R, S: $crate::HashedStorage>(key: &$kty, f: F, storage: &mut S) -> R { let mut val = >::take(key, storage); let ret = f(&mut val); @@ -282,84 +269,6 @@ macro_rules! __storage_items_internal { } } }; - // generator for lists. - (($($vis:tt)*) $name:ident : $prefix:expr => list [$ty:ty]) => { - $($vis)* struct $name; - - impl $name { - fn clear_item>(index: u32, storage: &S) { - if index < <$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) { - storage.kill(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index)); - } - } - - fn set_len>(count: u32, storage: &S) { - (count..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage)).for_each(|i| $name::clear_item(i, storage)); - storage.put(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key(), &count); - } - } - - impl $crate::storage::hashed::generator::StorageList<$ty> for $name { - /// Get the prefix key in storage. - fn prefix() -> &'static [u8] { - $prefix - } - - /// Get the key used to put the length field. - fn len_key() -> $crate::rstd::vec::Vec { - let mut key = $prefix.to_vec(); - key.extend(b"len"); - key - } - - /// Get the storage key used to fetch a value at a given index. - fn key_for(index: u32) -> $crate::rstd::vec::Vec { - let mut key = $prefix.to_vec(); - $crate::codec::Encode::encode_to(&index, &mut key); - key - } - - /// Read out all the items. - fn items>(storage: &S) -> $crate::rstd::vec::Vec<$ty> { - (0..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage)) - .map(|i| <$name as $crate::storage::hashed::generator::StorageList<$ty>>::get(i, storage).expect("all items within length are set; qed")) - .collect() - } - - /// Set the current set of items. - fn set_items>(items: &[$ty], storage: &S) { - $name::set_len(items.len() as u32, storage); - items.iter() - .enumerate() - .for_each(|(i, item)| <$name as $crate::storage::hashed::generator::StorageList<$ty>>::set_item(i as u32, item, storage)); - } - - fn set_item>(index: u32, item: &$ty, storage: &S) { - if index < <$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) { - storage.put(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index)[..], item); - } - } - - /// Load the value at given index. Returns `None` if the index is out-of-bounds. - fn get>(index: u32, storage: &S) -> Option<$ty> { - storage.get(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index)[..]) - } - - /// Load the length of the list. - fn len>(storage: &S) -> u32 { - storage.get(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key()).unwrap_or_default() - } - - /// Clear the list. - fn clear>(storage: &S) { - for i in 0..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) { - $name::clear_item(i, storage); - } - - storage.kill(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key()[..]) - } - } - }; } #[macro_export] @@ -383,7 +292,6 @@ macro_rules! __handle_wrap_internal { #[allow(dead_code)] mod tests { use std::collections::HashMap; - use std::cell::RefCell; use super::*; use crate::metadata::*; use crate::metadata::StorageHasher; @@ -392,49 +300,26 @@ mod tests { storage_items! { Value: b"a" => u32; - List: b"b:" => list [u64]; Map: b"c:" => map [u32 => [u8; 32]]; } #[test] fn value() { - let mut overlay = HashMap::new(); - let storage = RefCell::new(&mut overlay); + let mut storage = HashMap::new(); assert!(Value::get(&storage).is_none()); - Value::put(&100_000, &storage); + Value::put(&100_000, &mut storage); assert_eq!(Value::get(&storage), Some(100_000)); - Value::kill(&storage); + Value::kill(&mut storage); assert!(Value::get(&storage).is_none()); } - #[test] - fn list() { - let mut overlay = HashMap::new(); - let storage = RefCell::new(&mut overlay); - assert_eq!(List::len(&storage), 0); - assert!(List::items(&storage).is_empty()); - - List::set_items(&[0, 2, 4, 6, 8], &storage); - assert_eq!(List::items(&storage), &[0, 2, 4, 6, 8]); - assert_eq!(List::len(&storage), 5); - - List::set_item(2, &10, &storage); - assert_eq!(List::items(&storage), &[0, 2, 10, 6, 8]); - assert_eq!(List::len(&storage), 5); - - List::clear(&storage); - assert_eq!(List::len(&storage), 0); - assert!(List::items(&storage).is_empty()); - } - #[test] fn map() { - let mut overlay = HashMap::new(); - let storage = RefCell::new(&mut overlay); + let mut storage = HashMap::new(); assert!(Map::get(&5, &storage).is_none()); - Map::insert(&5, &[1; 32], &storage); + Map::insert(&5, &[1; 32], &mut storage); assert_eq!(Map::get(&5, &storage), Some([1; 32])); - assert_eq!(Map::take(&5, &storage), Some([1; 32])); + assert_eq!(Map::take(&5, &mut storage), Some([1; 32])); assert!(Map::get(&5, &storage).is_none()); assert!(Map::get(&999, &storage).is_none()); } @@ -904,3 +789,46 @@ mod test3 { type BlockNumber = u32; } } + +#[cfg(test)] +#[allow(dead_code)] +mod test_map_vec_append { + pub trait Trait { + type Origin; + type BlockNumber; + } + decl_module! { + pub struct Module for enum Call where origin: T::Origin {} + } + crate::decl_storage! { + trait Store for Module as Test { + JustVec: Vec; + MapVec: map u32 => Vec; + } + } + + struct Test {} + + impl Trait for Test { + type Origin = u32; + type BlockNumber = u32; + } + + #[test] + fn append_works() { + use crate::storage::{AppendableStorageMap, StorageMap, StorageValue}; + use runtime_io::{with_externalities, TestExternalities}; + + with_externalities(&mut TestExternalities::default(), || { + let _ = >::append(1, &[1, 2, 3]); + let _ = >::append(1, &[4, 5]); + assert_eq!(>::get(1), vec![1, 2, 3, 4, 5]); + + let _ = >::append(&[1, 2, 3]); + let _ = >::append(&[4, 5]); + assert_eq!(>::get(), vec![1, 2, 3, 4, 5]); + }); + } +} + + diff --git a/srml/support/src/storage/unhashed/generator.rs b/srml/support/src/storage/unhashed/generator.rs index 25592dce6d9444f1d8a72fe355eee7c2ca2ca248..e6bbb5905f13120097434b19f90394179a8f051e 100644 --- a/srml/support/src/storage/unhashed/generator.rs +++ b/srml/support/src/storage/unhashed/generator.rs @@ -34,66 +34,66 @@ pub trait UnhashedStorage { fn get_or_default(&self, key: &[u8]) -> T { self.get(key).unwrap_or_default() } /// Put a value in under a key. - fn put(&self, key: &[u8], val: &T); + fn put(&mut self, key: &[u8], val: &T); /// Remove the bytes of a key from storage. - fn kill(&self, key: &[u8]); + fn kill(&mut self, key: &[u8]); /// Remove the bytes of a key from storage. - fn kill_prefix(&self, prefix: &[u8]); + fn kill_prefix(&mut self, prefix: &[u8]); /// Take a value from storage, deleting it after reading. - fn take(&self, key: &[u8]) -> Option { + fn take(&mut self, key: &[u8]) -> Option { let value = self.get(key); self.kill(key); value } /// Take a value from storage, deleting it after reading. - fn take_or_panic(&self, key: &[u8]) -> T { self.take(key).expect("Required values must be in storage") } + fn take_or_panic(&mut self, key: &[u8]) -> T { self.take(key).expect("Required values must be in storage") } /// Take a value from storage, deleting it after reading. - fn take_or_default(&self, key: &[u8]) -> T { self.take(key).unwrap_or_default() } + fn take_or_default(&mut self, key: &[u8]) -> T { self.take(key).unwrap_or_default() } /// Get a Vec of bytes from storage. fn get_raw(&self, key: &[u8]) -> Option>; /// Put a raw byte slice into storage. - fn put_raw(&self, key: &[u8], value: &[u8]); + fn put_raw(&mut self, key: &[u8], value: &[u8]); } // We use a construct like this during when genesis storage is being built. #[cfg(feature = "std")] -impl UnhashedStorage for std::cell::RefCell<&mut sr_primitives::StorageOverlay> { +impl UnhashedStorage for sr_primitives::StorageOverlay { fn exists(&self, key: &[u8]) -> bool { - self.borrow().contains_key(key) + self.contains_key(key) } fn get(&self, key: &[u8]) -> Option { - self.borrow().get(key) + self.get(key) .map(|x| codec::Decode::decode(&mut x.as_slice()).expect("Unable to decode expected type.")) } - fn put(&self, key: &[u8], val: &T) { - self.borrow_mut().insert(key.to_vec(), codec::Encode::encode(val)); + fn put(&mut self, key: &[u8], val: &T) { + self.insert(key.to_vec(), codec::Encode::encode(val)); } - fn kill(&self, key: &[u8]) { - self.borrow_mut().remove(key); + fn kill(&mut self, key: &[u8]) { + self.remove(key); } - fn kill_prefix(&self, prefix: &[u8]) { - self.borrow_mut().retain(|key, _| { + fn kill_prefix(&mut self, prefix: &[u8]) { + self.retain(|key, _| { !key.starts_with(prefix) }) } fn get_raw(&self, key: &[u8]) -> Option> { - self.borrow().get(key).cloned() + self.get(key).cloned() } - fn put_raw(&self, key: &[u8], value: &[u8]) { - self.borrow_mut().insert(key.to_vec(), value.to_vec()); + fn put_raw(&mut self, key: &[u8], value: &[u8]) { + self.insert(key.to_vec(), value.to_vec()); } } @@ -131,23 +131,43 @@ pub trait StorageDoubleMap fn get(k1: &K1, k2: &K2, storage: &S) -> Self::Query; /// Take the value under a key. - fn take(k1: &K1, k2: &K2, storage: &S) -> Self::Query; + fn take(k1: &K1, k2: &K2, storage: &mut S) -> Self::Query; /// Store a value to be associated with the given key from the map. - fn insert(k1: &K1, k2: &K2, val: &V, storage: &S) { + fn insert(k1: &K1, k2: &K2, val: &V, storage: &mut S) { storage.put(&Self::key_for(k1, k2), val); } /// Remove the value under a key. - fn remove(k1: &K1, k2: &K2, storage: &S) { + fn remove(k1: &K1, k2: &K2, storage: &mut S) { storage.kill(&Self::key_for(k1, k2)); } /// Removes all entries that shares the `k1` as the first key. - fn remove_prefix(k1: &K1, storage: &S) { + fn remove_prefix(k1: &K1, storage: &mut S) { storage.kill_prefix(&Self::prefix_for(k1)); } /// Mutate the value under a key. - fn mutate R, S: UnhashedStorage>(k1: &K1, k2: &K2, f: F, storage: &S) -> R; + fn mutate R, S: UnhashedStorage>(k1: &K1, k2: &K2, f: F, storage: &mut S) -> R; + + /// Append the given items to the value under the key specified. + fn append( + k1: &K1, + k2: &K2, + items: &[I], + storage: &mut S, + ) -> Result<(), &'static str> + where + I: codec::Encode, + V: codec::EncodeAppend, + { + let key = Self::key_for(k1, k2); + let new_val = ::append( + storage.get_raw(&key).unwrap_or_default(), + items, + ).ok_or_else(|| "Could not append given item")?; + storage.put_raw(&key, &new_val); + Ok(()) + } } diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index 6f0435a77a01d36160fa9ace1e4156bb8765e373..3b3c63e223ce14831368094bf3b882a929c89f74 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -14,34 +14,62 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Traits for SRML +//! Traits for SRML. +//! +//! NOTE: If you're looking for `parameter_types`, it has moved in to the top-level module. use crate::rstd::result; use crate::codec::{Codec, Encode, Decode}; use crate::runtime_primitives::traits::{ - MaybeSerializeDebug, SimpleArithmetic, As + MaybeSerializeDebug, SimpleArithmetic }; +use super::for_each_tuple; + +/// A trait for querying a single fixed value from a type. +pub trait Get { + /// Return a constant value. + fn get() -> T; +} + +/// A trait for querying whether a type can be said to statically "contain" a value. Similar +/// in nature to `Get`, except it is designed to be lazy rather than active (you can't ask it to +/// enumerate all values that it contains) and work for multiple values rather than just one. +pub trait Contains { + /// Return `true` if this "contains" the given value `t`. + fn contains(t: &T) -> bool; +} + +impl> Contains for T { + fn contains(t: &V) -> bool { + &Self::get() == t + } +} + /// The account with the given id was killed. pub trait OnFreeBalanceZero { /// The account was the given id was killed. fn on_free_balance_zero(who: &AccountId); } -impl OnFreeBalanceZero for () { - fn on_free_balance_zero(_who: &AccountId) {} -} -impl< - AccountId, - X: OnFreeBalanceZero, - Y: OnFreeBalanceZero, -> OnFreeBalanceZero for (X, Y) { - fn on_free_balance_zero(who: &AccountId) { - X::on_free_balance_zero(who); - Y::on_free_balance_zero(who); +macro_rules! impl_on_free_balance_zero { + () => ( + impl OnFreeBalanceZero for () { + fn on_free_balance_zero(_: &AccountId) {} + } + ); + + ( $($t:ident)* ) => { + impl),*> OnFreeBalanceZero for ($($t,)*) { + fn on_free_balance_zero(who: &AccountId) { + $($t::on_free_balance_zero(who);)* + } + } } } +for_each_tuple!(impl_on_free_balance_zero); + /// Trait for a hook to get called when some balance has been minted, causing dilution. pub trait OnDilution { /// Some `portion` of the total balance just "grew" by `minted`. `portion` is the pre-growth @@ -195,7 +223,7 @@ pub enum SignedImbalance>{ impl< P: Imbalance, N: Imbalance, - B: SimpleArithmetic + As + As + Codec + Copy + MaybeSerializeDebug + Default, + B: SimpleArithmetic + Codec + Copy + MaybeSerializeDebug + Default, > SignedImbalance { pub fn zero() -> Self { SignedImbalance::Positive(P::zero()) @@ -230,7 +258,7 @@ impl< /// Abstraction over a fungible assets system. pub trait Currency { /// The balance of an account. - type Balance: SimpleArithmetic + As + As + Codec + Copy + MaybeSerializeDebug + Default; + type Balance: SimpleArithmetic + Codec + Copy + MaybeSerializeDebug + Default; /// The opaque token type for an imbalance. This is returned by unbalanced operations /// and must be dealt with. It may be dropped but cannot be cloned. diff --git a/srml/support/src/unsigned.rs b/srml/support/src/unsigned.rs new file mode 100644 index 0000000000000000000000000000000000000000..8ea613461a1a83ddd25c421f03c276b7fe52da51 --- /dev/null +++ b/srml/support/src/unsigned.rs @@ -0,0 +1,154 @@ +// Copyright 2019 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 . + +#[doc(hidden)] +pub use crate::runtime_primitives::traits::ValidateUnsigned; +#[doc(hidden)] +pub use crate::runtime_primitives::transaction_validity::TransactionValidity; +#[doc(hidden)] +pub use crate::runtime_primitives::ApplyError; + + +/// Implement `ValidateUnsigned` for `Runtime`. +/// All given modules need to implement `ValidateUnsigned`. +/// +/// # Example +/// +/// ``` +/// # mod timestamp { +/// # pub struct Module; +/// # +/// # impl srml_support::unsigned::ValidateUnsigned for Module { +/// # type Call = Call; +/// # +/// # fn validate_unsigned(call: &Self::Call) -> srml_support::unsigned::TransactionValidity { +/// # unimplemented!(); +/// # } +/// # } +/// # +/// # pub enum Call { +/// # } +/// # } +/// # +/// # pub type Timestamp = timestamp::Module; +/// # +/// # +/// # pub enum Call { +/// # Timestamp(timestamp::Call), +/// # } +/// # #[allow(unused)] +/// pub struct Runtime; +/// +/// srml_support::impl_outer_validate_unsigned! { +/// impl ValidateUnsigned for Runtime { +/// Timestamp +/// } +/// } +/// ``` +#[macro_export] +macro_rules! impl_outer_validate_unsigned { + ( + impl ValidateUnsigned for $runtime:ident { + $( $module:ident )* + } + ) => { + impl $crate::unsigned::ValidateUnsigned for $runtime { + type Call = Call; + + fn validate_unsigned(call: &Self::Call) -> $crate::unsigned::TransactionValidity { + #[allow(unreachable_patterns)] + match call { + $( Call::$module(inner_call) => $module::validate_unsigned(inner_call), )* + _ => $crate::unsigned::TransactionValidity::Invalid($crate::unsigned::ApplyError::BadSignature as i8), + } + } + } + }; +} + +#[cfg(test)] +mod test_empty_call { + pub enum Call { + } + + #[allow(unused)] + pub struct Runtime; + + impl_outer_validate_unsigned! { + impl ValidateUnsigned for Runtime { + } + } +} + +#[cfg(test)] +mod test_partial_and_full_call { + pub mod timestamp { + pub struct Module; + + impl super::super::ValidateUnsigned for Module { + type Call = Call; + + fn validate_unsigned(_call: &Self::Call) -> super::super::TransactionValidity { + unimplemented!(); + } + } + + pub enum Call { + Foo, + } + } + + mod test_full_unsigned { + pub type Timestamp = super::timestamp::Module; + + pub enum Call { + Timestamp(super::timestamp::Call), + } + + pub struct Runtime; + + impl_outer_validate_unsigned! { + impl ValidateUnsigned for Runtime { + Timestamp + } + } + + #[test] + fn used() { + let _ = Call::Timestamp(super::timestamp::Call::Foo); + let _ = Runtime; + } + } + + mod test_not_full_unsigned { + pub enum Call { + Timestamp(super::timestamp::Call), + } + + pub struct Runtime; + + impl_outer_validate_unsigned! { + impl ValidateUnsigned for Runtime { + } + } + + #[test] + fn used() { + let _ = Call::Timestamp(super::timestamp::Call::Foo); + let _ = Runtime; + } + } +} diff --git a/srml/support/test/Cargo.toml b/srml/support/test/Cargo.toml index f6d84ba014bf618002c25ece53f3e7f02b3df620..5122c69f436b014af10fd0006e593208b36330f1 100644 --- a/srml/support/test/Cargo.toml +++ b/srml/support/test/Cargo.toml @@ -1,16 +1,17 @@ [package] name = "srml-support-test" -version = "0.1.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" -[dev-dependencies] +[dependencies] serde = { version = "1.0", default-features = false, features = ["derive"] } parity-codec = { version = "3.4", default-features = false, features = ["derive"] } runtime_io = { package = "sr-io", path = "../../../core/sr-io", default-features = false } -srml-support = { path = "../", default-features = false } +srml-support = { version = "2", path = "../", default-features = false } inherents = { package = "substrate-inherents", path = "../../../core/inherents", default-features = false } primitives = { package = "substrate-primitives", path = "../../../core/primitives", default-features = false } +trybuild = "1" [features] default = ["std"] diff --git a/srml/support/test/src/lib.rs b/srml/support/test/src/lib.rs index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a7a869cf8794d7855697b6c7d3066c21b32533bb 100644 --- a/srml/support/test/src/lib.rs +++ b/srml/support/test/src/lib.rs @@ -0,0 +1,24 @@ +// Copyright 2019 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 . + +//! Test crate for srml_support. Allow to make use of `srml_support::decl_storage`. +//! See tests directory. + +#[test] +fn reserved_keyword() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/reserved_keyword/*.rs"); +} diff --git a/srml/support/test/tests/final_keys.rs b/srml/support/test/tests/final_keys.rs new file mode 100644 index 0000000000000000000000000000000000000000..549506df496c9505719ad0e07ff5a0c7fe84c480 --- /dev/null +++ b/srml/support/test/tests/final_keys.rs @@ -0,0 +1,100 @@ +// Copyright 2019 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 . + +use runtime_io::{with_externalities, Blake2Hasher}; +use srml_support::{StorageValue, StorageMap, StorageDoubleMap}; +use srml_support::storage::unhashed; +use srml_support::runtime_primitives::BuildStorage; +use parity_codec::{Encode, Decode}; + +pub trait Trait { + type Origin; + type BlockNumber: Encode + Decode + Default + Clone; +} + +srml_support::decl_module! { + pub struct Module for enum Call where origin: T::Origin {} +} + +srml_support::decl_storage!{ + trait Store for Module as Module { + pub Value config(value): u32; + + pub Map: map u32 => u32; + pub Map2: map hasher(twox_128) u32 => u32; + + pub LinkedMap: linked_map u32 => u32; + pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; + + pub DoubleMap: double_map u32, blake2_256(u32) => u32; + pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32; + + pub Foo get(foo) config(): Option; + pub Foo2 get(foo2) config(): double_map u32, blake2_256(T::BlockNumber) => Option; + } +} + +struct Test; +impl Trait for Test { + type BlockNumber = u32; + type Origin = u32; +} + +fn new_test_ext() -> runtime_io::TestExternalities { + GenesisConfig::::default().build_storage().unwrap().0.into() +} + +#[test] +fn final_keys() { + with_externalities(&mut new_test_ext(), || { + >::put(1); + assert_eq!(unhashed::get::(&runtime_io::twox_128(b"Module Value")), Some(1u32)); + + >::insert(1, 2); + let mut k = b"Module Map".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); + + >::insert(1, 2); + let mut k = b"Module Map2".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); + + >::insert(1, 2); + let mut k = b"Module LinkedMap".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); + + >::insert(1, 2); + let mut k = b"Module LinkedMap2".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); + + >::insert(1, 2, 3); + let mut k = b"Module DoubleMap".to_vec(); + k.extend(1u32.encode()); + let mut k = runtime_io::blake2_256(&k).to_vec(); + k.extend(&runtime_io::blake2_256(&2u32.encode())); + assert_eq!(unhashed::get::(&k), Some(3u32)); + + >::insert(1, 2, 3); + let mut k = b"Module DoubleMap2".to_vec(); + k.extend(1u32.encode()); + let mut k = runtime_io::twox_128(&k).to_vec(); + k.extend(&runtime_io::blake2_128(&2u32.encode())); + assert_eq!(unhashed::get::(&k), Some(3u32)); + }); +} diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index 636baa99a09fc1f81ebd1a49d12d33c8812c9ee3..1190dd1d829516a248c42811c8048b50719e509e 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -86,14 +86,17 @@ mod module1 { pub type Log = RawLog< T, I, + ::Hash, >; /// A logs in this module. #[cfg_attr(feature = "std", derive(serde::Serialize, Debug))] #[derive(parity_codec::Encode, parity_codec::Decode, PartialEq, Eq, Clone)] - pub enum RawLog { + pub enum RawLog { _Phantom(std::marker::PhantomData<(T, I)>), AmountChange(u32), + ChangesTrieRoot(Hash), + AuthoritiesChange(Vec<()>), } pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"12345678"; @@ -262,12 +265,24 @@ srml_support::construct_runtime!( UncheckedExtrinsic = UncheckedExtrinsic { System: system::{Module, Call, Event, Log(ChangesTrieRoot)}, - Module1_1: module1::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, - Module1_2: module1::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, + Module1_1: module1::::{ + Module, Call, Storage, Event, Config, Origin, + Log(ChangesTrieRoot, AuthoritiesChange), Inherent + }, + Module1_2: module1::::{ + Module, Call, Storage, Event, Config, Origin, + Log(ChangesTrieRoot, AuthoritiesChange), Inherent + }, Module2: module2::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, - Module2_1: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, - Module2_2: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, - Module2_3: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent}, + Module2_1: module2::::{ + Module, Call, Storage, Event, Config, Origin, Log(), Inherent + }, + Module2_2: module2::::{ + Module, Call, Storage, Event, Config, Origin, Log(), Inherent + }, + Module2_3: module2::::{ + Module, Call, Storage, Event, Config, Origin, Log(), Inherent + }, Module3: module3::{Module, Call}, } ); diff --git a/srml/support/test/tests/reserved_keyword/on_initialize.rs b/srml/support/test/tests/reserved_keyword/on_initialize.rs new file mode 100644 index 0000000000000000000000000000000000000000..c63153241ce8f3ce052d9e355e36aa3d5f860818 --- /dev/null +++ b/srml/support/test/tests/reserved_keyword/on_initialize.rs @@ -0,0 +1,33 @@ +macro_rules! reserved { + ($($reserved:ident)*) => { + $( + mod $reserved { + pub use srml_support::dispatch::Result; + + pub trait Trait { + type Origin; + type BlockNumber: Into; + } + + pub mod system { + use srml_support::dispatch::Result; + + pub fn ensure_root(_: R) -> Result { + Ok(()) + } + } + + srml_support::decl_module! { + pub struct Module for enum Call where origin: T::Origin { + fn $reserved() -> Result { unreachable!() } + } + } + } + )* + } +} + +reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + +fn main() { +} diff --git a/srml/support/test/tests/reserved_keyword/on_initialize.stderr b/srml/support/test/tests/reserved_keyword/on_initialize.stderr new file mode 100644 index 0000000000000000000000000000000000000000..7a37eb66c32acd89f96ef45fa3a88dd9724030c1 --- /dev/null +++ b/srml/support/test/tests/reserved_keyword/on_initialize.stderr @@ -0,0 +1,47 @@ +error: Invalid call fn name: `on_finalize`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: Invalid call fn name: `on_initialize`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: Invalid call fn name: `on_finalise`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: Invalid call fn name: `on_initialise`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: Invalid call fn name: `offchain_worker`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: Invalid call fn name: `deposit_event`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) diff --git a/srml/system/Cargo.toml b/srml/system/Cargo.toml index 0effeae251a6dea54957b266ef78dd09b3790e35..5295d0708c429423ae926d370d210613a182c630 100644 --- a/srml/system/Cargo.toml +++ b/srml/system/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-system" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.5", default-features = false, features = ["derive"] } diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index 59b941b5006e625a0171708826664ee4ff9085c8..7e43ba239a02b8a461a52c7a7712b65953164e8f 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -76,11 +76,17 @@ use serde::Serialize; use rstd::prelude::*; #[cfg(any(feature = "std", test))] use rstd::map; -use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, Lookup, - Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, As, CurrentHeight, BlockNumberToHash, - MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup}; +use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, One, Bounded, Lookup, + Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, CurrentHeight, BlockNumberToHash, + MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup +}; +#[cfg(any(feature = "std", test))] +use primitives::traits::Zero; use substrate_primitives::storage::well_known_keys; -use srml_support::{storage, StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage}; +use srml_support::{ + storage, decl_module, decl_event, decl_storage, StorageDoubleMap, StorageValue, + StorageMap, Parameter, for_each_tuple, traits::Contains +}; use safe_mix::TripletMix; use parity_codec::{Encode, Decode}; @@ -96,10 +102,24 @@ pub trait OnNewAccount { fn on_new_account(who: &AccountId); } -impl OnNewAccount for () { - fn on_new_account(_who: &AccountId) {} +macro_rules! impl_on_new_account { + () => ( + impl OnNewAccount for () { + fn on_new_account(_: &AccountId) {} + } + ); + + ( $($t:ident)* ) => { + impl),*> OnNewAccount for ($($t,)*) { + fn on_new_account(who: &AccountId) { + $($t::on_new_account(who);)* + } + } + } } +for_each_tuple!(impl_on_new_account); + /// Determiner to say whether a given account is unused. pub trait IsDeadAccount { /// Is the given account dead? @@ -125,7 +145,7 @@ pub fn extrinsics_data_root(xts: Vec>) -> H::Output { pub trait Trait: 'static + Eq + Clone { /// The aggregated `Origin` type used by dispatchable calls. - type Origin: Into>> + From>; + type Origin: Into, Self::Origin>> + From>; /// Account index (aka nonce) type. This stores the number of previous transactions associated with a sender /// account. @@ -179,18 +199,7 @@ decl_module! { pub struct Module for enum Call where origin: T::Origin { /// Deposits an event into this block's event record. pub fn deposit_event(event: T::Event) { - let extrinsic_index = Self::extrinsic_index(); - let phase = extrinsic_index.map_or(Phase::Finalization, |c| Phase::ApplyExtrinsic(c)); - let event = EventRecord { phase, event }; - - // Appending can only fail if `Events` can not be decoded or - // when we try to insert more than `u32::max_value()` events. - // If one of these conditions is met, we just insert the new event. - let events = [event]; - if >::append(&events).is_err() { - let [event] = events; - >::put(vec![event]); - } + Self::deposit_event_indexed(&[], event); } } } @@ -208,11 +217,13 @@ pub enum Phase { /// Record of an event happening. #[derive(Encode, Decode)] #[cfg_attr(feature = "std", derive(Serialize, PartialEq, Eq, Clone, Debug))] -pub struct EventRecord { +pub struct EventRecord { /// The phase of the block it happened in. pub phase: Phase, /// The event itself. pub event: E, + /// The list of the topics this event has. + pub topics: Vec, } decl_event!( @@ -233,15 +244,17 @@ pub enum RawOrigin { Root, /// It is signed by some public key and we provide the `AccountId`. Signed(AccountId), - /// It is signed by nobody but included and agreed upon by the validators anyway: it's "inherently" true. - Inherent, + /// It is signed by nobody, can be either: + /// * included and agreed upon by the validators anyway, + /// * or unsigned transaction validated by a module. + None, } impl From> for RawOrigin { fn from(s: Option) -> RawOrigin { match s { Some(who) => RawOrigin::Signed(who), - None => RawOrigin::Inherent, + None => RawOrigin::None, } } } @@ -290,6 +303,12 @@ fn hash69 + Default>() -> T { h } +/// This type alias represents an index of an event. +/// +/// We use `u32` here because this index is used as index for `Events` +/// which can't contain more than `u32::max_value()` items. +type EventIndex = u32; + decl_storage! { trait Store for Module as System { /// Extrinsics nonce for accounts. @@ -302,10 +321,11 @@ decl_storage! { pub BlockHash get(block_hash) build(|_| vec![(T::BlockNumber::zero(), hash69())]): map T::BlockNumber => T::Hash; /// Extrinsics data for the current block (maps an extrinsic's index to its data). ExtrinsicData get(extrinsic_data): map u32 => Vec; - /// Random seed of the current block. - RandomSeed get(random_seed) build(|_| T::Hash::default()): T::Hash; + /// Series of block headers from the last 81 blocks that acts as random seed material. This is arranged as a + /// ring buffer with the `i8` prefix being the index into the `Vec` of the oldest hash. + RandomMaterial get(random_material): (i8, Vec); /// The current block number being processed. Set by `execute_block`. - Number get(block_number) build(|_| T::BlockNumber::sa(1u64)): T::BlockNumber; + Number get(block_number) build(|_| 1.into()): T::BlockNumber; /// Hash of the previous block. ParentHash get(parent_hash) build(|_| hash69()): T::Hash; /// Extrinsics root of the current block, also part of the block header. @@ -313,7 +333,30 @@ decl_storage! { /// Digest of the current block, also part of the block header. Digest get(digest): T::Digest; /// Events deposited for the current block. - Events get(events): Vec>; + Events get(events): Vec>; + /// The number of events in the `Events` list. + EventCount get(event_count): EventIndex; + + // TODO: https://github.com/paritytech/substrate/issues/2553 + // Possibly, we can improve it by using something like: + // `Option<(BlockNumber, Vec)>`, however in this case we won't be able to use + // `EventTopics::append`. + + /// Mapping between a topic (represented by T::Hash) and a vector of indexes + /// of events in the `>` list. + /// + /// The first key serves no purpose. This field is declared as double_map just + /// for convenience of using `remove_prefix`. + /// + /// All topic vectors have deterministic storage locations depending on the topic. This + /// allows light-clients to leverage the changes trie storage tracking mechanism and + /// in case of changes fetch the list of events of interest. + /// + /// The value has the type `(T::BlockNumber, EventIndex)` because if we used only just + /// the `EventIndex` then in case if the topic has the same contents on the next block + /// no notification will be triggered thus the event might be lost. + EventTopics get(event_topics): double_map hasher(blake2_256) (), blake2_256(T::Hash) + => Vec<(T::BlockNumber, EventIndex)>; } add_extra_genesis { config(changes_trie_config): Option; @@ -333,46 +376,151 @@ decl_storage! { } pub struct EnsureRoot(::rstd::marker::PhantomData); -impl>>, AccountId> EnsureOrigin for EnsureRoot { +impl< + O: Into, O>> + From>, + AccountId, +> EnsureOrigin for EnsureRoot { type Success = (); - fn ensure_origin(o: O) -> Result { - ensure_root(o) + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Root => Ok(()), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureSigned(::rstd::marker::PhantomData); +impl< + O: Into, O>> + From>, + AccountId, +> EnsureOrigin for EnsureSigned { + type Success = AccountId; + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Signed(who) => Ok(who), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureSignedBy(::rstd::marker::PhantomData<(Who, AccountId)>); +impl< + O: Into, O>> + From>, + Who: Contains, + AccountId: PartialEq + Clone, +> EnsureOrigin for EnsureSignedBy { + type Success = AccountId; + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Signed(ref who) if Who::contains(who) => Ok(who.clone()), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureNone(::rstd::marker::PhantomData); +impl< + O: Into, O>> + From>, + AccountId, +> EnsureOrigin for EnsureNone { + type Success = (); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::None => Ok(()), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureNever(::rstd::marker::PhantomData); +impl EnsureOrigin for EnsureNever { + type Success = T; + fn try_origin(o: O) -> Result { + Err(o) } } /// Ensure that the origin `o` represents a signed extrinsic (i.e. transaction). /// Returns `Ok` with the account that signed the extrinsic or an `Err` otherwise. pub fn ensure_signed(o: OuterOrigin) -> Result - where OuterOrigin: Into>> + where OuterOrigin: Into, OuterOrigin>> { match o.into() { - Some(RawOrigin::Signed(t)) => Ok(t), + Ok(RawOrigin::Signed(t)) => Ok(t), _ => Err("bad origin: expected to be a signed origin"), } } /// Ensure that the origin `o` represents the root. Returns `Ok` or an `Err` otherwise. pub fn ensure_root(o: OuterOrigin) -> Result<(), &'static str> - where OuterOrigin: Into>> + where OuterOrigin: Into, OuterOrigin>> { match o.into() { - Some(RawOrigin::Root) => Ok(()), + Ok(RawOrigin::Root) => Ok(()), _ => Err("bad origin: expected to be a root origin"), } } /// Ensure that the origin `o` represents an unsigned extrinsic. Returns `Ok` or an `Err` otherwise. -pub fn ensure_inherent(o: OuterOrigin) -> Result<(), &'static str> - where OuterOrigin: Into>> +pub fn ensure_none(o: OuterOrigin) -> Result<(), &'static str> + where OuterOrigin: Into, OuterOrigin>> { match o.into() { - Some(RawOrigin::Inherent) => Ok(()), - _ => Err("bad origin: expected to be an inherent origin"), + Ok(RawOrigin::None) => Ok(()), + _ => Err("bad origin: expected to be no origin"), } } impl Module { - /// Gets the index of extrinsic that is currenty executing. + /// Deposits an event into this block's event record adding this event + /// to the corresponding topic indexes. + /// + /// This will update storage entries that correpond to the specified topics. + /// It is expected that light-clients could subscribe to this topics. + pub fn deposit_event_indexed(topics: &[T::Hash], event: T::Event) { + let extrinsic_index = Self::extrinsic_index(); + let phase = extrinsic_index.map_or(Phase::Finalization, |c| Phase::ApplyExtrinsic(c)); + let event = EventRecord { + phase, + event, + topics: topics.iter().cloned().collect::>(), + }; + + // Index of the to be added event. + let event_idx = { + let old_event_count = >::get(); + let new_event_count = match old_event_count.checked_add(1) { + // We've reached the maximum number of events at this block, just + // don't do anything and leave the event_count unaltered. + None => return, + Some(nc) => nc, + }; + >::put(new_event_count); + old_event_count + }; + + // Appending can only fail if `Events` can not be decoded or + // when we try to insert more than `u32::max_value()` events. + // + // We perform early return if we've reached the maximum capacity of the event list, + // so `Events` seems to be corrupted. Also, this has happened after the start of execution + // (since the event list is cleared at the block initialization). + if >::append(&[event]).is_err() { + // The most sensible thing to do here is to just ignore this event and wait until the + // new block. + return; + } + + let block_no = Self::block_number(); + for topic in topics { + // The same applies here. + if >::append(&(), topic, &[(block_no, event_idx)]).is_err() { + return; + } + } + } + + /// Gets the index of extrinsic that is currently executing. pub fn extrinsic_index() -> Option { storage::unhashed::get(well_known_keys::EXTRINSIC_INDEX) } @@ -388,29 +536,41 @@ impl Module { } /// Start the execution of a particular block. - pub fn initialize(number: &T::BlockNumber, parent_hash: &T::Hash, txs_root: &T::Hash) { + pub fn initialize( + number: &T::BlockNumber, + parent_hash: &T::Hash, + txs_root: &T::Hash, + digest: &T::Digest, + ) { // populate environment storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32); >::put(number); + >::put(digest); >::put(parent_hash); >::insert(*number - One::one(), parent_hash); >::put(txs_root); - >::put(Self::calculate_random()); + >::mutate(|&mut(ref mut index, ref mut values)| if values.len() < 81 { + values.push(parent_hash.clone()) + } else { + values[*index as usize] = parent_hash.clone(); + *index = (*index + 1) % 81; + }); >::kill(); + >::kill(); + >::remove_prefix(&()); } /// Remove temporary "environment" entries in storage. pub fn finalize() -> T::Header { - >::kill(); - ExtrinsicCount::kill(); - AllExtrinsicsLen::kill(); + >::kill(); + >::kill(); let number = >::take(); let parent_hash = >::take(); let mut digest = >::take(); let extrinsics_root = >::take(); let storage_root = T::Hashing::storage_root(); - let storage_changes_root = T::Hashing::storage_changes_root(parent_hash, number.as_() - 1); + let storage_changes_root = T::Hashing::storage_changes_root(parent_hash); // we can't compute changes trie root earlier && put it to the Digest // because it will include all currently existing temporaries. @@ -420,7 +580,13 @@ impl Module { digest.push(item); } - // > stays to be inspected by the client. + // The following fields + // + // - > + // - > + // - > + // + // stay to be inspected by the client and will be cleared by `Self::initialize`. ::new(number, extrinsics_root, storage_root, parent_hash, digest) } @@ -432,26 +598,13 @@ impl Module { >::put(l); } - /// Calculate the current block's random seed. - fn calculate_random() -> T::Hash { - assert!(Self::block_number() > Zero::zero(), "Block number may never be zero"); - (0..81) - .scan( - Self::block_number() - One::one(), - |c, _| { if *c > Zero::zero() { *c -= One::one() }; Some(*c) - }) - .map(Self::block_hash) - .triplet_mix() - } - /// Get the basic externalities for this module, useful for tests. #[cfg(any(feature = "std", test))] pub fn externalities() -> TestExternalities { TestExternalities::new(map![ twox_128(&>::key_for(T::BlockNumber::zero())).to_vec() => [69u8; 32].encode(), twox_128(>::key()).to_vec() => T::BlockNumber::one().encode(), - twox_128(>::key()).to_vec() => [69u8; 32].encode(), - twox_128(>::key()).to_vec() => T::Hash::default().encode() + twox_128(>::key()).to_vec() => [69u8; 32].encode() ]) } @@ -462,7 +615,7 @@ impl Module { >::put(n); } - /// Sets the index of extrinsic that is currenty executing. + /// Sets the index of extrinsic that is currently executing. #[cfg(any(feature = "std", test))] pub fn set_extrinsic_index(extrinsic_index: u32) { storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &extrinsic_index) @@ -475,11 +628,67 @@ impl Module { >::put(n); } - /// Set the random seed to something in particular. Can be used as an alternative to - /// `initialize` for tests that don't need to bother with the other environment entries. - #[cfg(any(feature = "std", test))] - pub fn set_random_seed(seed: T::Hash) { - >::put(seed); + /// Get the basic random seed. + /// + /// In general you won't want to use this, but rather `Self::random` which + /// allows you to give a subject for the random result and whose value will + /// be independently low-influence random from any other such seeds. + pub fn random_seed() -> T::Hash { + Self::random(&[][..]) + } + + /// Get a low-influence "random" value. + /// + /// Being a deterministic block chain, real randomness is difficult to come + /// by. This gives you something that approximates it. `subject` is a + /// context identifier and allows you to get a different result to other + /// callers of this function; use it like `random(&b"my context"[..])`. + /// + /// This is initially implemented through a low-influence "triplet mix" + /// convolution of previous block hash values. In the future it will be + /// generated from a secure verifiable random function (VRF). + /// + /// ### Security Notes + /// + /// This randomness uses a low-influence function, drawing upon the block + /// hashes from the previous 81 blocks. Its result for any given subject + /// will be known in advance by the block producer of this block (and, + /// indeed, anyone who knows the block's `parent_hash`). However, it is + /// mostly impossible for the producer of this block *alone* to influence + /// the value of this hash. A sizable minority of dishonest and coordinating + /// block producers would be required in order to affect this value. If that + /// is an insufficient security guarantee then two things can be used to + /// improve this randomness: + /// + /// - Name, in advance, the block number whose random value will be used; + /// ensure your module retains a buffer of previous random values for its + /// subject and then index into these in order to obviate the ability of + /// your user to look up the parent hash and choose when to transact based + /// upon it. + /// - Require your user to first commit to an additional value by first + /// posting its hash. Require them to reveal the value to determine the + /// final result, hashing it with the output of this random function. This + /// reduces the ability of a cabal of block producers from conspiring + /// against individuals. + /// + /// WARNING: Hashing the result of this function will remove any + /// low-influnce properties it has and mean that all bits of the resulting + /// value are entirely manipulatable by the author of the parent block, who + /// can determine the value of `parent_hash`. + pub fn random(subject: &[u8]) -> T::Hash { + let (index, hash_series) = >::get(); + if hash_series.len() > 0 { + // Always the case after block 1 is initialised. + hash_series.iter() + .cycle() + .skip(index as usize) + .take(81) + .enumerate() + .map(|(i, h)| (i as i8, subject, h).using_encoded(T::Hashing::hash)) + .triplet_mix() + } else { + T::Hash::default() + } } /// Increment a particular account's nonce by 1. @@ -487,8 +696,9 @@ impl Module { >::insert(who, Self::account_nonce(who) + T::Index::one()); } - /// Note what the extrinsic data of the current extrinsic index is. If this is called, then - /// ensure `derive_extrinsics` is also called before block-building is completed. + /// Note what the extrinsic data of the current extrinsic index is. If this + /// is called, then ensure `derive_extrinsics` is also called before + /// block-building is completed. /// /// NOTE: This function is called only when the block is being constructed locally. /// `execute_block` doesn't note any extrinsics. @@ -600,19 +810,32 @@ mod tests { GenesisConfig::::default().build_storage().unwrap().0.into() } + #[test] + fn origin_works() { + let o = Origin::from(RawOrigin::::Signed(1u64)); + let x: Result, Origin> = o.into(); + assert_eq!(x, Ok(RawOrigin::::Signed(1u64))); + } + #[test] fn deposit_event_should_work() { with_externalities(&mut new_test_ext(), || { - System::initialize(&1, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&1, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); System::note_finished_extrinsics(); System::deposit_event(1u16); System::finalize(); assert_eq!( System::events(), - vec![EventRecord { phase: Phase::Finalization, event: 1u16 }] + vec![ + EventRecord { + phase: Phase::Finalization, + event: 1u16, + topics: vec![], + } + ] ); - System::initialize(&2, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&2, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); System::deposit_event(42u16); System::note_applied_extrinsic(&Ok(()), 0); System::note_applied_extrinsic(&Err(""), 0); @@ -620,11 +843,71 @@ mod tests { System::deposit_event(3u16); System::finalize(); assert_eq!(System::events(), vec![ - EventRecord { phase: Phase::ApplyExtrinsic(0), event: 42u16 }, - EventRecord { phase: Phase::ApplyExtrinsic(0), event: 100u16 }, - EventRecord { phase: Phase::ApplyExtrinsic(1), event: 101u16 }, - EventRecord { phase: Phase::Finalization, event: 3u16 } + EventRecord { phase: Phase::ApplyExtrinsic(0), event: 42u16, topics: vec![] }, + EventRecord { phase: Phase::ApplyExtrinsic(0), event: 100u16, topics: vec![] }, + EventRecord { phase: Phase::ApplyExtrinsic(1), event: 101u16, topics: vec![] }, + EventRecord { phase: Phase::Finalization, event: 3u16, topics: vec![] } ]); }); } + + #[test] + fn deposit_event_topics() { + with_externalities(&mut new_test_ext(), || { + const BLOCK_NUMBER: u64 = 1; + + System::initialize(&BLOCK_NUMBER, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + System::note_finished_extrinsics(); + + let topics = vec![ + H256::repeat_byte(1), + H256::repeat_byte(2), + H256::repeat_byte(3), + ]; + + // We deposit a few events with different sets of topics. + System::deposit_event_indexed(&topics[0..3], 1u16); + System::deposit_event_indexed(&topics[0..1], 2u16); + System::deposit_event_indexed(&topics[1..2], 3u16); + + System::finalize(); + + // Check that topics are reflected in the event record. + assert_eq!( + System::events(), + vec![ + EventRecord { + phase: Phase::Finalization, + event: 1u16, + topics: topics[0..3].to_vec(), + }, + EventRecord { + phase: Phase::Finalization, + event: 2u16, + topics: topics[0..1].to_vec(), + }, + EventRecord { + phase: Phase::Finalization, + event: 3u16, + topics: topics[1..2].to_vec(), + } + ] + ); + + // Check that the topic-events mapping reflects the deposited topics. + // Note that these are indexes of the events. + assert_eq!( + System::event_topics(&(), &topics[0]), + vec![(BLOCK_NUMBER, 0), (BLOCK_NUMBER, 1)], + ); + assert_eq!( + System::event_topics(&(), &topics[1]), + vec![(BLOCK_NUMBER, 0), (BLOCK_NUMBER, 2)], + ); + assert_eq!( + System::event_topics(&(), &topics[2]), + vec![(BLOCK_NUMBER, 0)], + ); + }); + } } diff --git a/srml/timestamp/Cargo.toml b/srml/timestamp/Cargo.toml index c86493890aaea9d6d2d53bdab905eec2b8d72c32..607a6d60d2860d70927394427bad523965dd144f 100644 --- a/srml/timestamp/Cargo.toml +++ b/srml/timestamp/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-timestamp" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index df89d0c1ff59be60bfb41a45cd06e7f0cdb1243b..24750215d1c04ebbb858ddd926bf38247ab81857 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -87,6 +87,7 @@ #![cfg_attr(not(feature = "std"), no_std)] +use rstd::{result, ops::{Mul, Div}, cmp}; use parity_codec::Encode; #[cfg(feature = "std")] use parity_codec::Decode; @@ -94,9 +95,8 @@ use parity_codec::Decode; use inherents::ProvideInherentData; use srml_support::{StorageValue, Parameter, decl_storage, decl_module}; use srml_support::for_each_tuple; -use runtime_primitives::traits::{As, SimpleArithmetic, Zero}; -use system::ensure_inherent; -use rstd::{result, ops::{Mul, Div}, cmp}; +use runtime_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion}; +use system::ensure_none; use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData}; /// The identifier for the `timestamp` inherent. @@ -221,7 +221,7 @@ decl_module! { /// /// The dispatch origin for this call must be `Inherent`. fn set(origin, #[compact] now: T::Moment) { - ensure_inherent(origin)?; + ensure_none(origin)?; assert!(!::DidUpdate::exists(), "Timestamp must be updated only once in the block"); assert!( Self::now().is_zero() || now >= Self::now() + >::get(), @@ -252,7 +252,7 @@ decl_module! { decl_storage! { trait Store for Module as Timestamp { /// Current time for the current block. - pub Now get(now) build(|_| T::Moment::sa(0)): T::Moment; + pub Now get(now) build(|_| 0.into()): T::Moment; /// Old storage item provided for compatibility. Remove after all networks upgraded. // TODO: #2133 @@ -262,7 +262,7 @@ decl_storage! { /// that the block production apparatus provides. Your chosen consensus system will generally /// work with this to determine a sensible block time. e.g. For Aura, it will be double this /// period on default settings. - pub MinimumPeriod get(minimum_period) config(): T::Moment = T::Moment::sa(3); + pub MinimumPeriod get(minimum_period) config(): T::Moment = 3.into(); /// Did the timestamp get updated in this block? DidUpdate: bool; @@ -297,23 +297,25 @@ impl ProvideInherent for Module { const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; fn create_inherent(data: &InherentData) -> Option { - let data = extract_inherent_data(data).expect("Gets and decodes timestamp inherent data"); + let data: T::Moment = extract_inherent_data(data) + .expect("Gets and decodes timestamp inherent data") + .saturated_into(); - let next_time = cmp::max(As::sa(data), Self::now() + >::get()); + let next_time = cmp::max(data, Self::now() + >::get()); Some(Call::set(next_time.into())) } fn check_inherent(call: &Self::Call, data: &InherentData) -> result::Result<(), Self::Error> { const MAX_TIMESTAMP_DRIFT: u64 = 60; - let t = match call { - Call::set(ref t) => t.clone(), + let t: u64 = match call { + Call::set(ref t) => t.clone().saturated_into::(), _ => return Ok(()), - }.as_(); + }; let data = extract_inherent_data(data).map_err(|e| InherentError::Other(e))?; - let minimum = (Self::now() + >::get()).as_(); + let minimum = (Self::now() + >::get()).saturated_into::(); if t > data + MAX_TIMESTAMP_DRIFT { Err(InherentError::Other("Timestamp too far in future to accept".into())) } else if t < minimum { @@ -369,7 +371,7 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); - assert_ok!(Timestamp::dispatch(Call::set(69), Origin::INHERENT)); + assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE)); assert_eq!(Timestamp::now(), 69); }); } @@ -384,8 +386,8 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); - assert_ok!(Timestamp::dispatch(Call::set(69), Origin::INHERENT)); - let _ = Timestamp::dispatch(Call::set(70), Origin::INHERENT); + assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE)); + let _ = Timestamp::dispatch(Call::set(70), Origin::NONE); }); } @@ -399,7 +401,7 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); - let _ = Timestamp::dispatch(Call::set(46), Origin::INHERENT); + let _ = Timestamp::dispatch(Call::set(46), Origin::NONE); }); } } diff --git a/srml/treasury/Cargo.toml b/srml/treasury/Cargo.toml index a4f3960edd8c951c69cbd848521ff5df30c34d3e..68b0451caf857e04105936d34264582d2bdcf226 100644 --- a/srml/treasury/Cargo.toml +++ b/srml/treasury/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-treasury" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index d9cecd37f2bf4f26b1405dcd9b100d18a5af8b33..dc967e2c9bc4c0e62523b4f326728971c8830a4f 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -16,46 +16,54 @@ //! # Treasury Module //! -//! The `treasury` module keeps account of currency in a `pot` and manages the subsequent -//! deployment of these funds. +//! The Treasury module provides a "pot" of funds that can be managed by stakeholders in the +//! system and a structure for making spending proposals from this pot. +//! +//! - [`treasury::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) //! //! ## Overview //! -//! Funds for treasury are raised in two ways: -//! 1. By minting new tokens, leading to inflation, and -//! 2. By channeling tokens from transaction fees and slashing. +//! The Treasury Module itself provides the pot to store funds, and a means for stakeholders to +//! propose, approve, and deny expendatures. The chain will need to provide a method (e.g. +//! inflation, fees) for collecting funds. +//! +//! By way of example, the Council could vote to fund the Treasury with a portion of the block +//! reward and use the funds to pay developers. //! -//! Treasury funds can be used to pay for developers who provide software updates, -//! any changes decided by referenda, and to generally keep the system running smoothly. +//! ### Terminology //! -//! Treasury can be used with other modules, such as to tax validator rewards in the `staking` module. +//! - **Proposal:** A suggestion to allocate funds from the pot to a beneficiary. +//! - **Beneficiary:** An account who will receive the funds from a proposal iff +//! the proposal is approved. +//! - **Deposit:** Funds that a proposer must lock when making a proposal. The +//! deposit will be returned or slashed if the proposal is approved or rejected +//! respectively. +//! - **Pot:** Unspent funds accumulated by the treasury module. //! //! ### Implementations //! //! The treasury module provides an implementation for the following trait: -//! - `OnDilution` - Mint extra funds upon dilution; maintain the ratio of `portion` diluted to `total_issuance`. +//! +//! - `OnDilution` - When new funds are minted to reward the deployment of other existing funds, +//! a corresponding amount of tokens are minted into the treasury so that the tokens being rewarded +//! do not represent a higher portion of total supply. For example, in the default substrate node, +//! when validators are rewarded new tokens for staking, they do not hold a higher portion of total +//! tokens. Rather, tokens are added to the treasury to keep the portion of tokens staked constant. //! //! ## Interface //! //! ### Dispatchable Functions //! -//! - `propose_spend` - Propose a spending proposal and stake a proposal deposit. +//! - `propose_spend` - Make a spending proposal and stake the required deposit. //! - `set_pot` - Set the spendable balance of funds. //! - `configure` - Configure the module's proposal requirements. -//! - `reject_proposal` - Reject a proposal and slash the deposit. -//! - `approve_proposal` - Accept the proposal and return the deposit. -//! -//! Please refer to the [`Call`](./enum.Call.html) enum and its associated variants for documentation on each function. -//! -//! ### Public Functions +//! - `reject_proposal` - Reject a proposal, slashing the deposit. +//! - `approve_proposal` - Accept the proposal, returning the deposit. //! -//! See the [module](./struct.Module.html) for details on publicly available functions. -//! -//! ## Related Modules -//! -//! The treasury module depends on the `system` and `srml_support` modules as well as -//! Substrate Core libraries and the Rust standard library. +//! ## GenesisConfig //! +//! The Treasury module depends on the [`GenesisConfig`](./struct.GenesisConfig.html). #![cfg_attr(not(feature = "std"), no_std)] @@ -64,7 +72,9 @@ use serde::{Serialize, Deserialize}; use rstd::prelude::*; use srml_support::{StorageValue, StorageMap, decl_module, decl_storage, decl_event, ensure}; use srml_support::traits::{Currency, ReservableCurrency, OnDilution, OnUnbalanced, Imbalance}; -use runtime_primitives::{Permill, traits::{Zero, EnsureOrigin, StaticLookup}}; +use runtime_primitives::{Permill, + traits::{Zero, EnsureOrigin, StaticLookup, Saturating, CheckedSub, CheckedMul} +}; use parity_codec::{Encode, Decode}; use system::ensure_signed; @@ -181,8 +191,8 @@ decl_storage! { trait Store for Module as Treasury { // Config... - /// Proportion of funds that should be bonded in order to place a proposal. An accepted - /// proposal gets these back. A rejected proposal doesn't. + /// Fraction of a proposal's value that should be bonded in order to place the proposal. + /// An accepted proposal gets these back. A rejected proposal does not. ProposalBond get(proposal_bond) config(): Permill; /// Minimum amount of funds that should be placed in a deposit for making a proposal. @@ -291,8 +301,12 @@ impl OnDilution> for Module { // pre dilution and post-dilution. if !minted.is_zero() && !portion.is_zero() { let total_issuance = T::Currency::total_issuance(); - let funding = (total_issuance - portion) / portion * minted; - >::mutate(|x| *x += funding); + if let Some(funding) = total_issuance.checked_sub(&portion) { + let funding = funding / portion; + if let Some(funding) = funding.checked_mul(&minted) { + >::mutate(|x| *x = x.saturating_add(funding)); + } + } } } } @@ -501,6 +515,35 @@ mod tests { }); } + #[test] + // Note: This test demonstrates that `on_dilution` does not increase the pot with good resolution + // with large amounts of the network staked. https://github.com/paritytech/substrate/issues/2579 + // A fix to 2579 should include a change of this test. + fn on_dilution_quantization_effects() { + with_externalities(&mut new_test_ext(), || { + // minted = 1% of total issuance for all cases + let _ = Treasury::set_pot(0); + assert_eq!(Balances::total_issuance(), 200); + + Treasury::on_dilution(2, 66); // portion = 33% of total issuance + assert_eq!(Treasury::pot(), 4); // should increase by 4 (200 - 66) / 66 * 2 + + Treasury::on_dilution(2, 67); // portion = 33+eps% of total issuance + assert_eq!(Treasury::pot(), 6); // should increase by 2 (200 - 67) / 67 * 2 + + Treasury::on_dilution(2, 100); // portion = 50% of total issuance + assert_eq!(Treasury::pot(), 8); // should increase by 2 (200 - 100) / 100 * 2 + + // If any more than 50% of the network is staked (i.e. (2 * portion) > total_issuance) + // then the pot will not increase. + Treasury::on_dilution(2, 101); // portion = 50+eps% of total issuance + assert_eq!(Treasury::pot(), 8); // should increase by 0 (200 - 101) / 101 * 2 + + Treasury::on_dilution(2, 134); // portion = 67% of total issuance + assert_eq!(Treasury::pot(), 8); // should increase by 0 (200 - 134) / 134 * 2 + }); + } + #[test] fn pot_underflow_should_not_diminish() { with_externalities(&mut new_test_ext(), || { diff --git a/subkey/Cargo.toml b/subkey/Cargo.toml index 12ae7bdbbe0e23ae58cc5493dc2feb5c88da4893..5f043e9486c5bc5d6231fca57808eb5dbfebb4e1 100644 --- a/subkey/Cargo.toml +++ b/subkey/Cargo.toml @@ -1,11 +1,14 @@ [package] name = "subkey" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] substrate-primitives = { version = "*", path = "../core/primitives" } +node-runtime = { version = "*", path = "../node/runtime" } +node-primitives = { version = "*", path = "../node/primitives" } +sr-primitives = { version = "*", path = "../core/sr-primitives" } rand = "0.6" clap = { version = "~2.32", features = ["yaml"] } tiny-bip39 = "0.6.0" @@ -13,6 +16,8 @@ rustc-hex = "2.0" substrate-bip39 = { git = "https://github.com/paritytech/substrate-bip39" } schnorrkel = "0.1" hex = "0.3" +hex-literal = "0.2" +parity-codec = "3.2" [features] bench = [] diff --git a/subkey/README.adoc b/subkey/README.adoc index 7fe194eb82b701e0821391eacb465f89454f8add..52770e78ec4432778a5683bd140e25005b877a96 100644 --- a/subkey/README.adoc +++ b/subkey/README.adoc @@ -53,3 +53,18 @@ You can use the included vanity generator to find a seed that provides an addres ```bash subkey vanity 1337 ``` + +=== Signing a transaction + +Sign a transaction from an encoded `Call`. + +```bash +subkey sign-transaction \ + --call \ + --nonce 0 \ + --suri \ + --password \ + --prior-block-hash +``` + +Will output a signed and encoded `UncheckedMortalCompactExtrinsic` as hex. diff --git a/subkey/src/cli.yml b/subkey/src/cli.yml index cc131703eb8df23b4d7599b258c5f0971cb71f7a..eedd4757375f406a95c617c08c7d5ba92f121670 100644 --- a/subkey/src/cli.yml +++ b/subkey/src/cli.yml @@ -40,6 +40,30 @@ subcommands: long: hex help: The message on STDIN is hex-encoded data takes_value: false + - transfer: + about: Author and sign a Node balances::Transfer transaction with a given (secret) key + args: + - from: + index: 1 + required: true + help: The signing secret key URI. + - to: + index: 2 + required: true + help: The destination account public key URI. + - amount: + index: 3 + required: true + help: The number of units to transfer. + - index: + index: 4 + required: true + help: The signing account's transaction index. + - genesis: + short: g + long: genesis + help: The genesis hash or a recognised chain identifier (dev, elm, alex). + takes_value: true - verify: about: Verify a signature for a message, provided on STDIN, with a given (public or secret) key args: @@ -68,3 +92,36 @@ subcommands: help: Number of keys to generate takes_value: true default_value: "1" + - sign-transaction: + about: Sign transaction from encoded Call. Returns a signed and encoded UncheckedMortalCompactExtrinsic as hex. + args: + - call: + short: c + long: call + help: The call, hex-encoded. + takes_value: true + required: true + - nonce: + short: n + long: nonce + help: The nonce. + takes_value: true + required: true + - suri: + long: suri + short: s + help: The secret key URI. + takes_value: true + required: true + - password: + short: p + long: password + takes_value: true + help: The password for the key. + required: true + - prior-block-hash: + short: h + long: prior-block-hash + help: The prior block hash, hex-encoded. + takes_value: true + required: true diff --git a/subkey/src/main.rs b/subkey/src/main.rs index 5caf58d45ba14cda8e06f133ce4bd3744e46755c..1b9afb8cd7d83e0de992750759bd38c9deda7a97 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -18,16 +18,18 @@ #[cfg(feature = "bench")] extern crate test; -extern crate substrate_bip39; -extern crate rustc_hex; - use std::io::{stdin, Read}; +use hex_literal::hex; use clap::load_yaml; use rand::{RngCore, rngs::OsRng}; use substrate_bip39::mini_secret_from_entropy; use bip39::{Mnemonic, Language, MnemonicType}; -use substrate_primitives::{ed25519, sr25519, hexdisplay::HexDisplay, Pair, crypto::Ss58Codec}; +use substrate_primitives::{ed25519, sr25519, hexdisplay::HexDisplay, Pair, crypto::Ss58Codec, blake2_256}; +use parity_codec::{Encode, Decode, Compact}; +use sr_primitives::generic::Era; use schnorrkel::keys::MiniSecretKey; +use node_primitives::{Balance, Index, Hash}; +use node_runtime::{Call, UncheckedExtrinsic, BalancesCall}; mod vanity; @@ -173,6 +175,96 @@ fn execute>(matches: clap::ArgMatches) where let sig = pair.sign(&message); println!("{}", hex::encode(&sig)); } + ("transfer", Some(matches)) => { + let signer = matches.value_of("from") + .expect("parameter is required; thus it can't be None; qed"); + let signer = Sr25519::pair_from_suri(signer, password); + + let to = matches.value_of("to") + .expect("parameter is required; thus it can't be None; qed"); + let to = sr25519::Public::from_string(to).ok().or_else(|| + sr25519::Pair::from_string(to, password).ok().map(|p| p.public()) + ).expect("Invalid 'to' URI; expecting either a secret URI or a public URI."); + + let amount = matches.value_of("amount") + .expect("parameter is required; thus it can't be None; qed"); + let amount = str::parse::(amount) + .expect("Invalid 'amount' parameter; expecting an integer."); + + let index = matches.value_of("index") + .expect("parameter is required; thus it can't be None; qed"); + let index = str::parse::(index) + .expect("Invalid 'amount' parameter; expecting an integer."); + + let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); + + let genesis_hash: Hash = match matches.value_of("genesis").unwrap_or("alex") { + "elm" => hex!["10c08714a10c7da78f40a60f6f732cf0dba97acfb5e2035445b032386157d5c3"].into(), + "alex" => hex!["dcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b"].into(), + h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..])).expect("Invalid genesis hash or unrecognised chain identifier"), + }; + + println!("Using a genesis hash of {}", HexDisplay::from(&genesis_hash.as_ref())); + + let era = Era::immortal(); + let raw_payload = (Compact(index), function, era, genesis_hash); + let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { + signer.sign(&blake2_256(payload)[..]) + } else { + println!("Signing {}", HexDisplay::from(&payload)); + signer.sign(payload) + }); + let extrinsic = UncheckedExtrinsic::new_signed( + index, + raw_payload.1, + signer.public().into(), + signature.into(), + era, + ); + println!("0x{}", hex::encode(&extrinsic.encode())); + } + ("sign-transaction", Some(matches)) => { + let s = matches.value_of("suri") + .expect("secret URI parameter is required; thus it can't be None; qed"); + let signer = Sr25519::pair_from_suri(s, password); + + let index = matches.value_of("nonce") + .expect("nonce is required; thus it can't be None; qed"); + let index = str::parse::(index) + .expect("Invalid 'index' parameter; expecting an integer."); + + let call = matches.value_of("call") + .expect("call is required; thus it can't be None; qed"); + let function: Call = hex::decode(&call).ok() + .and_then(|x| Decode::decode(&mut &x[..])).unwrap(); + + let h = matches.value_of("prior-block-hash") + .expect("prior-block-hash is required; thus it can't be None; qed"); + let prior_block_hash: Hash = hex::decode(h).ok() + .and_then(|x| Decode::decode(&mut &x[..])) + .expect("Invalid prior block hash"); + + let era = Era::immortal(); + + let raw_payload = (Compact(index), function, era, prior_block_hash); + let signature = raw_payload.using_encoded(|payload| + if payload.len() > 256 { + signer.sign(&blake2_256(payload)[..]) + } else { + signer.sign(payload) + } + ); + + let extrinsic = UncheckedExtrinsic::new_signed( + index, + raw_payload.1, + signer.public().into(), + signature.into(), + era, + ); + + println!("0x{}", hex::encode(&extrinsic.encode())); + } ("verify", Some(matches)) => { let sig_data = matches.value_of("sig") .expect("signature parameter is required; thus it can't be None; qed"); @@ -218,3 +310,22 @@ fn main() { fn print_usage(matches: &clap::ArgMatches) { println!("{}", matches.usage()); } + +#[cfg(test)] +mod tests { + use super::{Hash, Decode}; + #[test] + fn should_work() { + let s = "0123456789012345678901234567890123456789012345678901234567890123"; + + let d1: Hash = hex::decode(s).ok().and_then(|x| Decode::decode(&mut &x[..])).unwrap(); + + let d2: Hash = { + let mut gh: [u8; 32] = Default::default(); + gh.copy_from_slice(hex::decode(s).unwrap().as_ref()); + Hash::from(gh) + }; + + assert_eq!(d1, d2); + } +} diff --git a/subkey/src/vanity.rs b/subkey/src/vanity.rs index 785eb95aa5b203ac5c53e62abea30b6c090259ae..2399197e99576a09ea385673ef9353eeac232637 100644 --- a/subkey/src/vanity.rs +++ b/subkey/src/vanity.rs @@ -19,9 +19,9 @@ use super::Crypto; fn good_waypoint(done: u64) -> u64 { match done { - 0 ... 1_000_000 => 100_000, - 0 ... 10_000_000 => 1_000_000, - 0 ... 100_000_000 => 10_000_000, + 0 ..= 1_000_000 => 100_000, + 0 ..= 10_000_000 => 1_000_000, + 0 ..= 100_000_000 => 10_000_000, _ => 100_000_000, } } @@ -105,7 +105,7 @@ pub(super) fn generate_key>(desired: &str) -> Result" "checksum kvdb-rocksdb 0.1.4 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" -"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" -"checksum lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddba4c30a78328befecec92fc94970e53b3ae385827d28620f0f5bb2493081e0" -"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" +"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" +"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" +"checksum libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)" = "c6785aa7dd976f5fbf3b71cfd9cd49d7f783c1ff565a858d71031c6c313aa5c6" "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" -"checksum libp2p 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ef2cce57e82d0decdf5464e4e179a319ee14c218c330bb017f62453f4ab74842" -"checksum libp2p-core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "26977e332e88c070353864d5ed72b6e1175fc1c63af5709b5174877836a229b6" -"checksum libp2p-core-derive 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a88f076f3f60f3f407ce4fc0f620e3592125461bec5aa4895316e1f0414b3ea" -"checksum libp2p-dns 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f7ad92f9711efece48bb7ce30e3f1e662cd3524dc5d9f96b8f68b6e4e7cde96" -"checksum libp2p-floodsub 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4feda0ff3afcf84dfee9ea088835293829d199a34491d7f0990a4ccfd627816c" -"checksum libp2p-identify 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "548f9180101bd5846f4f60e060a00032ba3671a77fc735c48a85b7d1016d28ef" -"checksum libp2p-kad 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "91c28bf179a22fd1bfa3bad28ed86b8657ed2d193b76caa6f632ea83356d3a40" -"checksum libp2p-mdns 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1bbcb82063545605abf697967d919d418b1725f7d3688973fa26c98f81e8cda8" -"checksum libp2p-mplex 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9406ea58ce4fef47820f7d2d6aa62b7e42b4972c30cc87de577d4da40852d4b1" -"checksum libp2p-ping 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c1ca7b60c2edb0cae7f9db56fbe6c21ca6960e96ec92cd1ed265ac06db24a1fe" -"checksum libp2p-plaintext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84bdbdd4700d5edea10214e4733ab5ac5be87862bac8a9b259c987bc9c15004" -"checksum libp2p-ratelimit 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d3001ea6afed5ccd1e5934715aa388b60b23e7587117db36b89d697e8ea43ff3" -"checksum libp2p-secio 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc2bee2dce0d0d054d81447b06f7e923f1a98e6b240e42674e0fdf2e4a4924f" -"checksum libp2p-tcp 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fcb2bcb9402f5fe42441dd4558306ff83a28624f67c6066bdbaa98928c180e3" -"checksum libp2p-uds 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3e88ac8f419f8d9487aaee9ef8785f592b37d78067c6764fe0adc1874a72c6c" -"checksum libp2p-websocket 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "80b60b65b8d7053220a0c78a09eda0a162db410067639d2b24432a9f1dc06230" -"checksum libp2p-yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71b4fd69a1c038152d017366d759177e2580fb4fbb56ce65429a642e011a07b1" -"checksum librocksdb-sys 5.14.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b9024327233e7fac7982440f73301c00046d438c5b1011e8f4e394226ce19007" +"checksum libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0231edab431064b30b7749484a39735eb36492cef4658c372c9059e58c3003aa" +"checksum libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a3bad2ed26297112847678683dd221473a0d44297250b61f004e1b35e72493" +"checksum libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f765f103b680cbed910b02bfdbdcfce5b1142899c93e51acb960bf59b6f81b1" +"checksum libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b129d20cc8cbb6ce5da8361045649c024659173e246c5dfbf20ae06071c046a" +"checksum libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70d68816b8435d6788399416eb2f0a6974fb1d15c4be5c30141f87c8e81746df" +"checksum libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "718ca645a065fd70855ca6042a7df686c24cd21add750c37a82c811fbd1e5c43" +"checksum libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbe27c623a6a720efd5d704347838972062f89149a9c3cd149748da60bdcd3e0" +"checksum libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9bc1a5d85f4812cae6367b49a432763fe28997bac7c530dc55b70ec18a78aa7" +"checksum libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe5a858342a1cc89464474f7edc4bae1da649b9c823a3e04d9fb494493601746" +"checksum libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc6b5185c50a52a12e7bbe2ee7799059e24de4e52ab25edbfd26c8ab8515d317" +"checksum libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7905c1431ad115bee83405770629a27d6f17153ad02ec9670a7347998ef20e22" +"checksum libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc17626763ded57da8fed73187c2d9f6ebb89d30838673c430315bf560c7e4db" +"checksum libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2409d08b809ab1a74269597f7da2829d117cc11b9ed3343af33fc20831619726" +"checksum libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258cdc6742945c8f6402997bbbf36733588e2db18e5a0014da6d46e3ccfb92cf" +"checksum libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b5691e2ba2720d42bd1e93d6b90239fa9235c1956ef6a5f1dd499a7ae2767be" +"checksum libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ab0b9ca050105fd94229c48911c0c84aef4d6b86a53d1b6df81d938354e47e" +"checksum libp2p-websocket 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81692c3141a9aefd84f4faffdc93985af3858ef82ed7fe8185e6b27437b36183" +"checksum libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"checksum librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19778314deaa7048f2ea7d07b8aa12e1c227acebe975a37eeab6d2f8c74e41b" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" -"checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" -"checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" -"checksum lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775751a3e69bde4df9b38dd00a1b5d6ac13791e4223d4a0506577f0dd27cfb7a" +"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" +"checksum linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7c91c4c7bbeb4f2f7c4e5be11e6a05bd6830bc37249c47ce1ad86ad453ff9c" +"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" -"checksum lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d06ff7ff06f729ce5f4e227876cb88d10bc59cd4ae1e09fbb2bde15c850dc21" -"checksum make-cmd 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8ca8afbe8af1785e09636acb5a41e08a765f5f0340568716c18a8700ba3c0d3" -"checksum mashup 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f2d82b34c7fb11bb41719465c060589e291d505ca4735ea30016a91f6fc79c3b" -"checksum mashup-impl 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "aa607bfb674b4efb310512527d64266b065de3f894fc52f84efcbf7eaa5965fb" +"checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" -"checksum memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0a3eb002f0535929f1199681417029ebea04aadc0c7a4224b46be99c7f5d6a16" +"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" +"checksum memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum multistream-select 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "886fe7ba983a194afdd9074323171c8e313b2c145561da69464d5443f1a3d121" +"checksum multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" -"checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" +"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" -"checksum nohash-hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "27593c72432b8cec9ae79e92792a73c38341064d525b6b612a9fccf8b7d17407" -"checksum nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b30adc557058ce00c9d0d7cb3c6e0b5bc6f36e2e2eabe74b0ba726d194abd588" +"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" +"checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" +"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" -"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" +"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" +"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" -"checksum once_cell 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "53075ac5dbd2798cfbcf9f710f2737de031d8076c192d8fe66fb23f639ccbdf4" -"checksum opaque-debug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d620c9c26834b34f039489ac0dfdb12c7ac15ccaf818350a64c9b5334a452ad7" +"checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "5e1309181cdcbdb51bc3b6bedb33dfac2a83b3d585033d3f6d9e22e8c1928613" +"checksum openssl 0.10.22 (registry+https://github.com/rust-lang/crates.io-index)" = "a51f452b82d622fc8dd973d7266e9055ac64af25b957d9ced3989142dc61cb6b" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)" = "278c1ad40a89aa1e741a1eed089a2f60b18fab8089c3139b542140fc7d674106" +"checksum openssl-sys 0.9.46 (registry+https://github.com/rust-lang/crates.io-index)" = "05636e06b4f8762d4b81d24a351f3966f38bd25ccbcfd235606c91fdb82cc60f" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" +"checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" -"checksum parity-codec 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88f69984317b736dceac3baa86600fc089856f69b44b07231f39b5648b02bcd4" -"checksum parity-codec-derive 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a58ba33211595f92cc2163ac583961d3dc767e656934146636b05256cc9acd7f" -"checksum parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8adf489acb31f1922db0ce43803b6f48a425241a8473611be3cc625a8e4a4c47" -"checksum parity-multiaddr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9a8e5d637787fe097ec1bfca2aa3eb687396518003df991c6c7216d86682d5ff" -"checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" +"checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" +"checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" +"checksum parity-crypto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1b9c063d87e1507cb3807493c8d21859ef23b5414b39f81c53f0ba267d64c1" +"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parity-ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2fec5048fba72a2e01baeb0d08089db79aead4b57e2443df172fb1840075a233" -"checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f50392d1265092fbee9273414cc40eb6d47d307bd66222c477bb8450c8504f9d" -"checksum paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a3cd512fe3a55e8933b2dcad913e365639db86d512e4004c3084b86864d9467a" +"checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" +"checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" +"checksum pbkdf2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0c09cddfbfc98de7f76931acf44460972edb4023eb14d0c6d4018800e552d8e0" +"checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" +"checksum primitive-types 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "99d5a5fe9d93ddb394e2fb3fc49d0e31acb475fd45a30eeb8f3e76b767ecb7e1" +"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66" +"checksum proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0c1dd4172a1e1f96f709341418f49b11ea6c2d95d53dca08c0f74cbd332d9cf3" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "77997c53ae6edd6d187fec07ec41b207063b5ee6f33680e9fa86d405cdd313d4" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "671a9cce836bd3635b40b2b0a72783481755ee988c493891f4e974b45264cc9d" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc7badf647ae2fa27ba51c218e347386c88cc604fcfe71f2aba0ad017f3f2b75" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" -"checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" -"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" -"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" -"checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd" -"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" -"checksum rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9d223d52ae411a33cf7e54ec6034ec165df296ccd23533d671a28252b6f66a" -"checksum rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "771b009e3a508cb67e8823dda454aaa5368c7bc1c16829fb77d3e980440dd34a" -"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372" -"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db" +"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" +"checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" +"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" +"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" -"checksum rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "effa3fcaa47e18db002bdde6060944b6d2f9cfd8db471c30e873448ad9187be3" -"checksum rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "df7a791f788cb4c516f0e091301a29c2b71ef680db5e644a7d68835c8ae6dbfa" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +"checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" -"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" +"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2069749032ea3ec200ca51e4a31df41759190a88edca0d2d86ee8bedf7073341" -"checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" -"checksum ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2c4db68a2e35f3497146b7e4563df7d4773a2433230c5e4b448328e31740458a" +"checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" +"checksum ripemd160 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad5112e0dbbb87577bfbc56c42450235e3012ce336e29c5befd7807bd626da4a" "checksum rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1651697fefd273bfb4fd69466cc2a9d20de557a0213b97233b22b5e95924b5e" -"checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" -"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395" +"checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" -"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rw-stream-sink 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "108ad7c3d65ba866ec50a224b7b3b0cb6c682c3d805015cea859d491232346a5" -"checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7" +"checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" -"checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56" -"checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28" +"checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" +"checksum scrypt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8570c5e2fa69cb29d492fd4e9974b6b5facb5a888e1c6da630d4a3cd7ebfef4a" "checksum secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfaccd3a23619349e0878d9a241f34b1982343cdf67367058cd7d078d326b63e" -"checksum security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "697d3f3c23a618272ead9e1fb259c1411102b31c6af8b93f1d64cca9c3b0e8e0" -"checksum security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab01dfbe5756785b5b4d46e0289e5a18071dfa9a7c2b24213ea00b9ef9b665bf" +"checksum security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eee63d0f4a9ec776eeb30e220f0bc1e092c3ad744b2a379e3993070364d3adc2" +"checksum security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9636f8989cbf61385ae4824b98c1aaa54c994d7d8b41f11c601ed799f0549a56" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "15c141fc7027dd265a47c090bf864cf62b42c4d228bbcf4e51a0c9e2b0d3f7ef" -"checksum serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "225de307c6302bec3898c51ca302fc94a7a1697ef0845fcee6448f33c032249c" -"checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce" +"checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" +"checksum serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "101b495b109a3e3ca8c4cbe44cf62391527cdfb6ba15821c5ce80bcd5ea23f9f" +"checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" "checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" -"checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d" +"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" "checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" -"checksum slog-json 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddd14b8df2df39378b3e933c79784350bf715b11444d99f903df0253bbe524e5" -"checksum slog-scope 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "053344c94c0e2b22da6305efddb698d7c485809427cf40555dc936085f67a9df" -"checksum smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "153ffa32fd170e9944f7e0838edf824a754ec4c1fc64746fcc9fe1f8fa602e5d" +"checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" +"checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" +"checksum slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eff3b513cf2e0d1a60e1aba152dc72bedc5b05585722bb3cebd7bcb1e31b98f" +"checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" +"checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" +"checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" -"checksum stdweb 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "22203527a18dc1c5c83bbd247fb005f5877d040783b6626571d6b7ed7a6f5e75" +"checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" +"checksum stdweb 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c34362bb10ac1a9439674795cc0e1bdcb0c46444c8fd4874ef39a01d9a8a8f24" "checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcbc9155af9606d44c740197d7d6672b49c4ee93a176c7cecde8b49322677604" -"checksum stdweb-internal-runtime 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b74fe9de4c0d07e91987f4d798b95f27f3cb7769fbc222fa951fa386908297b5" -"checksum stream-cipher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "30dc6118470d69ce0fdcf7e6f95e95853f7f4f72f80d835d4519577c323814ab" -"checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970" +"checksum stdweb-internal-macros 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "e68f7d08b76979a43e93fe043b66d2626e35d41d68b0b85519202c6dd8ac59fa" +"checksum stdweb-internal-runtime 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d52317523542cc0af5b7e31017ad0f7d1e78da50455e38d5657cd17754f617da" +"checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" +"checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" -"checksum structopt 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "41c4a2479a078509940d82773d90ff824a8c89533ab3b59cd3ce8b0c0e369c02" -"checksum structopt-derive 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "5352090cfae7a2c85e1a31146268b53396106c88ca5d6ccee2e3fae83b6e35c2" +"checksum structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "3d0760c312538987d363c36c42339b55f5ee176ea8808bbe4543d484a291c8d1" +"checksum structopt-derive 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "528aeb7351d042e6ffbc2a6fb76a86f9b622fdf7c25932798e7a82cb03bc94c6" +"checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" +"checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" +"checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)" = "ae8b29eb5210bc5cf63ed6149cbf9adfc82ac0be023d8735c176ee74a2db4da7" -"checksum sysinfo 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c747a1fbe091faa7bf76c19f40099f9f12495384c811485d81cf3d60c0eae62" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" +"checksum sysinfo 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d88e417391431019773011a31a6c967538da388782b7711f2f6fafd9e601e55" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" -"checksum tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "55c1195ef8513f3273d55ff59fe5da6940287a0d7a98331254397f464833675b" +"checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" -"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" +"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" +"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +"checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" -"checksum tk-listen 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dec7ba6a80b7695fc2abb21af18bed445a362ffd80b64704771ce142d6d2151d" -"checksum tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6e93c78d23cc61aa245a8acd2c4a79c4d7fa7fb5c3ca90d5737029f043a84895" +"checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" +"checksum tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "cec6c34409089be085de9403ba2010b80e36938c9ca992c4f67f407bb13db0b1" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "aeeffbbb94209023feaef3c196a41cbcdafa06b4a6f893f68779bb5e53796f71" -"checksum tokio-current-thread 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f90fcd90952f0a496d438a976afba8e5c205fb12123f813d8ab3aa1c8436638c" +"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" -"checksum tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c117b6cf86bb730aab4834f10df96e4dd586eff2c3c27d3781348da49e255bde" -"checksum tokio-fs 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "60ae25f6b17d25116d2cba342083abe5255d3c2c79cb21ea11aa049c53bf7c75" -"checksum tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "7392fe0a70d5ce0c882c4778116c519bd5dbaa8a7c3ae3d04578b3afafdcda21" -"checksum tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4b26fd37f1125738b2170c80b551f69ff6fecb277e6e5ca885e53eec2b005018" -"checksum tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad235e9dadd126b2d47f6736f65aa1fdcd6420e66ca63f44177bc78df89f912" -"checksum tokio-threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3929aee321c9220ed838ed6c3928be7f9b69986b0e3c22c972a66dbf8a298c68" -"checksum tokio-timer 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3a52f00c97fedb6d535d27f65cccb7181c8dd4c6edc3eda9ea93f6d45d05168e" -"checksum tokio-tls 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e53fdbf3156f588be1676022fe794232b24922d426e8c14f4e46891c1e31c440" -"checksum tokio-udp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "da941144b816d0dcda4db3a1ba87596e4df5e860a72b70783fe435891f80601c" -"checksum tokio-uds 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df195376b43508f01570bacc73e13a1de0854dc59e79d1ec09913e8db6dd2a70" +"checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" +"checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" +"checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" +"checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" +"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" +"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c" +"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" +"checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" +"checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" +"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" -"checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" +"checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" +"checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" -"checksum twofish 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1eef327f05b0d0ec1b9d7d119d8f4d9f602ceee37e0540aff8071e8e66c2e22e" -"checksum twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f85be565a110ed72ed7048cf56570db04ce0a592c98aa59b7dacde3e5718750" +"checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" +"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" -"checksum ucd-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d0f8bfa9ff0cadcd210129ad9d2c5f145c13e9ced3d3e5d948a6213487d52444" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" +"checksum uint 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91bb295c2c53c54742a6b8acb705114f6dfdf3c42becdb146a662cb77fcc0d02" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -"checksum unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3218ea14b4edcaccfa0df0a64a3792a2c32cc706f1b336e48867f9d3147f90" +"checksum unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84e5511b2a947f3ae965dcb29b13b7b1691b6e7332cf5dbc1744138d5acb7f6" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -"checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" +"checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" "checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -"checksum unsigned-varint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb8abc4b7d8158bdfbbaaccc35331ed3c30c2673e99000d7ae665a2eb6576f4" +"checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" -"checksum url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a321979c09843d272956e73700d12c4e7d3d92b2ee112b31548aef0d4efc5a6" +"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" -"checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" -"checksum websocket 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c9faed2bff8af2ea6b9f8b917d3d00b467583f6781fe3def174a9e33c879703" -"checksum which 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e84a603e7e0b1ce1aa1ee2b109c7be00155ce52df5081590d1ffb93f4f515cb2" +"checksum wasm-bindgen 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "546e4ab1bf7f9a3532d21472efd72d01a23f55abd885c60b165f393394dbad95" +"checksum wasm-bindgen-backend 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "7b84bedebfd6ae3522cce59dec6b52ee6c53ceeaae8541668c15b9f42df8ecab" +"checksum wasm-bindgen-futures 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)" = "c6fc76797785881eac82f72e9b676032a737dea717103878100dbf6106d8d2cb" +"checksum wasm-bindgen-macro 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "f2a033fc6bfd5e486a488b0e19d7d1bb29e667ebb91db85f698381a8aa831786" +"checksum wasm-bindgen-macro-support 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "fba68375ef8f095c4a169c093c95ed2e1b5e44f7872f3bcbcafe2c51b4a80480" +"checksum wasm-bindgen-shared 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "321949f4d7f7bf7a49dccd464bdc46581b180f761d9505e4943926d50b2a4a64" +"checksum wasm-bindgen-webidl 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c2c2b45b827f96657beea954a5430d37da4cf477d2874595f5f0a6ad027980" +"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" +"checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" +"checksum web-sys 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)" = "47ad2ecfe3793a87a0aa49562ad6f01cb3af3c870213283bc60032ec8dd7e62a" +"checksum websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0adcd2a64c5746c9702b354a1b992802b0c363df1dfa324a74cb7aebe10e0cbf" +"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" +"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" "checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum xdg 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a66b7c2281ebde13cf4391d70d4c7e5946c3c25e72a7b859ca8f677dcd0b0c61" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"checksum xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" "checksum yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992" -"checksum yamux 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e25561b512df3c287cf52404cab0b07ea43d095cb96230e9e2cb635db72d75f0" +"checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" +"checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" diff --git a/test-utils/chain-spec-builder/Cargo.toml b/test-utils/chain-spec-builder/Cargo.toml index 79290463da09965c67ace75f75cb72b8f5cbe027..a54094d8c7920b9a0be8b2a3176464d25f76099f 100644 --- a/test-utils/chain-spec-builder/Cargo.toml +++ b/test-utils/chain-spec-builder/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "chain-spec-builder" -version = "0.1.0" -authors = ["haydn dufrene "] +version = "2.0.0" +authors = ["Parity Technologies "] edition = "2018" [dependencies] diff --git a/test-utils/chain-spec-builder/src/main.rs b/test-utils/chain-spec-builder/src/main.rs index c7b4dd99d8ab28c760f37c543be55b0bc245ce52..211e8321e3fd1c409c64f8ee8f5d7cd16d9125e0 100644 --- a/test-utils/chain-spec-builder/src/main.rs +++ b/test-utils/chain-spec-builder/src/main.rs @@ -8,20 +8,24 @@ fn genesis_constructor() -> chain_spec::GenesisConfig { let matches = App::from_yaml(yaml).get_matches(); let authorities = matches.values_of("initial_authority_seed") .unwrap() - .map(chain_spec::get_authority_id_from_seed) + .map(chain_spec::get_authority_keys_from_seed) .collect(); let endowed_accounts = matches.values_of("endowed_account_seed") .unwrap() - .map(chain_spec::get_authority_id_from_seed) + .map(chain_spec::get_account_id_from_seed) .collect(); let sudo_key_seed = matches.value_of("sudo_key_seed").unwrap(); - let sudo_key = chain_spec::get_authority_id_from_seed(sudo_key_seed); + let sudo_key = chain_spec::get_account_id_from_seed(sudo_key_seed); + + let enable_println = true; + chain_spec::testnet_genesis( authorities, sudo_key.into(), Some(endowed_accounts), + enable_println, ) } @@ -34,6 +38,7 @@ fn generate_chain_spec() -> String { None, None, None, + None, ); build_spec(chain_spec, false).unwrap() } diff --git a/test-utils/transaction-factory/Cargo.toml b/test-utils/transaction-factory/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..66faaf6b345820bff589b319255de8a177e89813 --- /dev/null +++ b/test-utils/transaction-factory/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "transaction-factory" +version = "0.0.1" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +cli = { package = "substrate-cli", path = "../../core/cli" } +client = { package = "substrate-client", path = "../../core/client" } +consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } +log = "0.4" +parity-codec = { version = "3.3", default-features = false, features = ["derive"] } +primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } +sr_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +substrate-service = { path = "../../core/service" } + +[features] +default = ["std"] +std = [ + "parity-codec/std", + "primitives/std", +] diff --git a/test-utils/transaction-factory/src/complex_mode.rs b/test-utils/transaction-factory/src/complex_mode.rs new file mode 100644 index 0000000000000000000000000000000000000000..6200affaeadb704571a7f71b340accd12999112b --- /dev/null +++ b/test-utils/transaction-factory/src/complex_mode.rs @@ -0,0 +1,156 @@ +// Copyright 2019 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 . + +/// This module implements the `MasterToNToM` mode: +/// +/// Manufacture `num` transactions from the master account to `num` +/// randomly created accounts. From each of these randomly created +/// accounts manufacture a transaction to another randomly created +/// account. +/// Repeat this round `rounds` times. If `rounds` = 1 the behavior +/// is the same as `MasterToN`. +/// +/// A -> B +/// A -> C +/// A -> D +/// ... x `num` +/// +/// B -> E +/// C -> F +/// D -> G +/// ... +/// E -> H +/// F -> I +/// G -> J +/// ... +/// ... x `rounds` + +use std::sync::Arc; + +use log::info; +use client::block_builder::api::BlockBuilder; +use client::runtime_api::ConstructRuntimeApi; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{Block as BlockT, ProvideRuntimeApi, One, Zero}; +use substrate_service::{ + FactoryBlock, FullClient, ServiceFactory, ComponentClient, FullComponents +}; + +use crate::{RuntimeAdapter, create_block}; + +pub fn next( + factory_state: &mut RA, + client: &Arc>>, + prior_block_hash: ::Hash, + prior_block_id: BlockId, +) -> Option<::Block> +where + F: ServiceFactory, + F::RuntimeApi: ConstructRuntimeApi, FullClient>, + FullClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilder>, + RA: RuntimeAdapter, +{ + let total = factory_state.start_number() + factory_state.num() * factory_state.rounds(); + + if factory_state.block_no() >= total || factory_state.round() >= factory_state.rounds() { + return None; + } + + info!( + "Round {}: Creating {} transactions in total, {} per round. {} rounds in total.", + factory_state.round() + RA::Number::one(), + factory_state.num() * factory_state.rounds(), + factory_state.num(), + factory_state.rounds(), + ); + + let from = from::(factory_state); + + let seed = factory_state.start_number() + factory_state.block_no(); + let to = RA::gen_random_account_id(&seed); + + let mut amount; + if factory_state.round() == RA::Number::zero() { + amount = RA::minimum_balance() * factory_state.rounds(); + } else { + let rounds_left = factory_state.rounds() - factory_state.round(); + amount = RA::minimum_balance() * rounds_left; + }; + + let transfer = factory_state.transfer_extrinsic( + &from.0, + &from.1, + &to, + &amount, + &prior_block_hash, + ); + + let inherents = factory_state.inherent_extrinsics(); + let inherents = client.runtime_api().inherent_extrinsics(&prior_block_id, inherents) + .expect("Failed to create inherent extrinsics"); + + let block = create_block::(&client, transfer, inherents); + info!( + "Created block {} with hash {}. Transferring {} from {} to {}.", + factory_state.block_no() + RA::Number::one(), + prior_block_hash, + amount, + from.0, + to + ); + + factory_state.set_block_no(factory_state.block_no() + RA::Number::one()); + + let new_round = factory_state.block_no() > RA::Number::zero() + && factory_state.block_no() % factory_state.num() == RA::Number::zero(); + if new_round { + factory_state.set_round(factory_state.round() + RA::Number::one()); + factory_state.set_block_in_round(RA::Number::zero()); + } else { + factory_state.set_block_in_round(factory_state.block_in_round() + RA::Number::one()); + } + + Some(block) +} + +/// Return the account which received tokens at this point in the previous round. +fn from( + factory_state: &mut RA +) -> (::AccountId, ::Secret) +where RA: RuntimeAdapter +{ + let is_first_round = factory_state.round() == RA::Number::zero(); + match is_first_round { + true => { + // first round always uses master account + (RA::master_account_id(), RA::master_account_secret()) + }, + _ => { + // the account to which was sent in the last round + let is_round_one = factory_state.round() == RA::Number::one(); + let seed = match is_round_one { + true => factory_state.start_number() + factory_state.block_in_round(), + _ => { + let block_no_in_prior_round = + factory_state.num() * (factory_state.round() - RA::Number::one()) + factory_state.block_in_round(); + factory_state.start_number() + block_no_in_prior_round + } + }; + (RA::gen_random_account_id(&seed), RA::gen_random_account_secret(&seed)) + }, + } +} diff --git a/test-utils/transaction-factory/src/lib.rs b/test-utils/transaction-factory/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..8f292f3a02a2e48b6106e2ae8da8ea55d12ec68d --- /dev/null +++ b/test-utils/transaction-factory/src/lib.rs @@ -0,0 +1,180 @@ +// Copyright 2019 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 . + +//! Simple transaction factory which distributes tokens from a master +//! account to a specified number of newly created accounts. +//! +//! The factory currently only works on an empty database! + +use std::collections::HashMap; +use std::sync::Arc; +use std::ops::Mul; +use std::cmp::PartialOrd; +use std::fmt::Display; + +use log::info; + +use client::block_builder::api::BlockBuilder; +use client::runtime_api::ConstructRuntimeApi; +use consensus_common::{ + BlockOrigin, ImportBlock, InherentData, ForkChoiceStrategy, + SelectChain +}; +use consensus_common::block_import::BlockImport; +use parity_codec::{Decode, Encode}; +use sr_primitives::generic::BlockId; +use sr_primitives::traits::{ + Block as BlockT, Header as HeaderT, ProvideRuntimeApi, SimpleArithmetic, + One, Zero, +}; +use substrate_service::{ + FactoryBlock, FactoryFullConfiguration, FullClient, new_client, + ServiceFactory, ComponentClient, FullComponents}; +pub use crate::modes::Mode; + +pub mod modes; +mod complex_mode; +mod simple_modes; + +pub trait RuntimeAdapter { + type AccountId: Display; + type Balance: Display + Mul; + type Block: BlockT; + type Index: Copy; + type Number: Display + PartialOrd + SimpleArithmetic + Zero + One; + type Phase: Copy; + type Secret; + + fn new(mode: Mode, rounds: u64, start_number: u64) -> Self; + + fn block_no(&self) -> Self::Number; + fn block_in_round(&self) -> Self::Number; + fn mode(&self) -> &Mode; + fn num(&self) -> Self::Number; + fn rounds(&self) -> Self::Number; + fn round(&self) -> Self::Number; + fn start_number(&self) -> Self::Number; + + fn set_block_in_round(&mut self, val: Self::Number); + fn set_block_no(&mut self, val: Self::Number); + fn set_round(&mut self, val: Self::Number); + + fn transfer_extrinsic( + &self, + sender: &Self::AccountId, + key: &Self::Secret, + destination: &Self::AccountId, + amount: &Self::Number, + prior_block_hash: &::Hash, + ) -> ::Extrinsic; + + fn inherent_extrinsics(&self) -> InherentData; + + fn minimum_balance() -> Self::Number; + fn master_account_id() -> Self::AccountId; + fn master_account_secret() -> Self::Secret; + fn extract_index(&self, account_id: &Self::AccountId, block_hash: &::Hash) -> Self::Index; + fn extract_phase(&self, block_hash: ::Hash) -> Self::Phase; + fn gen_random_account_id(seed: &Self::Number) -> Self::AccountId; + fn gen_random_account_secret(seed: &Self::Number) -> Self::Secret; +} + +/// Manufactures transactions. The exact amount depends on +/// `mode`, `num` and `rounds`. +pub fn factory( + mut factory_state: RA, + mut config: FactoryFullConfiguration, +) -> cli::error::Result<()> +where + F: ServiceFactory, + F::RuntimeApi: ConstructRuntimeApi, FullClient>, + FullClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilder>, + RA: RuntimeAdapter, + <::Block as BlockT>::Hash: From, +{ + if *factory_state.mode() != Mode::MasterToNToM && factory_state.rounds() > RA::Number::one() { + let msg = "The factory can only be used with rounds set to 1 in this mode.".into(); + return Err(cli::error::Error::Input(msg)); + } + + let client = new_client::(&config)?; + + let select_chain = F::build_select_chain(&mut config, client.clone())?; + + let best_header: Result<::Header, cli::error::Error> = + select_chain.best_chain().map_err(|e| format!("{:?}", e).into()); + let mut best_hash = best_header?.hash(); + let best_block_id = BlockId::::hash(best_hash); + + while let Some(block) = match factory_state.mode() { + Mode::MasterToNToM => + complex_mode::next::(&mut factory_state, &client, best_hash.into(), best_block_id), + _ => + simple_modes::next::(&mut factory_state, &client, best_hash.into(), best_block_id) + } { + best_hash = block.header().hash(); + import_block::(&client, block); + + info!("Imported block at {}", factory_state.block_no()); + } + + Ok(()) +} + +/// Create a baked block from a transfer extrinsic and timestamp inherent. +pub fn create_block( + client: &Arc>>, + transfer: ::Extrinsic, + inherent_extrinsics: Vec<::Extrinsic>, +) -> ::Block +where + F: ServiceFactory, + FullClient: ProvideRuntimeApi, + F::RuntimeApi: ConstructRuntimeApi, FullClient>, + as ProvideRuntimeApi>::Api: BlockBuilder>, + RA: RuntimeAdapter, +{ + let mut block = client.new_block(Default::default()).expect("Failed to create new block"); + block.push( + Decode::decode(&mut &transfer.encode()[..]) + .expect("Failed to decode transfer extrinsic") + ).expect("Failed to push transfer extrinsic into block"); + + for inherent in inherent_extrinsics { + block.push(inherent).expect("Failed ..."); + } + + block.bake().expect("Failed to bake block") +} + +fn import_block( + client: &Arc>>, + block: ::Block +) -> () where F: ServiceFactory +{ + let import = ImportBlock { + origin: BlockOrigin::File, + header: block.header().clone(), + post_digests: Vec::new(), + body: Some(block.extrinsics().to_vec()), + finalized: false, + justification: None, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + client.import_block(import, HashMap::new()).expect("Failed to import block"); +} diff --git a/test-utils/transaction-factory/src/modes.rs b/test-utils/transaction-factory/src/modes.rs new file mode 100644 index 0000000000000000000000000000000000000000..a212d6aed8c3193d526b6a741536104540f1ea18 --- /dev/null +++ b/test-utils/transaction-factory/src/modes.rs @@ -0,0 +1,40 @@ +// Copyright 2019 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 . + +//! The transaction factory can operate in different modes. See +//! the `simple_mode` and `complex_mode` modules for details. + +use std::str::FromStr; + +/// Token distribution modes. +#[derive(Debug, Clone, PartialEq)] +pub enum Mode { + MasterToN, + MasterTo1, + MasterToNToM +} + +impl FromStr for Mode { + type Err = String; + fn from_str(mode: &str) -> Result { + match mode { + "MasterToN" => Ok(Mode::MasterToN), + "MasterTo1" => Ok(Mode::MasterTo1), + "MasterToNToM" => Ok(Mode::MasterToNToM), + _ => Err(format!("Invalid mode: {}", mode)), + } + } +} diff --git a/test-utils/transaction-factory/src/simple_modes.rs b/test-utils/transaction-factory/src/simple_modes.rs new file mode 100644 index 0000000000000000000000000000000000000000..4ce7b47e6fc52d2c887964d35150c09dd0fe267b --- /dev/null +++ b/test-utils/transaction-factory/src/simple_modes.rs @@ -0,0 +1,106 @@ +// Copyright 2019 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 . + +/// This module implements two manufacturing modes: +/// +/// # MasterToN +/// Manufacture `num` transactions from the master account +/// to `num` randomly created accounts, one each. +/// +/// A -> B +/// A -> C +/// ... x `num` +/// +/// +/// # MasterTo1 +/// Manufacture `num` transactions from the master account +/// to exactly one other randomly created account. +/// +/// A -> B +/// A -> B +/// ... x `num` + +use std::sync::Arc; + +use log::info; +use client::block_builder::api::BlockBuilder; +use client::runtime_api::ConstructRuntimeApi; +use sr_primitives::traits::{Block as BlockT, ProvideRuntimeApi, One}; +use sr_primitives::generic::BlockId; +use substrate_service::{ + FactoryBlock, FullClient, ServiceFactory, ComponentClient, FullComponents +}; + +use crate::{Mode, RuntimeAdapter, create_block}; + +pub fn next( + factory_state: &mut RA, + client: &Arc>>, + prior_block_hash: ::Hash, + prior_block_id: BlockId, +) -> Option<::Block> +where + F: ServiceFactory, + F::RuntimeApi: ConstructRuntimeApi, FullClient>, + FullClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: BlockBuilder>, + RA: RuntimeAdapter, +{ + if factory_state.block_no() >= factory_state.num() { + return None; + } + + let from = (RA::master_account_id(), RA::master_account_secret()); + + let seed = match factory_state.mode() { + // choose the same receiver for all transactions + Mode::MasterTo1 => factory_state.start_number(), + + // different receiver for each transaction + Mode::MasterToN => factory_state.start_number() + factory_state.block_no(), + _ => unreachable!("Mode not covered!"), + }; + let to = RA::gen_random_account_id(&seed); + + let amount = RA::minimum_balance(); + + let transfer = factory_state.transfer_extrinsic( + &from.0, + &from.1, + &to, + &amount, + &prior_block_hash, + ); + + let inherents = RA::inherent_extrinsics(&factory_state); + let inherents = client.runtime_api().inherent_extrinsics(&prior_block_id, inherents) + .expect("Failed to create inherent extrinsics"); + + let block = create_block::(&client, transfer, inherents); + + factory_state.set_block_no(factory_state.block_no() + RA::Number::one()); + + info!( + "Created block {} with hash {}. Transferring {} from {} to {}.", + factory_state.block_no(), + prior_block_hash, + amount, + from.0, + to + ); + + Some(block) +}